Commit a0abbd087c864053dcca55ff650bbc73e49ee9fa

Authored by ailsoncgt
2 parents 155d4bbb 0f3d09e5

Merge in dev

Showing 210 changed files with 7256 additions and 1923 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 210 files displayed.

amadeus/static/nothing.txt.py 0 → 100644
amadeus/urls.py
... ... @@ -21,7 +21,7 @@ from django.contrib import admin
21 21  
22 22 urlpatterns = [
23 23 url(r'^home/', include('app.urls', namespace = 'app')),
24   - url(r'^course/', include('courses.urls', namespace = 'course')),
  24 + url(r'^courses/', include('courses.urls', namespace = 'course')),
25 25 url(r'^users/', include('users.urls', namespace = 'users')),
26 26 url(r'^admin/', admin.site.urls),
27 27 url(r'^', include('core.urls', namespace = 'core')),
... ...
app/templates/home.html
... ... @@ -3,53 +3,55 @@
3 3 {% load static i18n django_bootstrap_breadcrumbs permission_tags %}
4 4  
5 5 {% block javascript %}
6   - <script type="text/javascript">
7   - var pageNum = {{ page_obj.number }}; // The latest page loaded
8   - var numberPages = {{ paginator.num_pages }}; // Indicates the number of pages
9   - var baseUrl = '{% url "app:index" %}';
  6 + {% if page_obj %}
  7 + <script type="text/javascript">
  8 + var pageNum = {{ page_obj.number }}; // The latest page loaded
  9 + var numberPages = {{ paginator.num_pages }}; // Indicates the number of pages
  10 + var baseUrl = '{% url "app:index" %}';
10 11  
11   - // loadOnScroll handler
12   - var loadOnScroll = function() {
13   - // If the current scroll position is past out cutoff point...
14   - if ($(window).scrollTop() >= $(document).height() - $(window).height() - 10) {
15   - // temporarily unhook the scroll event watcher so we don't call a bunch of times in a row
16   - $(window).unbind();
17   - // execute the load function below that will visit the view and return the content
18   - loadItems();
19   - }
20   - };
  12 + // loadOnScroll handler
  13 + var loadOnScroll = function() {
  14 + // If the current scroll position is past out cutoff point...
  15 + if ($(window).scrollTop() >= $(document).height() - $(window).height() - 10) {
  16 + // temporarily unhook the scroll event watcher so we don't call a bunch of times in a row
  17 + $(window).unbind();
  18 + // execute the load function below that will visit the view and return the content
  19 + loadItems();
  20 + }
  21 + };
21 22  
22   - var loadItems = function() {
23   - // Check if page is equal to the number of pages
24   - if (pageNum == numberPages) {
25   - return false
26   - }
27   - // Update the page number
28   - pageNum = pageNum + 1;
  23 + var loadItems = function() {
  24 + // Check if page is equal to the number of pages
  25 + if (pageNum == numberPages) {
  26 + return false
  27 + }
  28 + // Update the page number
  29 + pageNum = pageNum + 1;
29 30  
30   - $("#loading").show();
31   - // Configure the url we're about to hit
32   - setTimeout(function (){
33   - $.ajax({
34   - url: baseUrl,
35   - data: {'page': pageNum},
36   - success: function(data) {
37   - $("#loading").hide();
  31 + $("#loading").show();
  32 + // Configure the url we're about to hit
  33 + setTimeout(function (){
  34 + $.ajax({
  35 + url: baseUrl,
  36 + data: {'page': pageNum},
  37 + success: function(data) {
  38 + $("#loading").hide();
38 39  
39   - $("#timeline").append(data);
40   - },
41   - complete: function(data, textStatus){
42   - // Turn the scroll monitor back on
43   - $(window).bind('scroll', loadOnScroll);
44   - }
45   - });
46   - }, 1000)
47   - };
  40 + $("#timeline").append(data);
  41 + },
  42 + complete: function(data, textStatus){
  43 + // Turn the scroll monitor back on
  44 + $(window).bind('scroll', loadOnScroll);
  45 + }
  46 + });
  47 + }, 1000)
  48 + };
48 49  
49   - $(document).ready(function(){
50   - $(window).bind('scroll', loadOnScroll);
51   - });
52   - </script>
  50 + $(document).ready(function(){
  51 + $(window).bind('scroll', loadOnScroll);
  52 + });
  53 + </script>
  54 + {% endif %}
53 55 {% endblock %}
54 56  
55 57 {% block breadcrumbs %}
... ... @@ -73,6 +75,7 @@
73 75 {% if user|has_role:'student' or not user.is_staff %}
74 76 <li><a href="{% url 'course:manage' %}">{% trans 'My courses' %}</a></li>
75 77 {% endif %}
  78 + <li><a href="{% url 'core:guest' %}">{% trans 'All Courses' %}</a></li>
76 79 {% if user|has_role:'system_admin' %}
77 80 <li> <a href="{% url 'users:manage' %}">{% trans 'Manage Users' %}</a></li>
78 81 {% endif %}
... ...
app/templates/home_student.html
... ... @@ -24,6 +24,7 @@
24 24 <ul class="nav nav-pills nav-stacked">
25 25 <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li>
26 26 <li><a href="{% url 'course:manage' %}">{% trans 'My Courses' %}</a></li>
  27 + <li><a href="{% url 'core:guest' %}">{% trans 'All Courses' %}</a></li>
27 28 <li><a href="javascript:void(0)">{% trans 'Google accounts' %}</a></li>
28 29 </ul>
29 30 </div>
... ...
app/templates/home_teacher_student_content.html
... ... @@ -4,19 +4,14 @@
4 4  
5 5  
6 6 <div class="well timeLine">
7   - <div class="row">
8   - <div class="col-md-12">
9   - <p><a href="#"></a></p><h6><a href="#"><i>Default Path to Notification</i></a></h6><p></p>
10   - </div>
11   - </div>
  7 +
12 8 <div class="row">
13 9 <div class="col-xs-2 col-md-1">
14   - <img class="imgTimeLine" src="{{ notification.user.image_url }}">
  10 + <img class="imgTimeLine" src="{{ notification.actor.image_url }}">
15 11 </div>
16 12 <div class="col-xs-10 col-md-11">
17   - <i class="fa fa-pencil-square-o" aria-hidden="true"></i>
18   - <a href=""><h4 class="resource_inline"><b>{{ notification.user }}</b></h4></a>
19   - <p class="resource_inline">{{notification.message}} em : <a href="{% url 'core:notification_read' notification.id %}">Recurso</a></p>
  13 + <h4 class="resource_inline"><b>{{ notification.actor.username }}</b></h4>
  14 + <p class="resource_inline">{{notification.message}} em : <a href="{% url 'core:notification_read' notification.id %}">{{ notification.action_resource.resource.name }}</a></p>
20 15 <p class="timePost"><i> {{ notification.datetime|timesince }} {% trans "ago" %} </i></p>
21 16 </div>
22 17 </div>
... ...
app/views.py
... ... @@ -18,8 +18,6 @@ class AppIndex(LoginRequiredMixin, LogMixin, ListView, NotificationMixin):
18 18 context_object_name = 'objects'
19 19 paginate_by = 10
20 20  
21   -
22   -
23 21 def get_queryset(self):
24 22 if self.request.user.is_staff:
25 23 objects = Course.objects.all()
... ... @@ -42,7 +40,6 @@ class AppIndex(LoginRequiredMixin, LogMixin, ListView, NotificationMixin):
42 40 else:
43 41 self.template_name = "home_teacher_student_content.html"
44 42  
45   - super(AppIndex, self).createNotification("testando notificacao de login", resource_name="home", resource_link="/")
46 43 return self.response_class(request = self.request, template = self.template_name, context = context, using = self.template_engine, **response_kwargs)
47 44  
48 45  
... ...
core/decorators.py
... ... @@ -60,7 +60,7 @@ def notification_decorator(read = False, message = &#39;&#39;, actor = None, users = [],
60 60 if action.exists():
61 61 action = action[0]
62 62 else:
63   - action = Action(name = not_action)
  63 + action = Action(name = not_action)
64 64 action.save()
65 65  
66 66 if resource.exists():
... ...
core/locale/pt_BR/LC_MESSAGES/django.po
... ... @@ -20,7 +20,7 @@ msgstr &quot;&quot;
20 20  
21 21 #: core/models.py:15 core/models.py:36
22 22 msgid "Name"
23   -msgstr ""
  23 +msgstr "Nome"
24 24  
25 25 #: core/models.py:16 core/models.py:37
26 26 msgid "Created Date"
... ... @@ -36,7 +36,7 @@ msgstr &quot;&quot;
36 36  
37 37 #: core/models.py:61
38 38 msgid "message"
39   -msgstr ""
  39 +msgstr "mensagem"
40 40  
41 41 #: core/models.py:62
42 42 msgid "Actor"
... ... @@ -64,11 +64,11 @@ msgstr &quot;Senha&quot;
64 64  
65 65 #: core/templates/index.html:44
66 66 msgid "Remember Email"
67   -msgstr ""
  67 +msgstr "Lembrar Senha"
68 68  
69 69 #: core/templates/index.html:53
70 70 msgid "Guest"
71   -msgstr ""
  71 +msgstr "Convidado"
72 72  
73 73 #: core/templates/index.html:56
74 74 msgid "Login"
... ... @@ -80,11 +80,11 @@ msgstr &quot;Cadastrar&quot;
80 80  
81 81 #: core/templates/register_user.html:29
82 82 msgid "User Register"
83   -msgstr ""
  83 +msgstr "Registrar Usuário"
84 84  
85 85 #: core/templates/register_user.html:53
86 86 msgid "Save"
87   -msgstr ""
  87 +msgstr "Salvar"
88 88  
89 89 #: core/templates/remember_password.html:18
90 90 msgid "E-mail"
... ... @@ -92,7 +92,7 @@ msgstr &quot;E-mail&quot;
92 92  
93 93 #: core/templates/remember_password.html:22
94 94 msgid "Registration"
95   -msgstr ""
  95 +msgstr "Registrar"
96 96  
97 97 #: core/templates/remember_password.html:26
98 98 msgid "Send"
... ... @@ -100,7 +100,7 @@ msgstr &quot;Enviar&quot;
100 100  
101 101 #: core/views.py:31
102 102 msgid "User successfully registered!"
103   -msgstr ""
  103 +msgstr "Usuario cadastrado com sucesso"
104 104  
105 105 #: core/views.py:54
106 106 msgid "E-mail or password are incorrect!"
... ...
core/migrations/0001_initial.py
1 1 # -*- coding: utf-8 -*-
2   -# Generated by Django 1.10 on 2016-10-18 21:42
  2 +# Generated by Django 1.10 on 2016-10-24 18:59
3 3 from __future__ import unicode_literals
4 4  
5 5 import autoslug.fields
... ... @@ -20,11 +20,12 @@ class Migration(migrations.Migration):
20 20 fields=[
21 21 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
22 22 ('name', models.CharField(max_length=100, verbose_name='Name')),
  23 + ('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True, verbose_name='Slug')),
23 24 ('created_date', models.DateField(auto_now_add=True, verbose_name='Created Date')),
24 25 ],
25 26 options={
26   - 'verbose_name': 'Action',
27 27 'verbose_name_plural': 'Actions',
  28 + 'verbose_name': 'Action',
28 29 },
29 30 ),
30 31 migrations.CreateModel(
... ... @@ -33,8 +34,8 @@ class Migration(migrations.Migration):
33 34 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
34 35 ],
35 36 options={
36   - 'verbose_name': 'Action_Resource',
37 37 'verbose_name_plural': 'Action_Resources',
  38 + 'verbose_name': 'Action_Resource',
38 39 },
39 40 ),
40 41 migrations.CreateModel(
... ... @@ -44,8 +45,8 @@ class Migration(migrations.Migration):
44 45 ('datetime', models.DateTimeField(auto_now_add=True, verbose_name='Date and Time of action')),
45 46 ],
46 47 options={
47   - 'verbose_name': 'Log',
48 48 'verbose_name_plural': 'Logs',
  49 + 'verbose_name': 'Log',
49 50 },
50 51 ),
51 52 migrations.CreateModel(
... ... @@ -56,8 +57,8 @@ class Migration(migrations.Migration):
56 57 ('icon', models.CharField(max_length=50, unique=True, verbose_name='Icon')),
57 58 ],
58 59 options={
59   - 'verbose_name': 'Amadeus Mime Type',
60 60 'verbose_name_plural': 'Amadeus Mime Types',
  61 + 'verbose_name': 'Amadeus Mime Type',
61 62 },
62 63 ),
63 64 migrations.CreateModel(
... ... @@ -70,8 +71,8 @@ class Migration(migrations.Migration):
70 71 ('action_resource', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action_Resource', verbose_name='Action_Resource')),
71 72 ],
72 73 options={
73   - 'verbose_name': 'Notification',
74 74 'verbose_name_plural': 'Notifications',
  75 + 'verbose_name': 'Notification',
75 76 },
76 77 ),
77 78 migrations.CreateModel(
... ... @@ -84,8 +85,8 @@ class Migration(migrations.Migration):
84 85 ('url', models.CharField(default='', max_length=100, verbose_name='URL')),
85 86 ],
86 87 options={
87   - 'verbose_name': 'Resource',
88 88 'verbose_name_plural': 'Resources',
  89 + 'verbose_name': 'Resource',
89 90 },
90 91 ),
91 92 ]
... ...
core/migrations/0002_auto_20161018_1842.py
... ... @@ -1,50 +0,0 @@
1   -# -*- coding: utf-8 -*-
2   -# Generated by Django 1.10 on 2016-10-18 21:42
3   -from __future__ import unicode_literals
4   -
5   -from django.conf import settings
6   -from django.db import migrations, models
7   -import django.db.models.deletion
8   -
9   -
10   -class Migration(migrations.Migration):
11   -
12   - initial = True
13   -
14   - dependencies = [
15   - migrations.swappable_dependency(settings.AUTH_USER_MODEL),
16   - ('core', '0001_initial'),
17   - ]
18   -
19   - operations = [
20   - migrations.AddField(
21   - model_name='notification',
22   - name='actor',
23   - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notification_Performer', to=settings.AUTH_USER_MODEL, verbose_name='Perfomer'),
24   - ),
25   - migrations.AddField(
26   - model_name='notification',
27   - name='user',
28   - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notification_Actor', to=settings.AUTH_USER_MODEL, verbose_name='User'),
29   - ),
30   - migrations.AddField(
31   - model_name='log',
32   - name='action_resource',
33   - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action_Resource', verbose_name='Action_Resource'),
34   - ),
35   - migrations.AddField(
36   - model_name='log',
37   - name='user',
38   - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Actor'),
39   - ),
40   - migrations.AddField(
41   - model_name='action_resource',
42   - name='action',
43   - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action', verbose_name='Action_Applied'),
44   - ),
45   - migrations.AddField(
46   - model_name='action_resource',
47   - name='resource',
48   - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Resource', verbose_name='Resource'),
49   - ),
50   - ]
core/migrations/0002_auto_20161024_1559.py 0 → 100644
... ... @@ -0,0 +1,50 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-10-24 18:59
  3 +from __future__ import unicode_literals
  4 +
  5 +from django.conf import settings
  6 +from django.db import migrations, models
  7 +import django.db.models.deletion
  8 +
  9 +
  10 +class Migration(migrations.Migration):
  11 +
  12 + initial = True
  13 +
  14 + dependencies = [
  15 + migrations.swappable_dependency(settings.AUTH_USER_MODEL),
  16 + ('core', '0001_initial'),
  17 + ]
  18 +
  19 + operations = [
  20 + migrations.AddField(
  21 + model_name='notification',
  22 + name='actor',
  23 + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notification_Performer', to=settings.AUTH_USER_MODEL, verbose_name='Perfomer'),
  24 + ),
  25 + migrations.AddField(
  26 + model_name='notification',
  27 + name='user',
  28 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notification_Actor', to=settings.AUTH_USER_MODEL, verbose_name='User'),
  29 + ),
  30 + migrations.AddField(
  31 + model_name='log',
  32 + name='action_resource',
  33 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action_Resource', verbose_name='Action_Resource'),
  34 + ),
  35 + migrations.AddField(
  36 + model_name='log',
  37 + name='user',
  38 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Actor'),
  39 + ),
  40 + migrations.AddField(
  41 + model_name='action_resource',
  42 + name='action',
  43 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action', verbose_name='Action_Applied'),
  44 + ),
  45 + migrations.AddField(
  46 + model_name='action_resource',
  47 + name='resource',
  48 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Resource', verbose_name='Resource'),
  49 + ),
  50 + ]
... ...
core/mixins.py
... ... @@ -41,22 +41,25 @@ class LogMixin(object):
41 41 class NotificationMixin(object):
42 42 message = ""
43 43 read = False
44   - action_name = ''
  44 + action_slug = ''
45 45 resource_name = ''
46 46  
47   - def createNotification(self, message='', actor=None, users = User.objects.all(), resource_slug='' ,action_name = '', resource_name='', resource_link=''): #the default will be a broadcast
48   - action = Action.objects.filter(name = action_name)
  47 + def createNotification(self, message='', actor=None, users = User.objects.all(), resource_slug='' ,action_slug = '',
  48 + resource_name='', resource_link=''): #the default will be a broadcast
  49 + action = Action.objects.filter(slug = action_slug)
49 50 resource = Resource.objects.filter(slug = resource_slug)
50 51 if action.exists():
51 52 action = action[0]
52 53 else:
53   - action = Action(name = self.action_name)
  54 + action = Action(name = action_slug)
54 55 action.save()
55 56  
56 57 if resource.exists():
57 58 resource = resource[0]
  59 + resource.url = resource_link
  60 + resource.save()
58 61 else:
59   - resource = Resource(name = self.resource_name, url= resource_link)
  62 + resource = Resource(name = resource_name, url= resource_link)
60 63 resource.save()
61 64  
62 65 action_resource = Action_Resource.objects.filter(action = action, resource = resource)
... ... @@ -76,3 +79,9 @@ class NotificationMixin(object):
76 79 """
77 80 Not quite sure how to do about it"""
78 81 return super(NotificationMixin, self).dispatch(request, *args, **kwargs)
  82 +
  83 + def createorRetrieveAction(self, action_name):
  84 + action = Action.objects.filter(name=action_name)
  85 + if action is None:
  86 + action = Action(name=action_name)
  87 + return action
79 88 \ No newline at end of file
... ...
core/models.py
... ... @@ -25,6 +25,7 @@ class Action(models.Model):
25 25 """
26 26  
27 27 name = models.CharField(_('Name'), max_length = 100)
  28 + slug = AutoSlugField(_("Slug"), populate_from=('name'), unique=True)
28 29 created_date = models.DateField(_('Created Date'), auto_now_add=True)
29 30  
30 31 class Meta:
... ... @@ -84,7 +85,7 @@ class Notification(models.Model):
84 85 @action_resource: The Object that holds the information about which action was perfomed on the Resource
85 86 @actor: The user who applied the action
86 87 """
87   -
  88 +
