Bug 12166: Improve display of Reserve charges in patron account
[koha.git] / koha-tmpl / intranet-tmpl / prog / en / includes / calendar.inc
1 [% USE Koha %]
2 <script>
3
4 var debug    = "[% debug | html %]";
5 var dformat  = "[% dateformat | html %]";
6 var sentmsg = 0;
7 if (debug > 1) {alert("dateformat: " + dformat + "\ndebug is on (level " + debug + ")");}
8 var MSG_PLEASE_ENTER_A_VALID_DATE = (_("Please enter a valid date (should match %s)."));
9
10 function is_valid_date(date) {
11     // An empty string is considered as a valid date for convenient reasons.
12     if ( date === '' ) return 1;
13
14     var dateformat = dateformat_str = '[% Koha.Preference('dateformat') | html %]';
15     if ( dateformat == 'us' ) {
16         if ( date.search(/^\d{2}\/\d{2}\/\d{4}($|\s)/) == -1 ) return 0;
17         dateformat = 'mm/dd/yy';
18     } else if ( dateformat == 'metric' ) {
19         if ( date.search(/^\d{2}\/\d{2}\/\d{4}($|\s)/) == -1 ) return 0;
20         dateformat = 'dd/mm/yy';
21     } else if (dateformat == 'iso' ) {
22         if ( date.search(/^\d{4}-\d{2}-\d{2}($|\s)/) == -1 ) return 0;
23         dateformat = 'yy-mm-dd';
24     } else if ( dateformat == 'dmydot' ) {
25         if ( date.search(/^\d{2}\.\d{2}\.\d{4}($|\s)/) == -1 ) return 0;
26         dateformat = 'dd.mm.yy';
27     }
28     try {
29         $.datepicker.parseDate(dateformat, date);
30     } catch (e) {
31         return 0;
32     };
33     return 1;
34 }
35
36 function get_dateformat_str(dateformat) {
37     var dateformat_str;
38     if ( dateformat == 'us' ) {
39         dateformat_str = 'mm/dd/yyyy';
40     } else if ( dateformat == 'metric' ) {
41         dateformat_str = 'dd/mm/yyyy';
42     } else if (dateformat == 'iso' ) {
43         dateformat_str = 'yyyy-mm-dd';
44     } else if ( dateformat == 'dmydot' ) {
45         dateformat_str = 'dd.mm.yyyy';
46     }
47     return dateformat_str;
48 }
49
50 function validate_date (dateText, inst) {
51     if ( !is_valid_date(dateText) ) {
52         var dateformat_str = get_dateformat_str( '[% Koha.Preference('dateformat') | html %]' );
53         alert(MSG_PLEASE_ENTER_A_VALID_DATE.format(dateformat_str));
54         $('#'+inst.id).val('');
55     }
56 }
57
58 function Date_from_syspref(dstring) {
59         var dateX = dstring.split(/[-/.]/);
60         if (debug > 1 && sentmsg < 1) {sentmsg++; alert("Date_from_syspref(" + dstring + ") splits to:\n" + dateX.join("\n"));}
61         if (dformat === "iso") {
62                 return new Date(dateX[0], (dateX[1] - 1), dateX[2]);  // YYYY-MM-DD to (YYYY,m(0-11),d)
63         } else if (dformat === "us") {
64                 return new Date(dateX[2], (dateX[0] - 1), dateX[1]);  // MM/DD/YYYY to (YYYY,m(0-11),d)
65         } else if (dformat === "metric") {
66                 return new Date(dateX[2], (dateX[1] - 1), dateX[0]);  // DD/MM/YYYY to (YYYY,m(0-11),d)
67         } else if (dformat === "dmydot") {
68                 return new Date(dateX[2], (dateX[1] - 1), dateX[0]);  // DD.MM.YYYY to (YYYY,m(0-11),d)
69         } else {
70                 if (debug > 0) {alert("KOHA ERROR - Unrecognized date format: " +dformat);}
71                 return 0;
72         }
73 }
74
75 function DateTime_from_syspref(date_time) {
76         var parts = date_time.split(" ");
77         var date = parts[0];
78         var time = parts[1];
79         parts = time.split(":");
80         var hour = parts[0];
81         var minute = parts[1];
82
83         if ( hour < 0 || hour > 23 ) {
84             return 0;
85         }
86         if ( minute < 0 || minute > 59 ) {
87             return 0;
88         }
89
90         var datetime = Date_from_syspref( date );
91
92         if ( isNaN( datetime.getTime() ) ) {
93             return 0;
94         }
95
96         datetime.setHours( hour );
97         datetime.setMinutes( minute );
98
99         return datetime;
100 }
101
102
103 /* Instead of including multiple localization files as you would normally see with
104    jQueryUI we expose the localization strings in the default configuration */
105 jQuery(function($){
106     $.datepicker.regional[''] = {
107         closeText: _("Done"),
108         prevText: _("Prev"),
109         nextText: _("Next"),
110         currentText: _("Today"),
111         monthNames: [_("January"),_("February"),_("March"),_("April"),_("May"),_("June"),
112         _("July"),_("August"),_("September"),_("October"),_("November"),_("December")],
113         monthNamesShort: [_("Jan"), _("Feb"), _("Mar"), _("Apr"), _("May"), _("Jun"),
114         _("Jul"), _("Aug"), _("Sep"), _("Oct"), _("Nov"), _("Dec")],
115         dayNames: [_("Sunday"), _("Monday"), _("Tuesday"), _("Wednesday"), _("Thursday"), _("Friday"), _("Saturday")],
116         dayNamesShort: [_("Sun"), _("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat")],
117         dayNamesMin: [_("Su"),_("Mo"),_("Tu"),_("We"),_("Th"),_("Fr"),_("Sa")],
118         weekHeader: _("Wk"),
119         dateFormat: "[% IF ( dateformat == "us" ) %]mm/dd/yy[% ELSIF ( dateformat == "metric" ) %]dd/mm/yy[% ELSIF ( dateformat == "dmydot" ) %]dd.mm.yy[% ELSE %]yy-mm-dd[% END %]",
120         firstDay: '[% Koha.Preference('CalendarFirstDayOfWeek') | html %]',
121         isRTL: [% IF ( bidi ) %]true[% ELSE %]false[% END %],
122         showMonthAfterYear: false,
123         yearSuffix: ''};
124     $.datepicker.setDefaults($.datepicker.regional['']);
125 });
126
127 /*  jQuery Validator plugin custom method
128     This allows you to check that a given date falls after another.
129     It is required that a message be defined.
130
131    Syntax:
132        $("#form_id").validate({
133         rules: {
134             input_name_of_later_date_field: {
135                 is_date_after: "#input_id_of_earlier_date_field"
136             },
137         },
138         messages: {
139             input_name_of_later_date_field: {
140                 is_date_after: _("Validation error to be shown, i.e. End date must come after start date")
141             }
142         }
143     });
144 */
145
146 jQuery.validator.addMethod("is_date_after",
147 function(value, element, params) {
148     var from = Date_from_syspref( $(params).val() );
149     var to = Date_from_syspref(value);
150     return to > from;
151 });
152
153 jQuery.validator.addMethod("date_on_or_after",
154 function(value, element, params) {
155     var from = Date_from_syspref( $(params).val() );
156     var to = Date_from_syspref(value);
157     return to >= from;
158 });
159
160 $(document).ready(function(){
161
162 $.datepicker.setDefaults({
163         showOn: "focus",
164         changeMonth: true,
165         changeYear: true,
166         showButtonPanel: true,
167         showOtherMonths: true,
168         selectOtherMonths: true,
169         yearRange: "c-100:c+10"
170     });
171
172 $("#dateofbirth").datepicker({
173         yearRange: "c-100:c"
174     });
175
176     $( ".datepicker" ).datepicker({
177         onClose: function(dateText, inst) {
178             validate_date(dateText, inst);
179         },
180     }).on("change", function(e, value) {
181         if ( ! is_valid_date( $(this).val() ) ) {$(this).val("");}
182     });
183     // http://jqueryui.com/demos/datepicker/#date-range
184     var dates = $( ".datepickerfrom, .datepickerto" ).datepicker({
185         changeMonth: true,
186         numberOfMonths: 1,
187         onSelect: function( selectedDate ) {
188             var option = this.id == "from" ? "minDate" : "maxDate",
189                 instance = $( this ).data( "datepicker" );
190                 date = $.datepicker.parseDate(
191                     instance.settings.dateFormat ||
192                     $.datepicker._defaults.dateFormat,
193                     selectedDate, instance.settings );
194             dates.not( this ).datepicker( "option", option, date );
195         },
196         onClose: function(dateText, inst) {
197             validate_date(dateText, inst);
198         },
199     }).on("change", function(e, value) {
200         if ( ! is_valid_date( $(this).val() ) ) {$(this).val("");}
201     });
202 });
203 </script>