From 4591076c6afb3c890b646d1ce560c23cc5b9832b Mon Sep 17 00:00:00 2001 From: dipanshu <43211840+dipanshu231099@users.noreply.github.com> Date: Fri, 5 Jul 2019 12:41:12 +0530 Subject: [PATCH] Add calendar widget. --- carpool/forms.py | 6 +- carpool/static/css/jquery.simple-dtpicker.css | 339 +++ carpool/static/js/jquery.simple-dtpicker.js | 1836 +++++++++++++++++ carpool/templates/add.html | 9 + carpool/templates/index.html | 16 + carpool/views.py | 2 +- 6 files changed, 2204 insertions(+), 4 deletions(-) create mode 100644 carpool/static/css/jquery.simple-dtpicker.css create mode 100644 carpool/static/js/jquery.simple-dtpicker.js diff --git a/carpool/forms.py b/carpool/forms.py index c9ef0db..f6dc7b7 100644 --- a/carpool/forms.py +++ b/carpool/forms.py @@ -3,7 +3,6 @@ from django.contrib.auth.forms import UserCreationForm from .models import User, Pool - class SignUpForm(UserCreationForm): first_name = forms.CharField(max_length=30, widget=forms.TextInput(attrs={'placeholder': 'First Name'})) last_name = forms.CharField(max_length=30, widget=forms.TextInput(attrs={'placeholder': 'Last Name'})) @@ -25,7 +24,7 @@ class Meta: class PoolForm(forms.ModelForm): user = forms.ModelChoiceField(queryset=User.objects.all(), required=False) tot = forms.IntegerField(widget=forms.NumberInput(), label="Seats") - dateTime = forms.DateTimeField(widget=forms.widgets.DateTimeInput(), label="Date Time YYYY-MM-DD HH:MM") + dateTime = forms.CharField(widget=forms.TextInput(attrs={'id':'datepicker-3'})) source = forms.ChoiceField(choices=CHOICE, initial='', widget=forms.Select()) dest = forms.ChoiceField(choices=CHOICE, label="destination", initial='', widget=forms.Select()) paid = forms.BooleanField(required=False) @@ -47,12 +46,13 @@ def __init__(self, *args, **kwargs): ) + class filterForm(forms.Form): source = forms.ChoiceField(choices=CHOICES, label="From", initial='', widget=forms.Select()) dest = forms.ChoiceField(choices=CHOICES, label="To", initial='', widget=forms.Select()) free = forms.BooleanField(required=False, widget=forms.CheckboxInput(attrs={'class': 'checkbox'})) tot = forms.IntegerField(widget=forms.NumberInput(), label="Slots") - date = forms.DateField(widget=forms.SelectDateWidget()) + date = forms.CharField(widget=forms.TextInput(attrs={'id':'datepicker-3'})) class DeleteForm(forms.Form): diff --git a/carpool/static/css/jquery.simple-dtpicker.css b/carpool/static/css/jquery.simple-dtpicker.css new file mode 100644 index 0000000..cf8e09e --- /dev/null +++ b/carpool/static/css/jquery.simple-dtpicker.css @@ -0,0 +1,339 @@ +/** + * Style-sheet for dtpicker + * https://github.com/mugifly/jquery-simple-datetimepicker + */ + +.datepicker { + position: relative; + display: inline-block; + font: 15px/1.5 "Helvetica Neue", mplus-2c, Helvetica, Arial, "Hiragino Kaku Gothic Pro", Meiryo, sans-serif; + font-weight: 300; + border: 1px solid #dfdfdf; + border-radius: 3px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + box-shadow: 0.5px 0.5px 0px #c8c8c8; + -webkit-box-shadow: 0.5px 0.5px 3px #eeeeee; + -moz-box-shadow: 0.5px 0.5px 3px #eeeeee; +} + +/* + * datepicker_header +*/ + +.datepicker > .datepicker_header { + padding-top: 2px; + padding-bottom: 2px; + padding-left: 5px; + padding-right: 5px; + background-color: #eeeeee; + color: #3f3f3f; + text-align: center; + font-size: 9pt; + font-weight: bold; + min-height: 30px; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +.datepicker > .datepicker_header > span { + display: inline-block; + margin-top: -2px; +} + +.datepicker > .datepicker_header > a { + color: #3b7796; + cursor: pointer; + font-size: 20px; + padding: 3px 16px; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + vertical-align: middle; +} + +.datepicker > .datepicker_header > a:hover { + color: #303030; + background-color: #c8c8c8; +} + +.datepicker > .datepicker_header > a:active { + color: #ffffff; + background-color: #808080; +} + +.datepicker > .datepicker_header > span { + margin-left: 20px; + margin-right: 20px; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +.datepicker > .datepicker_header > .icon-home { + position: absolute; + display: block; + width: 16px; + height: 16px; + vertical-align: middle; + padding: 8px; + top: 0; + left: 0; +} + +.datepicker > .datepicker_header > .icon-close { + position: absolute; + display: block; + width: 16px; + height: 16px; + vertical-align: middle; + padding: 8px; + top: 0; + right: 0; +} +.datepicker > .datepicker_header > .icon-home > div { + width: 16px; + height: 16px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAepJREFUSEudk71Kw2AUhnVxVnCyN1EcCjXUujmKF1AoRRCcNU4OIg5dtXF36tAb6B107qjg0iC4STt0EdTnTU8+v5rGNh54aM7Pe/J+abLmR3AZ7QeXD0+WZkI9zViaiXq9vg+5evU0Y+ksgjCqsrgPA2jBOzQs91FNPc0o70vLQtGHAbTgHRqW+6imnmaUS1PVqWL4SgijJr8juHK1H1Qb2Uxai1kivowmjODKq6Wopp5m0losA95Noh43ONXi+XpCPOsx49W9ZaIHp+CbSlFNPc24+i8DxfGX/YeZgTDqQrsgXc9AF9oFkcY9gQN7J3MjuOhs2WUS0ngGluqZmdNLs7IBTltmZsrvsZUKGaBfhik4vTSw3EBwfrdBfwhvwcX9tpVXNkBvA4bwBk4vDSw2UD27WbdLnf42mQmjIysl8ZeBWq3m9PRubWZOL43qGQOccpf8lc9tj5tWuP7g+tHaLqSR1pY7Pde78Ap7UIEPyOip5RgIOzvkzzCGF4gxtWltF9LAIgM78AxjeAF9/xk9tfy/gBuWOLVMfPIUDq08F3kGFOQlkIlPWKiXBvJfQl6+EjdvWJqJvwwoqMlErl4aabVowmmvbWEBEs2EJeLaFhZBmone8hMtAj2JIkykZYmQifRprAqa+sk3UgBXF8VWaxMAAAAASUVORK5CYII=); +} +.datepicker > .datepicker_header > .icon-close> div { + width: 16px; + height: 16px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAfhJREFUSEvNVEtKA0EUHHBhsvZ7D0HF4PRMnERxI+hCQ4xuBE/g5yLRA+il/CCIXkDElRGt6qkZO91j1JUW1KJf1XvVn2Gif4XGUX986aRf0zIANXq0DBBv7Iwvb+192U+NHi2H0Tg+O2ycnN2DV+CcyiVQW5B2T6/KJUxr7dAkySN4bVbaiyqXMM1s3mr0wKtyDgytgQ/gu/gKbkumvgsOpJH0lieNN3s1O9iYd/EN657kyJikZ2uFDi97JDOgX8fAWyeg2MQO6IeT8Pbrao+Wtw/qJklvywBnE5ZuOAkve9SeA0PnQT+Ia7/2BoZXnK0uBkH5Oqxl4RNZYHAH9ANdMnxP9gA42X5FoMuhp6kEAnjlDPpVeIERm0B4+m0/N9AFq26Bta5sX0JvPvDCycFPTs+PbtQTUOvIHgAhu+DoJ4BH9mFgcAzyy3cDee3+c9ATq60ErjfDcP/kDPQ3hJtIM7XlwMAJ8FoBBe2bi/4m6J1QO34yrWlc740XxDffr/wm6EWP2u0GJsEnDS/DJVPvge7T0DspmT+aGQx+cUKGPriKTcCbzEhGwOn5GAZegM/gHdiSVAK1VBo9F+yRFJn2+hgGXtrBSXpn0mbQb5orbavl4ZfskZRDm5gGp1QKQM16nPACdhNpczZur3+ezAM1eoLwv0MUfQBkquZISGUUwgAAAABJRU5ErkJggg==); +} +.datepicker > .datepicker_header > a:hover > div, .datepicker > .datepicker_header > a:hover > div { + background-position: -16px 0px; +} + +/* + * datepicker_inner_container +*/ + +.datepicker > .datepicker_inner_container { + margin: -2px 0px -2px 0px; + background-color: #d2d2d2; + border: 1px solid #c8c8c8; + border-radius: 3px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + + box-shadow: 0.5px 0px 3px #c8c8c8; + -webkit-box-shadow: 0.5px 0px 3px #c8c8c8; + -moz-box-shadow: 0.5px 0px 3px #c8c8c8; +} + +.datepicker > .datepicker_inner_container:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* + * datepicker_inner_container > datepicker_calendar +*/ + +.datepicker > .datepicker_inner_container > .datepicker_calendar { + float: left; + width: 18.3em; + + margin-top: -0.5px; + margin-left: -1px; + margin-bottom: -2px; + + background-color: #ffffff; + border: 1px solid #c8c8c8; + + border-top:none; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + -webkit-border-bottom-left-radius: 3px; + -moz-border-radius-topleft: 3px; + -moz-border-radius-bottomleft: 3px; +} + +.datepicker > .datepicker_inner_container > .datepicker_calendar > table { + padding: 10px; +} + +/* + * datepicker_inner_container > datepicker_calendar > datepicker_table > tbody > tr > th (WDay-cell) +*/ + +.datepicker > .datepicker_inner_container > .datepicker_calendar > .datepicker_table > tbody > tr > th { + color: #646464; + width: 18px; + font-size: small; + font-weight: normal; + text-align:center; +} + +/* + * datepicker_inner_container > datepicker_calendar > datepicker_table > tbody > tr > td (Day-cell) +*/ + +.datepicker > .datepicker_inner_container > .datepicker_calendar > .datepicker_table > tbody > tr > td { + color: #000000; + font-size: small; + text-align:center; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + cursor: pointer; + padding: 10px; +} + +.datepicker > .datepicker_inner_container > .datepicker_calendar > .datepicker_table > tbody > tr > td.today { + border-bottom: #bfbfbf solid 2px; + margin-bottom: -2px; +} + +.datepicker > .datepicker_inner_container > .datepicker_calendar > .datepicker_table > tbody > tr > td.wday_sat { + color: #0044aa; +} + +.datepicker > .datepicker_inner_container > .datepicker_calendar > .datepicker_table > tbody > tr > td.wday_sun { + color: #e13b00; +} + +.datepicker > .datepicker_inner_container > .datepicker_calendar > .datepicker_table > tbody > tr > td.day_another_month { + color: #cccccc; +} + +.datepicker > .datepicker_inner_container > .datepicker_calendar > .datepicker_table > tbody > tr > td.day_in_past { + cursor: default; + color: #cccccc; +} + +.datepicker > .datepicker_inner_container > .datepicker_calendar > .datepicker_table > tbody > tr > td.day_in_unallowed { + cursor: default; + color: #cccccc; +} + +.datepicker > .datepicker_inner_container > .datepicker_calendar > .datepicker_table > tbody > tr > td.out_of_range { + cursor: default; + color: #cccccc; +} + +.datepicker > .datepicker_inner_container > .datepicker_calendar > .datepicker_table > tbody > tr > td.active { + color: #ffffff; + background-color: #808080; +} + +.datepicker > .datepicker_inner_container > .datepicker_calendar > .datepicker_table > tbody > tr > td.hover { + color: #000000; + background-color: #c8c8c8; +} + +/* + * datepicker_inner_container > datepicker_timelist +*/ + +.datepicker > .datepicker_inner_container > .datepicker_timelist { + float: left; + + margin-top: -0.5px; + padding: 5px 0px; + + overflow: auto; + overflow-x: hidden; + + background-color: #ffffff; + + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; + text-align: right; + width: 4.9em; +} + +/* +.datepicker > .datepicker_inner_container > .datepicker_timelist::after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} +*/ + +.datepicker > .datepicker_inner_container > .datepicker_timelist::-webkit-scrollbar { + overflow: hidden; + width: 6px; + background: #fafafa; + + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; +} + +.datepicker > .datepicker_inner_container > .datepicker_timelist::-webkit-scrollbar:horizontal { + height: 1px; +} + +.datepicker > .datepicker_inner_container > .datepicker_timelist::-webkit-scrollbar-button { + display: none; +} + +.datepicker > .datepicker_inner_container > .datepicker_timelist::-webkit-scrollbar-piece { + background: #eee; +} + +.datepicker > .datepicker_inner_container > .datepicker_timelist::-webkit-scrollbar-piece:start { + background: #eee; +} + +.datepicker > .datepicker_inner_container > .datepicker_timelist::-webkit-scrollbar-thumb { + background: #aaaaaa; + border-radius: 3px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; +} + +.datepicker > .datepicker_inner_container > .datepicker_timelist::-webkit-scrollbar-corner { + background: #333; +} + +.datepicker > .datepicker_inner_container > .datepicker_timelist > div.timelist_item { + padding-top: 5px; + padding-bottom:5px; + padding-left: 7px; + padding-right: 7px; + margin-top: 5px; + margin-bottom: 2px; + font-size: small; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + cursor: pointer; +} + +.datepicker > .datepicker_inner_container > .datepicker_timelist > div.timelist_item.time_in_past { + cursor: default; + color: #cccccc; +} + +.datepicker > .datepicker_inner_container > .datepicker_timelist > div.timelist_item.out_of_range { + cursor: default; + color: #cccccc; +} +.datepicker > .datepicker_inner_container > .datepicker_timelist > div.timelist_item.active { + color: #ffffff; + background-color: #808080; +} + +.datepicker > .datepicker_inner_container > .datepicker_timelist > div.timelist_item.hover { + color: #000000; + background-color: #c8c8c8; +} diff --git a/carpool/static/js/jquery.simple-dtpicker.js b/carpool/static/js/jquery.simple-dtpicker.js new file mode 100644 index 0000000..45e6379 --- /dev/null +++ b/carpool/static/js/jquery.simple-dtpicker.js @@ -0,0 +1,1836 @@ +/** + * jquery-simple-datetimepicker (jquery.simple-dtpicker.js) + * v1.14.0 + * (c) Masanori Ohgita. + * https://github.com/mugifly/jquery-simple-datetimepicker + **/ + +(function($) { + var lang = { + en: { + days: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'], + months: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", + "Sep", "Oct", "Nov", "Dec" + ], + sep: '-', + format: 'YYYY-MM-DD hh:mm', + prevMonth: 'Previous month', + nextMonth: 'Next month', + today: 'Today' + }, + ro: { + days: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'], + months: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun', 'Iul', 'Aug', + 'Sep', 'Oct', 'Nov', 'Dec' + ], + sep: '.', + format: 'DD.MM.YYYY hh:mm', + prevMonth: 'Luna precedentă', + nextMonth: 'Luna următoare', + today: 'Azi' + }, + + ja: { + days: ['日', '月', '火', '水', '木', '金', '土'], + months: ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", + "11", "12" + ], + sep: '/', + format: 'YYYY/MM/DD hh:mm' + }, + ru: { + days: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'], + months: ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", + "Сен", "Окт", "Ноя", "Дек" + ], + format: 'DD.MM.YYYY hh:mm' + }, + br: { + days: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'], + months: ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", + "Julho", "Agosto", "Setembro", "Outubro", "Novembro", + "Dezembro" + ], + format: 'DD/MM/YYYY hh:mm' + }, + pt: { + days: ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb'], + months: ["janeiro", "fevereiro", "março", "abril", "maio", "junho", + "julho", "agosto", "setembro", "outubro", "novembro", + "dezembro" + ] + }, + cn: { + days: ['日', '一', '二', '三', '四', '五', '六'], + months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", + "十一月", "十二月" + ] + }, + da: { + days: ['Sø', 'Ma', 'Ti', 'On', 'To', 'Fr', 'Lø'], + months: ["Jan", "Feb", "Mar", "Apr", "Maj", "Juni", "Juli", "Aug", + "Sept", "Okt", "Nov", "Dec" + ], + sep: '-', + format: 'DD-MM-YYYY hh:mm', + prevMonth: 'Forrige måned', + nextMonth: 'Næste måned', + today: 'I dag' + }, + de: { + days: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'], + months: ["Jan", "Feb", "März", "Apr", "Mai", "Juni", "Juli", "Aug", + "Sept", "Okt", "Nov", "Dez" + ], + format: 'DD.MM.YYYY hh:mm' + }, + sv: { + days: ['Sö', 'Må', 'Ti', 'On', 'To', 'Fr', 'Lö'], + months: ["Jan", "Feb", "Mar", "Apr", "Maj", "Juni", "Juli", "Aug", + "Sept", "Okt", "Nov", "Dec" + ] + }, + id: { + days: ['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'], + months: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Agu", + "Sep", "Okt", "Nov", "Des" + ] + }, + it: { + days: ['Dom', 'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab'], + months: ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", + "Set", "Ott", "Nov", "Dic" + ], + format: 'DD/MM/YYYY hh:mm' + }, + tr: { + days: ['Pz', 'Pzt', 'Sal', 'Çar', 'Per', 'Cu', 'Cts'], + months: ["Ock", "Şub", "Mar", "Nis", "May", "Haz", "Tem", "Agu", + "Eyl", "Ekm", "Kas", "Arlk" + ] + }, + es: { + days: ['dom', 'lun', 'mar', 'miér', 'jue', 'vie', 'sáb'], + months: ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", + "sep", "oct", "nov", "dic" + ], + format: 'DD/MM/YYYY hh:mm' + }, + ko: { + days: ['일', '월', '화', '수', '목', '금', '토'], + months: ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", + "11", "12" + ], + sep: '/', + prevMonth: '이전 달', + nextMonth: '다음 달', + today: '오늘' + }, + nl: { + days: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], + months: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", + "sep", "okt", "nov", "dec" + ], + format: 'DD-MM-YYYY hh:mm' + }, + no: { + days: ['Søn', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør'], + months: ["Jan", "Feb", "Mar", "Apr", "Mi", "Jun", "Jul", "Aug", "Sep", + "Okt", "Nov", "Des" + ], + sep: '.', + format: 'YYYY-MM-DD hh:mm', + prevMonth: 'Forrige Måned', + nextMonth: 'Neste Måned', + today: 'I dag' + }, + cz: { + days: ['Ne', 'Po', 'Út', 'St', 'Čt', 'Pá', 'So'], + months: ["Led", "Úno", "Bře", "Dub", "Kvě", "Čer", "Čvc", "Srp", + "Zář", "Říj", "Lis", "Pro" + ], + format: 'DD.MM.YYYY hh:mm' + }, + fr: { + days: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'], + months: ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", + "Juillet", "Août", "Septembre", "Octobre", "Novembre", + "Décembre" + ], + format: 'DD-MM-YYYY hh:mm' + }, + pl: { + days: ['N', 'Pn', 'Wt', 'Śr', 'Cz', 'Pt', 'So'], + months: ["Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", + "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", + "Grudzień" + ], + sep: '-', + format: 'YYYY-MM-DD hh:mm', + prevMonth: 'Poprzedni miesiąc', + nextMonth: 'Następny miesiąc', + today: 'Dzisiaj' + }, + gr: { + days: ['Κυ', 'Δε', 'Τρ', 'Τε', 'Πε', 'Πα', 'Σα'], + months: ["Ιαν", "Φεβ", "Μαρ", "Απρ", "Μαϊ", "Ιουν", "Ιουλ", "Αυγ", + "Σεπ", "Οκτ", "Νοε", "Δεκ" + ], + sep: '-', + format: 'DD-MM-YYYY hh:mm', + prevMonth: 'Προηγ. μήνας', + nextMonth: 'Επόμ. μήνας', + today: 'Σήμερα' + }, + ua: { + days: ["Неділя", "Понеділок", "Вівторок", "Cереда", "Четвер", + "П'ятниця", "Субота" + ], + months: ["Cічень", "Лютий", "Березень", "Квітень", "Травень", + "Червня", "Липня", "Серпня", "Вересня", "Жовтень", + "Листопада", "Грудня" + ], + format: 'YYYY-MM-DD hh:mm', + prevMonth: 'Попередній місяць', + nextMonth: 'Наступний місяць', + today: 'Cьогодні' + }, + et: { + days: ['P', 'E', 'T', 'K', 'N', 'R', 'L'], + months: ["Jaan", "Veebr", "Märts", "Apr", "Mai", "Juun", "Juul", + "Aug", "Sept", "Okt", "Nov", "Dets" + ], + sep: '.', + format: 'DD.MM.YYYY hh:mm', + prevMonth: 'Eelmine kuu', + nextMonth: 'Järgmine kuu', + today: 'Täna' + }, + hu: { + days: ['Va', 'Hé', 'Ke', 'Sze', 'Cs', 'Pé', 'Szo'], + months: ["Jan", "Feb", "Már", "Ápr", "Máj", "Jún", "Júl", "Aug", + "Szep", "Okt", "Nov", "Dec" + ], + sep: '-', + format: 'YYYY-MM-DD hh:mm:00', + prevMonth: 'Előző hónap', + nextMonth: 'Következő hónap', + today: 'Ma' + }, + fa: { + days: ['یکشنبه', 'دوشنبه', 'سه شنبه', 'چهارشنبه', 'پنج شنبه', 'جمعه', + 'شنبه' + ], + months: ["ژانویه", "فبریه", "مارچ", "آپریل", "می", "ژوئن", "جولای", + "آگوست", "سپتامبر", "اکتبر", "نوامبر", "دسامبر" + ], + sep: '-', + format: 'YYYY-MM-DD hh:mm', + prevMonth: 'ماه قبل', + nextMonth: 'ماه بعد', + today: 'امروز' + }, + lv: { + days: ['Sv', 'P', 'O', 'T', 'C', 'P', 'S'], + months: ["Jan", "Feb", "Mar", "Apr", "Mai", "Jūn", "Jūl", "Avg", + "Sep", "Okt", "Nov", "Dec" + ], + format: 'DD.MM.YYYY hh:mm' + }, + lt: { + days: ['Pr', 'A', 'T', 'K', 'P', 'Š', 'S'], + months: ["Saus.", "Vas.", "Kovas", "Bal.", "Geg.", "Birž.", "Liepa", + "Rugp.", "Rugs.", "Spal.", "Lapkr.", "Gruod." + ], + sep: '-', + format: 'YYYY-MM-DD hh:mm', + prevMonth: 'Praeitas mėnesis', + nextMonth: 'Sekantis mėnesis', + today: 'Šiandien' + }, + is: { + days: ['Su', 'Má', 'Þr', 'Mi', 'Fi', 'Fö', 'La'], + months: ["Jan", "Feb", "Mar", "Apr", "Maí", "Jún", "Júl", "Ágú", + "Sep", "Okt", "Nóv", "Des" + ], + sep: '-', + format: 'YYYY-MM-DD hh:mm', + prevMonth: 'Fyrri mánuður', + nextMonth: 'Næsti mánuður', + today: 'Í dag' + }, + fi: { + days: ['Su', 'Ma', 'Ti', 'Ke', 'To', 'Pe', 'La'], + months: ["Tammikuu", "Helmikuu", "Maaliskuu", "Huhtikuu", "Toukokuu", + "Kesäkuu", "Heinäkuu", "Elokuu", "Syyskuu", "Lokakuu", + "Marraskuu", "Joulukuu" + ], + sep: '-', + format: 'D.M.YYYY h:mm', + prevMonth: 'Edellinen kuukausi', + nextMonth: 'Seuraava kuukausi', + today: 'Tänään' + } + }; + /* ----- */ + + /** + PickerHandler Object + **/ + var PickerHandler = function($picker, $input) { + this.$pickerObject = $picker; + this.$inputObject = $input; + }; + + /* Get a picker */ + PickerHandler.prototype.getPicker = function() { + return this.$pickerObject; + }; + + /* Get a input-field */ + PickerHandler.prototype.getInput = function() { + return this.$inputObject; + }; + + /* Get the display state of a picker */ + PickerHandler.prototype.isShow = function() { + var is_show = true; + if (this.$pickerObject.css('display') == 'none') { + is_show = false; + } + return is_show; + }; + + /* Show a picker */ + PickerHandler.prototype.show = function() { + var $picker = this.$pickerObject; + var $input = this.$inputObject; + + $picker.show(); + + ActivePickerId = $input.data('pickerId'); + + if ($input != null && $picker.data('isInline') === false) { // Float mode + // Relocate a picker to position of the appended input-field + this._relocate(); + } + }; + + /* Hide a picker */ + PickerHandler.prototype.hide = function() { + var $picker = this.$pickerObject; + var $input = this.$inputObject; + $picker.hide(); + }; + + /* Get a selected date from a picker */ + PickerHandler.prototype.getDate = function() { + var $picker = this.$pickerObject; + var $input = this.$inputObject; + return getPickedDate($picker); + }; + + /* Set a specific date to a picker */ + PickerHandler.prototype.setDate = function(date) { + var $picker = this.$pickerObject; + var $input = this.$inputObject; + if (!isObj('Date', date)) { + date = new Date(date); + } + + draw_date($picker, { + "isAnim": true, + "isOutputToInputObject": true + }, date); + }; + + /* Set a specific min date to a picker and redraw */ + PickerHandler.prototype.setMinDate = function(date) { + var $picker = this.$pickerObject; + var $input = this.$inputObject; + if (!isObj('Date', date)) { + date = new Date(date); + } + $picker.data("minDate", date); + if ($input.val()) { + datepicked = new Date(getPickedDate($picker)); + draw_date($picker, { + "isAnim": true, + "isOutputToInputObject": true + }, ((datepicked > date) ? datepicked : date)); + } else { + draw_date($picker, { + "isAnim": true, + "isOutputToInputObject": false + }, date); + } + }; + + /* Set a specific max date to a picker and redraw */ + PickerHandler.prototype.setMaxDate = function(date) { + var $picker = this.$pickerObject; + var $input = this.$inputObject; + if (!isObj('Date', date)) { + date = new Date(date); + } + $picker.data("maxDate", date); + if ($input.val()) { + datepicked = new Date(getPickedDate($picker)); + draw_date($picker, { + "isAnim": true, + "isOutputToInputObject": true + }, ((datepicked < date) ? datepicked : date)); + } else { + draw_date($picker, { + "isAnim": true, + "isOutputToInputObject": false + }, date); + } + }; + + /* Destroy a picker */ + PickerHandler.prototype.destroy = function() { + var $picker = this.$pickerObject; + var picker_id = $picker.data('pickerId'); + PickerObjects[picker_id] = null; + $picker.remove(); + }; + + /* Relocate a picker to position of the appended input-field. */ + PickerHandler.prototype._relocate = function() { + var $picker = this.$pickerObject; + var $input = this.$inputObject; + + if ($input != null && $picker.data('isInline') === false) { // Float mode + // Move position of a picker - vertical + var input_outer_height = $input.outerHeight({ + 'margin': true + }); + if (!isObj('Number', input_outer_height)) { + input_outer_height = $input.outerHeight(); + } + var picker_outer_height = $picker.outerHeight({ + 'margin': true + }); + if (!isObj('Number', picker_outer_height)) { + picker_outer_height = $picker.outerHeight(); + } + + // Set width to assure date and time are side by side + if ($(".datepicker_calendar", $picker).width() !== 0 && $( + ".datepicker_timelist", $picker).width() !== 0) { + $picker.parent().width($(".datepicker_calendar", $picker).width() + + $(".datepicker_timelist", $picker).width() + 6); + } + if (parseInt($(window).height()) <= ($input.offset().top - $(document) + .scrollTop() + input_outer_height + picker_outer_height)) { + // Display to top of an input-field + $picker.parent().css('top', ($input.offset().top - ( + input_outer_height / 2) - picker_outer_height) + 'px'); + } else { + // Display to bottom of an input-field + $picker.parent().css('top', ($input.offset().top + + input_outer_height) + 'px'); + } + // Move position of a picker - horizontal + if ($picker.parent().width() + $input.offset().left > $(window).width() && + $picker.data('timeOnly') !== true) { + // Display left side stick to window + $picker.parent().css('left', (($(window).width() - $picker.parent() + .width()) / 2) + 'px'); + } else { + // Display left side stick to input + $picker.parent().css('left', $input.offset().left + 'px'); + } + // Display on most top of the z-index + $picker.parent().css('z-index', 100000); + } + }; + + /* ----- */ + + var PickerObjects = []; + var InputObjects = []; + var ActivePickerId = -1; + + var getParentPickerObject = function(obj) { + return $(obj).closest('.datepicker'); + }; + + var getPickersInputObject = function($obj) { + var $picker = getParentPickerObject($obj); + if ($picker.data("inputObjectId") != null) { + return $(InputObjects[$picker.data("inputObjectId")]); + } + return null; + }; + + var setToNow = function($obj) { + var $picker = getParentPickerObject($obj); + var date = new Date(); + var year, month, day, hour, minute; + + // compare timestamps + if ($picker.data('minDate') !== null && date < $picker.data('minDate')) { + var minDate = new Date($picker.data('minDate')); + year = minDate.getFullYear(); + month = minDate.getMonth(); + day = minDate.getDate(); + hour = minDate.getHours(); + minute = minDate.getMinutes(); + } else if ($picker.data('maxDate') !== null && date > $picker.data( + 'maxDate')) { + var maxDate = new Date($picker.data('maxDate')); + year = maxDate.getFullYear(); + month = maxDate.getMonth(); + day = maxDate.getDate(); + hour = maxDate.getHours(); + minute = maxDate.getMinutes(); + } else { + year = date.getFullYear(); + month = date.getMonth(); + day = date.getDate(); + hour = date.getHours(); + minute = date.getMinutes(); + } + + draw($picker, { + "isAnim": true, + "isOutputToInputObject": true + }, year, month, day, hour, minute); + }; + + var beforeMonth = function($obj) { + var $picker = getParentPickerObject($obj); + + if ($picker.data('stateAllowBeforeMonth') === false) { // Not allowed + return; + } + + var date = getShownDate($picker); + var targetMonth_lastDay = new Date(date.getFullYear(), date.getMonth(), 0) + .getDate(); + if (targetMonth_lastDay < date.getDate()) { + date.setDate(targetMonth_lastDay); + } + draw($picker, { + "isAnim": true, + "isOutputToInputObject": false, + "keepPickedDate": true + }, date.getFullYear(), date.getMonth() - 1, date.getDate(), date.getHours(), + date.getMinutes()); + + var todayDate = new Date(); + if ($picker.data("futureOnly") && $picker.data("current")) { + todayDate = new Date($picker.data("current")); + } + + var isCurrentYear = todayDate.getFullYear() == date.getFullYear(); + var isCurrentMonth = isCurrentYear && todayDate.getMonth() == date.getMonth(); + + if (!isCurrentMonth || !$picker.data("futureOnly")) { + if (targetMonth_lastDay < date.getDate()) { + date.setDate(targetMonth_lastDay); + } + var newdate = new Date(date.getFullYear(), date.getMonth() - 1, date.getDate(), + date.getHours(), date.getMinutes()); + if ($picker.data("minDate") && newdate < $picker.data("minDate")) + newdate = new Date($picker.data("minDate")); + draw($picker, { + "isAnim": true, + "isOutputToInputObject": false, + "keepPickedDate": true + }, newdate.getFullYear(), newdate.getMonth(), newdate.getDate(), + newdate.getHours(), newdate.getMinutes()); + } + }; + + var nextMonth = function($obj) { + var $picker = getParentPickerObject($obj); + var date = getShownDate($picker); + var targetMonth_lastDay = new Date(date.getFullYear(), date.getMonth() + + 1, 0).getDate(); + if (targetMonth_lastDay < date.getDate()) { + date.setDate(targetMonth_lastDay); + } + + // Check a last date of a next month + if (getLastDate(date.getFullYear(), date.getMonth() + 1) < date.getDate()) { + date.setDate(getLastDate(date.getFullYear(), date.getMonth() + 1)); + } + var newdate = new Date(date.getFullYear(), date.getMonth() + 1, date.getDate(), + date.getHours(), date.getMinutes()); + if ($picker.data("maxDate") && newdate > $picker.data("maxDate")) + newdate = new Date($picker.data("maxDate")); + draw($picker, { + "isAnim": true, + "isOutputToInputObject": false, + "keepPickedDate": true + }, newdate.getFullYear(), newdate.getMonth(), newdate.getDate(), + newdate.getHours(), newdate.getMinutes()); + }; + + /** + Check a last date of a specified year and month + **/ + var getLastDate = function(year, month) { + var date = new Date(year, month + 1, 0); + return date.getDate(); + }; + + var getDateFormat = function(format, locale, is_date_only, is_time_only) { + if (format == "default") { + // Default format + format = translate(locale, 'format'); + if (is_date_only) { + // Convert the format to date-only (ex: YYYY/MM/DD) + format = format.substring(0, format.search(' ')); + } else if (is_time_only) { + format = format.substring(format.search(' ') + 1); + } + } + return format; // Return date-format + }; + + var normalizeYear = function(year) { + if (year < 99) { // change year for 4 digits + var date = new Date(); + return parseInt(year) + parseInt(date.getFullYear().toString().substr( + 0, 2) + "00"); + } + return year; + }; + var parseDate = function(str, opt_date_format) { + var re, m, date; + if (opt_date_format != null) { + // Parse date & time with date-format + + // Match a string with date format + var df = opt_date_format.replace(/hh:mm.*/, '(?:$&)?') + .replace(/\s/, '\\s?') + .replace(/(-|\/)/g, '[-\/]') + .replace(/YYYY/gi, '(\\d{2,4})') + .replace(/(YY|MM|DD|HH|hh|mm)/g, '(\\d{1,2})') + .replace(/(M|D|H|h|m)/g, '(\\d{1,2})') + .replace(/(tt|TT)/g, '([aApP][mM])'); + re = new RegExp(df); + m = re.exec(str); + if (m != null) { + + // Generate the formats array (convert-table) + var formats = []; + var format_buf = ''; + var format_before_c = ''; + var df_ = opt_date_format; + while (df_ != null && 0 < df_.length) { + var format_c = df_.substring(0, 1); + df_ = df_.substring(1, df_.length); + if (format_before_c != format_c) { + if (/(YYYY|YY|MM|DD|mm|dd|M|D|HH|H|hh|h|m|tt|TT)/.test( + format_buf)) { + formats.push(format_buf); + format_buf = ''; + } else { + format_buf = ''; + } + } + format_buf += format_c; + format_before_c = format_c; + } + if (format_buf !== '' && + /(YYYY|YY|MM|DD|mm|dd|M|D|HH|H|hh|h|m|tt|TT)/.test(format_buf) + ) { + formats.push(format_buf); + } + + // Convert a string (with convert-table) to a date object + var year, month, day, hour, min; + var is_successful = false; + var pm = false; + var H = false; + for (var i = 0; i < formats.length; i++) { + if (m.length < i) { + break; + } + + var f = formats[i]; + var d = m[i + 1]; // Matched part of date + if (f == 'YYYY') { + year = normalizeYear(d); + is_successful = true; + } else if (f == 'YY') { + year = parseInt(d) + 2000; + is_successful = true; + } else if (f == 'MM' || f == 'M') { + month = parseInt(d) - 1; + is_successful = true; + } else if (f == 'DD' || f == 'D') { + day = d; + is_successful = true; + } else if (f == 'hh' || f == 'h') { + hour = (typeof d != 'undefined') ? d : 0; + is_successful = true; + } else if (f == 'HH' || f == 'H') { + hour = (typeof d != 'undefined') ? d : 0; + H = true; + is_successful = true; + } else if (f == 'mm' || f == 'm') { + min = (typeof d != 'undefined') ? d : 0; + is_successful = true; + } else if (f == 'tt' || f == 'TT') { + if (d == 'pm' || d == 'PM') { + pm = true; + } + is_successful = true; + } + } + if (H) { + if (pm) { + if (hour != 12) { + hour = parseInt(hour) + 12; + } + } else if (hour == 12) { + hour = 0; + } + } + date = new Date(year, month, day, hour, min); + + if (is_successful === true && isNaN(date) === false && isNaN(date + .getDate()) === false) { // Parse successful + return date; + } + } + } + + // Parse date & time with common format + re = /^(\d{2,4})[-\/](\d{1,2})[-\/](\d{1,2}) (\d{1,2}):(\d{1,2})$/; + m = re.exec(str); + if (m !== null) { + m[1] = normalizeYear(m[1]); + date = new Date(m[1], m[2] - 1, m[3], m[4], m[5]); + } else { + // Parse for date-only + re = /^(\d{2,4})[-\/](\d{1,2})[-\/](\d{1,2})$/; + m = re.exec(str); + if (m !== null) { + m[1] = normalizeYear(m[1]); + date = new Date(m[1], m[2] - 1, m[3]); + } + } + + if (isNaN(date) === false && isNaN(date.getDate()) === false) { // Parse successful + return date; + } + return false; + }; + var getFormattedDate = function(date, date_format) { + if (date == null) { + date = new Date(); + } + + var y = date.getFullYear(); + var m = date.getMonth() + 1; + var d = date.getDate(); + var hou = date.getHours(); + var min = date.getMinutes(); + + date_format = date_format.replace(/YYYY/gi, y) + .replace(/YY/g, y - 2000) /* century */ + .replace(/MM/g, zpadding(m)) + .replace(/M/g, m) + .replace(/DD/g, zpadding(d)) + .replace(/D/g, d) + .replace(/hh/g, zpadding(hou)) + .replace(/h/g, hou) + .replace(/HH/g, (hou > 12 ? zpadding(hou - 12) : (hou < 1 ? 12 : + zpadding(hou)))) + .replace(/H/g, (hou > 12 ? hou - 12 : (hou < 1 ? 12 : hou))) + .replace(/mm/g, zpadding(min)) + .replace(/m/g, min) + .replace(/tt/g, (hou >= 12 ? "pm" : "am")) + .replace(/TT/g, (hou >= 12 ? "PM" : "AM")); + return date_format; + }; + + var outputToInputObject = function($picker) { + var $inp = getPickersInputObject($picker); + if ($inp == null) { + return; + } + var date = getPickedDate($picker); + var locale = $picker.data("locale"); + var format = getDateFormat($picker.data("dateFormat"), locale, $picker.data( + 'dateOnly'), $picker.data('timeOnly')); + var old = $inp.val(); + $inp.val(getFormattedDate(date, format)); + if (old != $inp.val()) { // only trigger if it actually changed to avoid a nasty loop condition + $inp.trigger("change"); + } + }; + + var getShownDate = function($obj) { + var $picker = getParentPickerObject($obj); + return $picker.data("shownDate"); + }; + + var getPickedDate = function($obj) { + var $picker = getParentPickerObject($obj); + return $picker.data("pickedDate"); + }; + + var zpadding = function(num) { + num = ("0" + num).slice(-2); + return num; + }; + + var draw_date = function($picker, option, date) { + //console.log("draw_date - " + date.toString()); + draw($picker, option, date.getFullYear(), date.getMonth(), date.getDate(), + date.getHours(), date.getMinutes()); + }; + var translate = function(locale, s) { + if (typeof lang[locale][s] !== "undefined") { + return lang[locale][s]; + } + return lang.en[s]; + }; + var draw = function($picker, option, year, month, day, hour, min) { + var date = new Date(); + + if (hour != null) { + date = new Date(year, month, day, hour, min, 0); + } else if (year != null) { + date = new Date(year, month, day); + } else { + date = new Date(); + } + + /* Read options */ + var isTodayButton = $picker.data("todayButton"); + var isCloseButton = $picker.data("closeButton"); + var isScroll = option.isAnim; + /* It same with isAnim */ + if ($picker.data("timelistScroll") === false) { // If disabled by user option. + isScroll = false; + } + + var isAnim = option.isAnim; + if ($picker.data("animation") === false) { // If disabled by user option. + isAnim = false; + } + + var isFutureOnly = $picker.data("futureOnly"); + var minDate = $picker.data("minDate"); + var maxDate = $picker.data("maxDate"); + + var isOutputToInputObject = option.isOutputToInputObject; + var keepPickedDate = option.keepPickedDate; + if (typeof keepPickedDate === "undefined") keepPickedDate = false; + + var minuteInterval = $picker.data("minuteInterval"); + var firstDayOfWeek = $picker.data("firstDayOfWeek"); + + var allowWdays = $picker.data("allowWdays"); + if (allowWdays == null || isObj('Array', allowWdays) === false || + allowWdays.length <= 0) { + allowWdays = null; + } + + var minTime = $picker.data("minTime"); + var maxTime = $picker.data("maxTime"); + + /* Check a specified date */ + var todayDate = new Date(); + + + if (isFutureOnly) { + if ($picker.data("current")) { + todayDate = new Date($picker.data("current")); + } + if (date.getTime() < todayDate.getTime()) { // Already passed + date.setTime(todayDate.getTime()); + } + } + if (allowWdays != null && allowWdays.length <= 6) { + while (true) { + if ($.inArray(date.getDay(), allowWdays) == -1) { // Unallowed wday + // Slide a date + date.setDate(date.getDate() + 1); + } else { + break; + } + } + } + + /* Read locale option */ + var locale = $picker.data("locale"); + if (!lang.hasOwnProperty(locale)) { + locale = 'en'; + } + + /* Calculate dates */ + var firstWday = new Date(date.getFullYear(), date.getMonth(), 1).getDay() - + firstDayOfWeek; + var lastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate(); + var beforeMonthLastDay = new Date(date.getFullYear(), date.getMonth(), 0) + .getDate(); + var dateBeforeMonth = new Date(date.getFullYear(), date.getMonth(), 0); + var dateNextMonth = new Date(date.getFullYear(), date.getMonth() + 2, 0); + var isCurrentYear = todayDate.getFullYear() == date.getFullYear(); + var isCurrentMonth = isCurrentYear && todayDate.getMonth() == date.getMonth(); + var isCurrentDay = isCurrentMonth && todayDate.getDate() == date.getDate(); + var isNextYear = (todayDate.getFullYear() + 1 == date.getFullYear()); + var isNextMonth = (isCurrentYear && todayDate.getMonth() + 1 == date.getMonth()) || + (isNextYear && todayDate.getMonth() === 11 && date.getMonth() === 0); + var isPastMonth = false; + if (date.getFullYear() < todayDate.getFullYear() || (isCurrentYear && + date.getMonth() < todayDate.getMonth())) { + isPastMonth = true; + } + + /* Collect each part */ + var $header = $picker.children('.datepicker_header'); + var $inner = $picker.children('.datepicker_inner_container'); + var $calendar = $picker.children('.datepicker_inner_container').children( + '.datepicker_calendar'); + var $table = $calendar.children('.datepicker_table'); + var $timelist = $picker.children('.datepicker_inner_container').children( + '.datepicker_timelist'); + + /* Grasp a point that will be changed */ + var changePoint = ""; + var oldDate = getPickedDate($picker); + if (oldDate != null) { + if (oldDate.getMonth() != date.getMonth() || oldDate.getDate() != + date.getDate()) { + changePoint = "calendar"; + } else if (oldDate.getHours() != date.getHours() || oldDate.getMinutes() != + date.getMinutes()) { + if (date.getMinutes() === 0 || date.getMinutes() % minuteInterval === + 0) { + changePoint = "timelist"; + } + } + } + + /* Save newly date to Picker data */ + if (keepPickedDate === false) { + $($picker).data("pickedDate", date); + } + $($picker).data("shownDate", date); + + /* Fade-out animation */ + if (isAnim === true) { + if (changePoint == "calendar") { + $calendar.stop().queue([]); + $calendar.fadeTo("fast", 0.8); + } else if (changePoint == "timelist") { + $timelist.stop().queue([]); + $timelist.fadeTo("fast", 0.8); + } + } + /* Remind timelist scroll state */ + var drawBefore_timeList_scrollTop = $timelist.scrollTop(); + + /* New timelist */ + var timelist_activeTimeCell_offsetTop = -1; + + /* Header ----- */ + $header.children().remove(); + + var cDate = new Date(date.getTime()); + cDate.setMinutes(59); + cDate.setHours(23); + cDate.setSeconds(59); + cDate.setDate(0); // last day of previous month + + var $link_before_month = null; + if ((!isFutureOnly || !isCurrentMonth) && ((minDate == null) || (minDate < + cDate.getTime()))) { + $link_before_month = $(''); + $link_before_month.text('<'); + $link_before_month.prop('alt', translate(locale, 'prevMonth')); + $link_before_month.prop('title', translate(locale, 'prevMonth')); + $link_before_month.prop('class', "before-month"); + $link_before_month.click(function() { + beforeMonth($picker); + }); + $picker.data('stateAllowBeforeMonth', true); + } else { + $picker.data('stateAllowBeforeMonth', false); + } + + cDate.setMinutes(0); + cDate.setHours(0); + cDate.setSeconds(0); + cDate.setDate(1); // First day of next month + cDate.setMonth(date.getMonth() + 1); + + var $now_month = $(''); + $now_month.text(date.getFullYear() + " " + translate(locale, 'sep') + " " + + translate(locale, 'months')[date.getMonth()]); + + var $link_next_month = null; + if ((maxDate == null) || (maxDate > cDate.getTime())) { + $link_next_month = $(''); + $link_next_month.text('>'); + $link_next_month.prop('alt', translate(locale, 'nextMonth')); + $link_next_month.prop('title', translate(locale, 'nextMonth')); + $link_next_month.prop('class', "next-month"); + $link_next_month.click(function() { + nextMonth($picker); + }); + } + + if (isTodayButton) { + var $link_today = $('
'); + $link_today.addClass('icon-home'); + $link_today.prop('alt', translate(locale, 'today')); + $link_today.prop('title', translate(locale, 'today')); + $link_today.click(function() { + setToNow($picker); + }); + $header.append($link_today); + } + if (isCloseButton) { + var $link_close = $('
'); + $link_close.addClass('icon-close'); + $link_close.prop('alt', translate(locale, 'close')); + $link_close.prop('title', translate(locale, 'close')); + $link_close.click(function() { + $picker.hide(); + }); + $header.append($link_close); + } + + if ($link_before_month != null) { + $header.append($link_before_month); + } + $header.append($now_month); + if ($link_next_month != null) { + $header.append($link_next_month); + } + + /* Calendar > Table ----- */ + $table.children().remove(); + var $tr = $(''); + $table.append($tr); + + /* Output wday cells */ + var firstDayDiff = 7 + firstDayOfWeek; + var daysOfWeek = translate(locale, 'days'); + var $td; + for (var i = 0; i < 7; i++) { + $td = $(''); + $td.text(daysOfWeek[((i + firstDayDiff) % 7)]); + $tr.append($td); + } + + /* Output day cells */ + var cellNum = Math.ceil((firstWday + lastDay) / 7) * 7; + i = 0; + if (firstWday < 0) { + i = -7; + } + var realDayObj = new Date(date.getTime()); + realDayObj.setHours(0); + realDayObj.setMinutes(0); + realDayObj.setSeconds(0); + var pickedDate = getPickedDate($picker); + var shownDate = getShownDate($picker); + var $tbody = $(''); + $table.append($tbody).children("tbody"); + for (var zz = 0; i < cellNum; i++) { + var realDay = i + 1 - firstWday; + + var isPast = isPastMonth || + (isCurrentMonth && realDay < todayDate.getDate()) || + (isNextMonth && firstWday > i && (beforeMonthLastDay + realDay) < + todayDate.getDate()); + + if (i % 7 === 0) { + $tr = $(''); + $tbody.append($tr); + } + + $td = $(''); + $td.data("day", realDay); + + $tr.append($td); + + if (firstWday > i) { /* Before months day */ + $td.text(beforeMonthLastDay + realDay); + $td.addClass('day_another_month'); + $td.data("dateStr", dateBeforeMonth.getFullYear() + "/" + ( + dateBeforeMonth.getMonth() + 1) + "/" + ( + beforeMonthLastDay + realDay)); + realDayObj.setDate(beforeMonthLastDay + realDay); + realDayObj.setMonth(dateBeforeMonth.getMonth()); + realDayObj.setYear(dateBeforeMonth.getFullYear()); + } else if (i < firstWday + lastDay) { /* Now months day */ + $td.text(realDay); + $td.data("dateStr", (date.getFullYear()) + "/" + (date.getMonth() + + 1) + "/" + realDay); + realDayObj.setDate(realDay); + realDayObj.setMonth(date.getMonth()); + realDayObj.setYear(date.getFullYear()); + } else { /* Next months day */ + $td.text(realDay - lastDay); + $td.addClass('day_another_month'); + $td.data("dateStr", dateNextMonth.getFullYear() + "/" + ( + dateNextMonth.getMonth() + 1) + "/" + (realDay - + lastDay)); + realDayObj.setDate(realDay - lastDay); + realDayObj.setMonth(dateNextMonth.getMonth()); + realDayObj.setYear(dateNextMonth.getFullYear()); + } + + /* Check a wday */ + var wday = ((i + firstDayDiff) % 7); + if (allowWdays != null) { + if ($.inArray(wday, allowWdays) == -1) { + $td.addClass('day_in_unallowed'); + continue; // Skip + } + } else if (wday === 0) { /* Sunday */ + $td.addClass('wday_sun'); + } else if (wday == 6) { /* Saturday */ + $td.addClass('wday_sat'); + } + + /* Set a special mark class */ + if (shownDate.getFullYear() == pickedDate.getFullYear() && shownDate.getMonth() == + pickedDate.getMonth() && realDay == pickedDate.getDate()) { /* selected day */ + $td.addClass('active'); + } + + if (isCurrentMonth && realDay == todayDate.getDate()) { /* today */ + $td.addClass('today'); + } + + var realDayObjMN = new Date(realDayObj.getTime()); + realDayObjMN.setHours(23); + realDayObjMN.setMinutes(59); + realDayObjMN.setSeconds(59); + + if ( + // compare to 23:59:59 on the current day (if MIN is 1pm, then we still need to show this day + ((minDate != null) && (minDate > realDayObjMN.getTime())) || (( + maxDate != null) && (maxDate < realDayObj.getTime())) // compare to 00:00:00 + ) { // Out of range day + $td.addClass('out_of_range'); + } else if (isFutureOnly && isPast) { // Past day + $td.addClass('day_in_past'); + } else { + /* Set event-handler to day cell */ + $td.click(function(ev) { + ev.stopPropagation(); + if ($(this).hasClass('hover')) { + $(this).removeClass('hover'); + } + $(this).addClass('active'); + + var $picker = getParentPickerObject($(this)); + var targetDate = new Date($(this).data("dateStr")); + var selectedDate = getPickedDate($picker); + draw($picker, { + "isAnim": false, + "isOutputToInputObject": true + }, targetDate.getFullYear(), targetDate.getMonth(), + targetDate.getDate(), selectedDate.getHours(), + selectedDate.getMinutes()); + + // Generate the handler of a picker + var $input = $(this); + var handler = new PickerHandler($picker, $input); + + // Call a event-hanlder for onSelect + var func = $picker.data('onSelect'); + if (func != null) { + func(handler, targetDate); + } + + if ($picker.data("dateOnly") === true && $picker.data( + "isInline") === false && $picker.data( + "closeOnSelected")) { + // Close a picker + ActivePickerId = -1; + $picker.hide(); + } + }); + + $td.hover(function() { + if (!$(this).hasClass('active')) { + $(this).addClass('hover'); + } + }, function() { + if ($(this).hasClass('hover')) { + $(this).removeClass('hover'); + } + }); + } + + /* ---- */ + } + + if ($picker.data('timeOnly') === true) { + $calendar.css("display", "none"); + $now_month.css("display", "none"); + if ($link_next_month != null) + $link_next_month.css("display", "none"); + if ($link_before_month != null) + $link_before_month.css("display", "none"); + } + + if ($picker.data("dateOnly") === true) { + /* dateOnly mode */ + $timelist.css("display", "none"); + } else { + /* Timelist ----- */ + $timelist.children().remove(); + + /* Set height to Timelist (Calendar innerHeight - Calendar padding) */ + if ($calendar.innerHeight() > 0) { + $timelist.css("height", $calendar.innerHeight() - 10 + 'px'); + } + + realDayObj = new Date(date.getTime()); + $timelist.css("height", Math.max($calendar.innerHeight() - 10, 200) + + 'px'); + + /* Output time cells */ + var hour_ = minTime[0]; + var min_ = minTime[1]; + + while (hour_ * 100 + min_ < maxTime[0] * 100 + maxTime[1]) { + + var $o = $('
'); + var is_past_time = hour_ < todayDate.getHours() || (hour_ == + todayDate.getHours() && min_ < todayDate.getMinutes()); + var is_past = isCurrentDay && is_past_time; + + $o.addClass('timelist_item'); + var oText = ""; + if ($picker.data("amPmInTimeList")) { + oText = /*zpadding*/ (hour_ > 12 ? hour_ - 12 : (hour_ < 1 ? + 12 : hour_)); + oText += ":" + zpadding(min_); + oText += (hour_ >= 12 ? "PM" : "AM"); + } else { + oText = zpadding(hour_) + ":" + zpadding(min_); + } + $o.text(oText); + $o.data("hour", hour_); + $o.data("min", min_); + + $timelist.append($o); + + realDayObj.setHours(hour_); + realDayObj.setMinutes(min_); + + if ( + ((minDate != null) && (minDate > realDayObj.getTime())) || (( + maxDate != null) && (maxDate < realDayObj.getTime())) + ) { // Out of range cell + $o.addClass('out_of_range'); + } else if (isFutureOnly && is_past) { // Past cell + $o.addClass('time_in_past'); + } else { // Normal cell + /* Set event handler to time cell */ + $o.click(function(ev) { + ev.stopPropagation(); + if ($(this).hasClass('hover')) { + $(this).removeClass('hover'); + } + $(this).addClass('active'); + + var $picker = getParentPickerObject($(this)); + var date = getPickedDate($picker); + var hour = $(this).data("hour"); + var min = $(this).data("min"); + draw($picker, { + "isAnim": false, + "isOutputToInputObject": true + }, date.getFullYear(), date.getMonth(), + date.getDate(), hour, min); + + if ($picker.data("isInline") === false && $picker + .data("closeOnSelected")) { + // Close a picker + ActivePickerId = -1; + $picker.hide(); + } + }); + + $o.hover(function() { + if (!$(this).hasClass('active')) { + $(this).addClass('hover'); + } + }, function() { + if ($(this).hasClass('hover')) { + $(this).removeClass('hover'); + } + }); + } + + if (hour_ == date.getHours() && min_ == date.getMinutes()) { /* selected time */ + $o.addClass('active'); + timelist_activeTimeCell_offsetTop = $o.offset().top; + } + + min_ += minuteInterval; + if (min_ >= 60) { + min_ = min_ - 60; + hour_++; + } + + } + + /* Scroll the timelist */ + if (isScroll === true) { + /* Scroll to new active time-cell position */ + $timelist.scrollTop(timelist_activeTimeCell_offsetTop - $timelist + .offset().top); + } else { + /* Scroll to position that before redraw. */ + $timelist.scrollTop(drawBefore_timeList_scrollTop); + } + } + + /* Fade-in animation */ + if (isAnim === true) { + if (changePoint == 'calendar' && $picker.data('timeOnly') === false) { + $calendar.fadeTo('fast', 1.0); + } else if (changePoint == 'timelist' && $picker.data('dateOnly') === + false) { + $timelist.fadeTo('fast', 1.0); + } + } + + /* Output to InputForm */ + if (isOutputToInputObject === true) { + outputToInputObject($picker); + } + }; + + /* Check for object type */ + var isObj = function(type, obj) { + /* http://qiita.com/Layzie/items/465e715dae14e2f601de */ + var clas = Object.prototype.toString.call(obj).slice(8, -1); + return obj !== undefined && obj !== null && clas === type; + }; + + var init = function($obj, opt) { + /* Container */ + var $picker = $('
'); + + $picker.destroy = function() { + window.alert('destroy!'); + }; + + $picker.addClass('datepicker'); + $obj.append($picker); + + /* Set current date */ + if (!opt.current) { + opt.current = new Date(); + } else { + var format = getDateFormat(opt.dateFormat, opt.locale, opt.dateOnly, + opt.timeOnly); + var date = parseDate(opt.current, format); + if (date) { + opt.current = date; + } else { + opt.current = new Date(); + } + } + + /* Set options data to container object */ + if (opt.inputObjectId != null) $picker.data("inputObjectId", opt.inputObjectId); + if (opt.timeOnly) opt.todayButton = false; + $picker.data("timeOnly", opt.timeOnly); + $picker.data("dateOnly", opt.dateOnly); + $picker.data("pickerId", PickerObjects.length); + $picker.data("dateFormat", opt.dateFormat); + $picker.data("locale", opt.locale); + $picker.data("firstDayOfWeek", opt.firstDayOfWeek); + $picker.data("animation", opt.animation); + $picker.data("closeOnSelected", opt.closeOnSelected); + $picker.data("timelistScroll", opt.timelistScroll); + $picker.data("calendarMouseScroll", opt.calendarMouseScroll); + $picker.data("todayButton", opt.todayButton); + $picker.data("closeButton", opt.closeButton); + $picker.data('futureOnly', opt.futureOnly); + $picker.data('onShow', opt.onShow); + $picker.data('onHide', opt.onHide); + $picker.data('onSelect', opt.onSelect); + $picker.data('onInit', opt.onInit); + $picker.data('allowWdays', opt.allowWdays); + $picker.data('current', opt.current); + + if (opt.amPmInTimeList === true) { + $picker.data('amPmInTimeList', true); + } else { + $picker.data('amPmInTimeList', false); + } + + var minDate = Date.parse(opt.minDate); + if (isNaN(minDate)) { // invalid date? + $picker.data('minDate', null); // set to null + } else { + $picker.data('minDate', minDate); + } + + var maxDate = Date.parse(opt.maxDate); + if (isNaN(maxDate)) { // invalid date? + $picker.data('maxDate', null); // set to null + } else { + $picker.data('maxDate', maxDate); + } + $picker.data("state", 0); + + if (5 <= opt.minuteInterval && opt.minuteInterval <= 30) { + $picker.data("minuteInterval", opt.minuteInterval); + } else { + $picker.data("minuteInterval", 30); + } + opt.minTime = opt.minTime.split(':'); + opt.maxTime = opt.maxTime.split(':'); + + if (!((opt.minTime[0] >= 0) && (opt.minTime[0] < 24))) { + opt.minTime[0] = "00"; + } + if (!((opt.maxTime[0] >= 0) && (opt.maxTime[0] < 24))) { + opt.maxTime[0] = "23"; + } + if (!((opt.minTime[1] >= 0) && (opt.minTime[1] < 60))) { + opt.minTime[1] = "00"; + } + if (!((opt.maxTime[1] >= 0) && (opt.maxTime[1] < 24))) { + opt.maxTime[1] = "59"; + } + opt.minTime[0] = parseInt(opt.minTime[0], 10); // parse as decimal number + opt.minTime[1] = parseInt(opt.minTime[1], 10); + opt.maxTime[0] = parseInt(opt.maxTime[0], 10); + opt.maxTime[1] = parseInt(opt.maxTime[1], 10); + $picker.data('minTime', opt.minTime); + $picker.data('maxTime', opt.maxTime); + + /* Header */ + var $header = $('
'); + $header.addClass('datepicker_header'); + $picker.append($header); + /* InnerContainer*/ + var $inner = $('
'); + $inner.addClass('datepicker_inner_container'); + $picker.append($inner); + /* Calendar */ + var $calendar = $('
'); + $calendar.addClass('datepicker_calendar'); + var $table = $(''); + $table.addClass('datepicker_table'); + $calendar.append($table); + $inner.append($calendar); + /* Timelist */ + var $timelist = $('
'); + $timelist.addClass('datepicker_timelist'); + $inner.append($timelist); + + /* Set event-handler to calendar */ + if (opt.calendarMouseScroll) { + if (window.sidebar) { // Mozilla Firefox + $calendar.on('DOMMouseScroll', function(e) { // Change a month with mouse wheel scroll for Fx + var $picker = getParentPickerObject($(this)); + + // up,left [delta < 0] down,right [delta > 0] + var delta = e.originalEvent.detail; + /* + // this code need to be commented - it's seems to be unnecessary + // normalization (/3) is not needed as we move one month back or forth + if(e.originalEvent.axis !== undefined && e.originalEvent.axis == e.originalEvent.HORIZONTAL_AXIS){ + e.deltaX = delta; + e.deltaY = 0; + } else { + e.deltaX = 0; + e.deltaY = delta; + } + e.deltaX /= 3; + e.deltaY /= 3; + */ + if (delta > 0) { + nextMonth($picker); + } else { + beforeMonth($picker); + } + return false; + }); + } else { // Other browsers + $calendar.on('mousewheel', function(e) { // Change a month with mouse wheel scroll + var $picker = getParentPickerObject($(this)); + // up [delta > 0] down [delta < 0] + if (e.originalEvent.wheelDelta / 120 > 0) { + beforeMonth($picker); + } else { + nextMonth($picker); + } + return false; + }); + } + } + + PickerObjects.push($picker); + + draw_date($picker, { + "isAnim": true, + "isOutputToInputObject": opt.autodateOnStart + }, opt.current); + }; + + var getDefaults = function() { + return { + "current": null, + "dateFormat": "default", + "locale": "en", + "animation": true, + "minuteInterval": 30, + "firstDayOfWeek": 0, + "closeOnSelected": false, + "timelistScroll": true, + "calendarMouseScroll": true, + "todayButton": true, + "closeButton": true, + "dateOnly": false, + "timeOnly": false, + "futureOnly": false, + "minDate": null, + "maxDate": null, + "autodateOnStart": true, + "minTime": "00:00", + "maxTime": "23:59", + "onShow": null, + "onHide": null, + "onSelect": null, + "allowWdays": null, + "amPmInTimeList": false, + "externalLocale": null + }; + }; + + /** + * Initialize dtpicker + */ + $.fn.dtpicker = function(config) { + var date = new Date(); + var defaults = getDefaults(); + + if (typeof config === "undefined" || config.closeButton !== true) { + defaults.closeButton = false; + } + + defaults.inputObjectId = undefined; + var options = $.extend(defaults, config); + + return this.each(function(i) { + init($(this), options); + }); + }; + + /** + * Initialize dtpicker, append to Text input field + * */ + $.fn.appendDtpicker = function(config) { + var date = new Date(); + var defaults = getDefaults(); + + if (typeof config !== "undefined" && config.inline === true && config.closeButton !== + true) { + defaults.closeButton = false; + } + + defaults.inline = false; + var options = $.extend(defaults, config); + + if (options.externalLocale != null) { + lang = $.extend(lang, options.externalLocale); + } + + return this.each(function(i) { + /* Checking exist a picker */ + var input = this; + if (0 < $(PickerObjects[$(input).data('pickerId')]).length) { + console.log("dtpicker - Already exist appended picker"); + return; + } + + /* Add input-field with inputsObjects array */ + var inputObjectId = InputObjects.length; + InputObjects.push(input); + + options.inputObjectId = inputObjectId; + + /* Current date */ + var date, strDate, strTime; + if ($(input).val() != null && $(input).val() !== "") { + options.current = $(input).val(); + } + + /* Make parent-div for picker */ + var $d = $('
'); + if (options.inline) { // Inline mode + $d.insertAfter(input); + } else { // Float mode + $d.css("position", "absolute"); + $('body').append($d); + } + + /* Initialize picker */ + + var pickerId = PickerObjects.length; + + var $picker_parent = $($d).dtpicker(options); // call dtpicker() method + + var $picker = $picker_parent.children('.datepicker'); + + /* Link input-field with picker*/ + $(input).data('pickerId', pickerId); + + /* Set event handler to input-field */ + + $(input).keyup(function() { + var $input = $(this); + var $picker = $(PickerObjects[$input.data( + 'pickerId')]); + if ($input.val() != null && ( + $input.data('beforeVal') == null || + ($input.data('beforeVal') != null && + $input.data('beforeVal') != $input.val() + ))) { /* beforeValue == null || beforeValue != nowValue */ + var format = getDateFormat($picker.data( + 'dateFormat'), $picker.data( + 'locale'), $picker.data( + 'dateOnly'), $picker.data( + 'timeOnly')); + var date = parseDate($input.val(), format); + //console.log("dtpicker - inputKeyup - format: " + format + ", date: " + $input.val() + " -> " + date); + if (date) { + draw_date($picker, { + "isAnim": true, + "isOutputToInputObject": false + }, date); + } + } + $input.data('beforeVal', $input.val()); + }); + + $(input).change(function() { + $(this).trigger('keyup'); + }); + + var handler = new PickerHandler($picker, $(input)); + + if (options.inline === true) { + /* inline mode */ + $picker.data('isInline', true); + } else { + /* float mode */ + $picker.data('isInline', false); + $picker_parent.css({ + "zIndex": 100 + }); + $picker.css("width", "auto"); + + /* Hide this picker */ + $picker.hide(); + + /* Set onClick event handler for input-field */ + $(input).on('click, focus', function(ev) { + ev.stopPropagation(); + var $input = $(this); + var $picker = $(PickerObjects[$input.data( + 'pickerId')]); + + // Generate the handler of a picker + var handler = new PickerHandler($picker, + $input); + // Get the display state of a picker + var is_showed = handler.isShow(); + if (!is_showed) { + // Show a picker + handler.show(); + + // Call a event-hanlder + var func = $picker.data('onShow'); + if (func != null) { + console.log( + "dtpicker- Call the onShow handler" + ); + func(handler); + } + } + }); + + // Set an event handler for resizing of a window + (function(handler) { + $(window).resize(function() { + handler._relocate(); + }); + $(window).scroll(function() { + handler._relocate(); + }); + })(handler); + } + + // Set an event handler for removing of an input-field + $(input).on('destroyed', function() { + var $input = $(this); + var $picker = $(PickerObjects[$input.data( + 'pickerId')]); + // Generate the handler of a picker + var handler = new PickerHandler($picker, $input); + // Destroy a picker + handler.destroy(); + }); + + // Call a event-handler + var func = $picker.data('onInit'); + if (func != null) { + console.log("dtpicker- Call the onInit handler"); + func(handler); + } + }); + }; + + /** + * Handle a appended dtpicker + * */ + var methods = { + show: function() { + var $input = $(this); + var $picker = $(PickerObjects[$input.data('pickerId')]); + if ($picker != null) { + var handler = new PickerHandler($picker, $input); + // Show a picker + handler.show(); + } + }, + hide: function() { + var $input = $(this); + var $picker = $(PickerObjects[$input.data('pickerId')]); + if ($picker != null) { + var handler = new PickerHandler($picker, $input); + // Hide a picker + handler.hide(); + } + }, + setDate: function(date) { + var $input = $(this); + var $picker = $(PickerObjects[$input.data('pickerId')]); + if ($picker != null) { + var handler = new PickerHandler($picker, $input); + // Set a date + handler.setDate(date); + } + }, + setMinDate: function(date) { + var $input = $(this); + var $picker = $(PickerObjects[$input.data('pickerId')]); + if ($picker != null) { + var handler = new PickerHandler($picker, $input); + // Set a min date + handler.setMinDate(date); + } + }, + setMaxDate: function(date) { + var $input = $(this); + var $picker = $(PickerObjects[$input.data('pickerId')]); + if ($picker != null) { + var handler = new PickerHandler($picker, $input); + // Set a max date + handler.setMaxDate(date); + } + }, + getDate: function() { + var $input = $(this); + var $picker = $(PickerObjects[$input.data('pickerId')]); + if ($picker != null) { + var handler = new PickerHandler($picker, $input); + // Get a date + return handler.getDate(); + } + }, + destroy: function() { + var $input = $(this); + var $picker = $(PickerObjects[$input.data('pickerId')]); + if ($picker != null) { + var handler = new PickerHandler($picker, $input); + // Destroy a picker + handler.destroy(); + } + } + }; + + $.fn.handleDtpicker = function(method) { + if (methods[method]) { + return methods[method].apply(this, Array.prototype.slice.call( + arguments, 1)); + } else if (typeof method === 'object' || !method) { + return methods.init.apply(this, arguments); + } else { + $.error('Method ' + method + + ' does not exist on jQuery.handleDtpicker'); + } + }; + + if (!window.console) { // Not available a console on this environment. + window.console = {}; + window.console.log = function() {}; + } + + /* Define a special event for catch when destroy of an input-field. */ + $.event.special.destroyed = { + remove: function(o) { + if (o.handler) { + o.handler.apply(this, arguments); + } + } + }; + + /* Set event handler to Body element, for hide a floated-picker */ + $(function() { + $('body').click(function(e) { + for (var i = 0; i < PickerObjects.length; i++) { + var $picker = $(PickerObjects[i]); + if ($picker.data('inputObjectId') != null && !$picker + .data('isInline') && $picker.css('display') != + 'none' && !$(e.target).is('.datepicker') && !$(e.target) + .is('.datepicker_header') && !$(e.target).is( + '.next-month') && !$(e.target).is( + '.before-month') && !$(e.target).is( + '.icon-home')) { + /* if append input-field && float picker */ + + // Check overlapping of cursor and picker + if ($picker.hasClass('hover')) continue; + + // Check overlapping of cursor and input-field + var $input = $(InputObjects[$picker.data( + 'inputObjectId')]); + if ($input.is(':focus')) continue; + + // Hide a picker + var handler = new PickerHandler($picker, $input); + handler.hide(); + + // Call a event-hanlder + var func = $picker.data('onHide'); + if (func != null) { + console.log( + 'dtpicker- Call the onHide handler'); + func(handler); + } + } + } + }); + }); + +})(jQuery); diff --git a/carpool/templates/add.html b/carpool/templates/add.html index b76744c..b8f7178 100755 --- a/carpool/templates/add.html +++ b/carpool/templates/add.html @@ -272,6 +272,15 @@

Add new ride

+ + + + + diff --git a/carpool/templates/index.html b/carpool/templates/index.html index f21a11f..2935602 100755 --- a/carpool/templates/index.html +++ b/carpool/templates/index.html @@ -35,6 +35,22 @@ + + + + + + + + + diff --git a/carpool/views.py b/carpool/views.py index 6326a23..9651308 100644 --- a/carpool/views.py +++ b/carpool/views.py @@ -85,7 +85,7 @@ def dashboard(request): delform += [DeleteForm(initial={'pk': ride.pk})] if request.method == 'POST' and 'filter' in request.POST: filter = filterForm(request.POST) - indate = request.POST['date_year'] + '-' + request.POST['date_month'] + '-' + request.POST['date_day'] + indate = request.POST['date'] CHOICES = {'1': "Mandi", '2': "South Campus", '3': "North Campus", } if 'free' in request.POST: allrides = Pool.objects.filter(source=CHOICES[request.POST['source']], dest=CHOICES[request.POST['dest']], tot__gte=request.POST['tot'], paid=False, dateTime__date = indate, )