summaryrefslogtreecommitdiff
path: root/misc/teaser.js
blob: e303aa963e15d097056182426ad5d60e7ae53e06 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// $Id$

/**
 * Auto-attach for teaser behavior.
 *
 * Note: depends on resizable textareas.
 */
Drupal.behaviors.teaser = {
  attach: function(context) {
    // This breaks in Konqueror. Prevent it from running.
    if (/KDE/.test(navigator.vendor)) {
      return;
    }

    $('textarea.teaser:not(.teaser-processed)', context).each(function() {
      var teaser = $(this).addClass('teaser-processed');

      // Move teaser textarea before body, and remove its form-item wrapper.
      var body = $('#'+ Drupal.settings.teaser[this.id]);
      var checkbox = $('#'+ Drupal.settings.teaserCheckbox[this.id]).parent();
      var checked = $(checkbox).children('input').attr('checked') ? true : false;
      var parent = teaser[0].parentNode;
      $(body).before(teaser);
      $(parent).remove();

      function trim(text) {
        return text.replace(/^\s+/g, '').replace(/\s+$/g, '');
      }

      // Join the teaser back to the body.
      function join_teaser() {
        if (teaser.val()) {
          body.val(trim(teaser.val()) +'\r\n\r\n'+ trim(body.val()));
        }
        // Empty, hide and disable teaser.
        teaser[0].value = '';
        $(teaser).attr('disabled', 'disabled');
        $(teaser).parent().slideUp('fast');
        // Change label.
        $(this).val(Drupal.t('Split summary at cursor'));
        // Hide separate teaser checkbox.
        $(checkbox).hide();
        // Force a hidden checkbox to be checked (to ensure that the body is
        // correctly processed on form submit when teaser/body are in joined
        // state), and remember the current checked status.
        checked = $(checkbox).children('input').attr('checked') ? true : false;
        $(checkbox).children('input').attr('checked', true);
      }

      // Split the teaser from the body.
      function split_teaser() {
        body[0].focus();
        var selection = Drupal.getSelection(body[0]);
        var split = selection.start;
        var text = body.val();

        // Note: using val() fails sometimes. jQuery bug?
        teaser[0].value = trim(text.slice(0, split));
        body[0].value = trim(text.slice(split));
        // Reveal and enable teaser.
        $(teaser).attr('disabled', '');
        $(teaser).parent().slideDown('fast');
        // Change label.
        $(this).val(Drupal.t('Join summary'));
        // Show separate teaser checkbox, restore checked value.
        $(checkbox).show().children('input').attr('checked', checked);
      }

      // Add split/join button.
      var button = $('<div class="teaser-button-wrapper"><input type="button" class="teaser-button" /></div>');
      var include = $('#'+ this.id.substring(0, this.id.length - 2) +'include');
      $(include).parent().parent().before(button);

      // Extract the teaser from the body, if set. Otherwise, stay in joined mode.
      var text = body.val().split('<!--break-->', 2);
      if (text.length == 2) {
        teaser[0].value = trim(text[0]);
        body[0].value = trim(text[1]);
        $(teaser).attr('disabled', '');
        $('input', button).val(Drupal.t('Join summary')).toggle(join_teaser, split_teaser);
      }
      else {
        $('input', button).val(Drupal.t('Split summary at cursor')).toggle(split_teaser, join_teaser);
        $(checkbox).hide().children('input').attr('checked', true);
      }

      // Make sure that textarea.js has done its magic to ensure proper visibility state.
      if (Drupal.behaviors.textarea && teaser.is(('.form-textarea:not(.textarea-processed)'))) {
        Drupal.behaviors.textarea.attach(teaser.parentNode);
      }
      // Set initial visibility.
      if ($(teaser).is('[@disabled]')) {
        $(teaser).parent().hide();
      }

    });
  }
};