1!(function ($) { 2 'use strict'; 3 4 $.fn.pickADate = function (options) { 5 6 var opts = $.extend({ 7 overlay: 'body div#dp-overlay', 8 template: '#caltemp', 9 inline: true, 10 linkedDates: true, 11 selectableDate: jING.Helpers.isExists('_LOCALISATION.date.picker.selectableDate') ? jING.Helpers.isExists.lastValue : false, 12 disabledWeekends: jING.Helpers.isExists('_LOCALISATION.date.picker.disabledWeekends') ? jING.Helpers.isExists.lastValue : true, 13 disabledHolidays: jING.Helpers.isExists('_LOCALISATION.date.picker.disabledHolidays') ? jING.Helpers.isExists.lastValue : false, 14 showOnlyFutureDates: jING.Helpers.isExists('_LOCALISATION.date.picker.showOnlyFutureDates') ? jING.Helpers.isExists.lastValue : false, 15 showOnlyPreviousDates: jING.Helpers.isExists('_LOCALISATION.date.picker.showOnlyPreviousDates') ? jING.Helpers.isExists.lastValue : false, 16 startDate: false, 17 endDate: false, 18 specialDaysCallback: function (o) { } 19 }, options); 20 21 var base = $.pickADate; 22 23 base.overlay = $(opts.overlay); 24 25 if (!base.html) { 26 base.html = $(opts.template).html(); 27 $(opts.template).remove(); 28 } 29 30 return this.each(function () { 31 32 var $input = $(this); 33 34 if ($input.data('pickADate')) { 35 return this; 36 } 37 $input.data('pickADate', true); 38 39 if ($.isMobile) { 40 return $.pickADate.initMobile(this, opts); 41 } 42 43 base.init($input, opts); 44 }); 45 }; 46 $.pickADate = { 47 constants: { 48 WEEKEND: 'weekend', 49 SPECIAL_DAY: 'special-days', 50 OUT_OF_RANGE: 'out-of-range' 51 }, 52 overlay: null, 53 html: null, 54 groups: {}, 55 holidays: [], 56 initMobile: function (input, options) { 57 return $.mobileDate.call(input, options); 58 }, 59 init: function ($input, opts) { 60 61 var base = $.pickADate; 62 63 var id = $input.attr('id') || $input.attr('name'), 64 ID = 'pickADate-' + id, 65 options = $.extend({}, opts), 66 groupName = $input.data('group'), 67 rel = $input.attr('rel'), 68 groupMembers = base.helpers.getGroupMembers(groupName), 69 $dp, $dpw; 70 71 $input.addClass('pickADate date'); 72 73 options = base.getOptions($input, options); 74 75 options.renderCallback = base.renderCallback($input, options); 76 77 if (!rel || rel === '' || rel === null) { 78 rel = 'Select a date'; 79 } 80 81 if ($input.is(':disabled')) { 82 if ($.ie8) { 83 $input.removeProp('disabled') 84 .addClass('dp-active') 85 .prop('disabled', true); 86 } 87 } 88 89 $input.data('options', options) 90 .data('isFirstInit', true) 91 .data('specialDays', options.specialDays); 92 if (!options.editable) $input.attr('readonly', 'true'); 93 94 var html = base.html.replace('__ID__', ID); 95 $input.after(html); 96 97 $dp = $('#' + ID); 98 $dp.attr('data-input-group', groupName) 99 .css({ 100 'top': $input.position().top + $input.outerHeight() + 2, 101 'left': $input.position().left - $dp.outerWidth() + $input.outerWidth() + 10 // - $dp.outerWidth() + $input.outerWidth() + 10 102 }) 103 .on('click', function (e) { 104 e.stopPropagation(); 105 }); 106 107 $dpw = $('.dp-wrapper', $dp); 108 $dpw.data('closeOnSelect', true); 109 110 $input.data('pickAdate', $dpw) 111 .addClass('dp-active'); 112 113 if (!groupMembers || groupMembers.length !== 2) { 114 $('.dp-select-month', $dp).addClass('disabled'); 115 } 116 117 base.bindEvents($input, { 118 $dp: $dp, 119 $dpw: $dpw, 120 id: id, 121 ID: ID, 122 groupMembers: groupMembers 123 }); 124 125 if ($input.val() !== '' && groupMembers) { 126 setTimeout(function () { 127 base.dpObject.initLinkeDates($input, groupMembers); 128 }, 0); 129 } 130 }, 131 getOptions: function ($input, options) { 132 133 var base = $.pickADate; 134 135 options = jING.date.getOptions(options, $input); 136 137 options.isLimited = !!($input.hasClass('limited') || options.showOnlyFutureDates || options.showOnlyPreviousDates || (options.startDate && options.endDate)); 138 139 if (options.isLimited) { 140 141 if (options.showOnlyFutureDates || options.showOnlyPreviousDates) { 142 143 var preDays = 2, 144 nextDays = 2; 145 146 if (options.showOnlyFutureDates) { 147 preDays = 0; 148 nextDays = parseInt(options.showOnlyFutureDates, 10) || 3650; 149 } else if (options.showOnlyPreviousDates) { 150 preDays = parseInt(options.showOnlyPreviousDates, 10) || 3650; 151 nextDays = 0; 152 } 153 154 var startDate = base.helpers.addDays(new Date(), -preDays), 155 endDate = base.helpers.addDays(new Date(), nextDays); 156 157 options.isLimited = [ 158 base.helpers.formatDate(startDate, options.dateFormat), 159 base.helpers.formatDate(endDate, options.dateFormat) 160 ]; 161 162 } else if (options.startDate && options.endDate) { 163 options.isLimited = [ 164 options.startDate, 165 options.endDate 166 ]; 167 } 168 169 $.extend(options, { 170 startDate: options.isLimited[0], 171 endDate: options.isLimited[1], 172 dStartDate: Date.fromString(options.isLimited[0]), 173 dEndDate: Date.fromString(options.isLimited[1]) 174 }); 175 176 options.value = $input.val(); 177 if (options.isLimited) { 178 if (options.value.trim().length > 0) { 179 if (Date.fromString(options.value) < options.dStartDate) { 180 options.value = options.startDate; 181 } else if (Date.fromString(options.value) > options.dEndDate) { 182 options.value = options.endDate; 183 } 184 } 185 } else { 186 if (options.value.trim().length === 0) { 187 options.value = base.helpers.formatDate(new Date(), options.dateFormat); 188 } 189 } 190 } 191 192 return options; 193 }, 194 bindEvents: function ($input, env) { 195 196 var base = $.pickADate, 197 options = $input.data('options'); 198 199 $('body').on('click', function () { 200 base.dpObject.hidePickADate(env.id); 201 }); 202 203 $('.close', env.$dp).on('click', function () { 204 base.dpObject.hidePickADate(env.id); 205 }); 206 207 $input.on('click', function (e) { 208 e.stopPropagation(); 209 210 if ($input.data('isFirstInit')) { 211 base.dpObject.initDatePicker(env.$dpw, $input, env.groupMembers); 212 } 213 214 $('.dp-container').hide(); 215 216 base.overlay.css({ 217 width: $('body').width(), 218 height: $(document).outerHeight() 219 }).fadeIn(50); 220 221 $('#' + env.ID).fadeIn(50); 222
223 env.$dp.css(base.helpers.calculatePos($input, env.$dp)); 224 if (options.onOpen) options.onOpen(); 225 }); 226 227 $input.on('dpSetSpecialDays', function (e, d) { 228 if (d.constructor === Array) { 229 $input.data('specialDays', d); 230 env.$dpw.dpRerenderCalendar(); 231 } 232 }).on('setShowOnlyPreviousDates', function (e) { 233 base.dpObject.setShowOnlyPreviousDates.call(env.$dp); 234 }).on('setShowOnlyFutureDates', function (e) { 235 base.dpObject.setShowOnlyFutureDates.call(env.$dp); 236 }).on('setGroupDateRange', function (e, startDate, endDate) { 237 base.dpObject.setGroupDateRange.call($dp, groupName, startDate, endDate); 238 }).on('setDisabledHolidays', function (e, status) { 239 options.disabledHolidays = status || true; 240 env.$dpw.dpRerenderCalendar(); 241 }).on('setDisabledWeekends', function (e, status) { 242 options.disabledWeekends = status || true; 243 env.$dpw.dpRerenderCalendar(); 244 }).on('dpSetOptions', function (e, opts) { 245 246 e.stopPropagation(); 247 e.preventDefault(); 248 249 $input[0].dpSetOptions(opts); 250 }); 251 252 $('.dp-select-today', env.$dp).on('click', function (e) { 253 254 e.stopPropagation(); 255 e.preventDefault(); 256 257 var d = base.helpers.formatDate(new Date(), options.dateFormat); 258 env.$dpw.dpSetSelected(d); 259 base.dpObject.hidePickADate(env.id); 260 261 return false; 262 }); 263 264 $('.dp-select-month', env.$dp).on('click', function (e) { 265 266 e.stopPropagation(); 267 e.preventDefault(); 268 269 var groupMembers = env.groupMembers; 270 271 if (groupMembers.length === 2) { 272 273 var // i = $input.data('pickAdateIndex'), 274 my = env.$dpw.dpGetDisplayedMonthYear(); 275 276 var monthRange = base.helpers.getMonthRange(my[0], my[1]); 277 278 var dayFirst = base.helpers.formatDate(monthRange.dayFirst, options.dateFormat); 279 var dayLast = base.helpers.formatDate(monthRange.dayLast, options.dateFormat); 280 281 $(groupMembers[0]).data('pickAdate').dpSetSelected(dayFirst); 282 $(groupMembers[1]).data('pickAdate').dpSetSelected(dayLast); 283 284 base.dpObject.hidePickADate(env.id); 285 } 286 287 return false; 288 }); 289 290 $input[0].setDate = function (d) { 291 292 if (typeof this.dp !== 'undefined') { 293 this.dp.dpSetSelected(d); 294 } else { 295 var settings = $input.data('options'); 296 settings.value = d; 297 $input.val(d); 298 $input.trigger('change'); 299 } 300 }; 301 302 $input[0].dpSetOptions = function (opts) { 303 304 var options = $input.data('options'); 305 306 if (opts.startDate) { 307 options.startDate = opts.startDate; 308 options.dStartDate = Date.fromString(opts.startDate), 309 env.$dpw.dpSetStartDate(opts.startDate); 310 env.$dpw.dpRerenderCalendar(); 311 } 312 313 if (opts.endDate) { 314 options.endDate = opts.endDate; 315 options.dEndDate = Date.fromString(opts.endDate); 316 env.$dpw.dpSetEndDate(opts.endDate); 317 env.$dpw.dpRerenderCalendar(); 318 } 319 320 if (opts.selectedDate) { 321 $input[0].setDate(opts.selectedDate); 322 env.$dpw.dpRerenderCalendar(); 323 } 324 325 return $input[0]; 326 }; 327 }, 328 renderCallback: function ($input, options) { 329 330 var base = $.pickADate; 331 332 return function ($td, thisDate, month, year) { 333 334 var sd = $input.data('specialDays'), 335 typeHoliday = false; 336 337 if (options.isLimited) { 338 if (thisDate < options.dStartDate || thisDate > options.dEndDate) { 339 typeHoliday = base.constants.OUT_OF_RANGE; 340 } 341 } 342 343 if (options.disabledWeekends) { 344 var d = thisDate.getDay(); 345 346 if (d === 0 || d === 6) { 347 typeHoliday = base.constants.WEEKEND; 348 } 349 } 350 351 if (options.disabledHolidays && $.inArray(base.helpers.formatDate(thisDate, 'yyyy-mm-dd'), sd) > -1) { 352 typeHoliday = base.constants.SPECIAL_DAY; 353 } 354 355 if (typeHoliday) { 356 357 $td.addClass('disabled ' + typeHoliday); 358 $td.off('click').on('click', function (e) { 359 360 e.stopPropagation(); 361 e.preventDefault(); 362 363 if ($(this).hasClass('disabled') || !$dpw) { 364 return; 365 } 366 367 options.specialDaysCallback.call($dpw, { 368 typeHoliday: typeHoliday, 369 input: $input, 370 td: $td, 371 date: thisDate, 372 month: month, 373 year: year 374 }); 375 376 return false; 377 }); 378 } 379 }; 380 }, 381 dpObject: { 382 _init: function ($dpw, $input, groupMembers) { 383 384 $input.data('isFirstInit', false); 385 386 var base = $.pickADate, 387 settings = $input.data('options'), 388 id = $input.attr('id') || $input.attr('name'); 389 390 $input[0].dp = $dpw; 391 392 $dpw.datePicker(settings) 393 .dpSetSelected(settings.value || $input.val()) 394 .on( 395 'dateSelected', 396 function (event, date, $td, status) { 397 398 $.pickADate.dpObject.onDateSelect($input, date, groupMembers); 399 400 if ($dpw.data('closeOnSelect')) { 401 settings = $(this).data('option'); 402 $.pickADate.dpObject.hidePickADate(id); 403 } 404 } 405 ); 406 407 if (!settings.value) { 408 try { 409 var s = base.helpers.fromString(settings.startDate) || Date.fromString(settings.startDate); 410 if (s) { 411 $dpw.dpSetDisplayedMonth(s.getMonth(), s.getFullYear()); 412 } 413 } catch (e) { } 414 } 415 }, 416 initLinkeDates: function ($input, groupMembers) { 417 418 var linkedDates = $input.data('options').linkedDates; 419 420 if (!linkedDates || (groupMembers.length !== 2)) { 421 return; 422 } 423 424 var d = Date.fromString($input.val()); 425 426 if ($input.data('pickAdateIndex') === 0) { 427 $(groupMembers[1]).data('datePickerOnInit', { 428 startDate: d.asString() 429 }); 430 } else {
431 $(groupMembers[0]).data('datePickerOnInit', { 432 endDate: d.asString() 433 }); 434 } 435 }, 436 onDateSelect: function ($input, date, groupMembers) { 437 438 var linkedDates = $input.data('options').linkedDates, 439 d = date; 440 441 if (d) { 442 d = new Date(d); 443 444 if ($input.val() !== d.asString()) { 445 $input.val(d.asString()); 446 $input.trigger('change'); 447 } 448 449 if (linkedDates && groupMembers && groupMembers.length === 2) { 450 if ($input.data('pickAdateIndex') === 0) { 451 // Start Date 452 $(groupMembers[1]).data('pickAdate').dpSetStartDate(d.asString()); 453 $(groupMembers[1]).data('pickAdate').dpRerenderCalendar(); 454 } else { 455 // End Date 456 $(groupMembers[0]).data('pickAdate').dpSetEndDate(d.asString()); 457 $(groupMembers[0]).data('pickAdate').dpRerenderCalendar(); 458 } 459 } 460 } 461 }, 462 initDatePicker: function ($dpw, $input, groupMembers) { 463 464 if (!groupMembers) { 465 $.pickADate.dpObject._init($dpw, $input, groupMembers); 466 } else { 467 $.each(groupMembers, function () { 468 469 var $el = $(this), 470 $dpw = $el.data('pickAdate'), 471 onInit = $el.data('datePickerOnInit'); 472 473 $.pickADate.dpObject._init($dpw, $el, groupMembers); 474 475 if (onInit) { 476 if (onInit.startDate) { 477 $dpw.dpSetStartDate(onInit.startDate); 478 } 479 if (onInit.endDate) { 480 $dpw.dpSetEndDate(onInit.endDate); 481 } 482 $dpw.dpRerenderCalendar(); 483 484 $el.removeData('datePickerOnInit'); 485 } 486 }); 487 } 488 }, 489 hidePickADate: function (id) { 490 $('#pickADate-' + id).hide(); 491 $.pickADate.overlay.hide(); 492 }, 493 setGroupDateRange: function (groupName, startDate, endDate) { 494 495 var members = $.pickADate.helpers.getGroupMembers(groupName), 496 $dp; 497 498 endDate = endDate || '31/12/2999'; 499 500 if (members.length > 0) { 501 502 startDate = Date.fromString(startDate); 503 endDate = Date.fromString(endDate); 504 505 $.each(members, function (i, v) { 506 $dp = $(v).data('pickAdate'); 507 $dp.dpSetStartDate(startDate); 508 $dp.dpSetEndDate(endDate); 509 $dp.dpRerenderCalendar(); 510 }); 511 } 512 }, 513 setShowOnlyPreviousDates: function () { 514 $.pickADate.dpObject.setGroupDateRange(this.data('input-group'), '01/01/1970', (new Date()).asString()); 515 }, 516 setShowOnlyFutureDates: function () { 517 $.pickADate.dpObject.setGroupDateRange(this.data('input-group'), (new Date()).asString(), false); 518 } 519 }, 520 helpers: { 521 calculatePos: function ($input, $dp) { 522 523 var arrow = { 524 obj: $('.dp-arrow:first', $dp), 525 pos: parseInt($('.dp-arrow:first', $dp).css('right'), 10) 526 }; 527 528 var data = arrow.obj.data(); 529 if (!data.pos) { 530 data.pos = parseInt(arrow.obj.css('right'), 10); 531 arrow.obj.data('pos', data.pos); 532 } 533 534 var position = { 535 'top': $input.position().top + $input.outerHeight() + 4, 536 'left': $input.position().left - $dp.outerWidth() + $input.outerWidth() + 10 537 }; 538 539 var diffY = $input.offset().top + $input.outerHeight() + $dp.outerHeight() - $(window).height() - $(window).scrollTop(); 540 if (diffY > 0) { 541 diffY += 10; 542 $(window).scrollTo('+=' + diffY + 'px', 500); 543 } 544 545 var diffX = position.left; 546 if (diffX < 0) { 547 position.left = 0; 548 diffX = -diffX + data.pos; 549 arrow.obj.css('right', diffX + 'px'); 550 } 551 552 return position; 553 }, 554 formatDate: function (d, f) { 555 556 f = f || Date.format || _LOCALISATION.date.formats.def; 557 558 var currDate = d.getDate(), 559 currMonth = d.getMonth() + 1, 560 currYear = d.getFullYear(); 561 562 var currDate2 = currDate.toString().length < 2 ? '0' + currDate : currDate, 563 currMonth2 = currMonth.toString().length < 2 ? '0' + currMonth : currMonth; 564 565 return f.replace('yyyy', currYear) 566 .replace('dd', currDate2) 567 .replace('mmmm', Date.monthNames[currMonth]) 568 .replace('mm', currMonth2) 569 .replace('d', currDate) 570 .replace('m', currMonth); 571 }, 572 fromString: function (st, f, d) { 573 574 f = f || _LOCALISATION.date.formats.mobile; 575 576 var date = d || null; 577 578 if (st && st !== '') { 579 date = Date.fromString(st, f); 580 } 581 582 return date; 583 }, 584 addDays: function (d, days) { 585 586 days = parseInt(days, 10); 587 588 return new Date(d.getTime() + (days * 86400000)); 589 }, 590 getMonthRange: function (m, y) { 591 592 m = m || 10; 593 y = y || 2012; 594 595 var dayFirst = new Date(y, m, 1), 596 dayLast = new Date(y, m + 1, 0); 597 598 return { 599 'dayFirst': dayFirst, 600 'dayLast': dayLast 601 }; 602 }, 603 getGroupMembers: function (groupName) { 604 605 if (typeof groupName === 'undefined' || !groupName) { 606 return null; 607 } 608 609 if (typeof $.pickADate.groups[groupName] !== 'undefined') { 610 return $.pickADate.groups[groupName]; 611 } 612 613 var _members = $('input[data-group="' + groupName + '"]'), 614 members = []; 615 616 if (_members.length < 1) { 617 members = []; 618 } else { 619 _members.each(function (i, v) { 620 // var index = $(v).attr('data-pickADateIndex') || i; 621 $(v).data('pickAdateIndex', i); 622 members[i] = v; 623 }); 624 } 625 626 $.pickADate.groups[groupName] = members; 627 628 return members; 629 }, 630 isHoliday: function (d, holidays, weekends) { 631 632 weekends = weekends || true; 633 634 var isHoliday = holidays.indexOf($.pickADate.helpers.formatDate(d, 'yyyy-mm-dd')) > -1; 635 636 if (weekends) { 637 var day = d.getDay(); 638 isHoliday = isHoliday || !(day > 0 && day < 6); 639 } 640 641 return isHoliday; 642 }, 643 getNextWorkingDate: function (date, holidays) { 644 645 var nextDay = date, 646 c = 15, 647 calc = false, 648 // day, 649 preDate, isHoliday; 650 651 do { 652 preDate = date; 653 date = nextDay; 654 nextDay = new Date(date.getTime() + 86400000); 655 isHoliday = $.pickADate.helpers.isHoliday(date, holidays) || $.pickADate.helpers.isHoliday(nextDay, holidays);
656 657 if (!calc && isHoliday) { 658 calc = true; 659 } 660 } while (c-- > 0 && isHoliday); 661 662 if (calc) { 663 date = preDate; 664 } 665 666 return date; 667 } 668 } 669 }; 670 671})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.