| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 | (function ($) {Drupal.behaviors.dateSelect = {};Drupal.behaviors.dateSelect.attach = function (context, settings) {  var $widget = $('.form-type-date-select').parents('fieldset').once('date');  var i;  for (i = 0; i < $widget.length; i++) {    new Drupal.date.EndDateHandler($widget[i]);  }};Drupal.date = Drupal.date || {};/** * Constructor for the EndDateHandler object. * * The EndDateHandler is responsible for synchronizing a date select widget's * end date with its start date. This behavior lasts until the user * interacts with the end date widget. * * @param widget *   The fieldset DOM element containing the from and to dates. */Drupal.date.EndDateHandler = function (widget) {  this.$widget = $(widget);  this.$start = this.$widget.find('.form-type-date-select[class$=value]');  this.$end = this.$widget.find('.form-type-date-select[class$=value2]');  if (this.$end.length === 0) {    return;  }  this.initializeSelects();  // Only act on date fields where the end date is completely blank or already  // the same as the start date. Otherwise, we do not want to override whatever  // the default value was.  if (this.endDateIsBlank() || this.endDateIsSame()) {    this.bindClickHandlers();    // Start out with identical start and end dates.    this.syncEndDate();  }};/** * Store all the select dropdowns in an array on the object, for later use. */Drupal.date.EndDateHandler.prototype.initializeSelects = function () {  var $starts = this.$start.find('select');  var $end, $start, endId, i, id;  this.selects = {};  for (i = 0; i < $starts.length; i++) {    $start = $($starts[i]);    id = $start.attr('id');    endId = id.replace('-value-', '-value2-');    $end = $('#' + endId);    this.selects[id] = {      'id': id,      'start': $start,      'end': $end    };  }};/** * Returns true if all dropdowns in the end date widget are blank. */Drupal.date.EndDateHandler.prototype.endDateIsBlank = function () {  var id;  for (id in this.selects) {    if (this.selects.hasOwnProperty(id)) {      if (this.selects[id].end.val() !== '') {        return false;      }    }  }  return true;};/** * Returns true if the end date widget has the same value as the start date. */Drupal.date.EndDateHandler.prototype.endDateIsSame = function () {  var id;  for (id in this.selects) {    if (this.selects.hasOwnProperty(id)) {      if (this.selects[id].end.val() != this.selects[id].start.val()) {        return false;      }    }  }  return true;};/** * Add a click handler to each of the start date's select dropdowns. */Drupal.date.EndDateHandler.prototype.bindClickHandlers = function () {  var id;  for (id in this.selects) {    if (this.selects.hasOwnProperty(id)) {      this.selects[id].start.bind('click.endDateHandler', this.startClickHandler.bind(this));      this.selects[id].end.bind('focus', this.endFocusHandler.bind(this));    }  }};/** * Click event handler for each of the start date's select dropdowns. */Drupal.date.EndDateHandler.prototype.startClickHandler = function (event) {  this.syncEndDate();};/** * Focus event handler for each of the end date's select dropdowns. */Drupal.date.EndDateHandler.prototype.endFocusHandler = function (event) {  var id;  for (id in this.selects) {    if (this.selects.hasOwnProperty(id)) {      this.selects[id].start.unbind('click.endDateHandler');    }  }  $(event.target).unbind('focus', this.endFocusHandler);};Drupal.date.EndDateHandler.prototype.syncEndDate = function () {  var id;  for (id in this.selects) {    if (this.selects.hasOwnProperty(id)) {      this.selects[id].end.val(this.selects[id].start.val());    }  }};}(jQuery));/** * Function.prototype.bind polyfill for older browsers. * https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind */if (!Function.prototype.bind) {  Function.prototype.bind = function (oThis) {    if (typeof this !== "function") // closest thing possible to the ECMAScript 5 internal IsCallable function      throw new TypeError("Function.prototype.bind - what is trying to be fBound is not callable");    var aArgs = Array.prototype.slice.call(arguments, 1),        fToBind = this,        fNOP = function () {},        fBound = function () {          return fToBind.apply(this instanceof fNOP ? this : oThis || window, aArgs.concat(Array.prototype.slice.call(arguments)));        };    fNOP.prototype = this.prototype;    fBound.prototype = new fNOP();    return fBound;  };}
 |