~widelands-dev/widelands-website/trunk

« back to all changes in this revision

Viewing changes to media/js/jquery-ui.multidatespicker.js

  • Committer: gschmitlin at gmail
  • Date: 2017-12-23 09:15:02 UTC
  • mto: This revision was merged to the branch mainline in revision 480.
  • Revision ID: gschmitlin@gmail.com-20171223091502-j1zscwdies0625nv
added scheduling module in a clean way

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * MultiDatesPicker v1.6.4
 
3
 * http://multidatespickr.sourceforge.net/
 
4
 * 
 
5
 * Copyright 2014, Luca Lauretta
 
6
 * Dual licensed under the MIT or GPL version 2 licenses.
 
7
 */
 
8
(function( $ ){
 
9
        $.extend($.ui, { multiDatesPicker: { version: "1.6.4" } });
 
10
        
 
11
        $.fn.multiDatesPicker = function(method) {
 
12
                var mdp_arguments = arguments;
 
13
                var ret = this;
 
14
                var today_date = new Date();
 
15
                var day_zero = new Date(0);
 
16
                var mdp_events = {};
 
17
                
 
18
                function removeDate(date, type) {
 
19
                        if(!type) type = 'picked';
 
20
                        date = dateConvert.call(this, date);
 
21
                        for(var i = 0; i < this.multiDatesPicker.dates[type].length; i++)
 
22
                                if(!methods.compareDates(this.multiDatesPicker.dates[type][i], date))
 
23
                                        return this.multiDatesPicker.dates[type].splice(i, 1).pop();
 
24
                }
 
25
                function removeIndex(index, type) {
 
26
                        if(!type) type = 'picked';
 
27
                        return this.multiDatesPicker.dates[type].splice(index, 1).pop();
 
28
                }
 
29
                function addDate(date, type, no_sort) {
 
30
                        if(!type) type = 'picked';
 
31
                        date = dateConvert.call(this, date);
 
32
                        
 
33
                        // @todo: use jQuery UI datepicker method instead
 
34
                        date.setHours(0);
 
35
                        date.setMinutes(0);
 
36
                        date.setSeconds(0);
 
37
                        date.setMilliseconds(0);
 
38
                        
 
39
                        if (methods.gotDate.call(this, date, type) === false) {
 
40
                                this.multiDatesPicker.dates[type].push(date);
 
41
                                if(!no_sort) this.multiDatesPicker.dates[type].sort(methods.compareDates);
 
42
                        } 
 
43
                }
 
44
                function sortDates(type) {
 
45
                        if(!type) type = 'picked';
 
46
                        this.multiDatesPicker.dates[type].sort(methods.compareDates);
 
47
                }
 
48
                function dateConvert(date, desired_type, date_format) {
 
49
                        if(!desired_type) desired_type = 'object';/*
 
50
                        if(!date_format && (typeof date == 'string')) {
 
51
                                date_format = $(this).datepicker('option', 'dateFormat');
 
52
                                if(!date_format) date_format = $.datepicker._defaults.dateFormat;
 
53
                        }
 
54
                        */
 
55
                        return methods.dateConvert.call(this, date, desired_type, date_format);
 
56
                }
 
57
                
 
58
                var methods = {
 
59
                        init : function( options ) {
 
60
                                var $this = $(this);
 
61
                                this.multiDatesPicker.changed = false;
 
62
                                
 
63
                                var mdp_events = {
 
64
                                        beforeShow: function(input, inst) {
 
65
                                                this.multiDatesPicker.changed = false;
 
66
                                                if(this.multiDatesPicker.originalBeforeShow) 
 
67
                                                        this.multiDatesPicker.originalBeforeShow.call(this, input, inst);
 
68
                                        },
 
69
                                        onSelect : function(dateText, inst) {
 
70
                                                var $this = $(this);
 
71
                                                this.multiDatesPicker.changed = true;
 
72
                                                
 
73
                                                if (dateText) {
 
74
                                                        $this.multiDatesPicker('toggleDate', dateText);
 
75
                                                        this.multiDatesPicker.changed = true;
 
76
                                                        // @todo: this will be optimized when I'll move methods to the singleton.
 
77
                                                }
 
78
                                                
 
79
                                                if (this.multiDatesPicker.mode == 'normal' && this.multiDatesPicker.pickableRange) {
 
80
                                                        if(this.multiDatesPicker.dates.picked.length > 0) {
 
81
                                                                var min_date = this.multiDatesPicker.dates.picked[0],
 
82
                                                                        max_date = new Date(min_date.getTime());
 
83
                                                                
 
84
                                                                methods.sumDays(max_date, this.multiDatesPicker.pickableRange-1);
 
85
                                                                        
 
86
                                                                // counts the number of disabled dates in the range
 
87
                                                                if(this.multiDatesPicker.adjustRangeToDisabled) {
 
88
                                                                        var c_disabled, 
 
89
                                                                                disabled = this.multiDatesPicker.dates.disabled.slice(0);
 
90
                                                                        do {
 
91
                                                                                c_disabled = 0;
 
92
                                                                                for(var i = 0; i < disabled.length; i++) {
 
93
                                                                                        if(disabled[i].getTime() <= max_date.getTime()) {
 
94
                                                                                                if((min_date.getTime() <= disabled[i].getTime()) && (disabled[i].getTime() <= max_date.getTime()) ) {
 
95
                                                                                                        c_disabled++;
 
96
                                                                                                }
 
97
                                                                                                disabled.splice(i, 1);
 
98
                                                                                                i--;
 
99
                                                                                        }
 
100
                                                                                }
 
101
                                                                                max_date.setDate(max_date.getDate() + c_disabled);
 
102
                                                                        } while(c_disabled != 0);
 
103
                                                                }
 
104
                                                                
 
105
                                                                if(this.multiDatesPicker.maxDate && (max_date > this.multiDatesPicker.maxDate))
 
106
                                                                        max_date = this.multiDatesPicker.maxDate;
 
107
                                                                
 
108
                                                                $this
 
109
                                                                        .datepicker("option", "minDate", min_date)
 
110
                                                                        .datepicker("option", "maxDate", max_date);
 
111
                                                        } else {
 
112
                                                                $this
 
113
                                                                        .datepicker("option", "minDate", this.multiDatesPicker.minDate)
 
114
                                                                        .datepicker("option", "maxDate", this.multiDatesPicker.maxDate);
 
115
                                                        }
 
116
                                                }
 
117
                                                
 
118
                                                if(this.multiDatesPicker.originalOnSelect && dateText)
 
119
                                                        this.multiDatesPicker.originalOnSelect.call(this, dateText, inst);
 
120
                                                
 
121
                                        },
 
122
                                        beforeShowDay : function(date) {
 
123
                                                var $this = $(this),
 
124
                                                        gotThisDate = $this.multiDatesPicker('gotDate', date) !== false,
 
125
                                                        isDisabledCalendar = $this.datepicker('option', 'disabled'),
 
126
                                                        isDisabledDate = $this.multiDatesPicker('gotDate', date, 'disabled') !== false,
 
127
                                                        areAllSelected = this.multiDatesPicker.maxPicks <= this.multiDatesPicker.dates.picked.length;
 
128
                                                
 
129
                                                var bsdReturn = [true, '', null];
 
130
                                                if(this.multiDatesPicker.originalBeforeShowDay)
 
131
                                                        bsdReturn = this.multiDatesPicker.originalBeforeShowDay.call(this, date);
 
132
                                                
 
133
                                                bsdReturn[1] = gotThisDate ? 'ui-state-highlight '+bsdReturn[1] : bsdReturn[1];
 
134
                                                bsdReturn[0] = bsdReturn[0] && !(isDisabledCalendar || isDisabledDate || (areAllSelected && !bsdReturn[1]));
 
135
                                                return bsdReturn;
 
136
                                        }
 
137
                                };
 
138
                                
 
139
                                // value have to be extracted before datepicker is initiated
 
140
                                if($this.val()) var inputDates = $this.val()
 
141
                                
 
142
                                if(options) {
 
143
                                        // value have to be extracted before datepicker is initiated
 
144
                                        //if(options.altField) var inputDates = $(options.altField).val();
 
145
                                        if(options.separator) this.multiDatesPicker.separator = options.separator;
 
146
                                        if(!this.multiDatesPicker.separator) this.multiDatesPicker.separator = ', ';
 
147
                                        
 
148
                                        this.multiDatesPicker.originalBeforeShow = options.beforeShow;
 
149
                                        this.multiDatesPicker.originalOnSelect = options.onSelect;
 
150
                                        this.multiDatesPicker.originalBeforeShowDay = options.beforeShowDay;
 
151
                                        this.multiDatesPicker.originalOnClose = options.onClose;
 
152
                                        
 
153
                                        // datepicker init
 
154
                                        $this.datepicker(options);
 
155
                                        
 
156
                                        this.multiDatesPicker.minDate = $.datepicker._determineDate(this, options.minDate, null);
 
157
                                        this.multiDatesPicker.maxDate = $.datepicker._determineDate(this, options.maxDate, null);
 
158
                                        if(options.addDates) methods.addDates.call(this, options.addDates);
 
159
                                         
 
160
                                        if(options.addDisabledDates)
 
161
                                                methods.addDates.call(this, options.addDisabledDates, 'disabled');
 
162
                                        
 
163
                                        methods.setMode.call(this, options);
 
164
                                } else {
 
165
                                        $this.datepicker();
 
166
                                }
 
167
                                $this.datepicker('option', mdp_events);
 
168
                                
 
169
                                // adds any dates found in the input or alt field
 
170
                                if(inputDates) $this.multiDatesPicker('value', inputDates);
 
171
                                
 
172
                                // generates the new string of added dates
 
173
                                var inputs_values = $this.multiDatesPicker('value');
 
174
                                
 
175
                                // fills the input field back with all the dates in the calendar
 
176
                                $this.val(inputs_values);
 
177
                                
 
178
                                // Fixes the altField filled with defaultDate by default
 
179
                                var altFieldOption = $this.datepicker('option', 'altField');
 
180
                                if (altFieldOption) $(altFieldOption).val(inputs_values);
 
181
                                
 
182
                                // Updates the calendar view
 
183
                                $this.datepicker('refresh');
 
184
                        },
 
185
                        compareDates : function(date1, date2) {
 
186
                                date1 = dateConvert.call(this, date1);
 
187
                                date2 = dateConvert.call(this, date2);
 
188
                                // return > 0 means date1 is later than date2 
 
189
                                // return == 0 means date1 is the same day as date2 
 
190
                                // return < 0 means date1 is earlier than date2 
 
191
                                var diff = date1.getFullYear() - date2.getFullYear();
 
192
                                if(!diff) {
 
193
                                        diff = date1.getMonth() - date2.getMonth();
 
194
                                        if(!diff) 
 
195
                                                diff = date1.getDate() - date2.getDate();
 
196
                                }
 
197
                                return diff;
 
198
                        },
 
199
                        sumDays : function( date, n_days ) {
 
200
                                var origDateType = typeof date;
 
201
                                obj_date = dateConvert.call(this, date);
 
202
                                obj_date.setDate(obj_date.getDate() + n_days);
 
203
                                return dateConvert.call(this, obj_date, origDateType);
 
204
                        },
 
205
                        dateConvert : function( date, desired_format, dateFormat ) {
 
206
                                var from_format = typeof date;
 
207
                                var $this = $(this);
 
208
                                
 
209
                                if(from_format == desired_format) {
 
210
                                        if(from_format == 'object') {
 
211
                                                try {
 
212
                                                        date.getTime();
 
213
                                                } catch (e) {
 
214
                                                        $.error('Received date is in a non supported format!');
 
215
                                                        return false;
 
216
                                                }
 
217
                                        }
 
218
                                        return date;
 
219
                                }
 
220
                                
 
221
                                if(typeof date == 'undefined') date = new Date(0);
 
222
                                
 
223
                                if(desired_format != 'string' && desired_format != 'object' && desired_format != 'number')
 
224
                                        $.error('Date format "'+ desired_format +'" not supported!');
 
225
                                
 
226
                                if(!dateFormat) {
 
227
                                        // thanks to bibendus83 -> http://sourceforge.net/tracker/index.php?func=detail&aid=3213174&group_id=358205&atid=1495382
 
228
                                        var dp_dateFormat = $this.datepicker('option', 'dateFormat');
 
229
                                        if (dp_dateFormat) {
 
230
                                                dateFormat = dp_dateFormat;
 
231
                                        } else {
 
232
                                                dateFormat = $.datepicker._defaults.dateFormat;
 
233
                                        }
 
234
                                }
 
235
                                
 
236
                                // converts to object as a neutral format
 
237
                                switch(from_format) {
 
238
                                        case 'object': break;
 
239
                                        case 'string': date = $.datepicker.parseDate(dateFormat, date); break;
 
240
                                        case 'number': date = new Date(date); break;
 
241
                                        default: $.error('Conversion from "'+ desired_format +'" format not allowed on jQuery.multiDatesPicker');
 
242
                                }
 
243
                                // then converts to the desired format
 
244
                                switch(desired_format) {
 
245
                                        case 'object': return date;
 
246
                                        case 'string': return $.datepicker.formatDate(dateFormat, date);
 
247
                                        case 'number': return date.getTime();
 
248
                                        default: $.error('Conversion to "'+ desired_format +'" format not allowed on jQuery.multiDatesPicker');
 
249
                                }
 
250
                                return false;
 
251
                        },
 
252
                        gotDate : function( date, type ) {
 
253
                                if(!type) type = 'picked';
 
254
                                for(var i = 0; i < this.multiDatesPicker.dates[type].length; i++) {
 
255
                                        if(methods.compareDates.call(this, this.multiDatesPicker.dates[type][i], date) === 0) {
 
256
                                                return i;
 
257
                                        }
 
258
                                }
 
259
                                return false;
 
260
                        },
 
261
                        value : function( value ) {
 
262
                                if(value && typeof value == 'string') {
 
263
                                        methods.addDates.call(this, value.split(this.multiDatesPicker.separator));
 
264
                                } else {
 
265
                                        var dates = methods.getDates.call(this, 'string');
 
266
                                        return dates.length
 
267
                                                ? dates.join(this.multiDatesPicker.separator)
 
268
                                                : "";
 
269
                                }
 
270
                        },
 
271
                        getDates : function( format, type ) {
 
272
                                if(!format) format = 'string';
 
273
                                if(!type) type = 'picked';
 
274
                                switch (format) {
 
275
                                        case 'object':
 
276
                                                return this.multiDatesPicker.dates[type];
 
277
                                        case 'string':
 
278
                                        case 'number':
 
279
                                                var o_dates = new Array();
 
280
                                                for(var i in this.multiDatesPicker.dates[type])
 
281
                                                        o_dates.push(
 
282
                                                                dateConvert.call(
 
283
                                                                        this, 
 
284
                                                                        this.multiDatesPicker.dates[type][i], 
 
285
                                                                        format
 
286
                                                                )
 
287
                                                        );
 
288
                                                return o_dates;
 
289
                                        
 
290
                                        default: $.error('Format "'+format+'" not supported!');
 
291
                                }
 
292
                        },
 
293
                        addDates : function( dates, type ) {
 
294
                                if(dates.length > 0) {
 
295
                                        if(!type) type = 'picked';
 
296
                                        switch(typeof dates) {
 
297
                                                case 'object':
 
298
                                                case 'array':
 
299
                                                        if(dates.length) {
 
300
                                                                for(var i = 0; i < dates.length; i++)
 
301
                                                                        addDate.call(this, dates[i], type, true);
 
302
                                                                sortDates.call(this, type);
 
303
                                                                break;
 
304
                                                        } // else does the same as 'string'
 
305
                                                case 'string':
 
306
                                                case 'number':
 
307
                                                        addDate.call(this, dates, type);
 
308
                                                        break;
 
309
                                                default: 
 
310
                                                        $.error('Date format "'+ typeof dates +'" not allowed on jQuery.multiDatesPicker');
 
311
                                        }
 
312
                                        //$(this).datepicker('refresh');
 
313
                                } else {
 
314
                                        $.error('Empty array of dates received.');
 
315
                                }
 
316
                        },
 
317
                        removeDates : function( dates, type ) {
 
318
                                if(!type) type = 'picked';
 
319
                                var removed = [];
 
320
                                if (Object.prototype.toString.call(dates) === '[object Array]') {
 
321
                                        for(var i in dates.sort(function(a,b){return b-a})) {
 
322
                                                removed.push(removeDate.call(this, dates[i], type));
 
323
                                        }
 
324
                                } else {
 
325
                                        removed.push(removeDate.call(this, dates, type));
 
326
                                }
 
327
                                return removed;
 
328
                        },
 
329
                        removeIndexes : function( indexes, type ) {
 
330
                                if(!type) type = 'picked';
 
331
                                var removed = [];
 
332
                                if (Object.prototype.toString.call(indexes) === '[object Array]') {
 
333
                                        for(var i in indexes.sort(function(a,b){return b-a})) {
 
334
                                                removed.push(removeIndex.call(this, indexes[i], type));
 
335
                                        }
 
336
                                } else {
 
337
                                        removed.push(removeIndex.call(this, indexes, type));
 
338
                                }
 
339
                                return removed;
 
340
                        },
 
341
                        resetDates : function ( type ) {
 
342
                                if(!type) type = 'picked';
 
343
                                this.multiDatesPicker.dates[type] = [];
 
344
                        },
 
345
                        toggleDate : function( date, type ) {
 
346
                                if(!type) type = 'picked';
 
347
                                
 
348
                                switch(this.multiDatesPicker.mode) {
 
349
                                        case 'daysRange':
 
350
                                                this.multiDatesPicker.dates[type] = []; // deletes all picked/disabled dates
 
351
                                                var end = this.multiDatesPicker.autoselectRange[1];
 
352
                                                var begin = this.multiDatesPicker.autoselectRange[0];
 
353
                                                if(end < begin) { // switch
 
354
                                                        end = this.multiDatesPicker.autoselectRange[0];
 
355
                                                        begin = this.multiDatesPicker.autoselectRange[1];
 
356
                                                }
 
357
                                                for(var i = begin; i < end; i++) 
 
358
                                                        methods.addDates.call(this, methods.sumDays.call(this,date, i), type);
 
359
                                                break;
 
360
                                        default:
 
361
                                                if(methods.gotDate.call(this, date) === false) // adds dates
 
362
                                                        methods.addDates.call(this, date, type);
 
363
                                                else // removes dates
 
364
                                                        methods.removeDates.call(this, date, type);
 
365
                                                break;
 
366
                                }
 
367
                        }, 
 
368
                        setMode : function( options ) {
 
369
                                var $this = $(this);
 
370
                                if(options.mode) this.multiDatesPicker.mode = options.mode;
 
371
                                
 
372
                                switch(this.multiDatesPicker.mode) {
 
373
                                        case 'normal':
 
374
                                                for(option in options)
 
375
                                                        switch(option) {
 
376
                                                                case 'maxPicks':
 
377
                                                                case 'minPicks':
 
378
                                                                case 'pickableRange':
 
379
                                                                case 'adjustRangeToDisabled':
 
380
                                                                        this.multiDatesPicker[option] = options[option];
 
381
                                                                        break;
 
382
                                                                //default: $.error('Option ' + option + ' ignored for mode "'.options.mode.'".');
 
383
                                                        }
 
384
                                        break;
 
385
                                        case 'daysRange':
 
386
                                        case 'weeksRange':
 
387
                                                var mandatory = 1;
 
388
                                                for(option in options)
 
389
                                                        switch(option) {
 
390
                                                                case 'autoselectRange':
 
391
                                                                        mandatory--;
 
392
                                                                case 'pickableRange':
 
393
                                                                case 'adjustRangeToDisabled':
 
394
                                                                        this.multiDatesPicker[option] = options[option];
 
395
                                                                        break;
 
396
                                                                //default: $.error('Option ' + option + ' does not exist for setMode on jQuery.multiDatesPicker');
 
397
                                                        }
 
398
                                                if(mandatory > 0) $.error('Some mandatory options not specified!');
 
399
                                        break;
 
400
                                }
 
401
                                
 
402
                                /*
 
403
                                if(options.pickableRange) {
 
404
                                        $this.datepicker("option", "maxDate", options.pickableRange);
 
405
                                        $this.datepicker("option", "minDate", this.multiDatesPicker.minDate);
 
406
                                }
 
407
                                */
 
408
                                
 
409
                                if(mdp_events.onSelect)
 
410
                                        mdp_events.onSelect();
 
411
                        },
 
412
                        destroy: function(){
 
413
                                this.multiDatesPicker = null;
 
414
                                $(this).datepicker('destroy');
 
415
                        }
 
416
                };
 
417
                
 
418
                this.each(function() {
 
419
                        var $this = $(this);
 
420
                        if (!this.multiDatesPicker) {
 
421
                                this.multiDatesPicker = {
 
422
                                        dates: {
 
423
                                                picked: [],
 
424
                                                disabled: []
 
425
                                        },
 
426
                                        mode: 'normal',
 
427
                                        adjustRangeToDisabled: true
 
428
                                };
 
429
                        }
 
430
                        
 
431
                        if(methods[method]) {
 
432
                                var exec_result = methods[method].apply(this, Array.prototype.slice.call(mdp_arguments, 1));
 
433
                                switch(method) {
 
434
                                        case 'removeDates':
 
435
                                        case 'removeIndexes':
 
436
                                        case 'resetDates':
 
437
                                        case 'toggleDate':
 
438
                                        case 'addDates':
 
439
                                                var altField = $this.datepicker('option', 'altField');
 
440
                                                // @todo: should use altFormat for altField
 
441
                                                var dates_string = methods.value.call(this);
 
442
                                                if (altField !== undefined && altField != "") {
 
443
                                                        $(altField).val(dates_string);
 
444
                                                }
 
445
                                                $this.val(dates_string);
 
446
                                                
 
447
                                                $.datepicker._refreshDatepicker(this);
 
448
                                }
 
449
                                switch(method) {
 
450
                                        case 'removeDates':
 
451
                                        case 'getDates':
 
452
                                        case 'gotDate':
 
453
                                        case 'sumDays':
 
454
                                        case 'compareDates':
 
455
                                        case 'dateConvert':
 
456
                                        case 'value':
 
457
                                                ret = exec_result;
 
458
                                }
 
459
                                return exec_result;
 
460
                        } else if( typeof method === 'object' || ! method ) {
 
461
                                return methods.init.apply(this, mdp_arguments);
 
462
                        } else {
 
463
                                $.error('Method ' +  method + ' does not exist on jQuery.multiDatesPicker');
 
464
                        }
 
465
                        return false;
 
466
                }); 
 
467
                
 
468
                return ret;
 
469
        };
 
470
 
 
471
        var PROP_NAME = 'multiDatesPicker';
 
472
        var dpuuid = new Date().getTime();
 
473
        var instActive;
 
474
 
 
475
        $.multiDatesPicker = {version: false};
 
476
        //$.multiDatesPicker = new MultiDatesPicker(); // singleton instance
 
477
        $.multiDatesPicker.initialized = false;
 
478
        $.multiDatesPicker.uuid = new Date().getTime();
 
479
        $.multiDatesPicker.version = $.ui.multiDatesPicker.version;
 
480
        
 
481
        // allows MDP not to hide everytime a date is picked
 
482
        $.multiDatesPicker._hideDatepicker = $.datepicker._hideDatepicker;
 
483
        $.datepicker._hideDatepicker = function(){
 
484
                var target = this._curInst.input[0];
 
485
                var mdp = target.multiDatesPicker;
 
486
                if(!mdp || (this._curInst.inline === false && !mdp.changed)) {
 
487
                        return $.multiDatesPicker._hideDatepicker.apply(this, arguments);
 
488
                } else {
 
489
                        mdp.changed = false;
 
490
                        $.datepicker._refreshDatepicker(target);
 
491
                        return;
 
492
                }
 
493
        };
 
494
 
 
495
        // Workaround for #4055
 
496
        // Add another global to avoid noConflict issues with inline event handlers
 
497
        window['DP_jQuery_' + dpuuid] = $;
 
498
})( jQuery );
 
 
b'\\ No newline at end of file'