88 89 message = models.TextField(_('Message'))
89 90 user = models.ForeignKey(User, related_name = _('%(class)s_Actor'), verbose_name= _('User'))
90 91 read = models.BooleanField(_('Read'), default = False)
... ...
core/static/css/base/amadeus.css
... ... @@ -12,7 +12,11 @@
12 12 #notification-dropdown{
13 13 max-height: 500%;
14 14 overflow: auto;
15   - width: 200px;
  15 + width: 300px;
  16 +}
  17 +
  18 +.user-notification-img{
  19 + width:40%;
16 20 }
17 21  
18 22 /* HEADER */
... ... @@ -359,4 +363,35 @@ ul, li {
359 363 .block-register-inline{
360 364 float: left;
361 365 display: inline-block;
  366 +}
  367 +
  368 +/* core/reset_password.html classes*/
  369 +.send-reset-email{
  370 + float: right;
  371 +}
  372 +
  373 +/* forum post loaded */
  374 +@-webkit-keyframes loaded {
  375 + 0% {
  376 + background-color: Yellow;
  377 + opacity: 0.2;
  378 + }
  379 + 22% {
  380 + background-color: Yellow;
  381 + opacity: 0.3;
  382 + }
  383 + 77% {
  384 + background-color: Yellow;
  385 + opacity: 0.6;
  386 + }
  387 + 100% {
  388 + background-color: White;
  389 + }
  390 +}
  391 +
  392 +.loaded {
  393 + -webkit-animation-name: loaded;
  394 + -webkit-animation-duration: 900ms;
  395 + -webkit-animation-iteration-count: 3;
  396 + -webkit-animation-timing-function: ease-in-out;
362 397 }
363 398 \ No newline at end of file
... ...
core/static/css/vendor/bootstrap-datepicker.standalone.css 0 → 100644
... ... @@ -0,0 +1,510 @@
  1 +/*!
  2 + * Datepicker for Bootstrap v1.7.0-dev (https://github.com/uxsolutions/bootstrap-datepicker)
  3 + *
  4 + * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
  5 + */
  6 +
  7 +.datepicker {
  8 + padding: 4px;
  9 + -webkit-border-radius: 4px;
  10 + -moz-border-radius: 4px;
  11 + border-radius: 4px;
  12 + direction: ltr;
  13 +}
  14 +.datepicker-inline {
  15 + width: 220px;
  16 +}
  17 +.datepicker.datepicker-rtl {
  18 + direction: rtl;
  19 +}
  20 +.datepicker.datepicker-rtl.dropdown-menu {
  21 + left: auto;
  22 +}
  23 +.datepicker.datepicker-rtl table tr td span {
  24 + float: right;
  25 +}
  26 +.datepicker-dropdown {
  27 + top: 0;
  28 + left: 0;
  29 +}
  30 +.datepicker-dropdown:before {
  31 + content: '';
  32 + display: inline-block;
  33 + border-left: 7px solid transparent;
  34 + border-right: 7px solid transparent;
  35 + border-bottom: 7px solid #999999;
  36 + border-top: 0;
  37 + border-bottom-color: rgba(0, 0, 0, 0.2);
  38 + position: absolute;
  39 +}
  40 +.datepicker-dropdown:after {
  41 + content: '';
  42 + display: inline-block;
  43 + border-left: 6px solid transparent;
  44 + border-right: 6px solid transparent;
  45 + border-bottom: 6px solid #ffffff;
  46 + border-top: 0;
  47 + position: absolute;
  48 +}
  49 +.datepicker-dropdown.datepicker-orient-left:before {
  50 + left: 6px;
  51 +}
  52 +.datepicker-dropdown.datepicker-orient-left:after {
  53 + left: 7px;
  54 +}
  55 +.datepicker-dropdown.datepicker-orient-right:before {
  56 + right: 6px;
  57 +}
  58 +.datepicker-dropdown.datepicker-orient-right:after {
  59 + right: 7px;
  60 +}
  61 +.datepicker-dropdown.datepicker-orient-bottom:before {
  62 + top: -7px;
  63 +}
  64 +.datepicker-dropdown.datepicker-orient-bottom:after {
  65 + top: -6px;
  66 +}
  67 +.datepicker-dropdown.datepicker-orient-top:before {
  68 + bottom: -7px;
  69 + border-bottom: 0;
  70 + border-top: 7px solid #999999;
  71 +}
  72 +.datepicker-dropdown.datepicker-orient-top:after {
  73 + bottom: -6px;
  74 + border-bottom: 0;
  75 + border-top: 6px solid #ffffff;
  76 +}
  77 +.datepicker table {
  78 + margin: 0;
  79 + -webkit-touch-callout: none;
  80 + -webkit-user-select: none;
  81 + -khtml-user-select: none;
  82 + -moz-user-select: none;
  83 + -ms-user-select: none;
  84 + user-select: none;
  85 +}
  86 +.datepicker td,
  87 +.datepicker th {
  88 + text-align: center;
  89 + width: 20px;
  90 + height: 20px;
  91 + -webkit-border-radius: 4px;
  92 + -moz-border-radius: 4px;
  93 + border-radius: 4px;
  94 + border: none;
  95 +}
  96 +.table-striped .datepicker table tr td,
  97 +.table-striped .datepicker table tr th {
  98 + background-color: transparent;
  99 +}
  100 +.datepicker table tr td.day:hover,
  101 +.datepicker table tr td.day.focused {
  102 + background: #eeeeee;
  103 + cursor: pointer;
  104 +}
  105 +.datepicker table tr td.old,
  106 +.datepicker table tr td.new {
  107 + color: #999999;
  108 +}
  109 +.datepicker table tr td.disabled,
  110 +.datepicker table tr td.disabled:hover {
  111 + background: none;
  112 + color: #999999;
  113 + cursor: default;
  114 +}
  115 +.datepicker table tr td.highlighted {
  116 + background: #d9edf7;
  117 + border-radius: 0;
  118 +}
  119 +.datepicker table tr td.today,
  120 +.datepicker table tr td.today:hover,
  121 +.datepicker table tr td.today.disabled,
  122 +.datepicker table tr td.today.disabled:hover {
  123 + background-color: #fde19a;
  124 + background-image: -moz-linear-gradient(to bottom, #fdd49a, #fdf59a);
  125 + background-image: -ms-linear-gradient(to bottom, #fdd49a, #fdf59a);
  126 + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));
  127 + background-image: -webkit-linear-gradient(to bottom, #fdd49a, #fdf59a);
  128 + background-image: -o-linear-gradient(to bottom, #fdd49a, #fdf59a);
  129 + background-image: linear-gradient(to bottom, #fdd49a, #fdf59a);
  130 + background-repeat: repeat-x;
  131 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);
  132 + border-color: #fdf59a #fdf59a #fbed50;
  133 + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
  134 + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
  135 + color: #000;
  136 +}
  137 +.datepicker table tr td.today:hover,
  138 +.datepicker table tr td.today:hover:hover,
  139 +.datepicker table tr td.today.disabled:hover,
  140 +.datepicker table tr td.today.disabled:hover:hover,
  141 +.datepicker table tr td.today:active,
  142 +.datepicker table tr td.today:hover:active,
  143 +.datepicker table tr td.today.disabled:active,
  144 +.datepicker table tr td.today.disabled:hover:active,
  145 +.datepicker table tr td.today.active,
  146 +.datepicker table tr td.today:hover.active,
  147 +.datepicker table tr td.today.disabled.active,
  148 +.datepicker table tr td.today.disabled:hover.active,
  149 +.datepicker table tr td.today.disabled,
  150 +.datepicker table tr td.today:hover.disabled,
  151 +.datepicker table tr td.today.disabled.disabled,
  152 +.datepicker table tr td.today.disabled:hover.disabled,
  153 +.datepicker table tr td.today[disabled],
  154 +.datepicker table tr td.today:hover[disabled],
  155 +.datepicker table tr td.today.disabled[disabled],
  156 +.datepicker table tr td.today.disabled:hover[disabled] {
  157 + background-color: #fdf59a;
  158 +}
  159 +.datepicker table tr td.today:active,
  160 +.datepicker table tr td.today:hover:active,
  161 +.datepicker table tr td.today.disabled:active,
  162 +.datepicker table tr td.today.disabled:hover:active,
  163 +.datepicker table tr td.today.active,
  164 +.datepicker table tr td.today:hover.active,
  165 +.datepicker table tr td.today.disabled.active,
  166 +.datepicker table tr td.today.disabled:hover.active {
  167 + background-color: #fbf069 \9;
  168 +}
  169 +.datepicker table tr td.today:hover:hover {
  170 + color: #000;
  171 +}
  172 +.datepicker table tr td.today.active:hover {
  173 + color: #fff;
  174 +}
  175 +.datepicker table tr td.range,
  176 +.datepicker table tr td.range:hover,
  177 +.datepicker table tr td.range.disabled,
  178 +.datepicker table tr td.range.disabled:hover {
  179 + background: #eeeeee;
  180 + -webkit-border-radius: 0;
  181 + -moz-border-radius: 0;
  182 + border-radius: 0;
  183 +}
  184 +.datepicker table tr td.range.today,
  185 +.datepicker table tr td.range.today:hover,
  186 +.datepicker table tr td.range.today.disabled,
  187 +.datepicker table tr td.range.today.disabled:hover {
  188 + background-color: #f3d17a;
  189 + background-image: -moz-linear-gradient(to bottom, #f3c17a, #f3e97a);
  190 + background-image: -ms-linear-gradient(to bottom, #f3c17a, #f3e97a);
  191 + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a));
  192 + background-image: -webkit-linear-gradient(to bottom, #f3c17a, #f3e97a);
  193 + background-image: -o-linear-gradient(to bottom, #f3c17a, #f3e97a);
  194 + background-image: linear-gradient(to bottom, #f3c17a, #f3e97a);
  195 + background-repeat: repeat-x;
  196 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);
  197 + border-color: #f3e97a #f3e97a #edde34;
  198 + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
  199 + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
  200 + -webkit-border-radius: 0;
  201 + -moz-border-radius: 0;
  202 + border-radius: 0;
  203 +}
  204 +.datepicker table tr td.range.today:hover,
  205 +.datepicker table tr td.range.today:hover:hover,
  206 +.datepicker table tr td.range.today.disabled:hover,
  207 +.datepicker table tr td.range.today.disabled:hover:hover,
  208 +.datepicker table tr td.range.today:active,
  209 +.datepicker table tr td.range.today:hover:active,
  210 +.datepicker table tr td.range.today.disabled:active,
  211 +.datepicker table tr td.range.today.disabled:hover:active,
  212 +.datepicker table tr td.range.today.active,
  213 +.datepicker table tr td.range.today:hover.active,
  214 +.datepicker table tr td.range.today.disabled.active,
  215 +.datepicker table tr td.range.today.disabled:hover.active,
  216 +.datepicker table tr td.range.today.disabled,
  217 +.datepicker table tr td.range.today:hover.disabled,
  218 +.datepicker table tr td.range.today.disabled.disabled,
  219 +.datepicker table tr td.range.today.disabled:hover.disabled,
  220 +.datepicker table tr td.range.today[disabled],
  221 +.datepicker table tr td.range.today:hover[disabled],
  222 +.datepicker table tr td.range.today.disabled[disabled],
  223 +.datepicker table tr td.range.today.disabled:hover[disabled] {
  224 + background-color: #f3e97a;
  225 +}
  226 +.datepicker table tr td.range.today:active,
  227 +.datepicker table tr td.range.today:hover:active,
  228 +.datepicker table tr td.range.today.disabled:active,
  229 +.datepicker table tr td.range.today.disabled:hover:active,
  230 +.datepicker table tr td.range.today.active,
  231 +.datepicker table tr td.range.today:hover.active,
  232 +.datepicker table tr td.range.today.disabled.active,
  233 +.datepicker table tr td.range.today.disabled:hover.active {
  234 + background-color: #efe24b \9;
  235 +}
  236 +.datepicker table tr td.selected,
  237 +.datepicker table tr td.selected:hover,
  238 +.datepicker table tr td.selected.disabled,
  239 +.datepicker table tr td.selected.disabled:hover {
  240 + background-color: #9e9e9e;
  241 + background-image: -moz-linear-gradient(to bottom, #b3b3b3, #808080);
  242 + background-image: -ms-linear-gradient(to bottom, #b3b3b3, #808080);
  243 + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080));
  244 + background-image: -webkit-linear-gradient(to bottom, #b3b3b3, #808080);
  245 + background-image: -o-linear-gradient(to bottom, #b3b3b3, #808080);
  246 + background-image: linear-gradient(to bottom, #b3b3b3, #808080);
  247 + background-repeat: repeat-x;
  248 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);
  249 + border-color: #808080 #808080 #595959;
  250 + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
  251 + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
  252 + color: #fff;
  253 + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
  254 +}
  255 +.datepicker table tr td.selected:hover,
  256 +.datepicker table tr td.selected:hover:hover,
  257 +.datepicker table tr td.selected.disabled:hover,
  258 +.datepicker table tr td.selected.disabled:hover:hover,
  259 +.datepicker table tr td.selected:active,
  260 +.datepicker table tr td.selected:hover:active,
  261 +.datepicker table tr td.selected.disabled:active,
  262 +.datepicker table tr td.selected.disabled:hover:active,
  263 +.datepicker table tr td.selected.active,
  264 +.datepicker table tr td.selected:hover.active,
  265 +.datepicker table tr td.selected.disabled.active,
  266 +.datepicker table tr td.selected.disabled:hover.active,
  267 +.datepicker table tr td.selected.disabled,
  268 +.datepicker table tr td.selected:hover.disabled,
  269 +.datepicker table tr td.selected.disabled.disabled,
  270 +.datepicker table tr td.selected.disabled:hover.disabled,
  271 +.datepicker table tr td.selected[disabled],
  272 +.datepicker table tr td.selected:hover[disabled],
  273 +.datepicker table tr td.selected.disabled[disabled],
  274 +.datepicker table tr td.selected.disabled:hover[disabled] {
  275 + background-color: #808080;
  276 +}
  277 +.datepicker table tr td.selected:active,
  278 +.datepicker table tr td.selected:hover:active,
  279 +.datepicker table tr td.selected.disabled:active,
  280 +.datepicker table tr td.selected.disabled:hover:active,
  281 +.datepicker table tr td.selected.active,
  282 +.datepicker table tr td.selected:hover.active,
  283 +.datepicker table tr td.selected.disabled.active,
  284 +.datepicker table tr td.selected.disabled:hover.active {
  285 + background-color: #666666 \9;
  286 +}
  287 +.datepicker table tr td.active,
  288 +.datepicker table tr td.active:hover,
  289 +.datepicker table tr td.active.disabled,
  290 +.datepicker table tr td.active.disabled:hover {
  291 + background-color: #006dcc;
  292 + background-image: -moz-linear-gradient(to bottom, #0088cc, #0044cc);
  293 + background-image: -ms-linear-gradient(to bottom, #0088cc, #0044cc);
  294 + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
  295 + background-image: -webkit-linear-gradient(to bottom, #0088cc, #0044cc);
  296 + background-image: -o-linear-gradient(to bottom, #0088cc, #0044cc);
  297 + background-image: linear-gradient(to bottom, #0088cc, #0044cc);
  298 + background-repeat: repeat-x;
  299 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
  300 + border-color: #0044cc #0044cc #002a80;
  301 + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
  302 + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
  303 + color: #fff;
  304 + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
  305 +}
  306 +.datepicker table tr td.active:hover,
  307 +.datepicker table tr td.active:hover:hover,
  308 +.datepicker table tr td.active.disabled:hover,
  309 +.datepicker table tr td.active.disabled:hover:hover,
  310 +.datepicker table tr td.active:active,
  311 +.datepicker table tr td.active:hover:active,
  312 +.datepicker table tr td.active.disabled:active,
  313 +.datepicker table tr td.active.disabled:hover:active,
  314 +.datepicker table tr td.active.active,
  315 +.datepicker table tr td.active:hover.active,
  316 +.datepicker table tr td.active.disabled.active,
  317 +.datepicker table tr td.active.disabled:hover.active,
  318 +.datepicker table tr td.active.disabled,
  319 +.datepicker table tr td.active:hover.disabled,
  320 +.datepicker table tr td.active.disabled.disabled,
  321 +.datepicker table tr td.active.disabled:hover.disabled,
  322 +.datepicker table tr td.active[disabled],
  323 +.datepicker table tr td.active:hover[disabled],
  324 +.datepicker table tr td.active.disabled[disabled],
  325 +.datepicker table tr td.active.disabled:hover[disabled] {
  326 + background-color: #0044cc;
  327 +}
  328 +.datepicker table tr td.active:active,
  329 +.datepicker table tr td.active:hover:active,
  330 +.datepicker table tr td.active.disabled:active,
  331 +.datepicker table tr td.active.disabled:hover:active,
  332 +.datepicker table tr td.active.active,
  333 +.datepicker table tr td.active:hover.active,
  334 +.datepicker table tr td.active.disabled.active,
  335 +.datepicker table tr td.active.disabled:hover.active {
  336 + background-color: #003399 \9;
  337 +}
  338 +.datepicker table tr td span {
  339 + display: block;
  340 + width: 23%;
  341 + height: 54px;
  342 + line-height: 54px;
  343 + float: left;
  344 + margin: 1%;
  345 + cursor: pointer;
  346 + -webkit-border-radius: 4px;
  347 + -moz-border-radius: 4px;
  348 + border-radius: 4px;
  349 +}
  350 +.datepicker table tr td span:hover,
  351 +.datepicker table tr td span.focused {
  352 + background: #eeeeee;
  353 +}
  354 +.datepicker table tr td span.disabled,
  355 +.datepicker table tr td span.disabled:hover {
  356 + background: none;
  357 + color: #999999;
  358 + cursor: default;
  359 +}
  360 +.datepicker table tr td span.active,
  361 +.datepicker table tr td span.active:hover,
  362 +.datepicker table tr td span.active.disabled,
  363 +.datepicker table tr td span.active.disabled:hover {
  364 + background-color: #006dcc;
  365 + background-image: -moz-linear-gradient(to bottom, #0088cc, #0044cc);
  366 + background-image: -ms-linear-gradient(to bottom, #0088cc, #0044cc);
  367 + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
  368 + background-image: -webkit-linear-gradient(to bottom, #0088cc, #0044cc);
  369 + background-image: -o-linear-gradient(to bottom, #0088cc, #0044cc);
  370 + background-image: linear-gradient(to bottom, #0088cc, #0044cc);
  371 + background-repeat: repeat-x;
  372 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
  373 + border-color: #0044cc #0044cc #002a80;
  374 + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
  375 + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
  376 + color: #fff;
  377 + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
  378 +}
  379 +.datepicker table tr td span.active:hover,
  380 +.datepicker table tr td span.active:hover:hover,
  381 +.datepicker table tr td span.active.disabled:hover,
  382 +.datepicker table tr td span.active.disabled:hover:hover,
  383 +.datepicker table tr td span.active:active,
  384 +.datepicker table tr td span.active:hover:active,
  385 +.datepicker table tr td span.active.disabled:active,
  386 +.datepicker table tr td span.active.disabled:hover:active,
  387 +.datepicker table tr td span.active.active,
  388 +.datepicker table tr td span.active:hover.active,
  389 +.datepicker table tr td span.active.disabled.active,
  390 +.datepicker table tr td span.active.disabled:hover.active,
  391 +.datepicker table tr td span.active.disabled,
  392 +.datepicker table tr td span.active:hover.disabled,
  393 +.datepicker table tr td span.active.disabled.disabled,
  394 +.datepicker table tr td span.active.disabled:hover.disabled,
  395 +.datepicker table tr td span.active[disabled],
  396 +.datepicker table tr td span.active:hover[disabled],
  397 +.datepicker table tr td span.active.disabled[disabled],
  398 +.datepicker table tr td span.active.disabled:hover[disabled] {
  399 + background-color: #0044cc;
  400 +}
  401 +.datepicker table tr td span.active:active,
  402 +.datepicker table tr td span.active:hover:active,
  403 +.datepicker table tr td span.active.disabled:active,
  404 +.datepicker table tr td span.active.disabled:hover:active,
  405 +.datepicker table tr td span.active.active,
  406 +.datepicker table tr td span.active:hover.active,
  407 +.datepicker table tr td span.active.disabled.active,
  408 +.datepicker table tr td span.active.disabled:hover.active {
  409 + background-color: #003399 \9;
  410 +}
  411 +.datepicker table tr td span.old,
  412 +.datepicker table tr td span.new {
  413 + color: #999999;
  414 +}
  415 +.datepicker .datepicker-switch {
  416 + width: 145px;
  417 +}
  418 +.datepicker .datepicker-switch,
  419 +.datepicker .prev,
  420 +.datepicker .next,
  421 +.datepicker tfoot tr th {
  422 + cursor: pointer;
  423 +}
  424 +.datepicker .datepicker-switch:hover,
  425 +.datepicker .prev:hover,
  426 +.datepicker .next:hover,
  427 +.datepicker tfoot tr th:hover {
  428 + background: #eeeeee;
  429 +}
  430 +.datepicker .prev.disabled,
  431 +.datepicker .next.disabled {
  432 + visibility: hidden;
  433 +}
  434 +.datepicker .cw {
  435 + font-size: 10px;
  436 + width: 12px;
  437 + padding: 0 2px 0 5px;
  438 + vertical-align: middle;
  439 +}
  440 +.input-append.date .add-on,
  441 +.input-prepend.date .add-on {
  442 + cursor: pointer;
  443 +}
  444 +.input-append.date .add-on i,
  445 +.input-prepend.date .add-on i {
  446 + margin-top: 3px;
  447 +}
  448 +.input-daterange input {
  449 + text-align: center;
  450 +}
  451 +.input-daterange input:first-child {
  452 + -webkit-border-radius: 3px 0 0 3px;
  453 + -moz-border-radius: 3px 0 0 3px;
  454 + border-radius: 3px 0 0 3px;
  455 +}
  456 +.input-daterange input:last-child {
  457 + -webkit-border-radius: 0 3px 3px 0;
  458 + -moz-border-radius: 0 3px 3px 0;
  459 + border-radius: 0 3px 3px 0;
  460 +}
  461 +.input-daterange .add-on {
  462 + display: inline-block;
  463 + width: auto;
  464 + min-width: 16px;
  465 + height: 20px;
  466 + padding: 4px 5px;
  467 + font-weight: normal;
  468 + line-height: 20px;
  469 + text-align: center;
  470 + text-shadow: 0 1px 0 #ffffff;
  471 + vertical-align: middle;
  472 + background-color: #eeeeee;
  473 + border: 1px solid #ccc;
  474 + margin-left: -5px;
  475 + margin-right: -5px;
  476 +}
  477 +.datepicker.dropdown-menu {
  478 + position: absolute;
  479 + top: 100%;
  480 + left: 0;
  481 + z-index: 1000;
  482 + float: left;
  483 + display: none;
  484 + min-width: 160px;
  485 + list-style: none;
  486 + background-color: #ffffff;
  487 + border: 1px solid #ccc;
  488 + border: 1px solid rgba(0, 0, 0, 0.2);
  489 + -webkit-border-radius: 5px;
  490 + -moz-border-radius: 5px;
  491 + border-radius: 5px;
  492 + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
  493 + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
  494 + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
  495 + -webkit-background-clip: padding-box;
  496 + -moz-background-clip: padding;
  497 + background-clip: padding-box;
  498 + *border-right-width: 2px;
  499 + *border-bottom-width: 2px;
  500 + color: #333333;
  501 + font-size: 13px;
  502 + line-height: 20px;
  503 +}
  504 +.datepicker.dropdown-menu th,
  505 +.datepicker.datepicker-inline th,
  506 +.datepicker.dropdown-menu td,
  507 +.datepicker.datepicker-inline td {
  508 + padding: 4px 5px;
  509 +}
  510 +/*# sourceMappingURL=bootstrap-datepicker.standalone.css.map */
0 511 \ No newline at end of file
... ...
core/static/css/vendor/datepicker.css
... ... @@ -1,182 +0,0 @@
1   -/*!
2   - * Datepicker for Bootstrap
3   - *
4   - * Copyright 2012 Stefan Petre
5   - * Licensed under the Apache License v2.0
6   - * http://www.apache.org/licenses/LICENSE-2.0
7   - *
8   - */
9   -.datepicker {
10   - top: 0;
11   - left: 0;
12   - padding: 4px;
13   - margin-top: 1px;
14   - -webkit-border-radius: 4px;
15   - -moz-border-radius: 4px;
16   - border-radius: 4px;
17   - /*.dow {
18   - border-top: 1px solid #ddd !important;
19   - }*/
20   -
21   -}
22   -.datepicker:before {
23   - content: '';
24   - display: inline-block;
25   - border-left: 7px solid transparent;
26   - border-right: 7px solid transparent;
27   - border-bottom: 7px solid #ccc;
28   - border-bottom-color: rgba(0, 0, 0, 0.2);
29   - position: absolute;
30   - top: -7px;
31   - left: 6px;
32   -}
33   -.datepicker:after {
34   - content: '';
35   - display: inline-block;
36   - border-left: 6px solid transparent;
37   - border-right: 6px solid transparent;
38   - border-bottom: 6px solid #ffffff;
39   - position: absolute;
40   - top: -6px;
41   - left: 7px;
42   -}
43   -.datepicker > div {
44   - display: none;
45   -}
46   -.datepicker table {
47   - width: 100%;
48   - margin: 0;
49   -}
50   -.datepicker td,
51   -.datepicker th {
52   - text-align: center;
53   - width: 20px;
54   - height: 20px;
55   - -webkit-border-radius: 4px;
56   - -moz-border-radius: 4px;
57   - border-radius: 4px;
58   -}
59   -.datepicker td.day:hover {
60   - background: #eeeeee;
61   - cursor: pointer;
62   -}
63   -.datepicker td.day.disabled {
64   - color: #eeeeee;
65   -}
66   -.datepicker td.old,
67   -.datepicker td.new {
68   - color: #999999;
69   -}
70   -.datepicker td.active,
71   -.datepicker td.active:hover {
72   - color: #ffffff;
73   - background-color: #006dcc;
74   - background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
75   - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
76   - background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
77   - background-image: -o-linear-gradient(top, #0088cc, #0044cc);
78   - background-image: linear-gradient(to bottom, #0088cc, #0044cc);
79   - background-repeat: repeat-x;
80   - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
81   - border-color: #0044cc #0044cc #002a80;
82   - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
83   - *background-color: #0044cc;
84   - /* Darken IE7 buttons by default so they stand out more given they won't have borders */
85   -
86   - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
87   - color: #fff;
88   - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
89   -}
90   -.datepicker td.active:hover,
91   -.datepicker td.active:hover:hover,
92   -.datepicker td.active:focus,
93   -.datepicker td.active:hover:focus,
94   -.datepicker td.active:active,
95   -.datepicker td.active:hover:active,
96   -.datepicker td.active.active,
97   -.datepicker td.active:hover.active,
98   -.datepicker td.active.disabled,
99   -.datepicker td.active:hover.disabled,
100   -.datepicker td.active[disabled],
101   -.datepicker td.active:hover[disabled] {
102   - color: #ffffff;
103   - background-color: #0044cc;
104   - *background-color: #003bb3;
105   -}
106   -.datepicker td.active:active,
107   -.datepicker td.active:hover:active,
108   -.datepicker td.active.active,
109   -.datepicker td.active:hover.active {
110   - background-color: #003399 \9;
111   -}
112   -.datepicker td span {
113   - display: block;
114   - width: 47px;
115   - height: 54px;
116   - line-height: 54px;
117   - float: left;
118   - margin: 2px;
119   - cursor: pointer;
120   - -webkit-border-radius: 4px;
121   - -moz-border-radius: 4px;
122   - border-radius: 4px;
123   -}
124   -.datepicker td span:hover {
125   - background: #eeeeee;
126   -}
127   -.datepicker td span.active {
128   - color: #ffffff;
129   - background-color: #006dcc;
130   - background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
131   - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
132   - background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
133   - background-image: -o-linear-gradient(top, #0088cc, #0044cc);
134   - background-image: linear-gradient(to bottom, #0088cc, #0044cc);
135   - background-repeat: repeat-x;
136   - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
137   - border-color: #0044cc #0044cc #002a80;
138   - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
139   - *background-color: #0044cc;
140   - /* Darken IE7 buttons by default so they stand out more given they won't have borders */
141   -
142   - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
143   - color: #fff;
144   - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
145   -}
146   -.datepicker td span.active:hover,
147   -.datepicker td span.active:focus,
148   -.datepicker td span.active:active,
149   -.datepicker td span.active.active,
150   -.datepicker td span.active.disabled,
151   -.datepicker td span.active[disabled] {
152   - color: #ffffff;
153   - background-color: #0044cc;
154   - *background-color: #003bb3;
155   -}
156   -.datepicker td span.active:active,
157   -.datepicker td span.active.active {
158   - background-color: #003399 \9;
159   -}
160   -.datepicker td span.old {
161   - color: #999999;
162   -}
163   -.datepicker th.switch {
164   - width: 145px;
165   -}
166   -.datepicker th.next,
167   -.datepicker th.prev {
168   - font-size: 21px;
169   -}
170   -.datepicker thead tr:first-child th {
171   - cursor: pointer;
172   -}
173   -.datepicker thead tr:first-child th:hover {
174   - background: #eeeeee;
175   -}
176   -.input-append.date .add-on i,
177   -.input-prepend.date .add-on i {
178   - display: block;
179   - cursor: pointer;
180   - width: 16px;
181   - height: 16px;
182   -}
183 0 \ No newline at end of file
core/static/js/main.js
  1 +var locale = navigator.language || navigator.userLanguage;
  2 +
1 3 $('.date-picker').datepicker({
2   - format: 'mm/dd/yyyy',
  4 + language: locale,
3 5 });
4 6 \ No newline at end of file
... ...
core/static/js/vendor/bootstrap-datepicker.js
1 1 /* =========================================================
2   - * bootstrap-datepicker.js
3   - * http://www.eyecon.ro/bootstrap-datepicker
  2 + * bootstrap-datepicker.js
  3 + * Repo: https://github.com/uxsolutions/bootstrap-datepicker/
  4 + * Demo: https://eternicode.github.io/bootstrap-datepicker/
  5 + * Docs: https://bootstrap-datepicker.readthedocs.org/
4 6 * =========================================================
5   - * Copyright 2012 Stefan Petre
6   - *
7 7 * Licensed under the Apache License, Version 2.0 (the "License");
8 8 * you may not use this file except in compliance with the License.
9 9 * You may obtain a copy of the License at
... ... @@ -16,459 +16,2021 @@
16 16 * See the License for the specific language governing permissions and
17 17 * limitations under the License.
18 18 * ========================================================= */
19   -
20   -!function( $ ) {
21   -
  19 +
  20 +(function(factory){
  21 + if (typeof define === "function" && define.amd) {
  22 + define(["jquery"], factory);
  23 + } else if (typeof exports === 'object') {
  24 + factory(require('jquery'));
  25 + } else {
  26 + factory(jQuery);
  27 + }
  28 +}(function($, undefined){
  29 +
  30 + function UTCDate(){
  31 + return new Date(Date.UTC.apply(Date, arguments));
  32 + }
  33 + function UTCToday(){
  34 + var today = new Date();
  35 + return UTCDate(today.getFullYear(), today.getMonth(), today.getDate());
  36 + }
  37 + function isUTCEquals(date1, date2) {
  38 + return (
  39 + date1.getUTCFullYear() === date2.getUTCFullYear() &&
  40 + date1.getUTCMonth() === date2.getUTCMonth() &&
  41 + date1.getUTCDate() === date2.getUTCDate()
  42 + );
  43 + }
  44 + function alias(method){
  45 + return function(){
  46 + return this[method].apply(this, arguments);
  47 + };
  48 + }
  49 + function isValidDate(d) {
  50 + return d && !isNaN(d.getTime());
  51 + }
  52 +
  53 + var DateArray = (function(){
  54 + var extras = {
  55 + get: function(i){
  56 + return this.slice(i)[0];
  57 + },
  58 + contains: function(d){
  59 + // Array.indexOf is not cross-browser;
  60 + // $.inArray doesn't work with Dates
  61 + var val = d && d.valueOf();
  62 + for (var i=0, l=this.length; i < l; i++)
  63 + // Use date arithmetic to allow dates with different times to match
  64 + if (0 <= this[i].valueOf() - val && this[i].valueOf() - val < 1000*60*60*24)
  65 + return i;
  66 + return -1;
  67 + },
  68 + remove: function(i){
  69 + this.splice(i,1);
  70 + },
  71 + replace: function(new_array){
  72 + if (!new_array)
  73 + return;
  74 + if (!$.isArray(new_array))
  75 + new_array = [new_array];
  76 + this.clear();
  77 + this.push.apply(this, new_array);
  78 + },
  79 + clear: function(){
  80 + this.length = 0;
  81 + },
  82 + copy: function(){
  83 + var a = new DateArray();
  84 + a.replace(this);
  85 + return a;
  86 + }
  87 + };
  88 +
  89 + return function(){
  90 + var a = [];
  91 + a.push.apply(a, arguments);
  92 + $.extend(a, extras);
  93 + return a;
  94 + };
  95 + })();
  96 +
  97 +
22 98 // Picker object
23   -
  99 +
24 100 var Datepicker = function(element, options){
  101 + $.data(element, 'datepicker', this);
  102 + this._process_options(options);
  103 +
  104 + this.dates = new DateArray();
  105 + this.viewDate = this.o.defaultViewDate;
  106 + this.focusDate = null;
  107 +
25 108 this.element = $(element);
26   - this.format = DPGlobal.parseFormat(options.format||this.element.data('date-format')||'mm/dd/yyyy');
27   - this.picker = $(DPGlobal.template)
28   - .appendTo('body')
29   - .on({
30   - click: $.proxy(this.click, this)//,
31   - //mousedown: $.proxy(this.mousedown, this)
32   - });
33 109 this.isInput = this.element.is('input');
34   - this.component = this.element.is('.date') ? this.element.find('.add-on') : false;
35   -
36   - if (this.isInput) {
37   - this.element.on({
38   - focus: $.proxy(this.show, this),
39   - //blur: $.proxy(this.hide, this),
40   - keyup: $.proxy(this.update, this)
41   - });
42   - } else {
43   - if (this.component){
44   - this.component.on('click', $.proxy(this.show, this));
45   - } else {
46   - this.element.on('click', $.proxy(this.show, this));
47   - }
  110 + this.inputField = this.isInput ? this.element : this.element.find('input');
  111 + this.component = this.element.hasClass('date') ? this.element.find('.add-on, .input-group-addon, .btn') : false;
  112 + if (this.component && this.component.length === 0)
  113 + this.component = false;
  114 + this.isInline = !this.component && this.element.is('div');
  115 +
  116 + this.picker = $(DPGlobal.template);
  117 +
  118 + // Checking templates and inserting
  119 + if (this._check_template(this.o.templates.leftArrow)) {
  120 + this.picker.find('.prev').html(this.o.templates.leftArrow);
48 121 }
49   -
50   - this.minViewMode = options.minViewMode||this.element.data('date-minviewmode')||0;
51   - if (typeof this.minViewMode === 'string') {
52   - switch (this.minViewMode) {
53   - case 'months':
54   - this.minViewMode = 1;
55   - break;
56   - case 'years':
57   - this.minViewMode = 2;
58   - break;
59   - default:
60   - this.minViewMode = 0;
61   - break;
62   - }
  122 +
  123 + if (this._check_template(this.o.templates.rightArrow)) {
  124 + this.picker.find('.next').html(this.o.templates.rightArrow);
63 125 }
64   - this.viewMode = options.viewMode||this.element.data('date-viewmode')||0;
65   - if (typeof this.viewMode === 'string') {
66   - switch (this.viewMode) {
67   - case 'months':
68   - this.viewMode = 1;
69   - break;
70   - case 'years':
71   - this.viewMode = 2;
72   - break;
73   - default:
74   - this.viewMode = 0;
75   - break;
76   - }
  126 +
  127 + this._buildEvents();
  128 + this._attachEvents();
  129 +
  130 + if (this.isInline){
  131 + this.picker.addClass('datepicker-inline').appendTo(this.element);
  132 + }
  133 + else {
  134 + this.picker.addClass('datepicker-dropdown dropdown-menu');
  135 + }
  136 +
  137 + if (this.o.rtl){
  138 + this.picker.addClass('datepicker-rtl');
  139 + }
  140 +
  141 + if (this.o.calendarWeeks) {
  142 + this.picker.find('.datepicker-days .datepicker-switch, thead .datepicker-title, tfoot .today, tfoot .clear')
  143 + .attr('colspan', function(i, val){
  144 + return Number(val) + 1;
  145 + });
77 146 }
78   - this.startViewMode = this.viewMode;
79   - this.weekStart = options.weekStart||this.element.data('date-weekstart')||0;
80   - this.weekEnd = this.weekStart === 0 ? 6 : this.weekStart - 1;
81   - this.onRender = options.onRender;
  147 +
  148 + this._allow_update = false;
  149 +
  150 + this.setStartDate(this._o.startDate);
  151 + this.setEndDate(this._o.endDate);
  152 + this.setDaysOfWeekDisabled(this.o.daysOfWeekDisabled);
  153 + this.setDaysOfWeekHighlighted(this.o.daysOfWeekHighlighted);
  154 + this.setDatesDisabled(this.o.datesDisabled);
  155 +
  156 + this.setViewMode(this.o.startView);
82 157 this.fillDow();
83 158 this.fillMonths();
  159 +
  160 + this._allow_update = true;
  161 +
84 162 this.update();
85   - this.showMode();
  163 +
  164 + if (this.isInline){
  165 + this.show();
  166 + }
86 167 };
87   -
  168 +
88 169 Datepicker.prototype = {
89 170 constructor: Datepicker,
90   -
91   - show: function(e) {
92   - this.picker.show();
93   - this.height = this.component ? this.component.outerHeight() : this.element.outerHeight();
94   - this.place();
95   - $(window).on('resize', $.proxy(this.place, this));
96   - if (e ) {
97   - e.stopPropagation();
98   - e.preventDefault();
  171 +
  172 + _resolveViewName: function(view){
  173 + $.each(DPGlobal.viewModes, function(i, viewMode){
  174 + if (view === i || $.inArray(view, viewMode.names) !== -1){
  175 + view = i;
  176 + return false;
  177 + }
  178 + });
  179 +
  180 + return view;
  181 + },
  182 +
  183 + _resolveDaysOfWeek: function(daysOfWeek){
  184 + if (!$.isArray(daysOfWeek))
  185 + daysOfWeek = daysOfWeek.split(/[,\s]*/);
  186 + return $.map(daysOfWeek, Number);
  187 + },
  188 +
  189 + _check_template: function(tmp){
  190 + try {
  191 + // If empty
  192 + if (tmp === undefined || tmp === "") {
  193 + return false;
  194 + }
  195 + // If no html, everything ok
  196 + if ((tmp.match(/[<>]/g) || []).length <= 0) {
  197 + return true;
  198 + }
  199 + // Checking if html is fine
  200 + var jDom = $(tmp);
  201 + return jDom.length > 0;
99 202 }
100   - if (!this.isInput) {
  203 + catch (ex) {
  204 + return false;
101 205 }
102   - var that = this;
103   - $(document).on('mousedown', function(ev){
104   - if ($(ev.target).closest('.datepicker').length == 0) {
105   - that.hide();
  206 + },
  207 +
  208 + _process_options: function(opts){
  209 + // Store raw options for reference
  210 + this._o = $.extend({}, this._o, opts);
  211 + // Processed options
  212 + var o = this.o = $.extend({}, this._o);
  213 +
  214 + // Check if "de-DE" style date is available, if not language should
  215 + // fallback to 2 letter code eg "de"
  216 + var lang = o.language;
  217 + if (!dates[lang]){
  218 + lang = lang.split('-')[0];
  219 + if (!dates[lang])
  220 + lang = defaults.language;
  221 + }
  222 + o.language = lang;
  223 +
  224 + // Retrieve view index from any aliases
  225 + o.startView = this._resolveViewName(o.startView);
  226 + o.minViewMode = this._resolveViewName(o.minViewMode);
  227 + o.maxViewMode = this._resolveViewName(o.maxViewMode);
  228 +
  229 + // Check view is between min and max
  230 + o.startView = Math.max(this.o.minViewMode, Math.min(this.o.maxViewMode, o.startView));
  231 +
  232 + // true, false, or Number > 0
  233 + if (o.multidate !== true){
  234 + o.multidate = Number(o.multidate) || false;
  235 + if (o.multidate !== false)
  236 + o.multidate = Math.max(0, o.multidate);
  237 + }
  238 + o.multidateSeparator = String(o.multidateSeparator);
  239 +
  240 + o.weekStart %= 7;
  241 + o.weekEnd = (o.weekStart + 6) % 7;
  242 +
  243 + var format = DPGlobal.parseFormat(o.format);
  244 + if (o.startDate !== -Infinity){
  245 + if (!!o.startDate){
  246 + if (o.startDate instanceof Date)
  247 + o.startDate = this._local_to_utc(this._zero_time(o.startDate));
  248 + else
  249 + o.startDate = DPGlobal.parseDate(o.startDate, format, o.language, o.assumeNearbyYear);
  250 + }
  251 + else {
  252 + o.startDate = -Infinity;
  253 + }
  254 + }
  255 + if (o.endDate !== Infinity){
  256 + if (!!o.endDate){
  257 + if (o.endDate instanceof Date)
  258 + o.endDate = this._local_to_utc(this._zero_time(o.endDate));
  259 + else
  260 + o.endDate = DPGlobal.parseDate(o.endDate, format, o.language, o.assumeNearbyYear);
106 261 }
  262 + else {
  263 + o.endDate = Infinity;
  264 + }
  265 + }
  266 +
  267 + o.daysOfWeekDisabled = this._resolveDaysOfWeek(o.daysOfWeekDisabled||[]);
  268 + o.daysOfWeekHighlighted = this._resolveDaysOfWeek(o.daysOfWeekHighlighted||[]);
  269 +
  270 + o.datesDisabled = o.datesDisabled||[];
  271 + if (!$.isArray(o.datesDisabled)) {
  272 + o.datesDisabled = o.datesDisabled.split(',');
  273 + }
  274 + o.datesDisabled = $.map(o.datesDisabled, function(d){
  275 + return DPGlobal.parseDate(d, format, o.language, o.assumeNearbyYear);
107 276 });
108   - this.element.trigger({
109   - type: 'show',
110   - date: this.date
  277 +
  278 + var plc = String(o.orientation).toLowerCase().split(/\s+/g),
  279 + _plc = o.orientation.toLowerCase();
  280 + plc = $.grep(plc, function(word){
  281 + return /^auto|left|right|top|bottom$/.test(word);
111 282 });
  283 + o.orientation = {x: 'auto', y: 'auto'};
  284 + if (!_plc || _plc === 'auto')
  285 + ; // no action
  286 + else if (plc.length === 1){
  287 + switch (plc[0]){
  288 + case 'top':
  289 + case 'bottom':
  290 + o.orientation.y = plc[0];
  291 + break;
  292 + case 'left':
  293 + case 'right':
  294 + o.orientation.x = plc[0];
  295 + break;
  296 + }
  297 + }
  298 + else {
  299 + _plc = $.grep(plc, function(word){
  300 + return /^left|right$/.test(word);
  301 + });
  302 + o.orientation.x = _plc[0] || 'auto';
  303 +
  304 + _plc = $.grep(plc, function(word){
  305 + return /^top|bottom$/.test(word);
  306 + });
  307 + o.orientation.y = _plc[0] || 'auto';
  308 + }
  309 + if (o.defaultViewDate) {
  310 + var year = o.defaultViewDate.year || new Date().getFullYear();
  311 + var month = o.defaultViewDate.month || 0;
  312 + var day = o.defaultViewDate.day || 1;
  313 + o.defaultViewDate = UTCDate(year, month, day);
  314 + } else {
  315 + o.defaultViewDate = UTCToday();
  316 + }
112 317 },
113   -
114   - hide: function(){
115   - this.picker.hide();
116   - $(window).off('resize', this.place);
117   - this.viewMode = this.startViewMode;
118   - this.showMode();
119   - if (!this.isInput) {
120   - $(document).off('mousedown', this.hide);
121   - }
122   - //this.set();
  318 + _events: [],
  319 + _secondaryEvents: [],
  320 + _applyEvents: function(evs){
  321 + for (var i=0, el, ch, ev; i < evs.length; i++){
  322 + el = evs[i][0];
  323 + if (evs[i].length === 2){
  324 + ch = undefined;
  325 + ev = evs[i][1];
  326 + } else if (evs[i].length === 3){
  327 + ch = evs[i][1];
  328 + ev = evs[i][2];
  329 + }
  330 + el.on(ev, ch);
  331 + }
  332 + },
  333 + _unapplyEvents: function(evs){
  334 + for (var i=0, el, ev, ch; i < evs.length; i++){
  335 + el = evs[i][0];
  336 + if (evs[i].length === 2){
  337 + ch = undefined;
  338 + ev = evs[i][1];
  339 + } else if (evs[i].length === 3){
  340 + ch = evs[i][1];
  341 + ev = evs[i][2];
  342 + }
  343 + el.off(ev, ch);
  344 + }
  345 + },
  346 + _buildEvents: function(){
  347 + var events = {
  348 + keyup: $.proxy(function(e){
  349 + if ($.inArray(e.keyCode, [27, 37, 39, 38, 40, 32, 13, 9]) === -1)
  350 + this.update();
  351 + }, this),
  352 + keydown: $.proxy(this.keydown, this),
  353 + paste: $.proxy(this.paste, this)
  354 + };
  355 +
  356 + if (this.o.showOnFocus === true) {
  357 + events.focus = $.proxy(this.show, this);
  358 + }
  359 +
  360 + if (this.isInput) { // single input
  361 + this._events = [
  362 + [this.element, events]
  363 + ];
  364 + }
  365 + // component: input + button
  366 + else if (this.component && this.inputField.length) {
  367 + this._events = [
  368 + // For components that are not readonly, allow keyboard nav
  369 + [this.inputField, events],
  370 + [this.component, {
  371 + click: $.proxy(this.show, this)
  372 + }]
  373 + ];
  374 + }
  375 + else {
  376 + this._events = [
  377 + [this.element, {
  378 + click: $.proxy(this.show, this),
  379 + keydown: $.proxy(this.keydown, this)
  380 + }]
  381 + ];
  382 + }
  383 + this._events.push(
  384 + // Component: listen for blur on element descendants
  385 + [this.element, '*', {
  386 + blur: $.proxy(function(e){
  387 + this._focused_from = e.target;
  388 + }, this)
  389 + }],
  390 + // Input: listen for blur on element
  391 + [this.element, {
  392 + blur: $.proxy(function(e){
  393 + this._focused_from = e.target;
  394 + }, this)
  395 + }]
  396 + );
  397 +
  398 + if (this.o.immediateUpdates) {
  399 + // Trigger input updates immediately on changed year/month
  400 + this._events.push([this.element, {
  401 + 'changeYear changeMonth': $.proxy(function(e){
  402 + this.update(e.date);
  403 + }, this)
  404 + }]);
  405 + }
  406 +
  407 + this._secondaryEvents = [
  408 + [this.picker, {
  409 + click: $.proxy(this.click, this)
  410 + }],
  411 + [this.picker, '.prev, .next', {
  412 + click: $.proxy(this.navArrowsClick, this)
  413 + }],
  414 + [$(window), {
  415 + resize: $.proxy(this.place, this)
  416 + }],
  417 + [$(document), {
  418 + 'mousedown touchstart': $.proxy(function(e){
  419 + // Clicked outside the datepicker, hide it
  420 + if (!(
  421 + this.element.is(e.target) ||
  422 + this.element.find(e.target).length ||
  423 + this.picker.is(e.target) ||
  424 + this.picker.find(e.target).length ||
  425 + this.isInline
  426 + )){
  427 + this.hide();
  428 + }
  429 + }, this)
  430 + }]
  431 + ];
  432 + },
  433 + _attachEvents: function(){
  434 + this._detachEvents();
  435 + this._applyEvents(this._events);
  436 + },
  437 + _detachEvents: function(){
  438 + this._unapplyEvents(this._events);
  439 + },
  440 + _attachSecondaryEvents: function(){
  441 + this._detachSecondaryEvents();
  442 + this._applyEvents(this._secondaryEvents);
  443 + },
  444 + _detachSecondaryEvents: function(){
  445 + this._unapplyEvents(this._secondaryEvents);
  446 + },
  447 + _trigger: function(event, altdate){
  448 + var date = altdate || this.dates.get(-1),
  449 + local_date = this._utc_to_local(date);
  450 +
123 451 this.element.trigger({
124   - type: 'hide',
125   - date: this.date
  452 + type: event,
  453 + date: local_date,
  454 + viewMode: this.viewMode,
  455 + dates: $.map(this.dates, this._utc_to_local),
  456 + format: $.proxy(function(ix, format){
  457 + if (arguments.length === 0){
  458 + ix = this.dates.length - 1;
  459 + format = this.o.format;
  460 + } else if (typeof ix === 'string'){
  461 + format = ix;
  462 + ix = this.dates.length - 1;
  463 + }
  464 + format = format || this.o.format;
  465 + var date = this.dates.get(ix);
  466 + return DPGlobal.formatDate(date, format, this.o.language);
  467 + }, this)
126 468 });
127 469 },
128   -
129   - set: function() {
130   - var formated = DPGlobal.formatDate(this.date, this.format);
131   - if (!this.isInput) {
132   - if (this.component){
133   - this.element.find('input').prop('value', formated);
134   - }
135   - this.element.data('date', formated);
  470 +
  471 + show: function(){
  472 + if (this.inputField.prop('disabled') || (this.inputField.prop('readonly') && this.o.enableOnReadonly === false))
  473 + return;
  474 + if (!this.isInline)
  475 + this.picker.appendTo(this.o.container);
  476 + this.place();
  477 + this.picker.show();
  478 + this._attachSecondaryEvents();
  479 + this._trigger('show');
  480 + if ((window.navigator.msMaxTouchPoints || 'ontouchstart' in document) && this.o.disableTouchKeyboard) {
  481 + $(this.element).blur();
  482 + }
  483 + return this;
  484 + },
  485 +
  486 + hide: function(){
  487 + if (this.isInline || !this.picker.is(':visible'))
  488 + return this;
  489 + this.focusDate = null;
  490 + this.picker.hide().detach();
  491 + this._detachSecondaryEvents();
  492 + this.setViewMode(this.o.startView);
  493 +
  494 + if (this.o.forceParse && this.inputField.val())
  495 + this.setValue();
  496 + this._trigger('hide');
  497 + return this;
  498 + },
  499 +
  500 + destroy: function(){
  501 + this.hide();
  502 + this._detachEvents();
  503 + this._detachSecondaryEvents();
  504 + this.picker.remove();
  505 + delete this.element.data().datepicker;
  506 + if (!this.isInput){
  507 + delete this.element.data().date;
  508 + }
  509 + return this;
  510 + },
  511 +
  512 + paste: function(e){
  513 + var dateString;
  514 + if (e.originalEvent.clipboardData && e.originalEvent.clipboardData.types
  515 + && $.inArray('text/plain', e.originalEvent.clipboardData.types) !== -1) {
  516 + dateString = e.originalEvent.clipboardData.getData('text/plain');
  517 + } else if (window.clipboardData) {
  518 + dateString = window.clipboardData.getData('Text');
136 519 } else {
137   - this.element.prop('value', formated);
  520 + return;
138 521 }
  522 + this.setDate(dateString);
  523 + this.update();
  524 + e.preventDefault();
  525 + },
  526 +
  527 + _utc_to_local: function(utc){
  528 + if (!utc) {
  529 + return utc;
  530 + }
  531 +
  532 + var local = new Date(utc.getTime() + (utc.getTimezoneOffset() * 60000));
  533 +
  534 + if (local.getTimezoneOffset() !== utc.getTimezoneOffset()) {
  535 + local = new Date(utc.getTime() + (local.getTimezoneOffset() * 60000));
  536 + }
  537 +
  538 + return local;
  539 + },
  540 + _local_to_utc: function(local){
  541 + return local && new Date(local.getTime() - (local.getTimezoneOffset()*60000));
139 542 },
140   -
141   - setValue: function(newDate) {
142   - if (typeof newDate === 'string') {
143   - this.date = DPGlobal.parseDate(newDate, this.format);
  543 + _zero_time: function(local){
  544 + return local && new Date(local.getFullYear(), local.getMonth(), local.getDate());
  545 + },
  546 + _zero_utc_time: function(utc){
  547 + return utc && UTCDate(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate());
  548 + },
  549 +
  550 + getDates: function(){
  551 + return $.map(this.dates, this._utc_to_local);
  552 + },
  553 +
  554 + getUTCDates: function(){
  555 + return $.map(this.dates, function(d){
  556 + return new Date(d);
  557 + });
  558 + },
  559 +
  560 + getDate: function(){
  561 + return this._utc_to_local(this.getUTCDate());
  562 + },
  563 +
  564 + getUTCDate: function(){
  565 + var selected_date = this.dates.get(-1);
  566 + if (selected_date !== undefined) {
  567 + return new Date(selected_date);
144 568 } else {
145   - this.date = new Date(newDate);
  569 + return null;
146 570 }
147   - this.set();
148   - this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0);
149   - this.fill();
150 571 },
151   -
  572 +
  573 + clearDates: function(){
  574 + this.inputField.val('');
  575 + this.update();
  576 + this._trigger('changeDate');
  577 +
  578 + if (this.o.autoclose) {
  579 + this.hide();
  580 + }
  581 + },
  582 +
  583 + setDates: function(){
  584 + var args = $.isArray(arguments[0]) ? arguments[0] : arguments;
  585 + this.update.apply(this, args);
  586 + this._trigger('changeDate');
  587 + this.setValue();
  588 + return this;
  589 + },
  590 +
  591 + setUTCDates: function(){
  592 + var args = $.isArray(arguments[0]) ? arguments[0] : arguments;
  593 + this.setDates.apply(this, $.map(args, this._utc_to_local));
  594 + return this;
  595 + },
  596 +
  597 + setDate: alias('setDates'),
  598 + setUTCDate: alias('setUTCDates'),
  599 + remove: alias('destroy'),
  600 +
  601 + setValue: function(){
  602 + var formatted = this.getFormattedDate();
  603 + this.inputField.val(formatted);
  604 + return this;
  605 + },
  606 +
  607 + getFormattedDate: function(format){
  608 + if (format === undefined)
  609 + format = this.o.format;
  610 +
  611 + var lang = this.o.language;
  612 + return $.map(this.dates, function(d){
  613 + return DPGlobal.formatDate(d, format, lang);
  614 + }).join(this.o.multidateSeparator);
  615 + },
  616 +
  617 + getStartDate: function(){
  618 + return this.o.startDate;
  619 + },
  620 +
  621 + setStartDate: function(startDate){
  622 + this._process_options({startDate: startDate});
  623 + this.update();
  624 + this.updateNavArrows();
  625 + return this;
  626 + },
  627 +
  628 + getEndDate: function(){
  629 + return this.o.endDate;
  630 + },
  631 +
  632 + setEndDate: function(endDate){
  633 + this._process_options({endDate: endDate});
  634 + this.update();
  635 + this.updateNavArrows();
  636 + return this;
  637 + },
  638 +
  639 + setDaysOfWeekDisabled: function(daysOfWeekDisabled){
  640 + this._process_options({daysOfWeekDisabled: daysOfWeekDisabled});
  641 + this.update();
  642 + return this;
  643 + },
  644 +
  645 + setDaysOfWeekHighlighted: function(daysOfWeekHighlighted){
  646 + this._process_options({daysOfWeekHighlighted: daysOfWeekHighlighted});
  647 + this.update();
  648 + return this;
  649 + },
  650 +
  651 + setDatesDisabled: function(datesDisabled){
  652 + this._process_options({datesDisabled: datesDisabled});
  653 + this.update();
  654 + return this;
  655 + },
  656 +
152 657 place: function(){
153   - var offset = this.component ? this.component.offset() : this.element.offset();
154   - this.picker.css({
155   - top: offset.top + this.height,
156   - left: offset.left
  658 + if (this.isInline)
  659 + return this;
  660 + var calendarWidth = this.picker.outerWidth(),
  661 + calendarHeight = this.picker.outerHeight(),
  662 + visualPadding = 10,
  663 + container = $(this.o.container),
  664 + windowWidth = container.width(),
  665 + scrollTop = this.o.container === 'body' ? $(document).scrollTop() : container.scrollTop(),
  666 + appendOffset = container.offset();
  667 +
  668 + var parentsZindex = [];
  669 + this.element.parents().each(function(){
  670 + var itemZIndex = $(this).css('z-index');
  671 + if (itemZIndex !== 'auto' && itemZIndex !== 0) parentsZindex.push(parseInt(itemZIndex));
157 672 });
158   - },
159   -
160   - update: function(newDate){
161   - this.date = DPGlobal.parseDate(
162   - typeof newDate === 'string' ? newDate : (this.isInput ? this.element.prop('value') : this.element.data('date')),
163   - this.format
  673 + var zIndex = Math.max.apply(Math, parentsZindex) + this.o.zIndexOffset;
  674 + var offset = this.component ? this.component.parent().offset() : this.element.offset();
  675 + var height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(false);
  676 + var width = this.component ? this.component.outerWidth(true) : this.element.outerWidth(false);
  677 + var left = offset.left - appendOffset.left,
  678 + top = offset.top - appendOffset.top;
  679 +
  680 + if (this.o.container !== 'body') {
  681 + top += scrollTop;
  682 + }
  683 +
  684 + this.picker.removeClass(
  685 + 'datepicker-orient-top datepicker-orient-bottom '+
  686 + 'datepicker-orient-right datepicker-orient-left'
164 687 );
165   - this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0);
  688 +
  689 + if (this.o.orientation.x !== 'auto'){
  690 + this.picker.addClass('datepicker-orient-' + this.o.orientation.x);
  691 + if (this.o.orientation.x === 'right')
  692 + left -= calendarWidth - width;
  693 + }
  694 + // auto x orientation is best-placement: if it crosses a window
  695 + // edge, fudge it sideways
  696 + else {
  697 + if (offset.left < 0) {
  698 + // component is outside the window on the left side. Move it into visible range
  699 + this.picker.addClass('datepicker-orient-left');
  700 + left -= offset.left - visualPadding;
  701 + } else if (left + calendarWidth > windowWidth) {
  702 + // the calendar passes the widow right edge. Align it to component right side
  703 + this.picker.addClass('datepicker-orient-right');
  704 + left += width - calendarWidth;
  705 + } else {
  706 + if (this.o.rtl) {
  707 + // Default to right
  708 + this.picker.addClass('datepicker-orient-right');
  709 + } else {
  710 + // Default to left
  711 + this.picker.addClass('datepicker-orient-left');
  712 + }
  713 + }
  714 + }
  715 +
  716 + // auto y orientation is best-situation: top or bottom, no fudging,
  717 + // decision based on which shows more of the calendar
  718 + var yorient = this.o.orientation.y,
  719 + top_overflow;
  720 + if (yorient === 'auto'){
  721 + top_overflow = -scrollTop + top - calendarHeight;
  722 + yorient = top_overflow < 0 ? 'bottom' : 'top';
  723 + }
  724 +
  725 + this.picker.addClass('datepicker-orient-' + yorient);
  726 + if (yorient === 'top')
  727 + top -= calendarHeight + parseInt(this.picker.css('padding-top'));
  728 + else
  729 + top += height;
  730 +
  731 + if (this.o.rtl) {
  732 + var right = windowWidth - (left + width);
  733 + this.picker.css({
  734 + top: top,
  735 + right: right,
  736 + zIndex: zIndex
  737 + });
  738 + } else {
  739 + this.picker.css({
  740 + top: top,
  741 + left: left,
  742 + zIndex: zIndex
  743 + });
  744 + }
  745 + return this;
  746 + },
  747 +
  748 + _allow_update: true,
  749 + update: function(){
  750 + if (!this._allow_update)
  751 + return this;
  752 +
  753 + var oldDates = this.dates.copy(),
  754 + dates = [],
  755 + fromArgs = false;
  756 + if (arguments.length){
  757 + $.each(arguments, $.proxy(function(i, date){
  758 + if (date instanceof Date)
  759 + date = this._local_to_utc(date);
  760 + dates.push(date);
  761 + }, this));
  762 + fromArgs = true;
  763 + } else {
  764 + dates = this.isInput
  765 + ? this.element.val()
  766 + : this.element.data('date') || this.inputField.val();
  767 + if (dates && this.o.multidate)
  768 + dates = dates.split(this.o.multidateSeparator);
  769 + else
  770 + dates = [dates];
  771 + delete this.element.data().date;
  772 + }
  773 +
  774 + dates = $.map(dates, $.proxy(function(date){
  775 + return DPGlobal.parseDate(date, this.o.format, this.o.language, this.o.assumeNearbyYear);
  776 + }, this));
  777 + dates = $.grep(dates, $.proxy(function(date){
  778 + return (
  779 + !this.dateWithinRange(date) ||
  780 + !date
  781 + );
  782 + }, this), true);
  783 + this.dates.replace(dates);
  784 +
  785 + if (this.o.updateViewDate) {
  786 + if (this.dates.length)
  787 + this.viewDate = new Date(this.dates.get(-1));
  788 + else if (this.viewDate < this.o.startDate)
  789 + this.viewDate = new Date(this.o.startDate);
  790 + else if (this.viewDate > this.o.endDate)
  791 + this.viewDate = new Date(this.o.endDate);
  792 + else
  793 + this.viewDate = this.o.defaultViewDate;
  794 + }
  795 +
  796 + if (fromArgs){
  797 + // setting date by clicking
  798 + this.setValue();
  799 + this.element.change();
  800 + }
  801 + else if (this.dates.length){
  802 + // setting date by typing
  803 + if (String(oldDates) !== String(this.dates) && fromArgs) {
  804 + this._trigger('changeDate');
  805 + this.element.change();
  806 + }
  807 + }
  808 + if (!this.dates.length && oldDates.length) {
  809 + this._trigger('clearDate');
  810 + this.element.change();
  811 + }
  812 +
166 813 this.fill();
  814 + return this;
167 815 },
168   -
  816 +
169 817 fillDow: function(){
170   - var dowCnt = this.weekStart;
171   - var html = '<tr>';
172   - while (dowCnt < this.weekStart + 7) {
173   - html += '<th class="dow">'+DPGlobal.dates.daysMin[(dowCnt++)%7]+'</th>';
  818 + var dowCnt = this.o.weekStart,
  819 + html = '<tr>';
  820 + if (this.o.calendarWeeks){
  821 + html += '<th class="cw">&#160;</th>';
  822 + }
  823 + while (dowCnt < this.o.weekStart + 7){
  824 + html += '<th class="dow';
  825 + if ($.inArray(dowCnt, this.o.daysOfWeekDisabled) !== -1)
  826 + html += ' disabled';
  827 + html += '">'+dates[this.o.language].daysMin[(dowCnt++)%7]+'</th>';
174 828 }
175 829 html += '</tr>';
176 830 this.picker.find('.datepicker-days thead').append(html);
177 831 },
178   -
  832 +
179 833 fillMonths: function(){
180   - var html = '';
181   - var i = 0
182   - while (i < 12) {
183   - html += '<span class="month">'+DPGlobal.dates.monthsShort[i++]+'</span>';
  834 + var localDate = this._utc_to_local(this.viewDate);
  835 + var html = '',
  836 + i = 0;
  837 + while (i < 12){
  838 + var focused = localDate && localDate.getMonth() === i ? ' focused' : '';
  839 + html += '<span class="month' + focused + '">' + dates[this.o.language].monthsShort[i++]+'</span>';
  840 + }
  841 + this.picker.find('.datepicker-months td').html(html);
  842 + },
  843 +
  844 + setRange: function(range){
  845 + if (!range || !range.length)
  846 + delete this.range;
  847 + else
  848 + this.range = $.map(range, function(d){
  849 + return d.valueOf();
  850 + });
  851 + this.fill();
  852 + },
  853 +
  854 + getClassNames: function(date){
  855 + var cls = [],
  856 + year = this.viewDate.getUTCFullYear(),
  857 + month = this.viewDate.getUTCMonth(),
  858 + today = UTCToday();
  859 + if (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)){
  860 + cls.push('old');
  861 + } else if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)){
  862 + cls.push('new');
  863 + }
  864 + if (this.focusDate && date.valueOf() === this.focusDate.valueOf())
  865 + cls.push('focused');
  866 + // Compare internal UTC date with UTC today, not local today
  867 + if (this.o.todayHighlight && isUTCEquals(date, today)) {
  868 + cls.push('today');
  869 + }
  870 + if (this.dates.contains(date) !== -1)
  871 + cls.push('active');
  872 + if (!this.dateWithinRange(date)){
  873 + cls.push('disabled');
  874 + }
  875 + if (this.dateIsDisabled(date)){
  876 + cls.push('disabled', 'disabled-date');
  877 + }
  878 + if ($.inArray(date.getUTCDay(), this.o.daysOfWeekHighlighted) !== -1){
  879 + cls.push('highlighted');
  880 + }
  881 +
  882 + if (this.range){
  883 + if (date > this.range[0] && date < this.range[this.range.length-1]){
  884 + cls.push('range');
  885 + }
  886 + if ($.inArray(date.valueOf(), this.range) !== -1){
  887 + cls.push('selected');
  888 + }
  889 + if (date.valueOf() === this.range[0]){
  890 + cls.push('range-start');
  891 + }
  892 + if (date.valueOf() === this.range[this.range.length-1]){
  893 + cls.push('range-end');
  894 + }
  895 + }
  896 + return cls;
  897 + },
  898 +
  899 + _fill_yearsView: function(selector, cssClass, factor, step, currentYear, startYear, endYear, callback){
  900 + var html, view, year, steps, startStep, endStep, thisYear, i, classes, tooltip, before;
  901 +
  902 + html = '';
  903 + view = this.picker.find(selector);
  904 + year = parseInt(currentYear / factor, 10) * factor;
  905 + startStep = parseInt(startYear / step, 10) * step;
  906 + endStep = parseInt(endYear / step, 10) * step;
  907 + steps = $.map(this.dates, function(d){
  908 + return parseInt(d.getUTCFullYear() / step, 10) * step;
  909 + });
  910 +
  911 + view.find('.datepicker-switch').text(year + '-' + (year + step * 9));
  912 +
  913 + thisYear = year - step;
  914 + for (i = -1; i < 11; i += 1) {
  915 + classes = [cssClass];
  916 + tooltip = null;
  917 +
  918 + if (i === -1) {
  919 + classes.push('old');
  920 + } else if (i === 10) {
  921 + classes.push('new');
  922 + }
  923 + if ($.inArray(thisYear, steps) !== -1) {
  924 + classes.push('active');
  925 + }
  926 + if (thisYear < startStep || thisYear > endStep) {
  927 + classes.push('disabled');
  928 + }
  929 + if (thisYear === this.viewDate.getFullYear()) {
  930 + classes.push('focused');
  931 + }
  932 +
  933 + if (callback !== $.noop) {
  934 + before = callback(new Date(thisYear, 0, 1));
  935 + if (before === undefined) {
  936 + before = {};
  937 + } else if (typeof before === 'boolean') {
  938 + before = {enabled: before};
  939 + } else if (typeof before === 'string') {
  940 + before = {classes: before};
  941 + }
  942 + if (before.enabled === false) {
  943 + classes.push('disabled');
  944 + }
  945 + if (before.classes) {
  946 + classes = classes.concat(before.classes.split(/\s+/));
  947 + }
  948 + if (before.tooltip) {
  949 + tooltip = before.tooltip;
  950 + }
  951 + }
  952 +
  953 + html += '<span class="' + classes.join(' ') + '"' + (tooltip ? ' title="' + tooltip + '"' : '') + '>' + thisYear + '</span>';
  954 + thisYear += step;
184 955 }
185   - this.picker.find('.datepicker-months td').append(html);
  956 + view.find('td').html(html);
186 957 },
187   -
188   - fill: function() {
  958 +
  959 + fill: function(){
189 960 var d = new Date(this.viewDate),
190   - year = d.getFullYear(),
191   - month = d.getMonth(),
192   - currentDate = this.date.valueOf();
193   - this.picker.find('.datepicker-days th:eq(1)')
194   - .text(DPGlobal.dates.months[month]+' '+year);
195   - var prevMonth = new Date(year, month-1, 28,0,0,0,0),
196   - day = DPGlobal.getDaysInMonth(prevMonth.getFullYear(), prevMonth.getMonth());
197   - prevMonth.setDate(day);
198   - prevMonth.setDate(day - (prevMonth.getDay() - this.weekStart + 7)%7);
  961 + year = d.getUTCFullYear(),
  962 + month = d.getUTCMonth(),
  963 + startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity,
  964 + startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity,
  965 + endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity,
  966 + endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity,
  967 + todaytxt = dates[this.o.language].today || dates['en'].today || '',
  968 + cleartxt = dates[this.o.language].clear || dates['en'].clear || '',
  969 + titleFormat = dates[this.o.language].titleFormat || dates['en'].titleFormat,
  970 + tooltip,
  971 + before;
  972 + if (isNaN(year) || isNaN(month))
  973 + return;
  974 + this.picker.find('.datepicker-days .datepicker-switch')
  975 + .text(DPGlobal.formatDate(d, titleFormat, this.o.language));
  976 + this.picker.find('tfoot .today')
  977 + .text(todaytxt)
  978 + .toggle(this.o.todayBtn !== false);
  979 + this.picker.find('tfoot .clear')
  980 + .text(cleartxt)
  981 + .toggle(this.o.clearBtn !== false);
  982 + this.picker.find('thead .datepicker-title')
  983 + .text(this.o.title)
  984 + .toggle(this.o.title !== '');
  985 + this.updateNavArrows();
  986 + this.fillMonths();
  987 + var prevMonth = UTCDate(year, month, 0),
  988 + day = prevMonth.getUTCDate();
  989 + prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7);
199 990 var nextMonth = new Date(prevMonth);
200   - nextMonth.setDate(nextMonth.getDate() + 42);
  991 + if (prevMonth.getUTCFullYear() < 100){
  992 + nextMonth.setUTCFullYear(prevMonth.getUTCFullYear());
  993 + }
  994 + nextMonth.setUTCDate(nextMonth.getUTCDate() + 42);
201 995 nextMonth = nextMonth.valueOf();
202 996 var html = [];
203   - var clsName,
204   - prevY,
205   - prevM;
206   - while(prevMonth.valueOf() < nextMonth) {
207   - if (prevMonth.getDay() === this.weekStart) {
  997 + var weekDay, clsName;
  998 + while (prevMonth.valueOf() < nextMonth){
  999 + weekDay = prevMonth.getUTCDay();
  1000 + if (weekDay === this.o.weekStart){
208 1001 html.push('<tr>');
  1002 + if (this.o.calendarWeeks){
  1003 + // ISO 8601: First week contains first thursday.
  1004 + // ISO also states week starts on Monday, but we can be more abstract here.
  1005 + var
  1006 + // Start of current week: based on weekstart/current date
  1007 + ws = new Date(+prevMonth + (this.o.weekStart - weekDay - 7) % 7 * 864e5),
  1008 + // Thursday of this week
  1009 + th = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5),
  1010 + // First Thursday of year, year from thursday
  1011 + yth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay()) % 7 * 864e5),
  1012 + // Calendar week: ms between thursdays, div ms per day, div 7 days
  1013 + calWeek = (th - yth) / 864e5 / 7 + 1;
  1014 + html.push('<td class="cw">'+ calWeek +'</td>');
  1015 + }
209 1016 }
210   - clsName = this.onRender(prevMonth);
211   - prevY = prevMonth.getFullYear();
212   - prevM = prevMonth.getMonth();
213   - if ((prevM < month && prevY === year) || prevY < year) {
214   - clsName += ' old';
215   - } else if ((prevM > month && prevY === year) || prevY > year) {
216   - clsName += ' new';
  1017 + clsName = this.getClassNames(prevMonth);
  1018 + clsName.push('day');
  1019 +
  1020 + if (this.o.beforeShowDay !== $.noop){
  1021 + before = this.o.beforeShowDay(this._utc_to_local(prevMonth));
  1022 + if (before === undefined)
  1023 + before = {};
  1024 + else if (typeof before === 'boolean')
  1025 + before = {enabled: before};
  1026 + else if (typeof before === 'string')
  1027 + before = {classes: before};
  1028 + if (before.enabled === false)
  1029 + clsName.push('disabled');
  1030 + if (before.classes)
  1031 + clsName = clsName.concat(before.classes.split(/\s+/));
  1032 + if (before.tooltip)
  1033 + tooltip = before.tooltip;
217 1034 }
218   - if (prevMonth.valueOf() === currentDate) {
219   - clsName += ' active';
  1035 +
  1036 + //Check if uniqueSort exists (supported by jquery >=1.12 and >=2.2)
  1037 + //Fallback to unique function for older jquery versions
  1038 + if ($.isFunction($.uniqueSort)) {
  1039 + clsName = $.uniqueSort(clsName);
  1040 + } else {
  1041 + clsName = $.unique(clsName);
220 1042 }
221   - html.push('<td class="day '+clsName+'">'+prevMonth.getDate() + '</td>');
222   - if (prevMonth.getDay() === this.weekEnd) {
  1043 +
  1044 + html.push('<td class="'+clsName.join(' ')+'"' + (tooltip ? ' title="'+tooltip+'"' : '') + (this.o.dateCells ? ' data-date="'+(prevMonth.getTime().toString())+'"' : '') + '>'+prevMonth.getUTCDate() + '</td>');
  1045 + tooltip = null;
  1046 + if (weekDay === this.o.weekEnd){
223 1047 html.push('</tr>');
224 1048 }
225   - prevMonth.setDate(prevMonth.getDate()+1);
  1049 + prevMonth.setUTCDate(prevMonth.getUTCDate() + 1);
226 1050 }
227   - this.picker.find('.datepicker-days tbody').empty().append(html.join(''));
228   - var currentYear = this.date.getFullYear();
229   -
  1051 + this.picker.find('.datepicker-days tbody').html(html.join(''));
  1052 +
  1053 + var monthsTitle = dates[this.o.language].monthsTitle || dates['en'].monthsTitle || 'Months';
230 1054 var months = this.picker.find('.datepicker-months')
231   - .find('th:eq(1)')
232   - .text(year)
  1055 + .find('.datepicker-switch')
  1056 + .text(this.o.maxViewMode < 2 ? monthsTitle : year)
233 1057 .end()
234   - .find('span').removeClass('active');
235   - if (currentYear === year) {
236   - months.eq(this.date.getMonth()).addClass('active');
237   - }
238   -
239   - html = '';
240   - year = parseInt(year/10, 10) * 10;
241   - var yearCont = this.picker.find('.datepicker-years')
242   - .find('th:eq(1)')
243   - .text(year + '-' + (year + 9))
244   - .end()
245   - .find('td');
246   - year -= 1;
247   - for (var i = -1; i < 11; i++) {
248   - html += '<span class="year'+(i === -1 || i === 10 ? ' old' : '')+(currentYear === year ? ' active' : '')+'">'+year+'</span>';
249   - year += 1;
250   - }
251   - yearCont.html(html);
252   - },
253   -
254   - click: function(e) {
255   - e.stopPropagation();
  1058 + .find('tbody span').removeClass('active');
  1059 +
  1060 + $.each(this.dates, function(i, d){
  1061 + if (d.getUTCFullYear() === year)
  1062 + months.eq(d.getUTCMonth()).addClass('active');
  1063 + });
  1064 +
  1065 + if (year < startYear || year > endYear){
  1066 + months.addClass('disabled');
  1067 + }
  1068 + if (year === startYear){
  1069 + months.slice(0, startMonth).addClass('disabled');
  1070 + }
  1071 + if (year === endYear){
  1072 + months.slice(endMonth+1).addClass('disabled');
  1073 + }
  1074 +
  1075 + if (this.o.beforeShowMonth !== $.noop){
  1076 + var that = this;
  1077 + $.each(months, function(i, month){
  1078 + var moDate = new Date(year, i, 1);
  1079 + var before = that.o.beforeShowMonth(moDate);
  1080 + if (before === undefined)
  1081 + before = {};
  1082 + else if (typeof before === 'boolean')
  1083 + before = {enabled: before};
  1084 + else if (typeof before === 'string')
  1085 + before = {classes: before};
  1086 + if (before.enabled === false && !$(month).hasClass('disabled'))
  1087 + $(month).addClass('disabled');
  1088 + if (before.classes)
  1089 + $(month).addClass(before.classes);
  1090 + if (before.tooltip)
  1091 + $(month).prop('title', before.tooltip);
  1092 + });
  1093 + }
  1094 +
  1095 + // Generating decade/years picker
  1096 + this._fill_yearsView(
  1097 + '.datepicker-years',
  1098 + 'year',
  1099 + 10,
  1100 + 1,
  1101 + year,
  1102 + startYear,
  1103 + endYear,
  1104 + this.o.beforeShowYear
  1105 + );
  1106 +
  1107 + // Generating century/decades picker
  1108 + this._fill_yearsView(
  1109 + '.datepicker-decades',
  1110 + 'decade',
  1111 + 100,
  1112 + 10,
  1113 + year,
  1114 + startYear,
  1115 + endYear,
  1116 + this.o.beforeShowDecade
  1117 + );
  1118 +
  1119 + // Generating millennium/centuries picker
  1120 + this._fill_yearsView(
  1121 + '.datepicker-centuries',
  1122 + 'century',
  1123 + 1000,
  1124 + 100,
  1125 + year,
  1126 + startYear,
  1127 + endYear,
  1128 + this.o.beforeShowCentury
  1129 + );
  1130 + },
  1131 +
  1132 + updateNavArrows: function(){
  1133 + if (!this._allow_update)
  1134 + return;
  1135 +
  1136 + var d = new Date(this.viewDate),
  1137 + year = d.getUTCFullYear(),
  1138 + month = d.getUTCMonth(),
  1139 + prevState,
  1140 + nextState;
  1141 + switch (this.viewMode){
  1142 + case 0:
  1143 + prevState = (
  1144 + this.o.startDate !== -Infinity &&
  1145 + year <= this.o.startDate.getUTCFullYear() &&
  1146 + month <= this.o.startDate.getUTCMonth()
  1147 + );
  1148 +
  1149 + nextState = (
  1150 + this.o.endDate !== Infinity &&
  1151 + year >= this.o.endDate.getUTCFullYear() &&
  1152 + month >= this.o.endDate.getUTCMonth()
  1153 + );
  1154 + break;
  1155 + case 1:
  1156 + case 2:
  1157 + case 3:
  1158 + case 4:
  1159 + prevState = (
  1160 + this.o.startDate !== -Infinity &&
  1161 + year <= this.o.startDate.getUTCFullYear()
  1162 + );
  1163 +
  1164 + nextState = (
  1165 + this.o.endDate !== Infinity &&
  1166 + year >= this.o.endDate.getUTCFullYear()
  1167 + );
  1168 + break;
  1169 + }
  1170 +
  1171 + this.picker.find('.prev').toggleClass('disabled', prevState);
  1172 + this.picker.find('.next').toggleClass('disabled', nextState);
  1173 + },
  1174 +
  1175 + click: function(e){
256 1176 e.preventDefault();
257   - var target = $(e.target).closest('span, td, th');
258   - if (target.length === 1) {
259   - switch(target[0].nodeName.toLowerCase()) {
260   - case 'th':
261   - switch(target[0].className) {
262   - case 'switch':
263   - this.showMode(1);
264   - break;
265   - case 'prev':
266   - case 'next':
267   - this.viewDate['set'+DPGlobal.modes[this.viewMode].navFnc].call(
268   - this.viewDate,
269   - this.viewDate['get'+DPGlobal.modes[this.viewMode].navFnc].call(this.viewDate) +
270   - DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1)
271   - );
272   - this.fill();
273   - this.set();
274   - break;
275   - }
276   - break;
277   - case 'span':
278   - if (target.is('.month')) {
279   - var month = target.parent().find('span').index(target);
280   - this.viewDate.setMonth(month);
281   - } else {
282   - var year = parseInt(target.text(), 10)||0;
283   - this.viewDate.setFullYear(year);
  1177 + e.stopPropagation();
  1178 +
  1179 + var target, dir, day, year, month;
  1180 + target = $(e.target);
  1181 +
  1182 + // Clicked on the switch
  1183 + if (target.hasClass('datepicker-switch') && this.viewMode !== this.o.maxViewMode){
  1184 + this.setViewMode(this.viewMode + 1);
  1185 + }
  1186 +
  1187 + // Clicked on today button
  1188 + if (target.hasClass('today') && !target.hasClass('day')){
  1189 + this.setViewMode(0);
  1190 + this._setDate(UTCToday(), this.o.todayBtn === 'linked' ? null : 'view');
  1191 + }
  1192 +
  1193 + // Clicked on clear button
  1194 + if (target.hasClass('clear')){
  1195 + this.clearDates();
  1196 + }
  1197 +
  1198 + if (!target.hasClass('disabled')){
  1199 + // Clicked on a day
  1200 + if (target.hasClass('day')){
  1201 + day = Number(target.text());
  1202 + year = this.viewDate.getUTCFullYear();
  1203 + month = this.viewDate.getUTCMonth();
  1204 +
  1205 + if (target.hasClass('old') || target.hasClass('new')){
  1206 + dir = target.hasClass('old') ? -1 : 1;
  1207 + month = (month + dir + 12) % 12;
  1208 + if ((dir === -1 && month === 11) || (dir === 1 && month === 0)) {
  1209 + year += dir;
  1210 + if (this.o.updateViewDate) {
  1211 + this._trigger('changeYear', this.viewDate);
  1212 + }
284 1213 }
285   - if (this.viewMode !== 0) {
286   - this.date = new Date(this.viewDate);
287   - this.element.trigger({
288   - type: 'changeDate',
289   - date: this.date,
290   - viewMode: DPGlobal.modes[this.viewMode].clsName
291   - });
  1214 + if (this.o.updateViewDate) {
  1215 + this._trigger('changeMonth', this.viewDate);
292 1216 }
293   - this.showMode(-1);
  1217 + }
  1218 + this._setDate(UTCDate(year, month, day));
  1219 + }
  1220 +
  1221 + // Clicked on a month, year, decade, century
  1222 + if (target.hasClass('month')
  1223 + || target.hasClass('year')
  1224 + || target.hasClass('decade')
  1225 + || target.hasClass('century')) {
  1226 + this.viewDate.setUTCDate(1);
  1227 +
  1228 + day = 1;
  1229 + if (this.viewMode === 1){
  1230 + month = target.parent().find('span').index(target);
  1231 + year = this.viewDate.getUTCFullYear();
  1232 + this.viewDate.setUTCMonth(month);
  1233 + } else {
  1234 + month = 0;
  1235 + year = Number(target.text());
  1236 + this.viewDate.setUTCFullYear(year);
  1237 + }
  1238 +
  1239 + this._trigger(DPGlobal.viewModes[this.viewMode - 1].e, this.viewDate);
  1240 +
  1241 + if (this.viewMode === this.o.minViewMode){
  1242 + this._setDate(UTCDate(year, month, day));
  1243 + } else {
  1244 + this.setViewMode(this.viewMode - 1);
  1245 + this.fill();
  1246 + }
  1247 + }
  1248 + }
  1249 +
  1250 + if (this.picker.is(':visible') && this._focused_from){
  1251 + this._focused_from.focus();
  1252 + }
  1253 + delete this._focused_from;
  1254 + },
  1255 +
  1256 + // Clicked on prev or next
  1257 + navArrowsClick: function(e){
  1258 + var target = $(e.target);
  1259 + var dir = target.hasClass('prev') ? -1 : 1;
  1260 + if (this.viewMode !== 0){
  1261 + dir *= DPGlobal.viewModes[this.viewMode].navStep * 12;
  1262 + }
  1263 + this.viewDate = this.moveMonth(this.viewDate, dir);
  1264 + this._trigger(DPGlobal.viewModes[this.viewMode].e, this.viewDate);
  1265 + this.fill();
  1266 + },
  1267 +
  1268 + _toggle_multidate: function(date){
  1269 + var ix = this.dates.contains(date);
  1270 + if (!date){
  1271 + this.dates.clear();
  1272 + }
  1273 +
  1274 + if (ix !== -1){
  1275 + if (this.o.multidate === true || this.o.multidate > 1 || this.o.toggleActive){
  1276 + this.dates.remove(ix);
  1277 + }
  1278 + } else if (this.o.multidate === false) {
  1279 + this.dates.clear();
  1280 + this.dates.push(date);
  1281 + }
  1282 + else {
  1283 + this.dates.push(date);
  1284 + }
  1285 +
  1286 + if (typeof this.o.multidate === 'number')
  1287 + while (this.dates.length > this.o.multidate)
  1288 + this.dates.remove(0);
  1289 + },
  1290 +
  1291 + _setDate: function(date, which){
  1292 + if (!which || which === 'date')
  1293 + this._toggle_multidate(date && new Date(date));
  1294 + if ((!which && this.o.updateViewDate) || which === 'view')
  1295 + this.viewDate = date && new Date(date);
  1296 +
  1297 + this.fill();
  1298 + this.setValue();
  1299 + if (!which || which !== 'view') {
  1300 + this._trigger('changeDate');
  1301 + }
  1302 + this.inputField.trigger('change');
  1303 + if (this.o.autoclose && (!which || which === 'date')){
  1304 + this.hide();
  1305 + }
  1306 + },
  1307 +
  1308 + moveDay: function(date, dir){
  1309 + var newDate = new Date(date);
  1310 + newDate.setUTCDate(date.getUTCDate() + dir);
  1311 +
  1312 + return newDate;
  1313 + },
  1314 +
  1315 + moveWeek: function(date, dir){
  1316 + return this.moveDay(date, dir * 7);
  1317 + },
  1318 +
  1319 + moveMonth: function(date, dir){
  1320 + if (!isValidDate(date))
  1321 + return this.o.defaultViewDate;
  1322 + if (!dir)
  1323 + return date;
  1324 + var new_date = new Date(date.valueOf()),
  1325 + day = new_date.getUTCDate(),
  1326 + month = new_date.getUTCMonth(),
  1327 + mag = Math.abs(dir),
  1328 + new_month, test;
  1329 + dir = dir > 0 ? 1 : -1;
  1330 + if (mag === 1){
  1331 + test = dir === -1
  1332 + // If going back one month, make sure month is not current month
  1333 + // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02)
  1334 + ? function(){
  1335 + return new_date.getUTCMonth() === month;
  1336 + }
  1337 + // If going forward one month, make sure month is as expected
  1338 + // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02)
  1339 + : function(){
  1340 + return new_date.getUTCMonth() !== new_month;
  1341 + };
  1342 + new_month = month + dir;
  1343 + new_date.setUTCMonth(new_month);
  1344 + // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11
  1345 + new_month = (new_month + 12) % 12;
  1346 + }
  1347 + else {
  1348 + // For magnitudes >1, move one month at a time...
  1349 + for (var i=0; i < mag; i++)
  1350 + // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)...
  1351 + new_date = this.moveMonth(new_date, dir);
  1352 + // ...then reset the day, keeping it in the new month
  1353 + new_month = new_date.getUTCMonth();
  1354 + new_date.setUTCDate(day);
  1355 + test = function(){
  1356 + return new_month !== new_date.getUTCMonth();
  1357 + };
  1358 + }
  1359 + // Common date-resetting loop -- if date is beyond end of month, make it
  1360 + // end of month
  1361 + while (test()){
  1362 + new_date.setUTCDate(--day);
  1363 + new_date.setUTCMonth(new_month);
  1364 + }
  1365 + return new_date;
  1366 + },
  1367 +
  1368 + moveYear: function(date, dir){
  1369 + return this.moveMonth(date, dir*12);
  1370 + },
  1371 +
  1372 + moveAvailableDate: function(date, dir, fn){
  1373 + do {
  1374 + date = this[fn](date, dir);
  1375 +
  1376 + if (!this.dateWithinRange(date))
  1377 + return false;
  1378 +
  1379 + fn = 'moveDay';
  1380 + }
  1381 + while (this.dateIsDisabled(date));
  1382 +
  1383 + return date;
  1384 + },
  1385 +
  1386 + weekOfDateIsDisabled: function(date){
  1387 + return $.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1;
  1388 + },
  1389 +
  1390 + dateIsDisabled: function(date){
  1391 + return (
  1392 + this.weekOfDateIsDisabled(date) ||
  1393 + $.grep(this.o.datesDisabled, function(d){
  1394 + return isUTCEquals(date, d);
  1395 + }).length > 0
  1396 + );
  1397 + },
  1398 +
  1399 + dateWithinRange: function(date){
  1400 + return date >= this.o.startDate && date <= this.o.endDate;
  1401 + },
  1402 +
  1403 + keydown: function(e){
  1404 + if (!this.picker.is(':visible')){
  1405 + if (e.keyCode === 40 || e.keyCode === 27) { // allow down to re-show picker
  1406 + this.show();
  1407 + e.stopPropagation();
  1408 + }
  1409 + return;
  1410 + }
  1411 + var dateChanged = false,
  1412 + dir, newViewDate,
  1413 + focusDate = this.focusDate || this.viewDate;
  1414 + switch (e.keyCode){
  1415 + case 27: // escape
  1416 + if (this.focusDate){
  1417 + this.focusDate = null;
  1418 + this.viewDate = this.dates.get(-1) || this.viewDate;
294 1419 this.fill();
295   - this.set();
  1420 + }
  1421 + else
  1422 + this.hide();
  1423 + e.preventDefault();
  1424 + e.stopPropagation();
  1425 + break;
  1426 + case 37: // left
  1427 + case 38: // up
  1428 + case 39: // right
  1429 + case 40: // down
  1430 + if (!this.o.keyboardNavigation || this.o.daysOfWeekDisabled.length === 7)
296 1431 break;
297   - case 'td':
298   - if (target.is('.day') && !target.is('.disabled')){
299   - var day = parseInt(target.text(), 10)||1;
300   - var month = this.viewDate.getMonth();
301   - if (target.is('.old')) {
302   - month -= 1;
303   - } else if (target.is('.new')) {
304   - month += 1;
305   - }
306   - var year = this.viewDate.getFullYear();
307   - this.date = new Date(year, month, day,0,0,0,0);
308   - this.viewDate = new Date(year, month, Math.min(28, day),0,0,0,0);
309   - this.fill();
310   - this.set();
311   - this.element.trigger({
312   - type: 'changeDate',
313   - date: this.date,
314   - viewMode: DPGlobal.modes[this.viewMode].clsName
315   - });
316   - }
  1432 + dir = e.keyCode === 37 || e.keyCode === 38 ? -1 : 1;
  1433 + if (this.viewMode === 0) {
  1434 + if (e.ctrlKey){
  1435 + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear');
  1436 +
  1437 + if (newViewDate)
  1438 + this._trigger('changeYear', this.viewDate);
  1439 + } else if (e.shiftKey){
  1440 + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth');
  1441 +
  1442 + if (newViewDate)
  1443 + this._trigger('changeMonth', this.viewDate);
  1444 + } else if (e.keyCode === 37 || e.keyCode === 39){
  1445 + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveDay');
  1446 + } else if (!this.weekOfDateIsDisabled(focusDate)){
  1447 + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveWeek');
  1448 + }
  1449 + } else if (this.viewMode === 1) {
  1450 + if (e.keyCode === 38 || e.keyCode === 40) {
  1451 + dir = dir * 4;
  1452 + }
  1453 + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth');
  1454 + } else if (this.viewMode === 2) {
  1455 + if (e.keyCode === 38 || e.keyCode === 40) {
  1456 + dir = dir * 4;
  1457 + }
  1458 + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear');
  1459 + }
  1460 + if (newViewDate){
  1461 + this.focusDate = this.viewDate = newViewDate;
  1462 + this.setValue();
  1463 + this.fill();
  1464 + e.preventDefault();
  1465 + }
  1466 + break;
  1467 + case 13: // enter
  1468 + if (!this.o.forceParse)
317 1469 break;
  1470 + focusDate = this.focusDate || this.dates.get(-1) || this.viewDate;
  1471 + if (this.o.keyboardNavigation) {
  1472 + this._toggle_multidate(focusDate);
  1473 + dateChanged = true;
  1474 + }
  1475 + this.focusDate = null;
  1476 + this.viewDate = this.dates.get(-1) || this.viewDate;
  1477 + this.setValue();
  1478 + this.fill();
  1479 + if (this.picker.is(':visible')){
  1480 + e.preventDefault();
  1481 + e.stopPropagation();
  1482 + if (this.o.autoclose)
  1483 + this.hide();
  1484 + }
  1485 + break;
  1486 + case 9: // tab
  1487 + this.focusDate = null;
  1488 + this.viewDate = this.dates.get(-1) || this.viewDate;
  1489 + this.fill();
  1490 + this.hide();
  1491 + break;
  1492 + }
  1493 + if (dateChanged){
  1494 + if (this.dates.length)
  1495 + this._trigger('changeDate');
  1496 + else
  1497 + this._trigger('clearDate');
  1498 + this.inputField.trigger('change');
  1499 + }
  1500 + },
  1501 +
  1502 + setViewMode: function(viewMode){
  1503 + this.viewMode = viewMode;
  1504 + this.picker
  1505 + .children('div')
  1506 + .hide()
  1507 + .filter('.datepicker-' + DPGlobal.viewModes[this.viewMode].clsName)
  1508 + .show();
  1509 + this.updateNavArrows();
  1510 + this._trigger('changeViewMode', new Date(this.viewDate));
  1511 + }
  1512 + };
  1513 +
  1514 + var DateRangePicker = function(element, options){
  1515 + $.data(element, 'datepicker', this);
  1516 + this.element = $(element);
  1517 + this.inputs = $.map(options.inputs, function(i){
  1518 + return i.jquery ? i[0] : i;
  1519 + });
  1520 + delete options.inputs;
  1521 +
  1522 + this.keepEmptyValues = options.keepEmptyValues;
  1523 + delete options.keepEmptyValues;
  1524 +
  1525 + datepickerPlugin.call($(this.inputs), options)
  1526 + .on('changeDate', $.proxy(this.dateUpdated, this));
  1527 +
  1528 + this.pickers = $.map(this.inputs, function(i){
  1529 + return $.data(i, 'datepicker');
  1530 + });
  1531 + this.updateDates();
  1532 + };
  1533 + DateRangePicker.prototype = {
  1534 + updateDates: function(){
  1535 + this.dates = $.map(this.pickers, function(i){
  1536 + return i.getUTCDate();
  1537 + });
  1538 + this.updateRanges();
  1539 + },
  1540 + updateRanges: function(){
  1541 + var range = $.map(this.dates, function(d){
  1542 + return d.valueOf();
  1543 + });
  1544 + $.each(this.pickers, function(i, p){
  1545 + p.setRange(range);
  1546 + });
  1547 + },
  1548 + dateUpdated: function(e){
  1549 + // `this.updating` is a workaround for preventing infinite recursion
  1550 + // between `changeDate` triggering and `setUTCDate` calling. Until
  1551 + // there is a better mechanism.
  1552 + if (this.updating)
  1553 + return;
  1554 + this.updating = true;
  1555 +
  1556 + var dp = $.data(e.target, 'datepicker');
  1557 +
  1558 + if (dp === undefined) {
  1559 + return;
  1560 + }
  1561 +
  1562 + var new_date = dp.getUTCDate(),
  1563 + keep_empty_values = this.keepEmptyValues,
  1564 + i = $.inArray(e.target, this.inputs),
  1565 + j = i - 1,
  1566 + k = i + 1,
  1567 + l = this.inputs.length;
  1568 + if (i === -1)
  1569 + return;
  1570 +
  1571 + $.each(this.pickers, function(i, p){
  1572 + if (!p.getUTCDate() && (p === dp || !keep_empty_values))
  1573 + p.setUTCDate(new_date);
  1574 + });
  1575 +
  1576 + if (new_date < this.dates[j]){
  1577 + // Date being moved earlier/left
  1578 + while (j >= 0 && new_date < this.dates[j]){
  1579 + this.pickers[j--].setUTCDate(new_date);
  1580 + }
  1581 + } else if (new_date > this.dates[k]){
  1582 + // Date being moved later/right
  1583 + while (k < l && new_date > this.dates[k]){
  1584 + this.pickers[k++].setUTCDate(new_date);
318 1585 }
319 1586 }
  1587 + this.updateDates();
  1588 +
  1589 + delete this.updating;
320 1590 },
321   -
322   - mousedown: function(e){
323   - e.stopPropagation();
324   - e.preventDefault();
  1591 + destroy: function(){
  1592 + $.map(this.pickers, function(p){ p.destroy(); });
  1593 + $(this.inputs).off('changeDate', this.dateUpdated);
  1594 + delete this.element.data().datepicker;
325 1595 },
326   -
327   - showMode: function(dir) {
328   - if (dir) {
329   - this.viewMode = Math.max(this.minViewMode, Math.min(2, this.viewMode + dir));
  1596 + remove: alias('destroy')
  1597 + };
  1598 +
  1599 + function opts_from_el(el, prefix){
  1600 + // Derive options from element data-attrs
  1601 + var data = $(el).data(),
  1602 + out = {}, inkey,
  1603 + replace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])');
  1604 + prefix = new RegExp('^' + prefix.toLowerCase());
  1605 + function re_lower(_,a){
  1606 + return a.toLowerCase();
  1607 + }
  1608 + for (var key in data)
  1609 + if (prefix.test(key)){
  1610 + inkey = key.replace(replace, re_lower);
  1611 + out[inkey] = data[key];
330 1612 }
331   - this.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).show();
  1613 + return out;
  1614 + }
  1615 +
  1616 + function opts_from_locale(lang){
  1617 + // Derive options from locale plugins
  1618 + var out = {};
  1619 + // Check if "de-DE" style date is available, if not language should
  1620 + // fallback to 2 letter code eg "de"
  1621 + if (!dates[lang]){
  1622 + lang = lang.split('-')[0];
  1623 + if (!dates[lang])
  1624 + return;
332 1625 }
333   - };
334   -
335   - $.fn.datepicker = function ( option, val ) {
336   - return this.each(function () {
  1626 + var d = dates[lang];
  1627 + $.each(locale_opts, function(i,k){
  1628 + if (k in d)
  1629 + out[k] = d[k];
  1630 + });
  1631 + return out;
  1632 + }
  1633 +
  1634 + var old = $.fn.datepicker;
  1635 + var datepickerPlugin = function(option){
  1636 + var args = Array.apply(null, arguments);
  1637 + args.shift();
  1638 + var internal_return;
  1639 + this.each(function(){
337 1640 var $this = $(this),
338 1641 data = $this.data('datepicker'),
339 1642 options = typeof option === 'object' && option;
340   - if (!data) {
341   - $this.data('datepicker', (data = new Datepicker(this, $.extend({}, $.fn.datepicker.defaults,options))));
  1643 + if (!data){
  1644 + var elopts = opts_from_el(this, 'date'),
  1645 + // Preliminary otions
  1646 + xopts = $.extend({}, defaults, elopts, options),
  1647 + locopts = opts_from_locale(xopts.language),
  1648 + // Options priority: js args, data-attrs, locales, defaults
  1649 + opts = $.extend({}, defaults, locopts, elopts, options);
  1650 + if ($this.hasClass('input-daterange') || opts.inputs){
  1651 + $.extend(opts, {
  1652 + inputs: opts.inputs || $this.find('input').toArray()
  1653 + });
  1654 + data = new DateRangePicker(this, opts);
  1655 + }
  1656 + else {
  1657 + data = new Datepicker(this, opts);
  1658 + }
  1659 + $this.data('datepicker', data);
  1660 + }
  1661 + if (typeof option === 'string' && typeof data[option] === 'function'){
  1662 + internal_return = data[option].apply(data, args);
342 1663 }
343   - if (typeof option === 'string') data[option](val);
344 1664 });
  1665 +
  1666 + if (
  1667 + internal_return === undefined ||
  1668 + internal_return instanceof Datepicker ||
  1669 + internal_return instanceof DateRangePicker
  1670 + )
  1671 + return this;
  1672 +
  1673 + if (this.length > 1)
  1674 + throw new Error('Using only allowed for the collection of a single element (' + option + ' function)');
  1675 + else
  1676 + return internal_return;
345 1677 };
  1678 + $.fn.datepicker = datepickerPlugin;
346 1679  
347   - $.fn.datepicker.defaults = {
348   - onRender: function(date) {
349   - return '';
  1680 + var defaults = $.fn.datepicker.defaults = {
  1681 + assumeNearbyYear: false,
  1682 + autoclose: false,
  1683 + beforeShowDay: $.noop,
  1684 + beforeShowMonth: $.noop,
  1685 + beforeShowYear: $.noop,
  1686 + beforeShowDecade: $.noop,
  1687 + beforeShowCentury: $.noop,
  1688 + calendarWeeks: false,
  1689 + clearBtn: false,
  1690 + toggleActive: false,
  1691 + daysOfWeekDisabled: [],
  1692 + daysOfWeekHighlighted: [],
  1693 + datesDisabled: [],
  1694 + endDate: Infinity,
  1695 + forceParse: true,
  1696 + format: 'mm/dd/yyyy',
  1697 + keepEmptyValues: false,
  1698 + keyboardNavigation: true,
  1699 + language: 'en',
  1700 + minViewMode: 0,
  1701 + maxViewMode: 4,
  1702 + multidate: false,
  1703 + multidateSeparator: ',',
  1704 + orientation: "auto",
  1705 + rtl: false,
  1706 + startDate: -Infinity,
  1707 + startView: 0,
  1708 + todayBtn: false,
  1709 + todayHighlight: false,
  1710 + updateViewDate: true,
  1711 + weekStart: 0,
  1712 + disableTouchKeyboard: false,
  1713 + enableOnReadonly: true,
  1714 + showOnFocus: true,
  1715 + zIndexOffset: 10,
  1716 + container: 'body',
  1717 + immediateUpdates: false,
  1718 + dateCells:false,
  1719 + title: '',
  1720 + templates: {
  1721 + leftArrow: '&#x00AB;',
  1722 + rightArrow: '&#x00BB;'
350 1723 }
351 1724 };
  1725 + var locale_opts = $.fn.datepicker.locale_opts = [
  1726 + 'format',
  1727 + 'rtl',
  1728 + 'weekStart'
  1729 + ];
352 1730 $.fn.datepicker.Constructor = Datepicker;
353   -
  1731 + var dates = $.fn.datepicker.dates = {
  1732 + en: {
  1733 + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
  1734 + daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
  1735 + daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
  1736 + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
  1737 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
  1738 + today: "Today",
  1739 + clear: "Clear",
  1740 + titleFormat: "MM yyyy"
  1741 + }
  1742 + };
  1743 +
354 1744 var DPGlobal = {
355   - modes: [
  1745 + viewModes: [
356 1746 {
  1747 + names: ['days', 'month'],
357 1748 clsName: 'days',
358   - navFnc: 'Month',
359   - navStep: 1
  1749 + e: 'changeMonth'
360 1750 },
361 1751 {
  1752 + names: ['months', 'year'],
362 1753 clsName: 'months',
363   - navFnc: 'FullYear',
  1754 + e: 'changeYear',
364 1755 navStep: 1
365 1756 },
366 1757 {
  1758 + names: ['years', 'decade'],
367 1759 clsName: 'years',
368   - navFnc: 'FullYear',
  1760 + e: 'changeDecade',
369 1761 navStep: 10
370   - }],
371   - dates:{
372   - days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
373   - daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
374   - daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
375   - months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
376   - monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
377   - },
378   - isLeapYear: function (year) {
379   - return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0))
380   - },
381   - getDaysInMonth: function (year, month) {
382   - return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]
383   - },
  1762 + },
  1763 + {
  1764 + names: ['decades', 'century'],
  1765 + clsName: 'decades',
  1766 + e: 'changeCentury',
  1767 + navStep: 100
  1768 + },
  1769 + {
  1770 + names: ['centuries', 'millennium'],
  1771 + clsName: 'centuries',
  1772 + e: 'changeMillennium',
  1773 + navStep: 1000
  1774 + }
  1775 + ],
  1776 + validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g,
  1777 + nonpunctuation: /[^ -\/:-@\u5e74\u6708\u65e5\[-`{-~\t\n\r]+/g,
384 1778 parseFormat: function(format){
385   - var separator = format.match(/[.\/\-\s].*?/),
386   - parts = format.split(/\W+/);
387   - if (!separator || !parts || parts.length === 0){
  1779 + if (typeof format.toValue === 'function' && typeof format.toDisplay === 'function')
  1780 + return format;
  1781 + // IE treats \0 as a string end in inputs (truncating the value),
  1782 + // so it's a bad format delimiter, anyway
  1783 + var separators = format.replace(this.validParts, '\0').split('\0'),
  1784 + parts = format.match(this.validParts);
  1785 + if (!separators || !separators.length || !parts || parts.length === 0){
388 1786 throw new Error("Invalid date format.");
389 1787 }
390   - return {separator: separator, parts: parts};
391   - },
392   - parseDate: function(date, format) {
393   - var parts = date.split(format.separator),
394   - date = new Date(),
395   - val;
396   - date.setHours(0);
397   - date.setMinutes(0);
398   - date.setSeconds(0);
399   - date.setMilliseconds(0);
400   - if (parts.length === format.parts.length) {
401   - var year = date.getFullYear(), day = date.getDate(), month = date.getMonth();
402   - for (var i=0, cnt = format.parts.length; i < cnt; i++) {
403   - val = parseInt(parts[i], 10)||1;
404   - switch(format.parts[i]) {
405   - case 'dd':
406   - case 'd':
407   - day = val;
408   - date.setDate(val);
409   - break;
410   - case 'mm':
411   - case 'm':
412   - month = val - 1;
413   - date.setMonth(val - 1);
414   - break;
415   - case 'yy':
416   - year = 2000 + val;
417   - date.setFullYear(2000 + val);
418   - break;
419   - case 'yyyy':
420   - year = val;
421   - date.setFullYear(val);
422   - break;
  1788 + return {separators: separators, parts: parts};
  1789 + },
  1790 + parseDate: function(date, format, language, assumeNearby){
  1791 + if (!date)
  1792 + return undefined;
  1793 + if (date instanceof Date)
  1794 + return date;
  1795 + if (typeof format === 'string')
  1796 + format = DPGlobal.parseFormat(format);
  1797 + if (format.toValue)
  1798 + return format.toValue(date, format, language);
  1799 + var fn_map = {
  1800 + d: 'moveDay',
  1801 + m: 'moveMonth',
  1802 + w: 'moveWeek',
  1803 + y: 'moveYear'
  1804 + },
  1805 + dateAliases = {
  1806 + yesterday: '-1d',
  1807 + today: '+0d',
  1808 + tomorrow: '+1d'
  1809 + },
  1810 + parts, part, dir, i, fn;
  1811 + if (date in dateAliases){
  1812 + date = dateAliases[date];
  1813 + }
  1814 + if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/i.test(date)){
  1815 + parts = date.match(/([\-+]\d+)([dmwy])/gi);
  1816 + date = new Date();
  1817 + for (i=0; i < parts.length; i++){
  1818 + part = parts[i].match(/([\-+]\d+)([dmwy])/i);
  1819 + dir = Number(part[1]);
  1820 + fn = fn_map[part[2].toLowerCase()];
  1821 + date = Datepicker.prototype[fn](date, dir);
  1822 + }
  1823 + return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());
  1824 + }
  1825 +
  1826 + parts = date && date.match(this.nonpunctuation) || [];
  1827 + date = new Date();
  1828 +
  1829 + function applyNearbyYear(year, threshold){
  1830 + if (threshold === true)
  1831 + threshold = 10;
  1832 +
  1833 + // if year is 2 digits or less, than the user most likely is trying to get a recent century
  1834 + if (year < 100){
  1835 + year += 2000;
  1836 + // if the new year is more than threshold years in advance, use last century
  1837 + if (year > ((new Date()).getFullYear()+threshold)){
  1838 + year -= 100;
  1839 + }
  1840 + }
  1841 +
  1842 + return year;
  1843 + }
  1844 +
  1845 + var parsed = {},
  1846 + setters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'],
  1847 + setters_map = {
  1848 + yyyy: function(d,v){
  1849 + return d.setUTCFullYear(assumeNearby ? applyNearbyYear(v, assumeNearby) : v);
  1850 + },
  1851 + m: function(d,v){
  1852 + if (isNaN(d))
  1853 + return d;
  1854 + v -= 1;
  1855 + while (v < 0) v += 12;
  1856 + v %= 12;
  1857 + d.setUTCMonth(v);
  1858 + while (d.getUTCMonth() !== v)
  1859 + d.setUTCDate(d.getUTCDate()-1);
  1860 + return d;
  1861 + },
  1862 + d: function(d,v){
  1863 + return d.setUTCDate(v);
  1864 + }
  1865 + },
  1866 + val, filtered;
  1867 + setters_map['yy'] = setters_map['yyyy'];
  1868 + setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m'];
  1869 + setters_map['dd'] = setters_map['d'];
  1870 + date = UTCToday();
  1871 + var fparts = format.parts.slice();
  1872 + // Remove noop parts
  1873 + if (parts.length !== fparts.length){
  1874 + fparts = $(fparts).filter(function(i,p){
  1875 + return $.inArray(p, setters_order) !== -1;
  1876 + }).toArray();
  1877 + }
  1878 + // Process remainder
  1879 + function match_part(){
  1880 + var m = this.slice(0, parts[i].length),
  1881 + p = parts[i].slice(0, m.length);
  1882 + return m.toLowerCase() === p.toLowerCase();
  1883 + }
  1884 + if (parts.length === fparts.length){
  1885 + var cnt;
  1886 + for (i=0, cnt = fparts.length; i < cnt; i++){
  1887 + val = parseInt(parts[i], 10);
  1888 + part = fparts[i];
  1889 + if (isNaN(val)){
  1890 + switch (part){
  1891 + case 'MM':
  1892 + filtered = $(dates[language].months).filter(match_part);
  1893 + val = $.inArray(filtered[0], dates[language].months) + 1;
  1894 + break;
  1895 + case 'M':
  1896 + filtered = $(dates[language].monthsShort).filter(match_part);
  1897 + val = $.inArray(filtered[0], dates[language].monthsShort) + 1;
  1898 + break;
  1899 + }
  1900 + }
  1901 + parsed[part] = val;
  1902 + }
  1903 + var _date, s;
  1904 + for (i=0; i < setters_order.length; i++){
  1905 + s = setters_order[i];
  1906 + if (s in parsed && !isNaN(parsed[s])){
  1907 + _date = new Date(date);
  1908 + setters_map[s](_date, parsed[s]);
  1909 + if (!isNaN(_date))
  1910 + date = _date;
423 1911 }
424 1912 }
425   - date = new Date(year, month, day, 0 ,0 ,0);
426 1913 }
427 1914 return date;
428 1915 },
429   - formatDate: function(date, format){
430   - var val = {
431   - d: date.getDate(),
432   - m: date.getMonth() + 1,
433   - yy: date.getFullYear().toString().substring(2),
434   - yyyy: date.getFullYear()
  1916 + formatDate: function(date, format, language){
  1917 + if (!date)
  1918 + return '';
  1919 + if (typeof format === 'string')
  1920 + format = DPGlobal.parseFormat(format);
  1921 + if (format.toDisplay)
  1922 + return format.toDisplay(date, format, language);
  1923 + var val = {
  1924 + d: date.getUTCDate(),
  1925 + D: dates[language].daysShort[date.getUTCDay()],
  1926 + DD: dates[language].days[date.getUTCDay()],
  1927 + m: date.getUTCMonth() + 1,
  1928 + M: dates[language].monthsShort[date.getUTCMonth()],
  1929 + MM: dates[language].months[date.getUTCMonth()],
  1930 + yy: date.getUTCFullYear().toString().substring(2),
  1931 + yyyy: date.getUTCFullYear()
435 1932 };
436 1933 val.dd = (val.d < 10 ? '0' : '') + val.d;
437 1934 val.mm = (val.m < 10 ? '0' : '') + val.m;
438   - var date = [];
439   - for (var i=0, cnt = format.parts.length; i < cnt; i++) {
  1935 + date = [];
  1936 + var seps = $.extend([], format.separators);
  1937 + for (var i=0, cnt = format.parts.length; i <= cnt; i++){
  1938 + if (seps.length)
  1939 + date.push(seps.shift());
440 1940 date.push(val[format.parts[i]]);
441 1941 }
442   - return date.join(format.separator);
  1942 + return date.join('');
443 1943 },
444 1944 headTemplate: '<thead>'+
  1945 + '<tr>'+
  1946 + '<th colspan="7" class="datepicker-title"></th>'+
  1947 + '</tr>'+
445 1948 '<tr>'+
446   - '<th class="prev">&lsaquo;</th>'+
447   - '<th colspan="5" class="switch"></th>'+
448   - '<th class="next">&rsaquo;</th>'+
  1949 + '<th class="prev">&laquo;</th>'+
  1950 + '<th colspan="5" class="datepicker-switch"></th>'+
  1951 + '<th class="next">&raquo;</th>'+
449 1952 '</tr>'+
450 1953 '</thead>',
451   - contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>'
  1954 + contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>',
  1955 + footTemplate: '<tfoot>'+
  1956 + '<tr>'+
  1957 + '<th colspan="7" class="today"></th>'+
  1958 + '</tr>'+
  1959 + '<tr>'+
  1960 + '<th colspan="7" class="clear"></th>'+
  1961 + '</tr>'+
  1962 + '</tfoot>'
452 1963 };
453   - DPGlobal.template = '<div class="datepicker dropdown-menu">'+
  1964 + DPGlobal.template = '<div class="datepicker">'+
454 1965 '<div class="datepicker-days">'+
455   - '<table class=" table-condensed">'+
  1966 + '<table class="table-condensed">'+
456 1967 DPGlobal.headTemplate+
457 1968 '<tbody></tbody>'+
  1969 + DPGlobal.footTemplate+
458 1970 '</table>'+
459 1971 '</div>'+
460 1972 '<div class="datepicker-months">'+
461 1973 '<table class="table-condensed">'+
462 1974 DPGlobal.headTemplate+
463 1975 DPGlobal.contTemplate+
  1976 + DPGlobal.footTemplate+
464 1977 '</table>'+
465 1978 '</div>'+
466 1979 '<div class="datepicker-years">'+
467 1980 '<table class="table-condensed">'+
468 1981 DPGlobal.headTemplate+
469 1982 DPGlobal.contTemplate+
  1983 + DPGlobal.footTemplate+
  1984 + '</table>'+
  1985 + '</div>'+
  1986 + '<div class="datepicker-decades">'+
  1987 + '<table class="table-condensed">'+
  1988 + DPGlobal.headTemplate+
  1989 + DPGlobal.contTemplate+
  1990 + DPGlobal.footTemplate+
  1991 + '</table>'+
  1992 + '</div>'+
  1993 + '<div class="datepicker-centuries">'+
  1994 + '<table class="table-condensed">'+
  1995 + DPGlobal.headTemplate+
  1996 + DPGlobal.contTemplate+
  1997 + DPGlobal.footTemplate+
470 1998 '</table>'+
471 1999 '</div>'+
472 2000 '</div>';
473 2001  
474   -}( window.jQuery );
475 2002 \ No newline at end of file
  2003 + $.fn.datepicker.DPGlobal = DPGlobal;
  2004 +
  2005 +
  2006 + /* DATEPICKER NO CONFLICT
  2007 + * =================== */
  2008 +
  2009 + $.fn.datepicker.noConflict = function(){
  2010 + $.fn.datepicker = old;
  2011 + return this;
  2012 + };
  2013 +
  2014 + /* DATEPICKER VERSION
  2015 + * =================== */
  2016 + $.fn.datepicker.version = '1.7.0-dev';
  2017 +
  2018 + /* DATEPICKER DATA-API
  2019 + * ================== */
  2020 +
  2021 + $(document).on(
  2022 + 'focus.datepicker.data-api click.datepicker.data-api',
  2023 + '[data-provide="datepicker"]',
  2024 + function(e){
  2025 + var $this = $(this);
  2026 + if ($this.data('datepicker'))
  2027 + return;
  2028 + e.preventDefault();
  2029 + // component click requires us to explicitly show it
  2030 + datepickerPlugin.call($this, 'show');
  2031 + }
  2032 + );
  2033 + $(function(){
  2034 + datepickerPlugin.call($('[data-provide="datepicker-inline"]'));
  2035 + });
  2036 +
  2037 +}));
... ...
core/static/js/vendor/jscookie.js 0 → 100644
... ... @@ -0,0 +1,156 @@
  1 +/*!
  2 + * JavaScript Cookie v2.1.3
  3 + * https://github.com/js-cookie/js-cookie
  4 + *
  5 + * Copyright 2006, 2015 Klaus Hartl & Fagner Brack
  6 + * Released under the MIT license
  7 + */
  8 +;(function (factory) {
  9 + var registeredInModuleLoader = false;
  10 + if (typeof define === 'function' && define.amd) {
  11 + define(factory);
  12 + registeredInModuleLoader = true;
  13 + }
  14 + if (typeof exports === 'object') {
  15 + module.exports = factory();
  16 + registeredInModuleLoader = true;
  17 + }
  18 + if (!registeredInModuleLoader) {
  19 + var OldCookies = window.Cookies;
  20 + var api = window.Cookies = factory();
  21 + api.noConflict = function () {
  22 + window.Cookies = OldCookies;
  23 + return api;
  24 + };
  25 + }
  26 +}(function () {
  27 + function extend () {
  28 + var i = 0;
  29 + var result = {};
  30 + for (; i < arguments.length; i++) {
  31 + var attributes = arguments[ i ];
  32 + for (var key in attributes) {
  33 + result[key] = attributes[key];
  34 + }
  35 + }
  36 + return result;
  37 + }
  38 +
  39 + function init (converter) {
  40 + function api (key, value, attributes) {
  41 + var result;
  42 + if (typeof document === 'undefined') {
  43 + return;
  44 + }
  45 +
  46 + // Write
  47 +
  48 + if (arguments.length > 1) {
  49 + attributes = extend({
  50 + path: '/'
  51 + }, api.defaults, attributes);
  52 +
  53 + if (typeof attributes.expires === 'number') {
  54 + var expires = new Date();
  55 + expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);
  56 + attributes.expires = expires;
  57 + }
  58 +
  59 + try {
  60 + result = JSON.stringify(value);
  61 + if (/^[\{\[]/.test(result)) {
  62 + value = result;
  63 + }
  64 + } catch (e) {}
  65 +
  66 + if (!converter.write) {
  67 + value = encodeURIComponent(String(value))
  68 + .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);
  69 + } else {
  70 + value = converter.write(value, key);
  71 + }
  72 +
  73 + key = encodeURIComponent(String(key));
  74 + key = key.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent);
  75 + key = key.replace(/[\(\)]/g, escape);
  76 +
  77 + return (document.cookie = [
  78 + key, '=', value,
  79 + attributes.expires ? '; expires=' + attributes.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
  80 + attributes.path ? '; path=' + attributes.path : '',
  81 + attributes.domain ? '; domain=' + attributes.domain : '',
  82 + attributes.secure ? '; secure' : ''
  83 + ].join(''));
  84 + }
  85 +
  86 + // Read
  87 +
  88 + if (!key) {
  89 + result = {};
  90 + }
  91 +
  92 + // To prevent the for loop in the first place assign an empty array
  93 + // in case there are no cookies at all. Also prevents odd result when
  94 + // calling "get()"
  95 + var cookies = document.cookie ? document.cookie.split('; ') : [];
  96 + var rdecode = /(%[0-9A-Z]{2})+/g;
  97 + var i = 0;
  98 +
  99 + for (; i < cookies.length; i++) {
  100 + var parts = cookies[i].split('=');
  101 + var cookie = parts.slice(1).join('=');
  102 +
  103 + if (cookie.charAt(0) === '"') {
  104 + cookie = cookie.slice(1, -1);
  105 + }
  106 +
  107 + try {
  108 + var name = parts[0].replace(rdecode, decodeURIComponent);
  109 + cookie = converter.read ?
  110 + converter.read(cookie, name) : converter(cookie, name) ||
  111 + cookie.replace(rdecode, decodeURIComponent);
  112 +
  113 + if (this.json) {
  114 + try {
  115 + cookie = JSON.parse(cookie);
  116 + } catch (e) {}
  117 + }
  118 +
  119 + if (key === name) {
  120 + result = cookie;
  121 + break;
  122 + }
  123 +
  124 + if (!key) {
  125 + result[name] = cookie;
  126 + }
  127 + } catch (e) {}
  128 + }
  129 +
  130 + return result;
  131 + }
  132 +
  133 + api.set = api;
  134 + api.get = function (key) {
  135 + return api.call(api, key);
  136 + };
  137 + api.getJSON = function () {
  138 + return api.apply({
  139 + json: true
  140 + }, [].slice.call(arguments));
  141 + };
  142 + api.defaults = {};
  143 +
  144 + api.remove = function (key, attributes) {
  145 + api(key, '', extend(attributes, {
  146 + expires: -1
  147 + }));
  148 + };
  149 +
  150 + api.withConverter = init;
  151 +
  152 + return api;
  153 + }
  154 +
  155 + return init(function () {});
  156 +}));
0 157 \ No newline at end of file
... ...
core/static/js/vendor/locales/bootstrap-datepicker-en-ca.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Canadian English translation for bootstrap-datepicker
  3 + * Mike Nacey <mnacey@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['en-CA'] = {
  7 + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
  8 + daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
  9 + daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
  10 + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
  11 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
  12 + today: "Today",
  13 + monthsTitle: "Months",
  14 + clear: "Clear",
  15 + weekStart: 0,
  16 + format: "yyyy-mm-dd"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.ar-tn.js 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +/**
  2 + * Arabic-Tunisia translation for bootstrap-datepicker
  3 + * Souhaieb Besbes <besbes.souhaieb@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['ar-tn'] = {
  7 + days: ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد"],
  8 + daysShort: ["أحد", "اثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت", "أحد"],
  9 + daysMin: ["ح", "ن", "ث", "ع", "خ", "ج", "س", "ح"],
  10 + months: ["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويليه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],
  11 + monthsShort: ["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويليه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],
  12 + today: "هذا اليوم",
  13 + rtl: true
  14 + };
  15 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.ar.js 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +/**
  2 + * Arabic translation for bootstrap-datepicker
  3 + * Mohammed Alshehri <alshehri866@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['ar'] = {
  7 + days: ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد"],
  8 + daysShort: ["أحد", "اثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت", "أحد"],
  9 + daysMin: ["ح", "ن", "ث", "ع", "خ", "ج", "س", "ح"],
  10 + months: ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"],
  11 + monthsShort: ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"],
  12 + today: "هذا اليوم",
  13 + rtl: true
  14 + };
  15 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.az.js 0 → 100644
... ... @@ -0,0 +1,12 @@
  1 +// Azerbaijani
  2 +;(function($){
  3 + $.fn.datepicker.dates['az'] = {
  4 + days: ["Bazar", "Bazar ertəsi", "Çərşənbə axşamı", "Çərşənbə", "Cümə axşamı", "Cümə", "Şənbə"],
  5 + daysShort: ["B.", "B.e", "Ç.a", "Ç.", "C.a", "C.", "Ş."],
  6 + daysMin: ["B.", "B.e", "Ç.a", "Ç.", "C.a", "C.", "Ş."],
  7 + months: ["Yanvar", "Fevral", "Mart", "Aprel", "May", "İyun", "İyul", "Avqust", "Sentyabr", "Oktyabr", "Noyabr", "Dekabr"],
  8 + monthsShort: ["Yan", "Fev", "Mar", "Apr", "May", "İyun", "İyul", "Avq", "Sen", "Okt", "Noy", "Dek"],
  9 + today: "Bu gün",
  10 + weekStart: 1
  11 + };
  12 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.bg.js 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +/**
  2 + * Bulgarian translation for bootstrap-datepicker
  3 + * Apostol Apostolov <apostol.s.apostolov@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['bg'] = {
  7 + days: ["Неделя", "Понеделник", "Вторник", "Сряда", "Четвъртък", "Петък", "Събота"],
  8 + daysShort: ["Нед", "Пон", "Вто", "Сря", "Чет", "Пет", "Съб"],
  9 + daysMin: ["Н", "П", "В", "С", "Ч", "П", "С"],
  10 + months: ["Януари", "Февруари", "Март", "Април", "Май", "Юни", "Юли", "Август", "Септември", "Октомври", "Ноември", "Декември"],
  11 + monthsShort: ["Ян", "Фев", "Мар", "Апр", "Май", "Юни", "Юли", "Авг", "Сеп", "Окт", "Ное", "Дек"],
  12 + today: "днес"
  13 + };
  14 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.br.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Breton translation for bootstrap-datepicker
  3 + * Gwenn Meynier <tornoz@laposte.net>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['br'] = {
  7 + days: ["Sul", "Lun", "Meurzh", "Merc'her", "Yaou", "Gwener", "Sadorn"],
  8 + daysShort: ["Sul", "Lun", "Meu.", "Mer.", "Yao.", "Gwe.", "Sad."],
  9 + daysMin: ["Su", "L", "Meu", "Mer", "Y", "G", "Sa"],
  10 + months: ["Genver", "C'hwevrer", "Meurzh", "Ebrel", "Mae", "Mezheven", "Gouere", "Eost", "Gwengolo", "Here", "Du", "Kerzu"],
  11 + monthsShort: ["Genv.", "C'hw.", "Meur.", "Ebre.", "Mae", "Mezh.", "Goue.", "Eost", "Gwen.", "Here", "Du", "Kerz."],
  12 + today: "Hiziv",
  13 + monthsTitle: "Miz",
  14 + clear: "Dilemel",
  15 + weekStart: 1,
  16 + format: "dd/mm/yyyy"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.bs.js 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +/**
  2 + * Bosnian translation for bootstrap-datepicker
  3 + */
  4 +;(function($){
  5 + $.fn.datepicker.dates['bs'] = {
  6 + days: ["Nedjelja","Ponedjeljak", "Utorak", "Srijeda", "Četvrtak", "Petak", "Subota"],
  7 + daysShort: ["Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub"],
  8 + daysMin: ["N", "Po", "U", "Sr", "Č", "Pe", "Su"],
  9 + months: ["Januar", "Februar", "Mart", "April", "Maj", "Juni", "Juli", "August", "Septembar", "Oktobar", "Novembar", "Decembar"],
  10 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"],
  11 + today: "Danas",
  12 + weekStart: 1,
  13 + format: "dd.mm.yyyy"
  14 + };
  15 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.ca.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Catalan translation for bootstrap-datepicker
  3 + * J. Garcia <jogaco.en@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['ca'] = {
  7 + days: ["Diumenge", "Dilluns", "Dimarts", "Dimecres", "Dijous", "Divendres", "Dissabte"],
  8 + daysShort: ["Diu", "Dil", "Dmt", "Dmc", "Dij", "Div", "Dis"],
  9 + daysMin: ["dg", "dl", "dt", "dc", "dj", "dv", "ds"],
  10 + months: ["Gener", "Febrer", "Març", "Abril", "Maig", "Juny", "Juliol", "Agost", "Setembre", "Octubre", "Novembre", "Desembre"],
  11 + monthsShort: ["Gen", "Feb", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Oct", "Nov", "Des"],
  12 + today: "Avui",
  13 + monthsTitle: "Mesos",
  14 + clear: "Esborrar",
  15 + weekStart: 1,
  16 + format: "dd/mm/yyyy"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.cs.js 0 → 100644
... ... @@ -0,0 +1,19 @@
  1 +/**
  2 + * Czech translation for bootstrap-datepicker
  3 + * Matěj Koubík <matej@koubik.name>
  4 + * Fixes by Michal Remiš <michal.remis@gmail.com>
  5 + */
  6 +;(function($){
  7 + $.fn.datepicker.dates['cs'] = {
  8 + days: ["Neděle", "Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota"],
  9 + daysShort: ["Ned", "Pon", "Úte", "Stř", "Čtv", "Pát", "Sob"],
  10 + daysMin: ["Ne", "Po", "Út", "St", "Čt", "Pá", "So"],
  11 + months: ["Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec"],
  12 + monthsShort: ["Led", "Úno", "Bře", "Dub", "Kvě", "Čer", "Čnc", "Srp", "Zář", "Říj", "Lis", "Pro"],
  13 + today: "Dnes",
  14 + clear: "Vymazat",
  15 + monthsTitle: "Měsíc",
  16 + weekStart: 1,
  17 + format: "dd.m.yyyy"
  18 + };
  19 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.cy.js 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +/**
  2 + * Welsh translation for bootstrap-datepicker
  3 + * S. Morris <s.morris@bangor.ac.uk>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['cy'] = {
  7 + days: ["Sul", "Llun", "Mawrth", "Mercher", "Iau", "Gwener", "Sadwrn"],
  8 + daysShort: ["Sul", "Llu", "Maw", "Mer", "Iau", "Gwe", "Sad"],
  9 + daysMin: ["Su", "Ll", "Ma", "Me", "Ia", "Gwe", "Sa"],
  10 + months: ["Ionawr", "Chewfror", "Mawrth", "Ebrill", "Mai", "Mehefin", "Gorfennaf", "Awst", "Medi", "Hydref", "Tachwedd", "Rhagfyr"],
  11 + monthsShort: ["Ion", "Chw", "Maw", "Ebr", "Mai", "Meh", "Gor", "Aws", "Med", "Hyd", "Tach", "Rha"],
  12 + today: "Heddiw"
  13 + };
  14 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.da.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Danish translation for bootstrap-datepicker
  3 + * Christian Pedersen <http://github.com/chripede>
  4 + * Ivan Mylyanyk <https://github.com/imylyanyk>
  5 + */
  6 +;(function($){
  7 + $.fn.datepicker.dates['da'] = {
  8 + days: ["Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag"],
  9 + daysShort: ["Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør"],
  10 + daysMin: ["Sø", "Ma", "Ti", "On", "To", "Fr", "Lø"],
  11 + months: ["Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December"],
  12 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"],
  13 + today: "I Dag",
  14 + weekStart: 1,
  15 + clear: "Nulstil",
  16 + format: "dd-mm-yyyy"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.de.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * German translation for bootstrap-datepicker
  3 + * Sam Zurcher <sam@orelias.ch>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['de'] = {
  7 + days: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"],
  8 + daysShort: ["Son", "Mon", "Die", "Mit", "Don", "Fre", "Sam"],
  9 + daysMin: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"],
  10 + months: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"],
  11 + monthsShort: ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"],
  12 + today: "Heute",
  13 + monthsTitle: "Monate",
  14 + clear: "Löschen",
  15 + weekStart: 1,
  16 + format: "dd.mm.yyyy"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.el.js 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +/**
  2 + * Greek translation for bootstrap-datepicker
  3 + */
  4 +;(function($){
  5 + $.fn.datepicker.dates['el'] = {
  6 + days: ["Κυριακή", "Δευτέρα", "Τρίτη", "Τετάρτη", "Πέμπτη", "Παρασκευή", "Σάββατο"],
  7 + daysShort: ["Κυρ", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ"],
  8 + daysMin: ["Κυ", "Δε", "Τρ", "Τε", "Πε", "Πα", "Σα"],
  9 + months: ["Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάιος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος"],
  10 + monthsShort: ["Ιαν", "Φεβ", "Μαρ", "Απρ", "Μάι", "Ιουν", "Ιουλ", "Αυγ", "Σεπ", "Οκτ", "Νοε", "Δεκ"],
  11 + today: "Σήμερα",
  12 + clear: "Καθαρισμός",
  13 + weekStart: 1,
  14 + format: "d/m/yyyy"
  15 + };
  16 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.en-au.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Australian English translation for bootstrap-datepicker
  3 + * Steve Chapman <steven.p.chapman@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['en-AU'] = {
  7 + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
  8 + daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
  9 + daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
  10 + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
  11 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
  12 + today: "Today",
  13 + monthsTitle: "Months",
  14 + clear: "Clear",
  15 + weekStart: 1,
  16 + format: "d/mm/yyyy"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.en-gb.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * British English translation for bootstrap-datepicker
  3 + * Xavier Dutreilh <xavier@dutreilh.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['en-GB'] = {
  7 + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
  8 + daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
  9 + daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
  10 + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
  11 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
  12 + today: "Today",
  13 + monthsTitle: "Months",
  14 + clear: "Clear",
  15 + weekStart: 1,
  16 + format: "dd/mm/yyyy"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.en-ie.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * Irish English translation for bootstrap-datepicker
  3 + */
  4 +;(function($){
  5 + $.fn.datepicker.dates['en-IE'] = {
  6 + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
  7 + daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
  8 + daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
  9 + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
  10 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
  11 + today: "Today",
  12 + monthsTitle: "Months",
  13 + clear: "Clear",
  14 + weekStart: 1,
  15 + format: "dd/mm/yyyy"
  16 + };
  17 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.en-nz.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * New Zealand English translation for bootstrap-datepicker
  3 + */
  4 +;(function($){
  5 + $.fn.datepicker.dates['en-NZ'] = {
  6 + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
  7 + daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
  8 + daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
  9 + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
  10 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
  11 + today: "Today",
  12 + monthsTitle: "Months",
  13 + clear: "Clear",
  14 + weekStart: 1,
  15 + format: "d/mm/yyyy"
  16 + };
  17 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.en-za.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * South African English translation for bootstrap-datepicker
  3 + */
  4 +;(function($){
  5 + $.fn.datepicker.dates['en-ZA'] = {
  6 + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
  7 + daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
  8 + daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
  9 + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
  10 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
  11 + today: "Today",
  12 + monthsTitle: "Months",
  13 + clear: "Clear",
  14 + weekStart: 1,
  15 + format: "yyyy/mm/d"
  16 + };
  17 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.eo.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * Esperanto translation for bootstrap-datepicker
  3 + * Emmanuel Debanne <https://github.com/debanne>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['eo'] = {
  7 + days: ["dimanĉo", "lundo", "mardo", "merkredo", "ĵaŭdo", "vendredo", "sabato"],
  8 + daysShort: ["dim.", "lun.", "mar.", "mer.", "ĵaŭ.", "ven.", "sam."],
  9 + daysMin: ["d", "l", "ma", "me", "ĵ", "v", "s"],
  10 + months: ["januaro", "februaro", "marto", "aprilo", "majo", "junio", "julio", "aŭgusto", "septembro", "oktobro", "novembro", "decembro"],
  11 + monthsShort: ["jan.", "feb.", "mar.", "apr.", "majo", "jun.", "jul.", "aŭg.", "sep.", "okt.", "nov.", "dec."],
  12 + today: "Hodiaŭ",
  13 + clear: "Nuligi",
  14 + weekStart: 1,
  15 + format: "yyyy-mm-dd"
  16 + };
  17 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.es.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Spanish translation for bootstrap-datepicker
  3 + * Bruno Bonamin <bruno.bonamin@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['es'] = {
  7 + days: ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"],
  8 + daysShort: ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb"],
  9 + daysMin: ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa"],
  10 + months: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
  11 + monthsShort: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"],
  12 + today: "Hoy",
  13 + monthsTitle: "Meses",
  14 + clear: "Borrar",
  15 + weekStart: 1,
  16 + format: "dd/mm/yyyy"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.et.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Estonian translation for bootstrap-datepicker
  3 + * Ando Roots <https://github.com/anroots>
  4 + * Fixes by Illimar Tambek <<https://github.com/ragulka>
  5 + */
  6 +;(function($){
  7 + $.fn.datepicker.dates['et'] = {
  8 + days: ["Pühapäev", "Esmaspäev", "Teisipäev", "Kolmapäev", "Neljapäev", "Reede", "Laupäev"],
  9 + daysShort: ["Pühap", "Esmasp", "Teisip", "Kolmap", "Neljap", "Reede", "Laup"],
  10 + daysMin: ["P", "E", "T", "K", "N", "R", "L"],
  11 + months: ["Jaanuar", "Veebruar", "Märts", "Aprill", "Mai", "Juuni", "Juuli", "August", "September", "Oktoober", "November", "Detsember"],
  12 + monthsShort: ["Jaan", "Veebr", "Märts", "Apr", "Mai", "Juuni", "Juuli", "Aug", "Sept", "Okt", "Nov", "Dets"],
  13 + today: "Täna",
  14 + clear: "Tühjenda",
  15 + weekStart: 1,
  16 + format: "dd.mm.yyyy"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.eu.js 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +/**
  2 + * Basque translation for bootstrap-datepicker
  3 + * Arkaitz Etxeberria <kondi80@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['eu'] = {
  7 + days: ['Igandea', 'Astelehena', 'Asteartea', 'Asteazkena', 'Osteguna', 'Ostirala', 'Larunbata'],
  8 + daysShort: ['Ig', 'Al', 'Ar', 'Az', 'Og', 'Ol', 'Lr'],
  9 + daysMin: ['Ig', 'Al', 'Ar', 'Az', 'Og', 'Ol', 'Lr'],
  10 + months: ['Urtarrila', 'Otsaila', 'Martxoa', 'Apirila', 'Maiatza', 'Ekaina', 'Uztaila', 'Abuztua', 'Iraila', 'Urria', 'Azaroa', 'Abendua'],
  11 + monthsShort: ['Urt', 'Ots', 'Mar', 'Api', 'Mai', 'Eka', 'Uzt', 'Abu', 'Ira', 'Urr', 'Aza', 'Abe'],
  12 + today: "Gaur"
  13 + };
  14 +}(jQuery));
  15 +
... ...
core/static/js/vendor/locales/bootstrap-datepicker.fa.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * Persian translation for bootstrap-datepicker
  3 + * Mostafa Rokooie <mostafa.rokooie@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['fa'] = {
  7 + days: ["یک‌شنبه", "دوشنبه", "سه‌شنبه", "چهارشنبه", "پنج‌شنبه", "جمعه", "شنبه", "یک‌شنبه"],
  8 + daysShort: ["یک", "دو", "سه", "چهار", "پنج", "جمعه", "شنبه", "یک"],
  9 + daysMin: ["ی", "د", "س", "چ", "پ", "ج", "ش", "ی"],
  10 + months: ["ژانویه", "فوریه", "مارس", "آوریل", "مه", "ژوئن", "ژوئیه", "اوت", "سپتامبر", "اکتبر", "نوامبر", "دسامبر"],
  11 + monthsShort: ["ژان", "فور", "مار", "آور", "مه", "ژون", "ژوی", "اوت", "سپت", "اکت", "نوا", "دسا"],
  12 + today: "امروز",
  13 + clear: "پاک کن",
  14 + weekStart: 1,
  15 + format: "yyyy/mm/dd"
  16 + };
  17 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.fi.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * Finnish translation for bootstrap-datepicker
  3 + * Jaakko Salonen <https://github.com/jsalonen>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['fi'] = {
  7 + days: ["sunnuntai", "maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai"],
  8 + daysShort: ["sun", "maa", "tii", "kes", "tor", "per", "lau"],
  9 + daysMin: ["su", "ma", "ti", "ke", "to", "pe", "la"],
  10 + months: ["tammikuu", "helmikuu", "maaliskuu", "huhtikuu", "toukokuu", "kesäkuu", "heinäkuu", "elokuu", "syyskuu", "lokakuu", "marraskuu", "joulukuu"],
  11 + monthsShort: ["tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mar", "jou"],
  12 + today: "tänään",
  13 + clear: "Tyhjennä",
  14 + weekStart: 1,
  15 + format: "d.m.yyyy"
  16 + };
  17 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.fo.js 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +/**
  2 + * Faroese translation for bootstrap-datepicker
  3 + * Theodor Johannesen <http://github.com/theodorjohannesen>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['fo'] = {
  7 + days: ["Sunnudagur", "Mánadagur", "Týsdagur", "Mikudagur", "Hósdagur", "Fríggjadagur", "Leygardagur"],
  8 + daysShort: ["Sun", "Mán", "Týs", "Mik", "Hós", "Frí", "Ley"],
  9 + daysMin: ["Su", "Má", "Tý", "Mi", "Hó", "Fr", "Le"],
  10 + months: ["Januar", "Februar", "Marts", "Apríl", "Mei", "Juni", "Juli", "August", "Septembur", "Oktobur", "Novembur", "Desembur"],
  11 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des"],
  12 + today: "Í Dag",
  13 + clear: "Reinsa"
  14 + };
  15 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.fr-ch.js 0 → 100644
... ... @@ -0,0 +1,21 @@
  1 +/**
  2 + * French (Switzerland) translation for bootstrap-datepicker
  3 + * Christoph Jossi <c.jossi@ascami.ch>
  4 + * Based on
  5 + * French translation for bootstrap-datepicker
  6 + * Nico Mollet <nico.mollet@gmail.com>
  7 + */
  8 +;(function($){
  9 + $.fn.datepicker.dates['fr'] = {
  10 + days: ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"],
  11 + daysShort: ["Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"],
  12 + daysMin: ["D", "L", "Ma", "Me", "J", "V", "S"],
  13 + months: ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"],
  14 + monthsShort: ["Jan", "Fév", "Mar", "Avr", "Mai", "Jui", "Jul", "Aou", "Sep", "Oct", "Nov", "Déc"],
  15 + today: "Aujourd'hui",
  16 + monthsTitle: "Mois",
  17 + clear: "Effacer",
  18 + weekStart: 1,
  19 + format: "dd.mm.yyyy"
  20 + };
  21 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.fr.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * French translation for bootstrap-datepicker
  3 + * Nico Mollet <nico.mollet@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['fr'] = {
  7 + days: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"],
  8 + daysShort: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."],
  9 + daysMin: ["d", "l", "ma", "me", "j", "v", "s"],
  10 + months: ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"],
  11 + monthsShort: ["janv.", "févr.", "mars", "avril", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."],
  12 + today: "Aujourd'hui",
  13 + monthsTitle: "Mois",
  14 + clear: "Effacer",
  15 + weekStart: 1,
  16 + format: "dd/mm/yyyy"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.gl.js 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +;(function($){
  2 + $.fn.datepicker.dates['gl'] = {
  3 + days: ["Domingo", "Luns", "Martes", "Mércores", "Xoves", "Venres", "Sábado"],
  4 + daysShort: ["Dom", "Lun", "Mar", "Mér", "Xov", "Ven", "Sáb"],
  5 + daysMin: ["Do", "Lu", "Ma", "Me", "Xo", "Ve", "Sa"],
  6 + months: ["Xaneiro", "Febreiro", "Marzo", "Abril", "Maio", "Xuño", "Xullo", "Agosto", "Setembro", "Outubro", "Novembro", "Decembro"],
  7 + monthsShort: ["Xan", "Feb", "Mar", "Abr", "Mai", "Xun", "Xul", "Ago", "Sep", "Out", "Nov", "Dec"],
  8 + today: "Hoxe",
  9 + clear: "Limpar",
  10 + weekStart: 1,
  11 + format: "dd/mm/yyyy"
  12 + };
  13 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.he.js 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +/**
  2 + * Hebrew translation for bootstrap-datepicker
  3 + * Sagie Maoz <sagie@maoz.info>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['he'] = {
  7 + days: ["ראשון", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת", "ראשון"],
  8 + daysShort: ["א", "ב", "ג", "ד", "ה", "ו", "ש", "א"],
  9 + daysMin: ["א", "ב", "ג", "ד", "ה", "ו", "ש", "א"],
  10 + months: ["ינואר", "פברואר", "מרץ", "אפריל", "מאי", "יוני", "יולי", "אוגוסט", "ספטמבר", "אוקטובר", "נובמבר", "דצמבר"],
  11 + monthsShort: ["ינו", "פבר", "מרץ", "אפר", "מאי", "יונ", "יול", "אוג", "ספט", "אוק", "נוב", "דצמ"],
  12 + today: "היום",
  13 + rtl: true
  14 + };
  15 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.hr.js 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +/**
  2 + * Croatian localisation
  3 + */
  4 +;(function($){
  5 + $.fn.datepicker.dates['hr'] = {
  6 + days: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "Četvrtak", "Petak", "Subota"],
  7 + daysShort: ["Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub"],
  8 + daysMin: ["Ne", "Po", "Ut", "Sr", "Če", "Pe", "Su"],
  9 + months: ["Siječanj", "Veljača", "Ožujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"],
  10 + monthsShort: ["Sij", "Velj", "Ožu", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro"],
  11 + today: "Danas"
  12 + };
  13 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.hu.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Hungarian translation for bootstrap-datepicker
  3 + * Sotus László <lacisan@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['hu'] = {
  7 + days: ["vasárnap", "hétfő", "kedd", "szerda", "csütörtök", "péntek", "szombat"],
  8 + daysShort: ["vas", "hét", "ked", "sze", "csü", "pén", "szo"],
  9 + daysMin: ["V", "H", "K", "Sze", "Cs", "P", "Szo"],
  10 + months: ["január", "február", "március", "április", "május", "június", "július", "augusztus", "szeptember", "október", "november", "december"],
  11 + monthsShort: ["jan", "feb", "már", "ápr", "máj", "jún", "júl", "aug", "sze", "okt", "nov", "dec"],
  12 + today: "ma",
  13 + weekStart: 1,
  14 + clear: "töröl",
  15 + titleFormat: "yyyy. MM",
  16 + format: "yyyy.mm.dd"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.hy.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * Armenian translation for bootstrap-datepicker
  3 + * Hayk Chamyan <hamshen@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['hy'] = {
  7 + days: ["Կիրակի", "Երկուշաբթի", "Երեքշաբթի", "Չորեքշաբթի", "Հինգշաբթի", "Ուրբաթ", "Շաբաթ"],
  8 + daysShort: ["Կրկ", "Երկ", "Երք", "Չրք", "Հնգ", "Ուր", "Շբթ"],
  9 + daysMin: ["Կրկ", "Երկ", "Երք", "Չրք", "Հնգ", "Ուր", "Շբթ"],
  10 + months: ["Հունվար", "Փետրվար", "Մարտ", "Ապրիլ", "Մայիս", "Հունիս", "Հուլիս", "Օգոստոս", "Սեպտեմբեր", "Հոկտեմբեր", "Նոյեմբեր", "Դեկտեմբեր"],
  11 + monthsShort: ["Հուն", "Փետ", "Մար", "Ապր", "Մայ", "Հնս", "Հլս", "Օգս", "Սեպ", "Հոկ", "Նմբ", "Դեկ"],
  12 + today: "Այսօր",
  13 + clear: "Ջնջել",
  14 + format: "dd.mm.yyyy",
  15 + weekStart: 1
  16 + };
  17 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.id.js 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +/**
  2 + * Bahasa translation for bootstrap-datepicker
  3 + * Azwar Akbar <azwar.akbar@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['id'] = {
  7 + days: ["Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"],
  8 + daysShort: ["Mgu", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab"],
  9 + daysMin: ["Mg", "Sn", "Sl", "Ra", "Ka", "Ju", "Sa"],
  10 + months: ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"],
  11 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Ags", "Sep", "Okt", "Nov", "Des"],
  12 + today: "Hari Ini",
  13 + clear: "Kosongkan"
  14 + };
  15 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.is.js 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +/**
  2 + * Icelandic translation for bootstrap-datepicker
  3 + * Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['is'] = {
  7 + days: ["Sunnudagur", "Mánudagur", "Þriðjudagur", "Miðvikudagur", "Fimmtudagur", "Föstudagur", "Laugardagur"],
  8 + daysShort: ["Sun", "Mán", "Þri", "Mið", "Fim", "Fös", "Lau"],
  9 + daysMin: ["Su", "Má", "Þr", "Mi", "Fi", "Fö", "La"],
  10 + months: ["Janúar", "Febrúar", "Mars", "Apríl", "Maí", "Júní", "Júlí", "Ágúst", "September", "Október", "Nóvember", "Desember"],
  11 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maí", "Jún", "Júl", "Ágú", "Sep", "Okt", "Nóv", "Des"],
  12 + today: "Í Dag"
  13 + };
  14 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.it-ch.js 0 → 100644
... ... @@ -0,0 +1,20 @@
  1 +/**
  2 + * Italian (Switzerland) translation for bootstrap-datepicker
  3 + * Christoph Jossi <c.jossi@ascami.ch>
  4 + * Based on
  5 + * Italian translation for bootstrap-datepicker
  6 + * Enrico Rubboli <rubboli@gmail.com>
  7 + */
  8 +;(function($){
  9 + $.fn.datepicker.dates['it'] = {
  10 + days: ["Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato"],
  11 + daysShort: ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"],
  12 + daysMin: ["Do", "Lu", "Ma", "Me", "Gi", "Ve", "Sa"],
  13 + months: ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"],
  14 + monthsShort: ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"],
  15 + today: "Oggi",
  16 + clear: "Cancella",
  17 + weekStart: 1,
  18 + format: "dd.mm.yyyy"
  19 + };
  20 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.it.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Italian translation for bootstrap-datepicker
  3 + * Enrico Rubboli <rubboli@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['it'] = {
  7 + days: ["Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato"],
  8 + daysShort: ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"],
  9 + daysMin: ["Do", "Lu", "Ma", "Me", "Gi", "Ve", "Sa"],
  10 + months: ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"],
  11 + monthsShort: ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"],
  12 + today: "Oggi",
  13 + monthsTitle: "Mesi",
  14 + clear: "Cancella",
  15 + weekStart: 1,
  16 + format: "dd/mm/yyyy"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.ja.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * Japanese translation for bootstrap-datepicker
  3 + * Norio Suzuki <https://github.com/suzuki/>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['ja'] = {
  7 + days: ["日曜", "月曜", "火曜", "水曜", "木曜", "金曜", "土曜"],
  8 + daysShort: ["日", "月", "火", "水", "木", "金", "土"],
  9 + daysMin: ["日", "月", "火", "水", "木", "金", "土"],
  10 + months: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
  11 + monthsShort: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
  12 + today: "今日",
  13 + format: "yyyy/mm/dd",
  14 + titleFormat: "yyyy年mm月",
  15 + clear: "クリア"
  16 + };
  17 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.ka.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * Georgian translation for bootstrap-datepicker
  3 + * Levan Melikishvili <levani0101@yahoo.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['ka'] = {
  7 + days: ["კვირა", "ორშაბათი", "სამშაბათი", "ოთხშაბათი", "ხუთშაბათი", "პარასკევი", "შაბათი"],
  8 + daysShort: ["კვი", "ორშ", "სამ", "ოთხ", "ხუთ", "პარ", "შაბ"],
  9 + daysMin: ["კვ", "ორ", "სა", "ოთ", "ხუ", "პა", "შა"],
  10 + months: ["იანვარი", "თებერვალი", "მარტი", "აპრილი", "მაისი", "ივნისი", "ივლისი", "აგვისტო", "სექტემბერი", "ოქტომბერი", "ნოემბერი", "დეკემბერი"],
  11 + monthsShort: ["იან", "თებ", "მარ", "აპრ", "მაი", "ივნ", "ივლ", "აგვ", "სექ", "ოქტ", "ნოე", "დეკ"],
  12 + today: "დღეს",
  13 + clear: "გასუფთავება",
  14 + weekStart: 1,
  15 + format: "dd.mm.yyyy"
  16 + };
  17 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.kh.js 0 → 100644
... ... @@ -0,0 +1,19 @@
  1 +/**
  2 + * Cambodia (Khmer) translation for bootstrap-datepicker
  3 + * Lytay TOUCH <lytaytouch@gmail.com>
  4 + *
  5 + * DEPRECATED: This language code 'kh' is deprecated and will be removed in 2.0.
  6 + * Khmer support is now in a 'km' translation file to follow the ISO language
  7 + * code - http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
  8 + */
  9 +;(function($){
  10 + $.fn.datepicker.dates['kh'] = {
  11 + days: ["អាទិត្យ", "ចន្ទ", "អង្គារ", "ពុធ", "ព្រហស្បតិ៍", "សុក្រ", "សៅរ៍"],
  12 + daysShort: ["អា.ទិ", "ចន្ទ", "អង្គារ", "ពុធ", "ព្រ.ហ", "សុក្រ", "សៅរ៍"],
  13 + daysMin: ["អា.ទិ", "ចន្ទ", "អង្គារ", "ពុធ", "ព្រ.ហ", "សុក្រ", "សៅរ៍"],
  14 + months: ["មករា", "កុម្ភះ", "មិនា", "មេសា", "ឧសភា", "មិថុនា", "កក្កដា", "សីហា", "កញ្ញា", "តុលា", "វិច្ឆិកា", "ធ្នូ"],
  15 + monthsShort: ["មករា", "កុម្ភះ", "មិនា", "មេសា", "ឧសភា", "មិថុនា", "កក្កដា", "សីហា", "កញ្ញា", "តុលា", "វិច្ឆិកា", "ធ្នូ"],
  16 + today: "ថ្ងៃនេះ",
  17 + clear: "សំអាត"
  18 + };
  19 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.kk.js 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +/**
  2 + * Kazakh translation for bootstrap-datepicker
  3 + * Yerzhan Tolekov <era.tolekov@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['kk'] = {
  7 + days: ["Жексенбі", "Дүйсенбі", "Сейсенбі", "Сәрсенбі", "Бейсенбі", "Жұма", "Сенбі"],
  8 + daysShort: ["Жек", "Дүй", "Сей", "Сәр", "Бей", "Жұм", "Сен"],
  9 + daysMin: ["Жк", "Дс", "Сс", "Ср", "Бс", "Жм", "Сн"],
  10 + months: ["Қаңтар", "Ақпан", "Наурыз", "Сәуір", "Мамыр", "Маусым", "Шілде", "Тамыз", "Қыркүйек", "Қазан", "Қараша", "Желтоқсан"],
  11 + monthsShort: ["Қаң", "Ақп", "Нау", "Сәу", "Мам", "Мау", "Шіл", "Там", "Қыр", "Қаз", "Қар", "Жел"],
  12 + today: "Бүгін",
  13 + weekStart: 1
  14 + };
  15 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.km.js 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +/**
  2 + * Khmer translation for bootstrap-datepicker
  3 + * This is the Updated Version of: https://github.com/uxsolutions/bootstrap-datepicker/blob/71308d42cce9524284c50c6fac50422d1790ac0f/js/locales/bootstrap-datepicker.kh.js
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['km'] = {
  7 + days: ["អាទិត្យ", "ចន្ទ", "អង្គារ", "ពុធ", "ព្រហស្បតិ៍", "សុក្រ", "សៅរ៍"],
  8 + daysShort: ["អា.ទិ", "ចន្ទ", "អង្គារ", "ពុធ", "ព្រ.ហ", "សុក្រ", "សៅរ៍"],
  9 + daysMin: ["អា.ទិ", "ចន្ទ", "អង្គារ", "ពុធ", "ព្រ.ហ", "សុក្រ", "សៅរ៍"],
  10 + months: ["មករា", "កុម្ភះ", "មិនា", "មេសា", "ឧសភា", "មិថុនា", "កក្កដា", "សីហា", "កញ្ញា", "តុលា", "វិច្ឆិកា", "ធ្នូ"],
  11 + monthsShort: ["មករា", "កុម្ភះ", "មិនា", "មេសា", "ឧសភា", "មិថុនា", "កក្កដា", "សីហា", "កញ្ញា", "តុលា", "វិច្ឆិកា", "ធ្នូ"],
  12 + today: "ថ្ងៃនេះ",
  13 + clear: "សំអាត"
  14 + };
  15 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.ko.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Korean translation for bootstrap-datepicker
  3 + * This is a port from https://github.com/moment/moment/blob/develop/src/locale/ko.js
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['ko'] = {
  7 + days: ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"],
  8 + daysShort: ["일", "월", "화", "수", "목", "금", "토"],
  9 + daysMin: ["일", "월", "화", "수", "목", "금", "토"],
  10 + months: ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"],
  11 + monthsShort: ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"],
  12 + today: "오늘",
  13 + clear: "삭제",
  14 + format: "yyyy-mm-dd",
  15 + titleFormat: "yyyy년mm월",
  16 + weekStart: 0
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.kr.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * Korean translation for bootstrap-datepicker
  3 + * Gu Youn <http://github.com/guyoun>
  4 + *
  5 + * DEPRECATED: This language code 'kr' is deprecated and will be removed in 2.0.
  6 + * Korean support is now in a 'ko' translation file to follow the ISO language
  7 + * code - http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
  8 + */
  9 +;(function($){
  10 + $.fn.datepicker.dates['kr'] = {
  11 + days: ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"],
  12 + daysShort: ["일", "월", "화", "수", "목", "금", "토"],
  13 + daysMin: ["일", "월", "화", "수", "목", "금", "토"],
  14 + months: ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"],
  15 + monthsShort: ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"]
  16 + };
  17 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.lt.js 0 → 100644
... ... @@ -0,0 +1,19 @@
  1 +/**
  2 + * Lithuanian translation for bootstrap-datepicker
  3 + * Šarūnas Gliebus <ssharunas@yahoo.co.uk>
  4 + */
  5 +
  6 +;(function($){
  7 + $.fn.datepicker.dates['lt'] = {
  8 + days: ["Sekmadienis", "Pirmadienis", "Antradienis", "Trečiadienis", "Ketvirtadienis", "Penktadienis", "Šeštadienis"],
  9 + daysShort: ["S", "Pr", "A", "T", "K", "Pn", "Š"],
  10 + daysMin: ["Sk", "Pr", "An", "Tr", "Ke", "Pn", "Št"],
  11 + months: ["Sausis", "Vasaris", "Kovas", "Balandis", "Gegužė", "Birželis", "Liepa", "Rugpjūtis", "Rugsėjis", "Spalis", "Lapkritis", "Gruodis"],
  12 + monthsShort: ["Sau", "Vas", "Kov", "Bal", "Geg", "Bir", "Lie", "Rugp", "Rugs", "Spa", "Lap", "Gru"],
  13 + today: "Šiandien",
  14 + monthsTitle:"Mėnesiai",
  15 + clear:"Išvalyti",
  16 + weekStart: 1,
  17 + format:"yyyy-mm-dd"
  18 + };
  19 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.lv.js 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +/**
  2 + * Latvian translation for bootstrap-datepicker
  3 + * Artis Avotins <artis@apit.lv>
  4 + */
  5 +
  6 +;(function($){
  7 + $.fn.datepicker.dates['lv'] = {
  8 + days: ["Svētdiena", "Pirmdiena", "Otrdiena", "Trešdiena", "Ceturtdiena", "Piektdiena", "Sestdiena"],
  9 + daysShort: ["Sv", "P", "O", "T", "C", "Pk", "S"],
  10 + daysMin: ["Sv", "Pr", "Ot", "Tr", "Ce", "Pk", "Se"],
  11 + months: ["Janvāris", "Februāris", "Marts", "Aprīlis", "Maijs", "Jūnijs", "Jūlijs", "Augusts", "Septembris", "Oktobris", "Novembris", "Decembris"],
  12 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mai", "Jūn", "Jūl", "Aug", "Sep", "Okt", "Nov", "Dec"],
  13 + today: "Šodien",
  14 + weekStart: 1
  15 + };
  16 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.me.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * Montenegrin translation for bootstrap-datepicker
  3 + * Miodrag Nikač <miodrag@restartit.me>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['me'] = {
  7 + days: ["Nedjelja","Ponedjeljak", "Utorak", "Srijeda", "Četvrtak", "Petak", "Subota"],
  8 + daysShort: ["Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub"],
  9 + daysMin: ["Ne", "Po", "Ut", "Sr", "Če", "Pe", "Su"],
  10 + months: ["Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar"],
  11 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Avg", "Sep", "Okt", "Nov", "Dec"],
  12 + today: "Danas",
  13 + weekStart: 1,
  14 + clear: "Izbriši",
  15 + format: "dd.mm.yyyy"
  16 + };
  17 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.mk.js 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +/**
  2 + * Macedonian translation for bootstrap-datepicker
  3 + * Marko Aleksic <psybaron@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['mk'] = {
  7 + days: ["Недела", "Понеделник", "Вторник", "Среда", "Четврток", "Петок", "Сабота"],
  8 + daysShort: ["Нед", "Пон", "Вто", "Сре", "Чет", "Пет", "Саб"],
  9 + daysMin: ["Не", "По", "Вт", "Ср", "Че", "Пе", "Са"],
  10 + months: ["Јануари", "Февруари", "Март", "Април", "Мај", "Јуни", "Јули", "Август", "Септември", "Октомври", "Ноември", "Декември"],
  11 + monthsShort: ["Јан", "Фев", "Мар", "Апр", "Мај", "Јун", "Јул", "Авг", "Сеп", "Окт", "Ное", "Дек"],
  12 + today: "Денес",
  13 + format: "dd.mm.yyyy"
  14 + };
  15 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.mn.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * Mongolian translation for bootstrap-datepicker
  3 + * Andrey Torsunov <andrey.torsunov@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['mn'] = {
  7 + days: ["Ням", "Даваа", "Мягмар", "Лхагва", "Пүрэв", "Баасан", "Бямба"],
  8 + daysShort: ["Ням", "Дав", "Мяг", "Лха", "Пүр", "Баа", "Бям"],
  9 + daysMin: ["Ня", "Да", "Мя", "Лх", "Пү", "Ба", "Бя"],
  10 + months: ["Хулгана", "Үхэр", "Бар", "Туулай", "Луу", "Могой", "Морь", "Хонь", "Бич", "Тахиа", "Нохой", "Гахай"],
  11 + monthsShort: ["Хул", "Үхэ", "Бар", "Туу", "Луу", "Мог", "Мор", "Хон", "Бич", "Тах", "Нох", "Гах"],
  12 + today: "Өнөөдөр",
  13 + clear: "Тодорхой",
  14 + format: "yyyy.mm.dd",
  15 + weekStart: 1
  16 + };
  17 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.ms.js 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +/**
  2 + * Malay translation for bootstrap-datepicker
  3 + * Ateman Faiz <noorulfaiz@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['ms'] = {
  7 + days: ["Ahad", "Isnin", "Selasa", "Rabu", "Khamis", "Jumaat", "Sabtu"],
  8 + daysShort: ["Aha", "Isn", "Sel", "Rab", "Kha", "Jum", "Sab"],
  9 + daysMin: ["Ah", "Is", "Se", "Ra", "Kh", "Ju", "Sa"],
  10 + months: ["Januari", "Februari", "Mac", "April", "Mei", "Jun", "Julai", "Ogos", "September", "Oktober", "November", "Disember"],
  11 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Ogo", "Sep", "Okt", "Nov", "Dis"],
  12 + today: "Hari Ini",
  13 + clear: "Bersihkan"
  14 + };
  15 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.nb.js 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +/**
  2 + * Norwegian (bokmål) translation for bootstrap-datepicker
  3 + * Fredrik Sundmyhr <http://github.com/fsundmyhr>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['nb'] = {
  7 + days: ["Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag"],
  8 + daysShort: ["Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør"],
  9 + daysMin: ["Sø", "Ma", "Ti", "On", "To", "Fr", "Lø"],
  10 + months: ["Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"],
  11 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des"],
  12 + today: "I Dag",
  13 + format: "dd.mm.yyyy"
  14 + };
  15 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.nl-be.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Belgium-Dutch translation for bootstrap-datepicker
  3 + * Julien Poulin <poulin_julien@hotmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['nl-BE'] = {
  7 + days: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"],
  8 + daysShort: ["zo", "ma", "di", "wo", "do", "vr", "za"],
  9 + daysMin: ["zo", "ma", "di", "wo", "do", "vr", "za"],
  10 + months: ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"],
  11 + monthsShort: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"],
  12 + today: "Vandaag",
  13 + monthsTitle: "Maanden",
  14 + clear: "Leegmaken",
  15 + weekStart: 1,
  16 + format: "dd/mm/yyyy"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.nl.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Dutch translation for bootstrap-datepicker
  3 + * Reinier Goltstein <mrgoltstein@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['nl'] = {
  7 + days: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"],
  8 + daysShort: ["zo", "ma", "di", "wo", "do", "vr", "za"],
  9 + daysMin: ["zo", "ma", "di", "wo", "do", "vr", "za"],
  10 + months: ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"],
  11 + monthsShort: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"],
  12 + today: "Vandaag",
  13 + monthsTitle: "Maanden",
  14 + clear: "Wissen",
  15 + weekStart: 1,
  16 + format: "dd-mm-yyyy"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.no.js 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +/**
  2 + * Norwegian translation for bootstrap-datepicker
  3 + **/
  4 +;(function($){
  5 + $.fn.datepicker.dates['no'] = {
  6 + days: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag'],
  7 + daysShort: ['Søn', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør'],
  8 + daysMin: ['Sø', 'Ma', 'Ti', 'On', 'To', 'Fr', 'Lø'],
  9 + months: ['Januar', 'Februar', 'Mars', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Desember'],
  10 + monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
  11 + today: 'I dag',
  12 + clear: 'Nullstill',
  13 + weekStart: 1,
  14 + format: 'dd.mm.yyyy'
  15 + };
  16 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.oc.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * Occitan translation for bootstrap-datepicker
  3 + */
  4 +;(function($){
  5 + $.fn.datepicker.dates['oc'] = {
  6 + days: ["Dimenge", "Diluns", "Dimars", "Dimècres", "Dijòus", "Divendres", "Dissabte"],
  7 + daysShort: ["Dim", "Dil", "Dmr", "Dmc", "Dij", "Div", "Dis"],
  8 + daysMin: ["dg", "dl", "dr", "dc", "dj", "dv", "ds"],
  9 + months: ["Genièr", "Febrièr", "Març", "Abrial", "Mai", "Junh", "Julhet", "Agost", "Setembre", "Octobre", "Novembre", "Decembre"],
  10 + monthsShort: ["Gen", "Feb", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Oct", "Nov", "Dec"],
  11 + today: "Uèi",
  12 + monthsTitle: "Meses",
  13 + clear: "Escafar",
  14 + weekStart: 1,
  15 + format: "dd/mm/yyyy"
  16 + };
  17 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.pl.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * Polish translation for bootstrap-datepicker
  3 + * Robert <rtpm@gazeta.pl>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['pl'] = {
  7 + days: ["Niedziela", "Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota"],
  8 + daysShort: ["Niedz.", "Pon.", "Wt.", "Śr.", "Czw.", "Piąt.", "Sob."],
  9 + daysMin: ["Ndz.", "Pn.", "Wt.", "Śr.", "Czw.", "Pt.", "Sob."],
  10 + months: ["Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"],
  11 + monthsShort: ["Sty.", "Lut.", "Mar.", "Kwi.", "Maj", "Cze.", "Lip.", "Sie.", "Wrz.", "Paź.", "Lis.", "Gru."],
  12 + today: "Dzisiaj",
  13 + weekStart: 1,
  14 + clear: "Wyczyść",
  15 + format: "dd.mm.yyyy"
  16 + };
  17 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.pt-br.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * Brazilian translation for bootstrap-datepicker
  3 + * Cauan Cabral <cauan@radig.com.br>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['pt-BR'] = {
  7 + days: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"],
  8 + daysShort: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"],
  9 + daysMin: ["Do", "Se", "Te", "Qu", "Qu", "Se", "Sa"],
  10 + months: ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"],
  11 + monthsShort: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"],
  12 + today: "Hoje",
  13 + monthsTitle: "Meses",
  14 + clear: "Limpar",
  15 + format: "dd/mm/yyyy"
  16 + };
  17 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.pt.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Portuguese translation for bootstrap-datepicker
  3 + * Original code: Cauan Cabral <cauan@radig.com.br>
  4 + * Tiago Melo <tiago.blackcode@gmail.com>
  5 + */
  6 +;(function($){
  7 + $.fn.datepicker.dates['pt'] = {
  8 + days: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"],
  9 + daysShort: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"],
  10 + daysMin: ["Do", "Se", "Te", "Qu", "Qu", "Se", "Sa"],
  11 + months: ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"],
  12 + monthsShort: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"],
  13 + today: "Hoje",
  14 + monthsTitle: "Meses",
  15 + clear: "Limpar",
  16 + format: "dd/mm/yyyy"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.ro.js 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +/**
  2 + * Romanian translation for bootstrap-datepicker
  3 + * Cristian Vasile <cristi.mie@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['ro'] = {
  7 + days: ["Duminică", "Luni", "Marţi", "Miercuri", "Joi", "Vineri", "Sâmbătă"],
  8 + daysShort: ["Dum", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm"],
  9 + daysMin: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sâ"],
  10 + months: ["Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", "Decembrie"],
  11 + monthsShort: ["Ian", "Feb", "Mar", "Apr", "Mai", "Iun", "Iul", "Aug", "Sep", "Oct", "Nov", "Dec"],
  12 + today: "Astăzi",
  13 + clear: "Șterge",
  14 + weekStart: 1
  15 + };
  16 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.rs-latin.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Serbian latin translation for bootstrap-datepicker
  3 + * Bojan Milosavlević <milboj@gmail.com>
  4 + *
  5 + * * DEPRECATED: This language code 'rs' is deprecated (invalid serbian language code) and will be removed in 2.0. Use the 'sr' language code as an replacement
  6 + */
  7 +;(function($){
  8 + $.fn.datepicker.dates['rs-latin'] = {
  9 + days: ["Nedelja","Ponedeljak", "Utorak", "Sreda", "Četvrtak", "Petak", "Subota"],
  10 + daysShort: ["Ned", "Pon", "Uto", "Sre", "Čet", "Pet", "Sub"],
  11 + daysMin: ["N", "Po", "U", "Sr", "Č", "Pe", "Su"],
  12 + months: ["Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar"],
  13 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Avg", "Sep", "Okt", "Nov", "Dec"],
  14 + today: "Danas",
  15 + weekStart: 1,
  16 + format: "dd.mm.yyyy"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.rs.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Serbian cyrillic translation for bootstrap-datepicker
  3 + * Bojan Milosavlević <milboj@gmail.com>
  4 + *
  5 + * DEPRECATED: This language code 'rs' is deprecated (invalid serbian language code) and will be removed in 2.0. Use the 'sr' language code as an replacement
  6 + */
  7 +;(function($){
  8 + $.fn.datepicker.dates['rs'] = {
  9 + days: ["Недеља","Понедељак", "Уторак", "Среда", "Четвртак", "Петак", "Субота"],
  10 + daysShort: ["Нед", "Пон", "Уто", "Сре", "Чет", "Пет", "Суб"],
  11 + daysMin: ["Н", "По", "У", "Ср", "Ч", "Пе", "Су"],
  12 + months: ["Јануар", "Фебруар", "Март", "Април", "Мај", "Јун", "Јул", "Август", "Септембар", "Октобар", "Новембар", "Децембар"],
  13 + monthsShort: ["Јан", "Феб", "Мар", "Апр", "Мај", "Јун", "Јул", "Авг", "Сеп", "Окт", "Нов", "Дец"],
  14 + today: "Данас",
  15 + weekStart: 1,
  16 + format: "dd.mm.yyyy"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.ru.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * Russian translation for bootstrap-datepicker
  3 + * Victor Taranenko <darwin@snowdale.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['ru'] = {
  7 + days: ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"],
  8 + daysShort: ["Вск", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Суб"],
  9 + daysMin: ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"],
  10 + months: ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"],
  11 + monthsShort: ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"],
  12 + today: "Сегодня",
  13 + clear: "Очистить",
  14 + format: "dd.mm.yyyy",
  15 + weekStart: 1
  16 + };
  17 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.si.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Sinhala translation for bootstrap-datepicker
  3 + * Chanaka Fernando <chanaka.fernando@hotmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['si'] = {
  7 + days: ["ඉරිදා", "සඳුදා", "අඟහරුවාදා", "බදාදා", "බ්‍රහස්පතින්දා", "සිකුරාදා", "සෙනසුරාදා"],
  8 + daysShort: ["ඉරි", "සඳු", "අඟ", "බදා", "බ්‍රහ", "සිකු", "සෙන"],
  9 + daysMin: ["ඉ", "ස", "අ", "බ", "බ්‍ර", "සි", "සෙ"],
  10 + months: ["ජනවාරි", "පෙබරවාරි", "මාර්තු", "අප්‍රේල්", "මැයි", "ජුනි", "ජූලි", "අගෝස්තු", "සැප්තැම්බර්", "ඔක්තෝබර්", "නොවැම්බර්", "දෙසැම්බර්"],
  11 + monthsShort: ["ජන", "පෙබ", "මාර්", "අප්‍රේ", "මැයි", "ජුනි", "ජූලි", "අගෝ", "සැප්", "ඔක්", "නොවැ", "දෙසැ"],
  12 + today: "අද",
  13 + monthsTitle: "මාස",
  14 + clear: "මකන්න",
  15 + weekStart: 0,
  16 + format: "yyyy-mm-dd"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.sk.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Slovak translation for bootstrap-datepicker
  3 + * Marek Lichtner <marek@licht.sk>
  4 + * Fixes by Michal Remiš <michal.remis@gmail.com>
  5 + */
  6 +;(function($){
  7 + $.fn.datepicker.dates["sk"] = {
  8 + days: ["Nedeľa", "Pondelok", "Utorok", "Streda", "Štvrtok", "Piatok", "Sobota"],
  9 + daysShort: ["Ned", "Pon", "Uto", "Str", "Štv", "Pia", "Sob"],
  10 + daysMin: ["Ne", "Po", "Ut", "St", "Št", "Pia", "So"],
  11 + months: ["Január", "Február", "Marec", "Apríl", "Máj", "Jún", "Júl", "August", "September", "Október", "November", "December"],
  12 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Máj", "Jún", "Júl", "Aug", "Sep", "Okt", "Nov", "Dec"],
  13 + today: "Dnes",
  14 + clear: "Vymazať",
  15 + weekStart: 1,
  16 + format: "d.m.yyyy"
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.sl.js 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +/**
  2 + * Slovene translation for bootstrap-datepicker
  3 + * Gregor Rudolf <gregor.rudolf@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['sl'] = {
  7 + days: ["Nedelja", "Ponedeljek", "Torek", "Sreda", "Četrtek", "Petek", "Sobota"],
  8 + daysShort: ["Ned", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob"],
  9 + daysMin: ["Ne", "Po", "To", "Sr", "Če", "Pe", "So"],
  10 + months: ["Januar", "Februar", "Marec", "April", "Maj", "Junij", "Julij", "Avgust", "September", "Oktober", "November", "December"],
  11 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Avg", "Sep", "Okt", "Nov", "Dec"],
  12 + today: "Danes"
  13 + };
  14 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.sq.js 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +/**
  2 + * Albanian translation for bootstrap-datepicker
  3 + * Tomor Pupovci <http://www.github.com/ttomor>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['sq'] = {
  7 + days: ["E Diel", "E Hënë", "E Martē", "E Mërkurë", "E Enjte", "E Premte", "E Shtunë"],
  8 + daysShort: ["Die", "Hën", "Mar", "Mër", "Enj", "Pre", "Shtu"],
  9 + daysMin: ["Di", "Hë", "Ma", "Më", "En", "Pr", "Sht"],
  10 + months: ["Janar", "Shkurt", "Mars", "Prill", "Maj", "Qershor", "Korrik", "Gusht", "Shtator", "Tetor", "Nëntor", "Dhjetor"],
  11 + monthsShort: ["Jan", "Shk", "Mar", "Pri", "Maj", "Qer", "Korr", "Gu", "Sht", "Tet", "Nën", "Dhjet"],
  12 + today: "Sot"
  13 + };
  14 +}(jQuery));
  15 +
... ...
core/static/js/vendor/locales/bootstrap-datepicker.sr-latin.js 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +/**
  2 + * Serbian latin translation for bootstrap-datepicker
  3 + * Bojan Milosavlević <milboj@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['sr-latin'] = {
  7 + days: ["Nedelja","Ponedeljak", "Utorak", "Sreda", "Četvrtak", "Petak", "Subota"],
  8 + daysShort: ["Ned", "Pon", "Uto", "Sre", "Čet", "Pet", "Sub"],
  9 + daysMin: ["N", "Po", "U", "Sr", "Č", "Pe", "Su"],
  10 + months: ["Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar"],
  11 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Avg", "Sep", "Okt", "Nov", "Dec"],
  12 + today: "Danas",
  13 + weekStart: 1,
  14 + format: "dd.mm.yyyy"
  15 + };
  16 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.sr.js 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +/**
  2 + * Serbian cyrillic translation for bootstrap-datepicker
  3 + * Bojan Milosavlević <milboj@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['sr'] = {
  7 + days: ["Недеља","Понедељак", "Уторак", "Среда", "Четвртак", "Петак", "Субота"],
  8 + daysShort: ["Нед", "Пон", "Уто", "Сре", "Чет", "Пет", "Суб"],
  9 + daysMin: ["Н", "По", "У", "Ср", "Ч", "Пе", "Су"],
  10 + months: ["Јануар", "Фебруар", "Март", "Април", "Мај", "Јун", "Јул", "Август", "Септембар", "Октобар", "Новембар", "Децембар"],
  11 + monthsShort: ["Јан", "Феб", "Мар", "Апр", "Мај", "Јун", "Јул", "Авг", "Сеп", "Окт", "Нов", "Дец"],
  12 + today: "Данас",
  13 + weekStart: 1,
  14 + format: "dd.mm.yyyy"
  15 + };
  16 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.sv.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * Swedish translation for bootstrap-datepicker
  3 + * Patrik Ragnarsson <patrik@starkast.net>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['sv'] = {
  7 + days: ["Söndag", "Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag"],
  8 + daysShort: ["Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör"],
  9 + daysMin: ["Sö", "Må", "Ti", "On", "To", "Fr", "Lö"],
  10 + months: ["Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"],
  11 + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"],
  12 + today: "Idag",
  13 + format: "yyyy-mm-dd",
  14 + weekStart: 1,
  15 + clear: "Rensa"
  16 + };
  17 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.sw.js 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +/**
  2 + * Swahili translation for bootstrap-datepicker
  3 + * Edwin Mugendi <https://github.com/edwinmugendi>
  4 + * Source: http://scriptsource.org/cms/scripts/page.php?item_id=entry_detail&uid=xnfaqyzcku
  5 + */
  6 +;(function($){
  7 + $.fn.datepicker.dates['sw'] = {
  8 + days: ["Jumapili", "Jumatatu", "Jumanne", "Jumatano", "Alhamisi", "Ijumaa", "Jumamosi"],
  9 + daysShort: ["J2", "J3", "J4", "J5", "Alh", "Ij", "J1"],
  10 + daysMin: ["2", "3", "4", "5", "A", "I", "1"],
  11 + months: ["Januari", "Februari", "Machi", "Aprili", "Mei", "Juni", "Julai", "Agosti", "Septemba", "Oktoba", "Novemba", "Desemba"],
  12 + monthsShort: ["Jan", "Feb", "Mac", "Apr", "Mei", "Jun", "Jul", "Ago", "Sep", "Okt", "Nov", "Des"],
  13 + today: "Leo"
  14 + };
  15 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.th.js 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +/**
  2 + * Thai translation for bootstrap-datepicker
  3 + * Suchau Jiraprapot <seroz24@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['th'] = {
  7 + days: ["อาทิตย์", "จันทร์", "อังคาร", "พุธ", "พฤหัส", "ศุกร์", "เสาร์", "อาทิตย์"],
  8 + daysShort: ["อา", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"],
  9 + daysMin: ["อา", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"],
  10 + months: ["มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"],
  11 + monthsShort: ["ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค."],
  12 + today: "วันนี้"
  13 + };
  14 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.tr.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Turkish translation for bootstrap-datepicker
  3 + * Serkan Algur <kaisercrazy_2@hotmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['tr'] = {
  7 + days: ["Pazar", "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi"],
  8 + daysShort: ["Pz", "Pzt", "Sal", "Çrş", "Prş", "Cu", "Cts"],
  9 + daysMin: ["Pz", "Pzt", "Sa", "Çr", "Pr", "Cu", "Ct"],
  10 + months: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"],
  11 + monthsShort: ["Oca", "Şub", "Mar", "Nis", "May", "Haz", "Tem", "Ağu", "Eyl", "Eki", "Kas", "Ara"],
  12 + today: "Bugün",
  13 + clear: "Temizle",
  14 + weekStart: 1,
  15 + format: "dd.mm.yyyy"
  16 + };
  17 +}(jQuery));
  18 +
... ...
core/static/js/vendor/locales/bootstrap-datepicker.uk.js 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +/**
  2 + * Ukrainian translation for bootstrap-datepicker
  3 + * Igor Polynets
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['uk'] = {
  7 + days: ["Неділя", "Понеділок", "Вівторок", "Середа", "Четвер", "П'ятниця", "Субота"],
  8 + daysShort: ["Нед", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Суб"],
  9 + daysMin: ["Нд", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"],
  10 + months: ["Cічень", "Лютий", "Березень", "Квітень", "Травень", "Червень", "Липень", "Серпень", "Вересень", "Жовтень", "Листопад", "Грудень"],
  11 + monthsShort: ["Січ", "Лют", "Бер", "Кві", "Тра", "Чер", "Лип", "Сер", "Вер", "Жов", "Лис", "Гру"],
  12 + today: "Сьогодні",
  13 + clear: "Очистити",
  14 + format: "dd.mm.yyyy",
  15 + weekStart: 1
  16 + };
  17 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.vi.js 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +/**
  2 + * Vietnamese translation for bootstrap-datepicker
  3 + * An Vo <https://github.com/anvoz/>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['vi'] = {
  7 + days: ["Chủ nhật", "Thứ hai", "Thứ ba", "Thứ tư", "Thứ năm", "Thứ sáu", "Thứ bảy"],
  8 + daysShort: ["CN", "Thứ 2", "Thứ 3", "Thứ 4", "Thứ 5", "Thứ 6", "Thứ 7"],
  9 + daysMin: ["CN", "T2", "T3", "T4", "T5", "T6", "T7"],
  10 + months: ["Tháng 1", "Tháng 2", "Tháng 3", "Tháng 4", "Tháng 5", "Tháng 6", "Tháng 7", "Tháng 8", "Tháng 9", "Tháng 10", "Tháng 11", "Tháng 12"],
  11 + monthsShort: ["Th1", "Th2", "Th3", "Th4", "Th5", "Th6", "Th7", "Th8", "Th9", "Th10", "Th11", "Th12"],
  12 + today: "Hôm nay",
  13 + clear: "Xóa",
  14 + format: "dd/mm/yyyy"
  15 + };
  16 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.zh-cn.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Simplified Chinese translation for bootstrap-datepicker
  3 + * Yuan Cheung <advanimal@gmail.com>
  4 + */
  5 +;(function($){
  6 + $.fn.datepicker.dates['zh-CN'] = {
  7 + days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"],
  8 + daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"],
  9 + daysMin: ["日", "一", "二", "三", "四", "五", "六"],
  10 + months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
  11 + monthsShort: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
  12 + today: "今日",
  13 + clear: "清除",
  14 + format: "yyyy年mm月dd日",
  15 + titleFormat: "yyyy年mm月",
  16 + weekStart: 1
  17 + };
  18 +}(jQuery));
... ...
core/static/js/vendor/locales/bootstrap-datepicker.zh-tw.js 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +/**
  2 + * Traditional Chinese translation for bootstrap-datepicker
  3 + * Rung-Sheng Jang <daniel@i-trend.co.cc>
  4 + * FrankWu <frankwu100@gmail.com> Fix more appropriate use of Traditional Chinese habit
  5 + */
  6 +;(function($){
  7 + $.fn.datepicker.dates['zh-TW'] = {
  8 + days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"],
  9 + daysShort: ["週日", "週一", "週二", "週三", "週四", "週五", "週六"],
  10 + daysMin: ["日", "一", "二", "三", "四", "五", "六"],
  11 + months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
  12 + monthsShort: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
  13 + today: "今天",
  14 + format: "yyyy年mm月dd日",
  15 + weekStart: 1,
  16 + clear: "清除"
  17 + };
  18 +}(jQuery));
... ...
core/templates/base.html
1 1 <!DOCTYPE html>
2 2  
3 3 {% load static i18n %}
  4 +{% get_current_language as LANGUAGE_CODE %}
4 5  
5 6 <html>
6 7 <head>
... ... @@ -20,7 +21,7 @@
20 21 <link rel="stylesheet" type="text/css" href="{% static 'bootstrap-3.3.7/css/bootstrap.css' %}">
21 22 <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/material.min.css' %}">
22 23 <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/ripples.min.css' %}">
23   - <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/datepicker.css' %}">
  24 + <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/bootstrap-datepicker.standalone.css' %}">
24 25 <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/alertifyjs/alertify.min.css' %}">
25 26 <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/alertifyjs/themes/bootstrap.css' %}">
26 27 <script type="text/javascript" src="{% static 'bootstrap-3.3.7/js/bootstrap.js' %}"></script>
... ... @@ -28,7 +29,13 @@
28 29 <script type="text/javascript" src="{% static 'js/vendor/material.min.js' %}"></script>
29 30 <script type="text/javascript" src="{% static 'js/vendor/ripples.min.js' %}"></script>
30 31 <script type="text/javascript" src="{% static 'js/vendor/bootstrap-datepicker.js' %}"></script>
  32 +
  33 + {% with "js/vendor/locales/bootstrap-datepicker."|add:LANGUAGE_CODE|add:".js" as locale_datepicker %}
  34 + <script type="text/javascript" src="{% static locale_datepicker %}"></script>
  35 + {% endwith %}
  36 +
31 37 <script type="text/javascript" src="{% static 'js/vendor/alertify.min.js' %}"></script>
  38 + <script type="text/javascript" src="{% static 'js/vendor/jscookie.js' %}"></script>
32 39  
33 40 <!-- Font awesome -->
34 41 <link rel="stylesheet" type="text/css" href="{% static 'font-awesome-4.6.3/css/font-awesome.min.css' %}">
... ...
core/templates/guest.html
1   -{% extends 'base.html' %}
  1 +<!DOCTYPE html>
2 2  
  3 +{% load static i18n %}
3 4 {% load i18n custom_filters %}
4 5  
5   -{% block breadcrumbs %}
6   - <div class="col-md-12">
7   - <form id="searchform" action="{% url 'course:manage' %}" method="get" accept-charset="utf-8">
8   - <div class="input-group">
9   - <div class="form-group is-empty">
10   - <input type="search" class="form-control" placeholder="Search Courses" name="q" id="searchbox"></div>
11   - <span class="input-group-btn input-group-sm">
12   - <button type="button" class="btn btn-fab btn-fab-mini">
13   - <i class="material-icons">search</i>
14   - </button>
15   - </span>
16   - </div>
17   - </form>
18   - </div>
19   -
20   - <div class="col-md-12">
21   - <div class="btn-group btn-group-justified btn-group-raised">
22   - <a href="?category=all" class="btn btn-raised btn-info">Todos</a>
23   - {% for category_course in categorys_courses %}
24   - <a href="?category={{category_course.name}}" class="btn btn-raised btn-primary">{{category_course.name}}</a>
25   - {% endfor %}
26   - </div>
27   - </div>
  6 +<html>
  7 +<head>
  8 + <title>{{ title }}</title>
  9 +
  10 + <meta http-equiv="Cache-Control" content="no-cache, no-store" />
  11 + <link href="{% static 'img/favicon.ico' %}" rel="shortcut icon" />
  12 + <!-- Roboto font -->
  13 + <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Roboto:300,400,500,700" type="text/css">
  14 + <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
  15 +
  16 + <!-- jQuery & jQuery UI -->
  17 + <script type="text/javascript" src="{% static 'js/vendor/jquery-3.1.0.min.js' %}"></script>
  18 + <script type="text/javascript" src="{% static 'js/vendor/jquery-ui.js' %}"></script>
  19 +
  20 + <!-- Bootstrap and themes (material) -->
  21 + <link rel="stylesheet" type="text/css" href="{% static 'bootstrap-3.3.7/css/bootstrap.css' %}">
  22 + <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/material.min.css' %}">
  23 + <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/ripples.min.css' %}">
  24 + <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/datepicker.css' %}">
  25 + <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/alertifyjs/alertify.min.css' %}">
  26 + <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/alertifyjs/themes/bootstrap.css' %}">
  27 + <script type="text/javascript" src="{% static 'bootstrap-3.3.7/js/bootstrap.js' %}"></script>
  28 + <script type="text/javascript" src="{% static 'js/vendor/bootstrap-acessibility.min.js' %}"></script>
  29 + <script type="text/javascript" src="{% static 'js/vendor/material.min.js' %}"></script>
  30 + <script type="text/javascript" src="{% static 'js/vendor/ripples.min.js' %}"></script>
  31 + <script type="text/javascript" src="{% static 'js/vendor/bootstrap-datepicker.js' %}"></script>
  32 + <script type="text/javascript" src="{% static 'js/vendor/alertify.min.js' %}"></script>
  33 +
  34 + <!-- Font awesome -->
  35 + <link rel="stylesheet" type="text/css" href="{% static 'font-awesome-4.6.3/css/font-awesome.min.css' %}">
  36 +
  37 + <!-- Custom styles -->
  38 + <link rel="stylesheet" type="text/css" href="{% static 'css/base/amadeus.css' %}">
  39 +
  40 + <!-- Init material Bootstrap -->
  41 + <script type="text/javascript">$.material.init()</script>
  42 +
  43 + <!--Javascript block for specific-app ones -->
  44 + <script src="{% static 'js/base/amadeus.js' %}"></script>
  45 + {% block style %}
  46 + {% endblock %}
  47 + {% block javascript %}
  48 + <script type="text/javascript" src="{% static 'js/course.js' %}"></script>
  49 + {% endblock %}
  50 +</head>
  51 +<body>
  52 + {% block nav %}
  53 + <div class="navbar navbar-default">
  54 + <div class="navbar-header">
  55 + <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-responsive-collapse">
  56 + <span class="icon-bar"></span>
  57 + <span class="icon-bar"></span>
  58 + <span class="icon-bar"></span>
  59 + </button>
  60 + <a class="navbar-brand" href="{% url 'app:index' %}"><img class="logo" src="{% static 'img/topo-amadeus-white.png' %}" alt="Logo"/></a>
  61 + </div>
  62 + <div class="navbar-collapse collapse navbar-responsive-collapse">
  63 + <ul class="nav navbar-nav navbar-right notifications">
  64 + <li class="" data-toggle="tooltip" data-placement="bottom" title data-original-title="notifications">
  65 + <a class="dropdown-toggle" data-toggle="dropdown"> <span id="notification-count" class="badge notification-count">{{notifications.count}}</span><i class="fa fa-bell" aria-hidden="true"></i></a>
  66 + <ul id="notification-dropdown" class="dropdown-menu">
  67 + <li class="dropdown-header">Notifications</li>
  68 + {% include "notifications.html" %}
  69 +
  70 + <li>
  71 + <a onclick="getNotifications(5)">
  72 + <div id="notification-see-more" class="list-group-item">
  73 + <div class="row-content">
  74 + <p class="list-group-item-text">See More</p>
  75 + </div>
  76 + </a>
  77 + </li>
  78 + </ul>
  79 + </li>
  80 +
  81 + <li data-toggle="tooltip" data-placement="bottom" title data-original-title="{% trans 'messages' %}"> <a href="#"><i class="fa fa-comments" aria-hidden="true"></i></a> </li>
  82 + <li > <a class="link" href="{% url 'app:index' %}">{{ user }}</a></li>
  83 +
  84 + </ul>
  85 + </div>
  86 + </div>
  87 + {% endblock %}
  88 + <div class="container-fluid">
  89 + <div class="row">
  90 +
  91 + <div class="col-xs-2 col-sm-2 col-md-2 col-lg-2 col-xl-2">
  92 + {% block sidebar %}
  93 + <div class="panel panel-primary navigation">
  94 + <div class="panel-heading">
  95 + <h4>Menu</h4>
  96 + </div>
  97 + <div class="panel-body">
  98 + <ul class="nav nav-pills nav-stacked">
  99 + <li><a href="{% url 'core:register' %}">{% trans 'Register' %}</a></li>
  100 + </ul>
  101 + </div>
  102 + </div>
  103 + {% endblock %}
  104 +
  105 + </div>
  106 + <div class="col-xs-10 col-sm-10 col-md-10 col-lg-10 col-xl-10">
  107 + {% block breadcrumbs %}
  108 + <div class="col-md-12">
  109 + <form id="searchform" action="{% url 'course:manage' %}" method="get" accept-charset="utf-8">
  110 + <div class="input-group">
  111 + <div class="form-group is-empty">
  112 + <input type="search" class="form-control" placeholder="Search Courses" name="q" id="searchbox"></div>
  113 + <span class="input-group-btn input-group-sm">
  114 + <button type="button" class="btn btn-fab btn-fab-mini">
  115 + <i class="material-icons">search</i>
  116 + </button>
  117 + </span>
  118 + </div>
  119 + </form>
  120 + </div>
28 121  
29   -{% endblock %}
30   -
31   -
32   -{% block content %}
33   -
34   - {% for course in courses %}
35   - <div class="panel panel-info">
36   - <div class="panel-heading">
37   - <h3 class="panel-title">
38   - {{course.name}}
39   - {% if user|show_course_subscribe:course %}
40   - <div class="pull-right" style="margin-top:-15px">
41   - <a onclick="subscribe($(this), '{% url 'course:subscribe' course.slug %}' , '{% trans 'Are you sure you want to subscribe to this subject?' %}')" class="btn btn-sm btn-primary btn-raised">{% trans 'Subscribe' %}</a>
42   - </div>
43   - {% endif %}
44   - </h3>
45   - </div>
46   -
47   - <div class="panel-body">
48   - <p><b>Course Name: </b>{{course.name}}</p>
49   - <p><b>Begining: </b>{{course.init_date}}</p>
50   - <p><b>End: </b>{{course.end_date}}</p>
51   - <p><b>Professor: </b>{{course.professors.name}}</p>
52   - <p>
53   - <b>Description:</b>
54   - <i>
55   - {{course.content}}
56   - </i>
57   - </p>
58   - </div>
59   - </div>
60   - {% endfor %}
61   -{% endblock %}
62   -
63   -
64   -
65   -{% comment %}
66   -
67   -
68   -
69   -
70   -</fieldset>
71   - <div class="col-md-12">
72   - {% if courses|length > 0 %}
73   - {% if request.GET.category == 'all' or none or request.GET.category == '' %}
74   - {% for course in list_courses %}
75   - <div class="panel-group ui-accordion ui-widget ui-helper-reset ui-sortable" id="accordion" role="tablist" aria-multiselectable="false">
76   - <div class="group">
77   - <div class="panel panel-info">
78   - <div class="panel-heading" role="tab">
79   - <div class="row">
80   - <div class="col-xs-9 col-md-9 titleTopic">
81   - <a role="button" data-toggle="collapse" data-parent="#accordion" href=".collapseOne" aria-expanded="false" aria-controls="collapseOne" class="collapsed">
82   - <h4 style="color:white">{{course.name}}</h4>
83   - </a>
84   - </div>
85   - </div>
86   - </div>
87   - <div class="panel-collapse collapseOne collapse in" role="tabpanel" aria-labelledby="headingOne" aria-expanded="true" aria-hidden="false" tabindex="0">
88   - <div class="panel-body">
89   - <p><b>Course Name: </b>{{course.name}}</p>
90   - <p><b>Duration (in semesters): </b>09</p>
91   - <p><b>Coordinator: </b>{{course.professors}}</p>
92   - <p>
93   - <b>Description:</b>
94   - <i>
95   - {{course.description}}
96   - </i>
97   - </p>
98   - <a href="{% url 'course:view' course.slug %}" class="btn btn-raised btn-default center-block">'View Course<div class="ripple-container"></div></a>
99   - </div>
100   - </div>
101   - </div>
  122 + <div class="col-md-12">
  123 + <div class="btn-group btn-group-justified btn-group-raised">
  124 + <a href="?category=all" class="btn btn-raised btn-info">Todos</a>
  125 + {% for category in categories %}
  126 + <a href="?category={{category.name}}" class="btn btn-raised btn-primary">{{category.name}}</a>
  127 + {% endfor %}
102 128 </div>
103 129 </div>
104   - {% endfor %}
105   - {% else %}
106   - {% for course in courses_category %}
107   - {% if course.category.name == request.GET.category %}
108   - <!-- Put your content here! -->
109   - <div class="panel-group ui-accordion ui-widget ui-helper-reset ui-sortable" id="accordion" role="tablist" aria-multiselectable="false">
110   - <div class="group">
111   - <div class="panel panel-info">
112   - <div class="panel-heading" role="tab">
113   - <div class="row">
114   - <div class="col-xs-9 col-md-9 titleTopic">
115   - <a role="button" data-toggle="collapse" data-parent="#accordion" href=".collapseOne" aria-expanded="false" aria-controls="collapseOne" class="collapsed">
116   - <h4 style="color:white">{{course.name}}</h4>
117   - </a>
118   - </div>
119   - </div>
120   - </div>
121   - <div class="panel-collapse collapseOne collapse in" role="tabpanel" aria-labelledby="headingOne" aria-expanded="true" aria-hidden="false" tabindex="0">
122   - <div class="panel-body">
123   - <p><b>Course Name: </b>{{course.name}}</p>
124   - <p><b>Duration (in semesters): </b>09</p>
125   - <p><b>Coordinator: </b>{{course.professors}}</p>
126   - <p>
127   - <b>Description:</b>
128   - <i>
129   - {{course.description}}
130   - </i>
131   - </p>
132   - <a href="{% url 'course:view' course.slug %}" class="btn btn-raised btn-default center-block">View Course<div class="ripple-container"></div></a>
133   - </div>
134   - </div>
  130 +
  131 + {% endblock %}
  132 + {% block render_breadcrumbs %}{% endblock %}
  133 + <div>
  134 + </div>
  135 + <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 col-xl-12">
  136 + {% block content %}
  137 + {% for course in courses %}
  138 + <div class="panel panel-info panel_{{ course.id }}">
  139 + <div class="panel-heading">
  140 + <a href="{{ course.get_absolute_url }}" class="panel-title">{{course.name}}</a>
  141 + {% if user|show_course_subscribe:course %}
  142 + <a onclick="subscribe($(this), '{% url 'course:subscribe' course.slug %}', {{ course.id}}, '{% trans 'Are you sure you want to subscribe to this course?' %}')" class="btn btn-sm btn-primary btn-raised pull-right" style="margin-top:-4px">{% trans 'Subscribe' %}</a>
  143 + {% endif %}
  144 + </div>
  145 +
  146 + <div class="panel-body">
  147 + <p><b>Course Name: </b>{{course.name}}</p>
  148 + <p><b>Begining: </b>{{course.init_date}}</p>
  149 + <p><b>End: </b>{{course.end_date}}</p>
  150 + <p><b>Professor: </b>{{course.professors.name}}</p>
  151 + <p>
  152 + <b>Description:</b>
  153 + <i>
  154 + {{course.content}}
  155 + </i>
  156 + </p>
  157 + </div>
135 158 </div>
136   - </div>
137   - </div>
138   - {% endif %}
139   - {% endfor %}
140   - {% endif %}
141   - {% else %}
142   - No courses found
143   - {% endif %}
144   - <div class="group">
145   - <div class="modal" id="removeCourse">
146   - <div class="modal-dialog">
147   - <div class="modal-content">
148   - <div class="modal-header">
149   - <button type="button" class="close" data-dismiss="modal" aria-hidden="true">X</button>
150   - <h4 class="modal-title"></h4>
151   - </div>
152   - <div class="modal-body">
153   - <p>Delete your course?</p>
154   - </div>
155   - <div class="modal-footer">
156   -
157   - <a href="http://127.0.0.1:8080/html/screens/users/profile_user.html" target="_self"><button type="button" class="btn btn-primary">Confirm</button></a>
158   -
159   - </div>
160   - </div>
161   - </div>
  159 + {% endfor %}
  160 +
  161 + {% endblock %}
162 162 </div>
163 163 </div>
164 164 </div>
165   - <div class="col-md-12">
166   - <nav aria-label="Page navigation">
167   - <ul class="pagination">
168   - {% if page_obj.has_previous %}
169   - <li>
170   - <a href="?page={{ page_obj.previous_page_number }}"><span><<</span></a>
171   - </li>
172   - {% endif %}
173   - {% for page_number in paginator.page_range %}
174   - <li{% if page_obj.number == page_number %} class="active"{% endif %}>
175   - <a href="?page={{ page_number }}">{{ page_number }}</a>
176   - </li>
177   - {% endfor %}
178   - {% if page_obj.has_next %}
179   - <li>
180   - <a href="?page={{ page_obj.next_page_number }}"><span>>></span></a>
181   - </li>
182   - {% endif %}
183   - </ul>
184   - </nav>
185   - </div>
186   -{% endcomment %}
  165 + <script src="{% static 'js/main.js' %}"></script>
  166 + <script type="text/javascript" src="{% static 'js/topic_editation_presentation.js' %}"></script>
  167 + {% block script_file %}
  168 +
  169 + {% endblock script_file %}
  170 +</body>
  171 +
  172 +</html>
187 173 \ No newline at end of file
... ...
core/templates/notifications.html
... ... @@ -5,8 +5,13 @@
5 5 <li>
6 6 <a href="{% url 'core:notification_read' notification.id %}"><div class="list-group-item">
7 7 <div class="row-picture">
8   - <img class="circle" src="http://lorempixel.com/56/56/people/1" alt="icon">
9   - <div class="least-content pull-right">{{ notification.datetime }}</div>
  8 + {% if notification.actor.image %}
  9 + <img class="circle user-notification-img" src="{{ notification.actor.image.url }}" alt="icon">
  10 + {% else %}
  11 + <img class="circle user-notification-img" src="{{ notification.actor.image_url }}" alt="icon">
  12 + {% endif %}
  13 +
  14 + <div class="least-content "> {{ notification.datetime|timesince }} </div>
10 15 </div>
11 16 <div class="row-content">
12 17 <p class="list-group-item-text">{{ notification.message }}</p>
... ... @@ -19,11 +24,11 @@
19 24 <a href="{% url 'core:notification_read' notification.id %}">
20 25 <div class="list-group-item">
21 26 <div class="row-action-primary">
22   - <i class="material-icons">folder</i>
  27 + <i class="material-icons"></i>
23 28 </div>
24 29 <div class="row-content">
25 30  
26   - <div class="least-content pull-right">{{ notification.datetime }}</div>
  31 + <div class="least-content pull-right">{{ notification.datetime|timesince }}</div>
27 32  
28 33 <p class="list-group-item-text">{{ notification.message }}</p>
29 34 </div>
... ...
core/templates/registration/passwor_reset_done.html
1 1 {% extends "index.html" %}
2 2 {% load i18n static %}
  3 +{% block content%}
3 4  
4   -{% block content %}
5   -
6   - <div class="row">
7   - <div class="col-md-4 col-md-offset-4 col-xs-4 col-xs-offset-4 col-sm-4 col-sm-offset-4 col-lg-4 col-lg-offset-4 col-xl-4 col-xl-offset-4">
8   - <div class="row">
9   - <div class="col-md-offset-2 col-md-8 col-sm-offset-2 col-sm-8 col-xs-offset-2 col-xs-8 col-lg-offset-2 col-lg-8 col-xs-offset-2 col-xs-8">
10   - </br>
11   - </br>
12   - <img src="{% static 'img/amadeus.png' %}" class="img-responsive center-block " alt="logo amadeus">
13   - </br>
14   - </div>
  5 +<div class="row">
  6 + <div class="col-sm-6 col-sm-offset-4 col-md-6 col-md-offset-4 col-xs-6 col-xs-offset-4 col-lg-6 col-lg-offset-4 col-xl-6 col-xl-offset-4 ">
  7 + <div class="col-sm-8 col-sm-offset-2 col-md-8 col-md-offset-2 col-xs-8 col-xs-offset-2 col-lg-8 col-lg-offset-2 col-xl-8 col-xl-offset-2">
  8 + <img src="{% static 'img/amadeus.png' %}" class="img-responsive center-block logo-login " alt="logo amadeus">
15 9 </div>
16   - </div>
17   - <div class="row ">
18   - <div class="col-lg-9 col-lg-offset-2 col-xs-9 col-xs-offset-2 col-sm-9 col-sm-offset-2 col-md-9 col-md-offset-2 col-xl-9 col-xl-offset-2">
19   - <div class="card">
20   - <div class="card-block">
21   - <div class="col-md-12 col-xs-12 col-sm-12 col-lg-12 col-xl-12">
22   - <form class="form-group " method="post" action="">
23   - {% csrf_token %}
24   - <div class="form-group is-empty">
25   - <p>{% trans "We have sent instructions to set up your password, if an account exists with the email entered. You should receive them soon." %}</p>
26   - <p>{% trans "If you do not receive an email, please make sure you entered the address you registered, and check the spam folder." %}</p>
27   - </div>
28   - </form>
  10 + </div>
  11 +</div>
  12 +<div class="row">
  13 + <div class="col-md-8 col-md-offset-3 col-sm-10 col-sm-offset-2 col-xs-12 col-xs-offset-1 col-lg-8 col-lg-offset-3 col-xl-8 col-xl-offset-3">
  14 + {% if success %}
  15 + <div class="alert alert-success alert-dismissible" role="alert">
  16 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  17 + <span aria-hidden="true">&times;</span>
  18 + </button>
  19 + <ul>
  20 + <li>{{ success }}</li>
  21 + </ul>
  22 + </div>
  23 + {% elif danger %}
  24 + <div class="alert alert-danger alert-dismissible" role="alert">
  25 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  26 + <span aria-hidden="true">&times;</span>
  27 + </button>
  28 + <ul>
  29 + <li>{{ danger }}</li>
  30 + </ul>
  31 + </div>
  32 + {% endif %}
  33 + <div class="card">
  34 + <div class="card-block">
  35 + <form class="form-group " method="post" action="">
  36 + <div class="col-md-12 col-xs-12 col-lg-10 col-lg-offset-1 col-sm-12">
  37 + {% csrf_token %}
  38 + <div class="form-group is-empty">
  39 + <p>{% trans "We have sent instructions to set up your password, if an account exists with the email entered. You should receive them soon." %}</p>
  40 + <p>{% trans "If you do not receive an email, please make sure you entered the address you registered, and check the spam folder." %}</p>
  41 + </div>
  42 + <div class="form-group">
  43 + <a href="{% url 'core:home' %}" class="btn btn-default btn-raised" >{% trans 'Back' %}</a>
29 44 </div>
30 45 </div>
31   - </div>
  46 + </form>
32 47 </div>
  48 + </div>
33 49 </div>
34   -
35   -{% endblock %}
  50 +</div>
  51 +{% endblock content %}
... ...
core/templates/registration/passwor_reset_form.html
... ... @@ -2,57 +2,53 @@
2 2 {% load i18n static %}
3 3 {% block content%}
4 4  
5   - <div class="row">
6   - <div class="col-md-4 col-md-offset-4 col-xs-4 col-xs-offset-4 col-sm-4 col-sm-offset-4 col-lg-4 col-lg-offset-4 col-xl-4 col-xl-offset-4">
7   - <div class="row">
8   - <div class="col-md-offset-2 col-md-8 col-sm-offset-2 col-sm-8 col-xs-offset-2 col-xs-8 col-lg-offset-2 col-lg-8 col-xs-offset-2 col-xs-8">
9   - </br>
10   - </br>
11   - <img src="{% static 'img/amadeus.png' %}" class="img-responsive center-block " alt="logo amadeus">
12   - </br>
13   - </div>
14   - </div>
15   - </div>
16   - <div class="row ">
17   - <div class="col-lg-9 col-lg-offset-2 col-xs-9 col-xs-offset-2 col-sm-9 col-sm-offset-2 col-md-9 col-md-offset-2 col-xl-9 col-xl-offset-2">
18   - {% if success %}
19   - <div class="alert alert-success alert-dismissible" role="alert">
20   - <button type="button" class="close" data-dismiss="alert" aria-label="Close">
21   - <span aria-hidden="true">&times;</span>
22   - </button>
23   - <ul>
24   - <li>{{ success }}</li>
25   - </ul>
26   - </div>
27   - {% elif danger %}
28   - <div class="alert alert-danger alert-dismissible" role="alert">
29   - <button type="button" class="close" data-dismiss="alert" aria-label="Close">
30   - <span aria-hidden="true">&times;</span>
31   - </button>
32   - <ul>
33   - <li>{{ danger }}</li>
34   - </ul>
35   - </div>
36   - {% endif %}
37   - <div class="card">
38   - <div class="card-block">
39   - <div class="col-md-12 col-xs-12 col-sm-12 col-lg-12 col-xl-12">
40   - <form class="form-group " method="post" action="">
41   - {% csrf_token %}
42   - <div class="form-group is-empty">
43   - <label for="inputEmail" class="ccontrol-label"> {% trans 'E-mail' %}</label>
44   - <input name="email" type="email" class="form-control" id="inputEmail" placeholder="Email" {% if email %}value="{{form.email}}"{% endif %}>
45   - </div>
46   - <div class="col-lg-offset-4 col-lg-4 col-xs-offset-4 col-xs-4 col-sm-offset-4 col-sm-4 col-md-offset-4 col-md-4 col-xl-offset-4 col-xl-4">
47   - <button type="submite" class="btn btn-raised btn-primary btn-block">{% trans 'Send' %}</button>
48   -
49   - </div>
50   - </form>
51   - </div>
52   - </div>
53   - </div>
  5 +<div class="row">
  6 + <div class="col-sm-6 col-sm-offset-4 col-md-6 col-md-offset-4 col-xs-6 col-xs-offset-4 col-lg-6 col-lg-offset-4 col-xl-6 col-xl-offset-4 ">
  7 + <div class="col-sm-8 col-sm-offset-2 col-md-8 col-md-offset-2 col-xs-8 col-xs-offset-2 col-lg-8 col-lg-offset-2 col-xl-8 col-xl-offset-2">
  8 + <img src="{% static 'img/amadeus.png' %}" class="img-responsive center-block logo-login " alt="logo amadeus">
  9 + </div>
  10 + </div>
  11 +</div>
  12 +<div class="row">
  13 + <div class="col-md-8 col-md-offset-3 col-sm-10 col-sm-offset-2 col-xs-12 col-xs-offset-1 col-lg-8 col-lg-offset-3 col-xl-8 col-xl-offset-3">
  14 + {% if success %}
  15 + <div class="alert alert-success alert-dismissible" role="alert">
  16 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  17 + <span aria-hidden="true">&times;</span>
  18 + </button>
  19 + <ul>
  20 + <li>{{ success }}</li>
  21 + </ul>
  22 + </div>
  23 + {% elif danger %}
  24 + <div class="alert alert-danger alert-dismissible" role="alert">
  25 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  26 + <span aria-hidden="true">&times;</span>
  27 + </button>
  28 + <ul>
  29 + <li>{{ danger }}</li>
  30 + </ul>
  31 + </div>
  32 + {% endif %}
  33 + <div class="card">
  34 + <div class="card-block">
  35 + <form class="form-group " method="post" action="">
  36 + <div class="col-md-12 col-xs-12 col-lg-10 col-lg-offset-1 col-sm-12">
  37 + {% csrf_token %}
  38 + <div class="form-group is-empty">
  39 + <label for="inputEmail" class="ccontrol-label"> {% trans 'E-mail' %}</label>
  40 + <input name="email" type="email" class="form-control" id="inputEmail" placeholder="Email" {% if email %}value="{{form.email}}"{% endif %}>
  41 + </div>
  42 + <div class="form-group send-reset-email">
  43 + <button type="submite" class="btn btn-raised btn-primary ">{% trans 'Send' %}</button>
  44 + </div>
  45 + <div class="form-group">
  46 + <a href="{% url 'core:home' %}" class="btn btn-default btn-raised" >{% trans 'Back' %}</a>
  47 + </div>
  48 + </div>
  49 + </form>
54 50 </div>
55 51 </div>
56 52 </div>
57   -
  53 +</div>
58 54 {% endblock content %}
... ...
core/views.py
... ... @@ -68,7 +68,6 @@ def remember_password(request):
68 68 context['danger'] = 'E-mail does not send'
69 69 return render(request, "remember_password.html",context)
70 70  
71   -@notification_decorator(message='just connected')
72 71 @log_decorator('Acessar', 'Sistema')
73 72 def login(request):
74 73 context = {}
... ... @@ -116,6 +115,7 @@ def getNotifications(request):
116 115  
117 116 def guest (request):
118 117 context = {
119   - 'courses': Course.objects.filter(public=True)
  118 + 'courses': Course.objects.filter(public=True),
  119 + 'categories': CourseCategory.objects.all(),
120 120 }
121 121 return render(request, 'guest.html', context)
122 122 \ No newline at end of file
... ...