diff misc/teaser.js @ 1:c1f4ac30525a 6.0

Drupal 6.0
author Franck Deroche <webmaster@defr.org>
date Tue, 23 Dec 2008 14:28:28 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/teaser.js	Tue Dec 23 14:28:28 2008 +0100
@@ -0,0 +1,96 @@
+// $Id: teaser.js,v 1.12 2008/01/09 12:10:04 goba Exp $
+
+/**
+ * Auto-attach for teaser behavior.
+ *
+ * Note: depends on resizable textareas.
+ */
+Drupal.behaviors.teaser = 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(teaser.parentNode);
+    }
+    // Set initial visibility
+    if ($(teaser).is('[@disabled]')) {
+      $(teaser).parent().hide();
+    }
+
+  });
+};