Projet

Général

Profil

Paste
Télécharger (21,3 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / shs / js / shs.js @ 98a362c2

1 85ad3d82 Assos Assos
/**
2
 * @file
3
 * Custom behaviors for Simple hierarchical select.
4
 */
5
6 98a362c2 Assos Assos
(function ($, Drupal) {
7 85ad3d82 Assos Assos
8
  /**
9
   * Creates the widget for Simple hierarchical select.
10
   */
11
  Drupal.behaviors.shsWidgetCreate = {
12
13
    // Default function to attach the behavior.
14
    attach: function (context, settings) {
15
      var self = this;
16 98a362c2 Assos Assos
      var settingsDefault = {
17
        display: {
18
          animationSpeed: 400,
19
        }
20
      };
21
      $('select.shs-enabled:not([disabled])')
22 85ad3d82 Assos Assos
        .once('shs')
23
        .addClass('element-invisible')
24 98a362c2 Assos Assos
        .hide()
25 85ad3d82 Assos Assos
        .each(function() {
26 98a362c2 Assos Assos
          $field = $(this);
27 85ad3d82 Assos Assos
          var fieldName = $(this).attr('name');
28 98a362c2 Assos Assos
          // Multiform messes up the names of the fields
29
          // to the format multiform[something][fieldname][...].
30
          if (fieldName.indexOf('multiform') == 0) {
31
            var split = fieldName.split('][');
32
            split.splice(0, 1);
33
            fieldName = split.splice(0, 1) + '[' + split.join('][');
34
          }
35 85ad3d82 Assos Assos
36
          if (fieldName in settings.shs) {
37
            var fieldSettings = {};
38
            // Since we store the field settings within an associative array with
39
            // random strings as keys (reason: http://drupal.org/node/208611) we
40
            // need to get the last setting for this field.
41
            $.each(settings.shs[fieldName], function(hash, setting) {
42
              fieldSettings = setting;
43
            });
44 98a362c2 Assos Assos
            fieldSettings = $.extend({}, fieldSettings, settingsDefault, {
45
              fieldName: fieldName
46
            });
47 85ad3d82 Assos Assos
            var level = 0;
48
            var parent_id = 0;
49
            // Update class of wrapper element.
50
            $field.parent('.form-item').not('.shs-wrapper-processed').once('shs-wrapper');
51
            // Create elements for each parent of the current value.
52
            $.each(fieldSettings.parents, function(index, parent) {
53
              level++;
54
              // Create select element.
55
              $select = shsElementCreate($field.attr('id'), fieldSettings, level);
56
              if ($field.hasClass('error')) {
57
                // Add error-class if there was an error with the original field.
58
                $select.addClass('error');
59
              }
60 98a362c2 Assos Assos
              // Add label to dropdown.
61
              $label = shsLabelCreate($field.attr('id'), fieldSettings, level);
62
              if ($label !== false) {
63
                $label.appendTo($field.parent());
64
              }
65 85ad3d82 Assos Assos
              $select.appendTo($field.parent());
66
              // Retrieve data for this level.
67
              getTermChildren($select, fieldSettings, parent_id, parent.tid, $field.attr('id'));
68
              // Use current term id as parent id for the next level.
69
              if (fieldSettings.multiple) {
70
                parent_id = parent['tid'];
71
              }
72
              else {
73
                parent_id = parent.tid;
74
              }
75
            });
76
            var addNextLevel = false;
77 98a362c2 Assos Assos
            if ((level > 1 || parent_id) && ((fieldSettings.settings.create_new_terms && fieldSettings.settings.create_new_levels) || fieldSettings.settings.test_create_new_levels)) {
78 85ad3d82 Assos Assos
              // Add next level in hierarchy if new levels may be created.
79
              addNextLevel = true;
80
            }
81 98a362c2 Assos Assos
            if (fieldSettings.default_value && (fieldSettings.default_value === parent_id) && (fieldSettings.default_value !== '')) {
82 85ad3d82 Assos Assos
              addNextLevel = true;
83
            }
84
            if (addNextLevel) {
85 98a362c2 Assos Assos
              // Add label to dropdown.
86
              $label = shsLabelCreate($field.attr('id'), fieldSettings, level);
87
              if ($label !== false) {
88
                $label.appendTo($field.parent());
89
              }
90 85ad3d82 Assos Assos
              // Try to add one additional level.
91 98a362c2 Assos Assos
              $select = shsElementCreate($field.attr('id'), fieldSettings, ++level);
92 85ad3d82 Assos Assos
              $select.appendTo($field.parent());
93
              // Retrieve data for this level.
94
              getTermChildren($select, fieldSettings, parent_id, 0, $field.attr('id'));
95
            }
96
          }
97
        });
98
    }
99
  }
100
101
  /**
102
   * Load direct children of a selected term.
103
   *
104
   * @param $element
105
   *   Element to fill with terms.
106
   * @param settings
107
   *   Field settings.
108
   * @param parent_value
109
    *   Value which has been selected in the parent element (== "selected term").
110
    * @param default_value
111
    *   Value to use as default.
112
    * @param base_id
113
    *   ID of original field which is rewritten as "taxonomy_shs".
114
    */
115
  getTermChildren = function($element, settings, parent_value, default_value, base_id) {
116
    // Check if parent_value is number and convert it.
117
    if (!$.isArray(parent_value) && typeof parent_value != "object") {
118
      parent_value = [parent_value];
119
    }
120
121
    $.ajax({
122 98a362c2 Assos Assos
      url: Drupal.settings.basePath + '?q=' + Drupal.settings.pathPrefix + 'js/shs/json',
123 85ad3d82 Assos Assos
      type: 'POST',
124
      dataType: 'json',
125
      cache: true,
126
      data: {
127
        callback: 'shs_json_term_get_children',
128
        arguments: {
129
          vid: settings.vid,
130
          parent: parent_value,
131 98a362c2 Assos Assos
          settings: settings.settings,
132
          field: settings.fieldName
133 85ad3d82 Assos Assos
        }
134
      },
135
      success: function(data) {
136
        if (data.success == true) {
137
          if ($element.prop) {
138
            var options = $element.prop('options');
139
          }
140
          else {
141
            var options = $element.attr('options');
142
          }
143
144 98a362c2 Assos Assos
          if (((data.data.length == 0) || ((data.data.length == 1 && !data.data[0].tid))) && !(settings.settings.create_new_terms && (settings.settings.create_new_levels || (parent_value[0] == settings.any_value && default_value == 0)))) {
145 85ad3d82 Assos Assos
            // Remove element.
146 98a362c2 Assos Assos
            $element.prev('label').remove();
147 85ad3d82 Assos Assos
            $element.remove();
148
            return;
149
          }
150
151
          // Remove all existing options.
152
          $('option', $element).remove();
153 98a362c2 Assos Assos
          // Add empty option (if field is not required or this is not the
154
          // first level.
155
          if (!settings.settings.required || (settings.settings.required && (default_value === 0 || parent_value !== 0))) {
156
            options[options.length] = new Option(settings.any_label, settings.any_value);
157 85ad3d82 Assos Assos
          }
158
159
          // Add retrieved list of options.
160
          $.each(data.data, function(key, term) {
161 98a362c2 Assos Assos
            if (term.vid && settings.settings.create_new_terms) {
162
              // Add option to add new item.
163
              options[options.length] = new Option(Drupal.t('<Add new item>', {}, {context: 'shs'}), '_add_new_');
164
            }
165
            else if (term.tid) {
166
              option = new Option(term.label, term.tid);
167
              options[options.length] = option;
168
              if (term.has_children) {
169
                option.setAttribute("class", "has-children");
170
              }
171
            }
172 85ad3d82 Assos Assos
          });
173
          // Set default value.
174
          $element.val(default_value);
175 98a362c2 Assos Assos
          if (0 === default_value) {
176
            $element.val(settings.any_value);
177
          }
178 85ad3d82 Assos Assos
179
          // Try to convert the element to a "Chosen" element.
180
          if (!elementConvertToChosen($element, settings)) {
181
            // Display original dropdown element.
182 98a362c2 Assos Assos
            $element.fadeIn(settings.display.animationSpeed);
183 85ad3d82 Assos Assos
            $element.css('display','inline-block');
184
          }
185 98a362c2 Assos Assos
          else {
186
            $element.trigger('chosen:updated');
187
          }
188 85ad3d82 Assos Assos
189
          // If there is no data, the field is required and the user is allowed
190
          // to add new terms, trigger click on "Add new".
191 98a362c2 Assos Assos
          if (data.data.length == 0 && settings.settings.required && settings.settings.create_new_terms && (settings.settings.create_new_levels || (parent_value[0] == settings.any_value && default_value == 0))) {
192 85ad3d82 Assos Assos
            updateElements($element, base_id, settings, 1);
193
          }
194
        }
195
      },
196
      error: function(xhr, status, error) {
197
      }
198
    });
199
  }
200
201
  /**
202
   * Add a new term to database.
203
   *
204
   * @param $triggering_element
205
   *   Element to add the new term to.
206
   * @param $container
207
   *   Container for "Add new" elements.
208
   * @param term
209
   *   The new term object.
210
   * @param base_id
211
   *   ID of original field which is rewritten as "taxonomy_shs".
212
   * @param level
213
   *   Current level in hierarchy.
214 98a362c2 Assos Assos
   * @param settings
215
   *   Field settings.
216 85ad3d82 Assos Assos
   */
217 98a362c2 Assos Assos
  termAddNew = function($triggering_element, $container, term, base_id, level, settings) {
218 85ad3d82 Assos Assos
    $.ajax({
219 98a362c2 Assos Assos
      url: Drupal.settings.basePath + '?q=' + Drupal.settings.pathPrefix + 'js/shs/json',
220 85ad3d82 Assos Assos
      type: 'POST',
221
      dataType: 'json',
222
      cache: true,
223
      data: {
224
        callback: 'shs_json_term_add',
225
        arguments: {
226
          vid: term.vid,
227
          parent: term.parent,
228 98a362c2 Assos Assos
          name: term.name,
229
          field: settings.fieldName
230 85ad3d82 Assos Assos
        }
231
      },
232
      success: function(data) {
233
        if (data.success == true && data.data.tid) {
234
          if ($triggering_element.prop) {
235
            var options = $triggering_element.prop('options');
236
          }
237
          else {
238
            var options = $triggering_element.attr('options');
239
          }
240
241
          // Add new option with data from created term.
242
          options[options.length] = new Option(data.data.name, data.data.tid);
243
          // Set new default value.
244
          $triggering_element.val(data.data.tid);
245
          // Set value of original field.
246 98a362c2 Assos Assos
          updateFieldValue($triggering_element, base_id, level, settings);
247
          // Add new child element if adding new levels is allowed.
248
          if (settings.settings.create_new_levels) {
249
            $element_new = shsElementCreate(base_id, settings, level + 1);
250
            $element_new.appendTo($triggering_element.parent());
251
            if ($element_new.prop) {
252
              var options_new = $element_new.prop('options');
253
            }
254
            else {
255
              var options_new = $element_new.attr('options');
256
            }
257
            // Add "none" option.
258
            options_new[options_new.length] = new Option(settings.any_label, settings.any_value);
259
            if (settings.settings.create_new_terms) {
260
              // Add option to add new item.
261
              options_new[options_new.length] = new Option(Drupal.t('<Add new item>', {}, {context: 'shs'}), '_add_new_');
262
            }
263
            // Try to convert the element to a "Chosen" element.
264
            if (!elementConvertToChosen($element_new, settings)) {
265
              // Display original dropdown element.
266
              $element_new.fadeIn(settings.display.animationSpeed);
267
              $element_new.css('display','inline-block');
268
            }
269
          }
270 85ad3d82 Assos Assos
        }
271
      },
272
      error: function(xhr, status, error) {
273
        // Reset value of triggering element.
274
        $triggering_element.val(0);
275
      },
276
      complete: function(xhr, status) {
277
        // Remove container.
278 98a362c2 Assos Assos
        $container.prev('label').remove();
279 85ad3d82 Assos Assos
        $container.remove();
280
        // Display triggering element.
281 98a362c2 Assos Assos
        $triggering_element.fadeIn(settings.display.animationSpeed);
282 85ad3d82 Assos Assos
        $triggering_element.css('display','inline-block');
283 98a362c2 Assos Assos
        $triggering_element.trigger('change');
284 85ad3d82 Assos Assos
      }
285
    });
286
  }
287
288
  /**
289
   * Update the changed element.
290
   *
291
   * @param $triggering_element
292
   *   Element which has been changed.
293
   * @param base_id
294
   *   ID of original field which is rewritten as "taxonomy_shs".
295
   * @param settings
296
   *   Field settings.
297
   * @param level
298
   *   Current level in hierarchy.
299
   */
300
  updateElements = function($triggering_element, base_id, settings, level) {
301
    // Remove all following elements.
302
    $triggering_element.nextAll('select').each(function() {
303
      if (Drupal.settings.chosen) {
304
        // Remove element created by chosen.
305
        var elem_id = $(this).attr('id');
306 98a362c2 Assos Assos
        $element_chosen = $('#' + elem_id.replace(/-/g, '_') + '_chosen');
307
        if ($element_chosen) {
308
          $element_chosen.prev('label').remove();
309
          $element_chosen.remove();
310
        }
311 85ad3d82 Assos Assos
      }
312
      // Remove element.
313 98a362c2 Assos Assos
      $(this).prev('label').remove();
314 85ad3d82 Assos Assos
      $(this).remove();
315
    });
316
    $triggering_element.nextAll('.shs-term-add-new-wrapper').remove();
317
    // Create next level (if the value is != 0).
318
    if ($triggering_element.val() == '_add_new_') {
319
      // Hide element.
320
      $triggering_element.hide();
321 98a362c2 Assos Assos
      if (Drupal.settings.chosen) {
322
        // Remove element created by chosen.
323
        var elem_id = $triggering_element.attr('id');
324
        $('#' + elem_id.replace(/-/g, '_') + '_chosen').remove();
325
      }
326 85ad3d82 Assos Assos
      // Create new container with textfield and buttons ("cancel", "save").
327
      $container = $('<div>')
328
        .addClass('shs-term-add-new-wrapper')
329
        .addClass('clearfix');
330
      // Append container to parent.
331
      $container.appendTo($triggering_element.parent());
332
333
      // Add textfield for term name.
334
      $nameField = $('<input type="text">')
335
        .attr('maxlength', 255)
336
        .attr('size', 10)
337
        .addClass('shs-term-name')
338
        .addClass('form-text');
339
      $nameField.appendTo($container);
340
341
      // Add buttons.
342
      $buttons = $('<div>')
343
        .addClass('buttons');
344
      $buttons.appendTo($container);
345
      $cancel = $('<a>')
346
        .attr('href', '#')
347
        .html(Drupal.t('Cancel'))
348
        .bind('click', function(event) {
349
          event.preventDefault();
350
          // Remove container.
351 98a362c2 Assos Assos
          $container.prev('label').remove();
352 85ad3d82 Assos Assos
          $container.remove();
353
          // Reset value of triggering element.
354 98a362c2 Assos Assos
          $triggering_element.val(settings.settings.any_value);
355
356
          if (!elementConvertToChosen($triggering_element, settings)) {
357
            // Display triggering element.
358
            $triggering_element.fadeIn(settings.display.animationSpeed);
359
            $triggering_element.css('display','inline-block');
360
          }
361 85ad3d82 Assos Assos
        });
362
      $cancel.appendTo($buttons);
363
      if (level == 1 && settings.settings.required && $('option', $triggering_element).length == 1) {
364
        // Hide cancel button since the term selection is empty (apart from
365
        // "Add new term") and the field is required.
366
        $cancel.hide();
367
      }
368
369
      $save = $('<a>')
370
        .attr('href', '#')
371
        .html(Drupal.t('Save'))
372
        .bind('click', function(event) {
373
          event.preventDefault();
374
          // Get the new term name.
375
          var termName = $(this).parents('.shs-term-add-new-wrapper').find('input.shs-term-name').val();
376
          // Create a term object.
377
          var term = {
378
            vid: settings.vid,
379 98a362c2 Assos Assos
            parent: (level === 1) ? 0 : ($triggering_element.prevAll('.shs-select').val() || 0),
380 85ad3d82 Assos Assos
            name: termName
381
          };
382
          if (termName.length > 0) {
383 98a362c2 Assos Assos
            termAddNew($triggering_element, $container, term, base_id, level, settings);
384 85ad3d82 Assos Assos
          }
385
          else {
386
            // Remove container.
387 98a362c2 Assos Assos
            $container.prev('label').remove();
388 85ad3d82 Assos Assos
            $container.remove();
389
            // Reset value of triggering element.
390
            $triggering_element.val(0);
391
            // Display triggering element.
392 98a362c2 Assos Assos
            $triggering_element.fadeIn(settings.display.animationSpeed);
393
            $triggering_element.css('display', 'inline-block');;
394 85ad3d82 Assos Assos
          }
395
        });
396
      $save.appendTo($buttons);
397
    }
398 98a362c2 Assos Assos
    else if ($triggering_element.val() != 0 && $triggering_element.val() != settings.any_value) {
399 85ad3d82 Assos Assos
      level++;
400 98a362c2 Assos Assos
      $label = shsLabelCreate(base_id, settings, level);
401
      if ($label !== false) {
402
        $label.appendTo($triggering_element.parent());
403
      }
404 85ad3d82 Assos Assos
      $element_new = shsElementCreate(base_id, settings, level);
405
      $element_new.appendTo($triggering_element.parent());
406
      // Retrieve list of items for the new element.
407
      getTermChildren($element_new, settings, $triggering_element.val(), 0, base_id);
408
    }
409
410
    // Set value of original field.
411 98a362c2 Assos Assos
    updateFieldValue($triggering_element, base_id, level, settings);
412 85ad3d82 Assos Assos
  }
413
414
  /**
415
   * Create a new <select> element.
416
   *
417
   * @param base_id
418
   *   ID of original field which is rewritten as "taxonomy_shs".
419
   * @param settings
420
   *   Field settings.
421
   * @param level
422
   *   Current level in hierarchy.
423
   *
424
   * @return
425
   *   The new (empty) <select> element.
426
   */
427
  shsElementCreate = function(base_id, settings, level) {
428
    // Create element and initially hide it.
429 98a362c2 Assos Assos
    $element = $('<select>')
430
      .attr('id', base_id + '-select-' + level)
431
      .addClass('shs-select')
432
      // Add core class to apply default styles to the element.
433
      .addClass('form-select')
434
      .addClass('shs-select-level-' + level)
435
      .bind('change', function() {
436
        updateElements($(this), base_id, settings, level);
437
      })
438
      .hide();
439 85ad3d82 Assos Assos
    if (settings.multiple) {
440 98a362c2 Assos Assos
      $element.attr('multiple', 'multiple')
441 85ad3d82 Assos Assos
    }
442 98a362c2 Assos Assos
    if (settings.settings.hasOwnProperty('required') && settings.settings.required) {
443
      $element.addClass('required');
444 85ad3d82 Assos Assos
    }
445
    // Return the new element.
446
    return $element;
447
  }
448
449 98a362c2 Assos Assos
  /**
450
   * Create label for dropdown in hierarchy.
451
   *
452
   * @param base_id
453
   *   ID of original field which is rewritten as "taxonomy_shs".
454
   * @param settings
455
   *   Field settings.
456
   * @param level
457
   *   Current level in hierarchy.
458
   *
459
   * @return
460
   *   The new <label> element or false if no label should be created.
461
   */
462
  shsLabelCreate = function(base_id, settings, level) {
463
    var labelKey = level - 1;
464
    if (!settings.hasOwnProperty('labels')) {
465
      return false;
466
    }
467
    if (!settings.labels.hasOwnProperty(labelKey) || settings.labels[labelKey] === false) {
468
      return false;
469
    }
470
    // Create element.
471
    $element = $('<label>')
472
      .attr('for', base_id + '-select-' + level)
473
      .addClass('element-invisible')
474
      .html(settings.labels[labelKey]);
475
    // Return the new element.
476
    return $element;
477
  }
478
479 85ad3d82 Assos Assos
  /**
480
   * Update value of original (hidden) field.
481
   *
482
   * @param $triggering_element
483
   *   Element which has been changed.
484
   * @param base_id
485
   *   ID of original field which is rewritten as "taxonomy_shs".
486
   * @param level
487
   *   Current level in hierarchy.
488 98a362c2 Assos Assos
   * @param settings
489
   *   Field settings.
490 85ad3d82 Assos Assos
   */
491 98a362c2 Assos Assos
  updateFieldValue = function($triggering_element, base_id, level, settings) {
492 85ad3d82 Assos Assos
    // Reset value of original field.
493
    $field_orig = $('#' + base_id);
494 98a362c2 Assos Assos
    $field_orig.val(settings.any_value);
495 85ad3d82 Assos Assos
    // Set original field value.
496 98a362c2 Assos Assos
    if ($triggering_element.val() === settings.any_value || $triggering_element.val() == '_add_new_') {
497
      if ($triggering_element.prev('select').length) {
498 85ad3d82 Assos Assos
        // Use value from parent level.
499
        $field_orig.val($triggering_element.prev('select').val());
500
      }
501
    }
502
    else {
503
      var new_val = $triggering_element.val();
504 98a362c2 Assos Assos
      if (level > 1 && settings.multiple) {
505 85ad3d82 Assos Assos
        var new_value = '';
506
        for (i = 0; i < level - 1; i++) {
507
          var prev_value = $('.shs-select:eq(' + i + ')').val();
508
          if (i == 0) {
509
            new_value = prev_value;
510
          }
511
          else {
512
            new_value = new_value + '+' + prev_value;
513
          }
514
        }
515
        new_val = new_value;
516
      }
517
      // Use value from current field.
518
      if ($.isArray(new_val)) {
519
        $field_orig.val(new_val.join(','));
520
      }
521
      else {
522 98a362c2 Assos Assos
        if ($field_orig.children('option[value="' + new_val + '"]').length > 0) {
523
          // Value exists.
524
          $field_orig.val(new_val);
525
        }
526
        else {
527
          // We need to append the new option.
528
          if ($field_orig.prop) {
529
            var options = $field_orig.prop('options');
530
          }
531
          else {
532
            var options = $field_orig.attr('options');
533
          }
534
          options[options.length] = new Option(new_val, new_val);
535
          $field_orig.val(new_val);
536
        }
537 85ad3d82 Assos Assos
      }
538
    }
539 98a362c2 Assos Assos
    // Notify listeners about the change in the original select.
540
    $field_orig.trigger({
541
      type: 'change',
542
      shs: {
543
        triggeringElement: $triggering_element,
544
        level: level,
545
        settings: settings,
546
        value: $triggering_element.val()
547
      }
548
    });
549 85ad3d82 Assos Assos
  }
550
551
  /**
552
   * Convert a dropdown to a "Chosen" element.
553
   *
554
   * @see http://drupal.org/project/chosen
555
   */
556
  elementConvertToChosen = function($element, settings) {
557 98a362c2 Assos Assos
    // Returns false if chosen is not available or its settings are undefined.
558
    if ($.fn.chosen === void 0 || !Drupal.settings.hasOwnProperty('chosen') || Drupal.settings.chosen === void 0) {
559
      return false;
560
    }
561
562
    var name = $element.attr('name');
563
    settings.chosen = settings.chosen || Drupal.settings.chosen;
564
    var minWidth = settings.chosen.minimum_width;
565
    var multiple = Drupal.settings.chosen.multiple;
566
    var maxSelectedOptions = Drupal.settings.chosen.max_selected_options;
567
568
    // Define options.
569
    var options = {
570
      inherit_select_classes: true
571
    };
572
573
    var minimum = multiple && multiple[name] ? settings.chosen.minimum_multiple : settings.chosen.minimum_single;
574
575
    if (maxSelectedOptions && maxSelectedOptions[name]) {
576
      options.max_selected_options = maxSelectedOptions[name];
577 85ad3d82 Assos Assos
    }
578 98a362c2 Assos Assos
579
    // Merges the user defined settings for chosen.
580
    options = $.extend(options, settings.chosen);
581
582
    // Get element selector from settings (and remove "visible" option since
583
    // our select element is hidden by default).
584
    var selector = settings.chosen.selector.replace(/:visible/, '');
585
    if ((settings.settings.use_chosen === 'always') || ((settings.settings.use_chosen === 'chosen') && $element.is(selector) && ($element.find('option').size() >= minimum || minimum === 'Always Apply'))) {
586
      options = $.extend(options, {
587
        width: (($element.width() < minWidth) ? minWidth : $element.width()) + 'px'
588
      });
589
590
      // Apply chosen to the element.
591
      return $element.chosen(options);
592
    }
593
    else if ((settings.settings.use_chosen === 'never') && (!$element.hasClass('chosen-disable'))) {
594
      // Tell chosen to not process this element.
595
      $element.addClass('chosen-disable');
596
    }
597
598 85ad3d82 Assos Assos
    return false;
599
  }
600
601 98a362c2 Assos Assos
})(jQuery, Drupal);