~widelands-dev/widelands-website/django_staticfiles

« back to all changes in this revision

Viewing changes to wlscheduling/static/js/jquery-ui.multidatespicker.js

  • Committer: Holger Rapp
  • Date: 2009-02-20 12:25:18 UTC
  • Revision ID: holgerrapp@gmx.net-20090220122518-feaq34ta973snnct
Imported wikiapp into our repository, because we did some local changes (users must be logged in to edit wiki pages)

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'