From 1d555cd0319c40158a1d967cde85f867c4885ff5 Mon Sep 17 00:00:00 2001 From: Ali Asadi Date: Sat, 1 Aug 2026 15:34:01 +0330 Subject: [PATCH] update admin panel calendar --- apps/wallet/admin.py | 8 +++-- apps/wallet/admin_filters.py | 46 ++++++++++++++++++++++++ log/accounts.log | 50 ++++++++++++++++++++++++++ log/errors.log | 0 static/admin/css/django_jalali.min.css | 2 ++ static/admin/js/django_jalali.min.js | 20 ++++++++--- 6 files changed, 119 insertions(+), 7 deletions(-) create mode 100644 apps/wallet/admin_filters.py create mode 100644 log/accounts.log create mode 100644 log/errors.log create mode 100755 static/admin/css/django_jalali.min.css diff --git a/apps/wallet/admin.py b/apps/wallet/admin.py index 1d73557..50ec2f5 100755 --- a/apps/wallet/admin.py +++ b/apps/wallet/admin.py @@ -5,7 +5,7 @@ import io import xlsxwriter import jdatetime from django.utils import timezone -from rangefilter.filters import DateTimeRangeFilter +from .admin_filters import JalaliDateTimeRangeFilter # from utils.accounts_client import get_user_detailed_info @admin.action(description="export excel") @@ -94,9 +94,13 @@ def export_accounts_as_excel(modeladmin, request, queryset): class TransactionAdmin(admin.ModelAdmin): list_display = ['uuid', 'application', 'splited_amount', 'jalali_datetime', 'payer', 'payer_type', 'payee', 'payee_type', 'state', 'amount', 'created_at', 'updated_at'] search_fields = ['uuid', 'created_at', 'updated_at', 'payer_account__owner_uuid', 'payee_account__owner_uuid', 'application__uuid'] - list_filter = ['application', 'state', ('created_at', DateTimeRangeFilter), ('updated_at', DateTimeRangeFilter),] + list_filter = ['application', 'state', ('created_at', JalaliDateTimeRangeFilter), ('updated_at', JalaliDateTimeRangeFilter),] actions = [export_excel] + class Media: + css = {'all': ('admin/css/django_jalali.min.css',)} + js = ('admin/js/django_jalali.min.js',) + class AccountAdmin(admin.ModelAdmin): list_display = ['uuid', 'owner_uuid', 'wallet', 'owner_type', 'balance', 'get_name'] search_fields = ['uuid', 'owner_uuid'] diff --git a/apps/wallet/admin_filters.py b/apps/wallet/admin_filters.py new file mode 100644 index 0000000..3da0686 --- /dev/null +++ b/apps/wallet/admin_filters.py @@ -0,0 +1,46 @@ +from collections import OrderedDict + +from django.contrib.admin.widgets import AdminSplitDateTime +from django.utils.translation import gettext_lazy as _ +from rangefilter.filters import DateTimeRangeFilter + +from jalali_date.fields import SplitJalaliDateTimeField +from jalali_date.widgets import AdminSplitJalaliDateTime as _AdminSplitJalaliDateTime + + +class AdminSplitJalaliDateTime(_AdminSplitJalaliDateTime): + # jalali_date's own template lives under the (unused, see below) 'jalali_date' + # app, which we deliberately don't register in INSTALLED_APPS: its + # templatetags module imports the stdlib `distutils`, removed in Python 3.12+, + # and Django auto-imports every installed app's templatetags at startup. + # Django's stock split-datetime template renders subwidgets generically, so + # it works fine here without needing that app registered. + template_name = AdminSplitDateTime.template_name + + +class JalaliDateTimeRangeFilter(DateTimeRangeFilter): + def _get_form_fields(self): + return OrderedDict( + ( + ( + self.lookup_kwarg_gte, + SplitJalaliDateTimeField( + label='', + widget=AdminSplitJalaliDateTime(attrs={'placeholder': _('From date')}), + localize=True, + required=False, + initial=self.default_gte, + ), + ), + ( + self.lookup_kwarg_lte, + SplitJalaliDateTimeField( + label='', + widget=AdminSplitJalaliDateTime(attrs={'placeholder': _('To date')}), + localize=True, + required=False, + initial=self.default_lte, + ), + ), + ) + ) diff --git a/log/accounts.log b/log/accounts.log new file mode 100644 index 0000000..c13f7fb --- /dev/null +++ b/log/accounts.log @@ -0,0 +1,50 @@ +2026-08-01 15:27:52,276 [INFO] django.server log 98318 6145355776 "GET /admin/login/ HTTP/1.1" 200 4068 +2026-08-01 15:28:16,343 [INFO] django.server log 98318 6145355776 "GET /admin/login/ HTTP/1.1" 200 4068 +2026-08-01 15:28:16,620 [INFO] django.server log 98318 6145355776 "POST /admin/login/ HTTP/1.1" 302 0 +2026-08-01 15:28:16,695 [INFO] django.server log 98318 6145355776 "GET /admin/wallet/transaction/ HTTP/1.1" 200 30332 +2026-08-01 15:29:03,893 [INFO] django.server log 98318 6162182144 "GET /admin/login/ HTTP/1.1" 200 4068 +2026-08-01 15:29:03,994 [INFO] django.server log 98318 6145355776 "GET /static/admin/css/login.css HTTP/1.1" 200 958 +2026-08-01 15:29:03,995 [INFO] django.server log 98318 6179008512 "GET /static/admin/css/dark_mode.css HTTP/1.1" 200 2682 +2026-08-01 15:29:03,995 [INFO] django.server log 98318 6195834880 "GET /static/admin/css/nav_sidebar.css HTTP/1.1" 200 2810 +2026-08-01 15:29:03,997 [INFO] django.server log 98318 6229487616 "GET /static/admin/js/theme.js HTTP/1.1" 200 1943 +2026-08-01 15:29:03,997 [INFO] django.server log 98318 6212661248 "GET /static/admin/css/responsive.css HTTP/1.1" 200 17905 +2026-08-01 15:29:03,997 [INFO] django.server log 98318 6162182144 "GET /static/admin/css/base.css HTTP/1.1" 200 21544 +2026-08-01 15:29:03,998 [INFO] django.server log 98318 6229487616 "GET /static/admin/js/nav_sidebar.js HTTP/1.1" 200 3063 +2026-08-01 15:29:04,565 [WARNING] django.server log 98318 6229487616 "GET /favicon.ico HTTP/1.1" 404 3758 +2026-08-01 15:32:02,114 [INFO] django.server log 98318 6145355776 "GET /admin/ HTTP/1.1" 302 0 +2026-08-01 15:32:02,125 [INFO] django.server log 98318 6145355776 "GET /admin/login/?next=/admin/ HTTP/1.1" 200 4081 +2026-08-01 15:32:02,263 [INFO] django.server log 98318 6162182144 "GET /static/admin/css/dark_mode.css HTTP/1.1" 200 2682 +2026-08-01 15:32:02,266 [INFO] django.server log 98318 6179008512 "GET /static/admin/css/nav_sidebar.css HTTP/1.1" 200 2810 +2026-08-01 15:32:02,266 [INFO] django.server log 98318 6145355776 "GET /static/admin/css/base.css HTTP/1.1" 200 21544 +2026-08-01 15:32:02,267 [INFO] django.server log 98318 6212661248 "GET /static/admin/js/theme.js HTTP/1.1" 200 1943 +2026-08-01 15:32:02,267 [INFO] django.server log 98318 6195834880 "GET /static/admin/css/login.css HTTP/1.1" 200 958 +2026-08-01 15:32:02,268 [INFO] django.server log 98318 6229487616 "GET /static/admin/css/responsive.css HTTP/1.1" 200 17905 +2026-08-01 15:32:02,276 [INFO] django.server log 98318 6229487616 "GET /static/admin/js/nav_sidebar.js HTTP/1.1" 200 3063 +2026-08-01 15:32:02,403 [WARNING] django.server log 98318 6229487616 "GET /favicon.ico HTTP/1.1" 404 3758 +2026-08-01 15:32:17,288 [INFO] django.server log 98318 6229487616 "POST /admin/login/?next=/admin/ HTTP/1.1" 302 0 +2026-08-01 15:32:17,351 [INFO] django.server log 98318 6229487616 "GET /admin/ HTTP/1.1" 200 13562 +2026-08-01 15:32:17,384 [INFO] django.server log 98318 6229487616 "GET /static/admin/css/dashboard.css HTTP/1.1" 200 441 +2026-08-01 15:32:17,389 [INFO] django.server log 98318 6195834880 "GET /static/admin/img/icon-changelink.svg HTTP/1.1" 200 380 +2026-08-01 15:32:17,389 [INFO] django.server log 98318 6229487616 "GET /static/admin/img/icon-addlink.svg HTTP/1.1" 200 331 +2026-08-01 15:32:22,629 [INFO] django.server log 98318 6229487616 "GET /admin/wallet/transaction/ HTTP/1.1" 200 30332 +2026-08-01 15:32:22,649 [INFO] django.server log 98318 6162182144 "GET /static/admin/js/jquery.init.js HTTP/1.1" 200 347 +2026-08-01 15:32:22,649 [INFO] django.server log 98318 6229487616 "GET /static/admin/css/changelists.css HTTP/1.1" 200 6811 +2026-08-01 15:32:22,649 [INFO] django.server log 98318 6179008512 "GET /static/admin/css/django_jalali.min.css HTTP/1.1" 200 8077 +2026-08-01 15:32:22,650 [INFO] django.server log 98318 6212661248 "GET /static/admin/js/django_jalali.min.js HTTP/1.1" 200 19826 +2026-08-01 15:32:22,657 [INFO] django.server log 98318 6212661248 "GET /static/admin/js/actions.js HTTP/1.1" 200 8067 +2026-08-01 15:32:22,658 [INFO] django.server log 98318 6229487616 "GET /static/admin/css/widgets.css HTTP/1.1" 200 11800 +2026-08-01 15:32:22,658 [INFO] django.server log 98318 6162182144 "GET /static/admin/js/core.js HTTP/1.1" 200 6208 +2026-08-01 15:32:22,660 [INFO] django.server log 98318 6179008512 "GET /static/admin/js/admin/RelatedObjectLookups.js HTTP/1.1" 200 9042 +2026-08-01 15:32:22,660 [INFO] django.server log 98318 6145355776 "GET /static/admin/js/vendor/jquery/jquery.js HTTP/1.1" 200 285312 +2026-08-01 15:32:22,666 [INFO] django.server log 98318 6145355776 "GET /static/admin/js/urlify.js HTTP/1.1" 200 7887 +2026-08-01 15:32:22,666 [INFO] django.server log 98318 6212661248 "GET /static/admin/js/prepopulate.js HTTP/1.1" 200 1531 +2026-08-01 15:32:22,667 [INFO] django.server log 98318 6195834880 "GET /admin/jsi18n/ HTTP/1.1" 200 3342 +2026-08-01 15:32:22,667 [INFO] django.server log 98318 6229487616 "GET /static/admin/img/search.svg HTTP/1.1" 200 458 +2026-08-01 15:32:22,669 [INFO] django.server log 98318 6179008512 "GET /static/admin/js/vendor/xregexp/xregexp.js HTTP/1.1" 200 325171 +2026-08-01 15:32:22,679 [INFO] django.server log 98318 6179008512 "GET /static/admin/js/filters.js HTTP/1.1" 200 978 +2026-08-01 15:32:22,696 [INFO] django.server log 98318 6229487616 "GET /static/admin/img/icon-viewlink.svg HTTP/1.1" 200 581 +2026-08-01 15:32:22,696 [INFO] django.server log 98318 6179008512 "GET /static/admin/img/tooltag-add.svg HTTP/1.1" 200 331 +2026-08-01 15:32:22,698 [INFO] django.server log 98318 6179008512 "GET /static/admin/img/sorting-icons.svg HTTP/1.1" 200 1097 +2026-08-01 15:32:22,719 [INFO] django.server log 98318 6179008512 "GET /static/admin/js/calendar.js HTTP/1.1" 200 9141 +2026-08-01 15:32:22,720 [INFO] django.server log 98318 6229487616 "GET /static/admin/js/admin/DateTimeShortcuts.js HTTP/1.1" 200 19319 +2026-08-01 15:32:22,736 [INFO] django.server log 98318 6229487616 "GET /static/admin/img/icon-clock.svg HTTP/1.1" 200 677 diff --git a/log/errors.log b/log/errors.log new file mode 100644 index 0000000..e69de29 diff --git a/static/admin/css/django_jalali.min.css b/static/admin/css/django_jalali.min.css new file mode 100755 index 0000000..a086f14 --- /dev/null +++ b/static/admin/css/django_jalali.min.css @@ -0,0 +1,2 @@ +/* Took from https://unpkg.com/@majidh1/jalalidatepicker@0.9.10/dist/jalalidatepicker.min.css */ +jdp-overlay{height:0;width:0}@media only screen and (max-width:481px){jdp-overlay{backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);background-color:rgba(0,0,0,.3);display:none;height:100%;left:0;position:fixed;top:0;width:100%}}jdp-container{-moz-animation:jdpOpenAnimation .3s cubic-bezier(.23,1,.32,1);-webkit-animation:jdpOpenAnimation .3s cubic-bezier(.23,1,.32,1);animation:jdpOpenAnimation .3s cubic-bezier(.23,1,.32,1);background:#fff;border-radius:4px;box-shadow:0 1px 6px rgba(0,0,0,.12),0 1px 4px rgba(0,0,0,.24);direction:rtl;display:none;max-width:307.875px;min-width:307.875px;overflow:hidden;padding:.5rem 0;position:absolute;-ms-touch-action:manipulation;touch-action:manipulation;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width:481px){jdp-container{-moz-animation:jdpOpenAnimationMobile .3s cubic-bezier(.23,1,.32,1);-webkit-animation:jdpOpenAnimationMobile .3s cubic-bezier(.23,1,.32,1);animation:jdpOpenAnimationMobile .3s cubic-bezier(.23,1,.32,1);border-radius:4px 4px 0 0;bottom:0!important;left:50%!important;max-width:100%;min-width:280px;top:unset!important;transform:translateX(-50%)!important;width:100%}}jdp-container,jdp-container *,jdp-container :after,jdp-container :before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}jdp-container .jdp-icon-minus,jdp-container .jdp-icon-plus{border:1px solid #e6e6e6;border-radius:4px;cursor:pointer;display:inline-block;flex:none;overflow:hidden;text-align:center;text-decoration:none;vertical-align:middle}jdp-container .jdp-icon-minus svg,jdp-container .jdp-icon-plus svg{height:1.5rem;padding:.25rem;vertical-align:middle;width:1.5rem}jdp-container .jdp-icon-minus.not-in-range,jdp-container .jdp-icon-plus.not-in-range{cursor:not-allowed}jdp-container .jdp-icon-minus.not-in-range svg,jdp-container .jdp-icon-plus.not-in-range svg{opacity:.3}jdp-container .jdp-months,jdp-container .jdp-years{fill:rgba(0,0,0,.9);color:rgba(0,0,0,.9);display:-webkit-inline-box;display:-webkit-flex;display:-ms-inline-flexbox;display:inline-flex;font-size:120%;margin:0 2.5%}jdp-container .jdp-months{width:50%}jdp-container .jdp-years{width:40%}jdp-container .jdp-month,jdp-container .jdp-month input,jdp-container .jdp-month select,jdp-container .jdp-time,jdp-container .jdp-time input,jdp-container .jdp-time select,jdp-container .jdp-year,jdp-container .jdp-year input,jdp-container .jdp-year select{background:#fff;border:none;border-radius:0;color:inherit;display:inline-block;font-family:inherit;font-size:inherit;font-weight:300;height:auto;line-height:inherit;margin:0;outline:none;padding:0;text-align:center;vertical-align:initial;width:100%}jdp-container .jdp-month:active,jdp-container .jdp-month:focus,jdp-container .jdp-month input:active,jdp-container .jdp-month input:focus,jdp-container .jdp-month select:active,jdp-container .jdp-month select:focus,jdp-container .jdp-time:active,jdp-container .jdp-time:focus,jdp-container .jdp-time input:active,jdp-container .jdp-time input:focus,jdp-container .jdp-time select:active,jdp-container .jdp-time select:focus,jdp-container .jdp-year:active,jdp-container .jdp-year:focus,jdp-container .jdp-year input:active,jdp-container .jdp-year input:focus,jdp-container .jdp-year select:active,jdp-container .jdp-year select:focus{outline:none}jdp-container .jdp-month input option,jdp-container .jdp-month option,jdp-container .jdp-month select option,jdp-container .jdp-time input option,jdp-container .jdp-time option,jdp-container .jdp-time select option,jdp-container .jdp-year input option,jdp-container .jdp-year option,jdp-container .jdp-year select option{font-size:95%;min-height:1.3rem;outline:none;padding:0}jdp-container .jdp-month:hover,jdp-container .jdp-time:hover,jdp-container .jdp-year:hover{filter:brightness(.9)}jdp-container .jdp-month input,jdp-container .jdp-time input,jdp-container .jdp-year input{-webkit-appearance:none;-moz-appearance:textfield;cursor:text}jdp-container .jdp-month input::-webkit-inner-spin-button,jdp-container .jdp-month input::-webkit-outer-spin-button,jdp-container .jdp-time input::-webkit-inner-spin-button,jdp-container .jdp-time input::-webkit-outer-spin-button,jdp-container .jdp-year input::-webkit-inner-spin-button,jdp-container .jdp-year input::-webkit-outer-spin-button{-webkit-appearance:none}jdp-container .jdp-month select,jdp-container .jdp-time select,jdp-container .jdp-year select{-webkit-appearance:menulist;-moz-appearance:menulist;cursor:pointer;position:relative}jdp-container .jdp-days{-ms-flex-pack:justify;display:inline-block;display:-ms-flexbox;display:flex;flex-wrap:wrap;-ms-flex-wrap:wrap;justify-content:space-around;outline:0;padding:.5rem 0 0;text-align:left;width:100%}jdp-container .jdp-day,jdp-container .jdp-day-name{background:none;border:1px solid transparent;color:rgba(0,0,0,.9);display:inline-block;flex-basis:14.2857143%;font-weight:400;height:31px;justify-content:center;line-height:31px;margin:2px 0;position:relative;text-align:center;width:14.2857143%}jdp-container .jdp-day-name.today,jdp-container .jdp-day.today{border-color:rgba(0,0,0,.3)}jdp-container .jdp-day-name.selected,jdp-container .jdp-day.selected{background-color:#569ff7!important;color:#fff!important;opacity:1!important}jdp-container .jdp-day-name.holly-day,jdp-container .jdp-day-name.last-week,jdp-container .jdp-day.holly-day,jdp-container .jdp-day.last-week{color:#f44336}jdp-container .jdp-day.not-in-month{opacity:.4}jdp-container .jdp-day.disabled-day{cursor:not-allowed;opacity:.15}jdp-container .jdp-day:not(.disabled-day){border-radius:4px;cursor:pointer;transition:.1s linear}jdp-container .jdp-day:not(.disabled-day):hover{background:rgba(0,0,0,.1);transform:scale(1.15);z-index:1}jdp-container .jdp-day-name{background-color:rgba(0,0,0,.1);border-radius:0;cursor:default;font-size:90%;font-weight:900}jdp-container .jdp-footer{-ms-flex-pack:justify;display:inline-block;display:-ms-flexbox;display:flex;flex-wrap:nowrap;-ms-flex-wrap:nowrap;justify-content:space-between;outline:0;padding:.5rem .5rem 0;width:100%}@media only screen and (max-width:481px){jdp-container .jdp-footer{margin:.5rem 0}}jdp-container .jdp-btn-close,jdp-container .jdp-btn-empty,jdp-container .jdp-btn-today{background:#569ff7;border-radius:5px;color:#fff;cursor:pointer;display:inline-block;font-size:90%;font-weight:400;padding:.3em .6em;text-align:center}@media only screen and (max-width:481px){jdp-container .jdp-btn-close,jdp-container .jdp-btn-empty,jdp-container .jdp-btn-today{font-size:100%;padding:.5em .8em}}jdp-container .jdp-btn-close.disabled-btn,jdp-container .jdp-btn-empty.disabled-btn,jdp-container .jdp-btn-today.disabled-btn{cursor:not-allowed;opacity:.2}@media only screen and (max-width:481px){jdp-container .jdp-btn-today~.jdp-btn-empty{margin-left:auto;margin-right:1em}}jdp-container .jdp-time-container{display:flex;padding:0}jdp-container .jdp-time-container .jdp-time{flex:auto;margin:0 .5rem;position:relative}jdp-container .jdp-time-container .jdp-time select{background:rgba(0,0,0,.03);border-radius:5px;padding:.5rem 1rem .5rem 7px}jdp-container .jdp-time-container .jdp-time:after{content:":";font-size:1.5rem;height:100%;position:absolute;right:-.7rem;top:50%;transform:translateY(-50%)}jdp-container .jdp-time-container .jdp-time:first-child:after{display:none}jdp-container .jdp-time-container.jdp-only-time .jdp-time select{font-size:1.5rem;padding:.8rem 1rem .8rem 7px}jdp-container .jdp-time-container.jdp-only-time .jdp-time:after{font-size:2.3rem;position:absolute;right:-.8rem}@-webkit-keyframes jdpOpenAnimation{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes jdpOpenAnimation{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@-webkit-keyframes jdpOpenAnimationMobile{0%{bottom:-10%;opacity:0}to{bottom:0;opacity:1}}@keyframes jdpOpenAnimationMobile{0%{margin-bottom:-20%;opacity:0}to{margin-bottom:0;opacity:1}} \ No newline at end of file diff --git a/static/admin/js/django_jalali.min.js b/static/admin/js/django_jalali.min.js index fa10072..e03a8b5 100644 --- a/static/admin/js/django_jalali.min.js +++ b/static/admin/js/django_jalali.min.js @@ -1,5 +1,15 @@ -function mod(e,t){return e-t*Math.floor(e/t)}function leap_gregorian(e){return e%4==0&&!(e%100==0&&e%400!=0)}function gregorian_to_jd(e,t,n){return GREGORIAN_EPOCH-1+365*(e-1)+Math.floor((e-1)/4)+-Math.floor((e-1)/100)+Math.floor((e-1)/400)+Math.floor((367*t-362)/12+(t<=2?0:leap_gregorian(e)?-1:-2)+n)}function jd_to_gregorian(e){var t,n,i,r,a,o,s,l,u,c,d,p;return t=Math.floor(e-.5)+.5,n=t-GREGORIAN_EPOCH,i=Math.floor(n/146097),r=mod(n,146097),a=Math.floor(r/36524),o=mod(r,36524),s=Math.floor(o/1461),l=mod(o,1461),u=Math.floor(l/365),c=400*i+100*a+4*s+u,4!=a&&4!=u&&c++,d=t-gregorian_to_jd(c,1,1),p=t0?474:473))%2820+474+38)%2816<682}function persian_to_jd(e,t,n){var i,r;return i=e-(e>=0?474:473),r=474+mod(i,2820),n+(t<=7?31*(t-1):30*(t-1)+6)+Math.floor((682*r-110)/2816)+365*(r-1)+1029983*Math.floor(i/2820)+(PERSIAN_EPOCH-1)}function jd_to_persian(e){var t,n,i,r,a,o,s,l,u,c;return e=Math.floor(e)+.5,r=e-persian_to_jd(475,1,1),a=Math.floor(r/1029983),o=mod(r,1029983),1029982==o?s=2820:(l=Math.floor(o/366),u=mod(o,366),s=Math.floor((2134*l+2816*u+2815)/1028522)+l+1),(t=s+2820*a+474)<=0&&t--,c=e-persian_to_jd(t,1,1)+1,n=c<=186?Math.ceil(c/31):Math.ceil((c-6)/30),i=e-persian_to_jd(t,n,1)+1,new Array(t,n,i)}function JalaliDate(e,t,n){function i(e){var t=0;e[1]<0&&(t=leap_persian(e[0]-1)?30:29,e[1]++);var n=jd_to_gregorian(persian_to_jd(e[0],e[1]+1,e[2])-t);return n[1]--,n}function r(e){var t=jd_to_persian(gregorian_to_jd(e[0],e[1]+1,e[2]));return t[1]--,t}function a(e){return e&&e.getGregorianDate&&(e=e.getGregorianDate()),(o=new Date(e)).setHours(o.getHours()>12?o.getHours()+2:0),o&&"Invalid Date"!=o&&!isNaN(o||!o.getDate())||(o=new Date),s=r([o.getFullYear(),o.getMonth(),o.getDate()]),this}var o,s;if(isNaN(parseInt(e))||isNaN(parseInt(t))||isNaN(parseInt(n)))a(e);else{var l=i([parseInt(e,10),parseInt(t,10),parseInt(n,10)]);a(new Date(l[0],l[1],l[2]))}this.getGregorianDate=function(){return o},this.setFullDate=a,this.setMonth=function(e){s[1]=e;var t=i(s);o=new Date(t[0],t[1],t[2]),s=r([t[0],t[1],t[2]])},this.setDate=function(e){s[2]=e;var t=i(s);o=new Date(t[0],t[1],t[2]),s=r([t[0],t[1],t[2]])},this.getFullYear=function(){return s[0]},this.getMonth=function(){return s[1]},this.getDate=function(){return s[2]},this.toString=function(){return s.join(",").toString()},this.getDay=function(){return o.getDay()},this.getHours=function(){return o.getHours()},this.getMinutes=function(){return o.getMinutes()},this.getSeconds=function(){return o.getSeconds()},this.getTime=function(){return o.getTime()},this.getTimeZoneOffset=function(){return o.getTimeZoneOffset()},this.getYear=function(){return s[0]%100},this.setHours=function(e){o.setHours(e)},this.setMinutes=function(e){o.setMinutes(e)},this.setSeconds=function(e){o.setSeconds(e)},this.setMilliseconds=function(e){o.setMilliseconds(e)}}!function(e,t){function n(e){var t=e.length,n=ue.type(e);return!ue.isWindow(e)&&(!(1!==e.nodeType||!t)||"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e))}function i(e){var t=we[e]={};return ue.each(e.match(de)||[],function(e,n){t[n]=!0}),t}function r(e,n,i,r){if(ue.acceptData(e)){var a,o,s=ue.expando,l=e.nodeType,u=l?ue.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(r||u[c].data)||i!==t||"string"!=typeof n)return c||(c=l?e[s]=ee.pop()||ue.guid++:s),u[c]||(u[c]=l?{}:{toJSON:ue.noop}),("object"==typeof n||"function"==typeof n)&&(r?u[c]=ue.extend(u[c],n):u[c].data=ue.extend(u[c].data,n)),o=u[c],r||(o.data||(o.data={}),o=o.data),i!==t&&(o[ue.camelCase(n)]=i),"string"==typeof n?null==(a=o[n])&&(a=o[ue.camelCase(n)]):a=o,a}}function a(e,t,n){if(ue.acceptData(e)){var i,r,a=e.nodeType,o=a?ue.cache:e,l=a?e[ue.expando]:ue.expando;if(o[l]){if(t&&(i=n?o[l]:o[l].data)){ue.isArray(t)?t=t.concat(ue.map(t,ue.camelCase)):t in i?t=[t]:(t=ue.camelCase(t),t=t in i?[t]:t.split(" ")),r=t.length;for(;r--;)delete i[t[r]];if(n?!s(i):!ue.isEmptyObject(i))return}(n||(delete o[l].data,s(o[l])))&&(a?ue.cleanData([e],!0):ue.support.deleteExpando||o!=o.window?delete o[l]:o[l]=null)}}}function o(e,n,i){if(i===t&&1===e.nodeType){var r="data-"+n.replace(Te,"-$1").toLowerCase();if("string"==typeof(i=e.getAttribute(r))){try{i="true"===i||"false"!==i&&("null"===i?null:+i+""===i?+i:Ce.test(i)?ue.parseJSON(i):i)}catch(e){}ue.data(e,n,i)}else i=t}return i}function s(e){var t;for(t in e)if(("data"!==t||!ue.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function l(){return!0}function u(){return!1}function c(){try{return G.activeElement}catch(e){}}function d(e,t){do{e=e[t]}while(e&&1!==e.nodeType);return e}function p(e,t,n){if(ue.isFunction(t))return ue.grep(e,function(e,i){return!!t.call(e,i,e)!==n});if(t.nodeType)return ue.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ye.test(t))return ue.filter(t,e,n);t=ue.filter(t,e)}return ue.grep(e,function(e){return ue.inArray(e,t)>=0!==n})}function h(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function f(e,t){return ue.nodeName(e,"table")&&ue.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function g(e){return e.type=(null!==ue.find.attr(e,"type"))+"/"+e.type,e}function m(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function y(e,t){for(var n,i=0;null!=(n=e[i]);i++)ue._data(n,"globalEval",!t||ue._data(t[i],"globalEval"))}function v(e,t){if(1===t.nodeType&&ue.hasData(e)){var n,i,r,a=ue._data(e),o=ue._data(t,a),s=a.events;if(s)for(n in delete o.handle,o.events={},s)for(i=0,r=s[n].length;r>i;i++)ue.event.add(t,n,s[n][i]);o.data&&(o.data=ue.extend({},o.data))}}function b(e,t){var n,i,r;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!ue.support.noCloneEvent&&t[ue.expando]){for(i in r=ue._data(t),r.events)ue.removeEvent(t,i,r.handle);t.removeAttribute(ue.expando)}"script"===n&&t.text!==e.text?(g(t).text=e.text,m(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),ue.support.html5Clone&&e.innerHTML&&!ue.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&et.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function _(e,n){var i,r,a=0,o=typeof e.getElementsByTagName!==U?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==U?e.querySelectorAll(n||"*"):t;if(!o)for(o=[],i=e.childNodes||e;null!=(r=i[a]);a++)!n||ue.nodeName(r,n)?o.push(r):ue.merge(o,_(r,n));return n===t||n&&ue.nodeName(e,n)?ue.merge([e],o):o}function x(e){et.test(e.type)&&(e.defaultChecked=e.checked)}function k(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),i=t,r=kt.length;r--;)if((t=kt[r]+n)in e)return t;return i}function D(e,t){return e=t||e,"none"===ue.css(e,"display")||!ue.contains(e.ownerDocument,e)}function w(e,t){for(var n,i,r,a=[],o=0,s=e.length;s>o;o++)(i=e[o]).style&&(a[o]=ue._data(i,"olddisplay"),n=i.style.display,t?(a[o]||"none"!==n||(i.style.display=""),""===i.style.display&&D(i)&&(a[o]=ue._data(i,"olddisplay",M(i.nodeName)))):a[o]||(r=D(i),(n&&"none"!==n||!r)&&ue._data(i,"olddisplay",r?n:ue.css(i,"display"))));for(o=0;s>o;o++)(i=e[o]).style&&(t&&"none"!==i.style.display&&""!==i.style.display||(i.style.display=t?a[o]||"":"none"));return e}function C(e,t,n){var i=gt.exec(t);return i?Math.max(0,i[1]-(n||0))+(i[2]||"px"):t}function T(e,t,n,i,r){for(var a=n===(i?"border":"content")?4:"width"===t?1:0,o=0;4>a;a+=2)"margin"===n&&(o+=ue.css(e,n+xt[a],!0,r)),i?("content"===n&&(o-=ue.css(e,"padding"+xt[a],!0,r)),"margin"!==n&&(o-=ue.css(e,"border"+xt[a]+"Width",!0,r))):(o+=ue.css(e,"padding"+xt[a],!0,r),"padding"!==n&&(o+=ue.css(e,"border"+xt[a]+"Width",!0,r)));return o}function N(e,t,n){var i=!0,r="width"===t?e.offsetWidth:e.offsetHeight,a=lt(e),o=ue.support.boxSizing&&"border-box"===ue.css(e,"boxSizing",!1,a);if(0>=r||null==r){if((0>(r=ut(e,t,a))||null==r)&&(r=e.style[t]),mt.test(r))return r;i=o&&(ue.support.boxSizingReliable||r===e.style[t]),r=parseFloat(r)||0}return r+T(e,t,n||(o?"border":"content"),i,a)+"px"}function M(e){var t=G,n=vt[e];return n||("none"!==(n=S(e,t))&&n||(st=(st||ue("