web/drupal/misc/teaser.js
branchdrupal
changeset 74 0ff3ba646492
equal deleted inserted replaced
73:fcf75e232c5b 74:0ff3ba646492
       
     1 // $Id: teaser.js,v 1.12.2.1 2009/05/20 11:50:54 goba Exp $
       
     2 
       
     3 /**
       
     4  * Auto-attach for teaser behavior.
       
     5  *
       
     6  * Note: depends on resizable textareas.
       
     7  */
       
     8 Drupal.behaviors.teaser = function(context) {
       
     9   // This breaks in Konqueror. Prevent it from running.
       
    10   if (/KDE/.test(navigator.vendor)) {
       
    11     return;
       
    12   }
       
    13 
       
    14   $('textarea.teaser:not(.teaser-processed)', context).each(function() {
       
    15     var teaser = $(this).addClass('teaser-processed');
       
    16 
       
    17     // Move teaser textarea before body, and remove its form-item wrapper.
       
    18     var body = $('#'+ Drupal.settings.teaser[this.id]);
       
    19     var checkbox = $('#'+ Drupal.settings.teaserCheckbox[this.id]).parent();
       
    20     var checked = $(checkbox).children('input').attr('checked') ? true : false;
       
    21     var parent = teaser[0].parentNode;
       
    22     $(body).before(teaser);
       
    23     $(parent).remove();
       
    24 
       
    25     function trim(text) {
       
    26       return text.replace(/^\s+/g, '').replace(/\s+$/g, '');
       
    27     }
       
    28 
       
    29     // Join the teaser back to the body.
       
    30     function join_teaser() {
       
    31       if (teaser.val()) {
       
    32         body.val(trim(teaser.val()) +'\r\n\r\n'+ trim(body.val()));
       
    33       }
       
    34       // Empty, hide and disable teaser.
       
    35       teaser[0].value = '';
       
    36       $(teaser).attr('disabled', 'disabled');
       
    37       $(teaser).parent().slideUp('fast');
       
    38       // Change label.
       
    39       $(this).val(Drupal.t('Split summary at cursor'));
       
    40       // Hide separate teaser checkbox.
       
    41       $(checkbox).hide();
       
    42       // Force a hidden checkbox to be checked (to ensure that the body is
       
    43       // correctly processed on form submit when teaser/body are in joined
       
    44       // state), and remember the current checked status.
       
    45       checked = $(checkbox).children('input').attr('checked') ? true : false;
       
    46       $(checkbox).children('input').attr('checked', true);
       
    47     }
       
    48 
       
    49     // Split the teaser from the body.
       
    50     function split_teaser() {
       
    51       body[0].focus();
       
    52       var selection = Drupal.getSelection(body[0]);
       
    53       var split = selection.start;
       
    54       var text = body.val();
       
    55 
       
    56       // Note: using val() fails sometimes. jQuery bug?
       
    57       teaser[0].value = trim(text.slice(0, split));
       
    58       body[0].value = trim(text.slice(split));
       
    59       // Reveal and enable teaser
       
    60       $(teaser).attr('disabled', '');
       
    61       $(teaser).parent().slideDown('fast');
       
    62       // Change label
       
    63       $(this).val(Drupal.t('Join summary'));
       
    64       // Show separate teaser checkbox, restore checked value.
       
    65       $(checkbox).show().children('input').attr('checked', checked);
       
    66     }
       
    67 
       
    68     // Add split/join button.
       
    69     var button = $('<div class="teaser-button-wrapper"><input type="button" class="teaser-button" /></div>');
       
    70     var include = $('#'+ this.id.substring(0, this.id.length - 2) +'include');
       
    71     $(include).parent().parent().before(button);
       
    72 
       
    73     // Extract the teaser from the body, if set. Otherwise, stay in joined mode.
       
    74     var text = body.val().split('<!--break-->');
       
    75     if (text.length >= 2) {
       
    76       teaser[0].value = trim(text.shift());
       
    77       body[0].value = trim(text.join('<!--break-->'));
       
    78       $(teaser).attr('disabled', '');
       
    79       $('input', button).val(Drupal.t('Join summary')).toggle(join_teaser, split_teaser);
       
    80     }
       
    81     else {
       
    82       $('input', button).val(Drupal.t('Split summary at cursor')).toggle(split_teaser, join_teaser);
       
    83       $(checkbox).hide().children('input').attr('checked', true);
       
    84     }
       
    85 
       
    86     // Make sure that textarea.js has done its magic to ensure proper visibility state.
       
    87     if (Drupal.behaviors.textarea && teaser.is(('.form-textarea:not(.textarea-processed)'))) {
       
    88       Drupal.behaviors.textarea(teaser.parentNode);
       
    89     }
       
    90     // Set initial visibility
       
    91     if ($(teaser).is('[@disabled]')) {
       
    92       $(teaser).parent().hide();
       
    93     }
       
    94 
       
    95   });
       
    96 };