From 7865ac31624fbb009847129e8644a179737e4cae Mon Sep 17 00:00:00 2001
From: Thomas Feichter <thomas.feichter@gmail.com>
Date: Sat, 1 Oct 2011 10:31:41 +0700
Subject: [PATCH] Option to disable clearing additional content. Instead the
 css class "error" will be added to the field when the limit
 is reached.

---
 maxlength.inc     |   16 ++++++++++++++++
 maxlength.install |    4 ++--
 maxlength.js      |   11 +++++++++--
 maxlength.module  |    8 ++++++--
 4 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/maxlength.inc b/maxlength.inc
index 7640f4f..a7e286e 100644
--- a/maxlength.inc
+++ b/maxlength.inc
@@ -121,6 +121,12 @@ function _maxlength_content_type_form_alter(&$form, &$form_state, $form_id) {
       '#default_value' => variable_get('maxlength_' . $label .'_js_'. $type, MAXLENGTH_DEFAULT_USE_JS),
       '#description' => t('This will enable a Javascript based count down, as well as the client side validation for the !type field of this content type. If no limit set this is ignored.', array('!type' => $label)),
     );
+    $form[$parent_form]['maxlength_' . $label]['maxlength_' . $label .'_disable_clear'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Disable clearing additional content for the !label', array('!label' => ucwords($label))),
+      '#default_value' => variable_get('maxlength_' . $label .'_disable_clear_'. $type, MAXLENGTH_DEFAULT_DISABLE_CLEAR),
+      '#description' => t('This will disable clearing additional content for the !type field of this content type. Instead the css class "error" will be added to the field when the limit is reached.', array('!type' => $label)),
+    );
     $form[$parent_form]['maxlength_' . $label]['maxlength_' . $label .'_text'] = array(
       '#type' => 'textarea',
       '#title' => t('!label count down message', array('!label' => ucwords($label))),
@@ -144,6 +150,12 @@ function _maxlength_cck_form_alter(&$form, &$form_state, $form_id) {
     '#default_value' => variable_get('maxlength_' . $form['field_name']['#value'] .'_js', MAXLENGTH_DEFAULT_USE_JS),
     '#description' => t('This will enable a Javascript based count down, as well as the client side validation for this field. If no limit set this is ignored.'),
   );
+  $form['field']['maxlength_' . $form['field_name']['#value'] .'_disable_clear'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Disable clearing additional content'),
+    '#default_value' => variable_get('maxlength_' . $form['field_name']['#value'] .'_disable_clear', MAXLENGTH_DEFAULT_DISABLE_CLEAR),
+    '#description' => t('This will disable clearing additional content. Instead the css class "error" will be added to the field when the limit is reached.'),
+  );
   $form['field']['maxlength_' . $form['field_name']['#value'] .'_text'] = array(
     '#type' => 'textarea',
     '#title' => t('Count down message'),
@@ -157,6 +169,7 @@ function _maxlength_cck_form_submit($form, &$form_state) {
   //note, max lenght for the CCK field is stored in this way as for textareas, its not in $element var passed to theme functions.
   variable_set('maxlength_' . $form['field_name']['#value'], $form['#post']['maxlength_' . $form['field_name']['#value'] .'_length']);
   variable_set('maxlength_' . $form['field_name']['#value'] .'_js', $form['#post']['maxlength_' . $form['field_name']['#value'] .'_js']);
+  variable_set('maxlength_' . $form['field_name']['#value'] .'_disable_clear', $form['#post']['maxlength_' . $form['field_name']['#value'] .'_disable_clear']);
   variable_set('maxlength_' . $form['field_name']['#value'] .'_text', $form['#post']['maxlength_' . $form['field_name']['#value'] .'_text']);
 }
 
@@ -179,6 +192,7 @@ function maxlength_get_values($field = 'body', $type = '') {
   if (strpos($field, 'field_') === 0) {
     $values['limit'] = variable_get('maxlength_' . $field, MAXLENGTH_DEFAULT_LENGTH);
     $values['use_js'] = variable_get('maxlength_' . $field .'_js', MAXLENGTH_DEFAULT_USE_JS);
+    $values['disable_clear'] = variable_get('maxlength_' . $field .'_disable_clear', MAXLENGTH_DEFAULT_DISABLE_CLEAR);
     $values['text'] = variable_get('maxlength_' . $field .'_text', MAXLENGTH_DEFAULT_TEXT);
     $values['key'] = 'value';
   }
@@ -186,12 +200,14 @@ function maxlength_get_values($field = 'body', $type = '') {
   elseif ($type != '') {
     $values['limit'] = variable_get('maxlength_' . $field .'_'. $type, MAXLENGTH_DEFAULT_LENGTH);
     $values['use_js'] = variable_get('maxlength_' . $field .'_js_'. $type, MAXLENGTH_DEFAULT_USE_JS);
+    $values['disable_clear'] = variable_get('maxlength_' . $field .'_disable_clear_'. $type, MAXLENGTH_DEFAULT_DISABLE_CLEAR);
     $values['text'] = variable_get('maxlength_' . $field .'_text_'. $type, MAXLENGTH_DEFAULT_TEXT);
   }
   // Values for other fields
   else {
     $values['limit'] = variable_get('maxlength_' . $field, MAXLENGTH_DEFAULT_LENGTH);
     $values['use_js'] = variable_get('maxlength_' . $field .'_js', MAXLENGTH_DEFAULT_USE_JS);
+    $values['disable_clear'] = variable_get('maxlength_' . $field .'_disable_clear', MAXLENGTH_DEFAULT_DISABLE_CLEAR);
     $values['text'] = variable_get('maxlength_' . $field .'_text', MAXLENGTH_DEFAULT_TEXT);
   }
 
diff --git a/maxlength.install b/maxlength.install
index 3a4132b..a96b23f 100644
--- a/maxlength.install
+++ b/maxlength.install
@@ -73,8 +73,8 @@ function maxlength_install() {
  */
 function maxlength_uninstall() {
   foreach (node_get_types() as $type => $name) {
-    $labels = array('title', 'js_title', 'text_title',
-                    'body', 'js_body', 'text_body');
+    $labels = array('title', 'js_title', 'disable_clear_title', 'text_title',
+                    'body', 'js_body', 'disable_clear_body', 'text_body');
 
     foreach ($labels as $label) {
       variable_del('maxlength_'  . $label . '_' . $type);
diff --git a/maxlength.js b/maxlength.js
index 61b1eef..1530e06 100644
--- a/maxlength.js
+++ b/maxlength.js
@@ -9,6 +9,7 @@ Drupal.maxLength_limit = function (field) {
     return;
   }
   var limit = Drupal.settings.maxlength[id];
+  var disable_clear = Drupal.settings.maxlength[id + '_disable_clear'];
   var maxlength = $('#maxlength-' + id);
   maxlength.show_count = false;
   maxlength.span_remaining_count = maxlength.find('span.maxlength-counter-remaining');
@@ -22,10 +23,16 @@ Drupal.maxLength_limit = function (field) {
   var remainingCount = limit - length;  
 
   // if there is not remaining char, we clear additional content
-  if (remainingCount < 0) {
+  if (remainingCount < 0 && disable_clear != 1) {
     $(field).val($(field).val().substr(0, limit));    
     remainingCount = 0;
-  }  
+  }
+  else if (remainingCount < 0 && disable_clear == 1) {
+    $(field).addClass('error');    
+  }
+  else if (remainingCount >= 0 && disable_clear == 1) {
+    $(field).removeClass('error');    
+  }
 
   // Update the remaing chars text.
   maxlength.span_remaining_count.html(remainingCount.toString());
diff --git a/maxlength.module b/maxlength.module
index 104a9eb..36f5742 100644
--- a/maxlength.module
+++ b/maxlength.module
@@ -8,6 +8,7 @@
 define('MAXLENGTH_DEFAULT_TEXT', 'Content limited to !limit characters, remaining: <strong>!remaining</strong>');
 define('MAXLENGTH_DEFAULT_USE_JS', TRUE);
 define('MAXLENGTH_DEFAULT_LENGTH', 0);
+define('MAXLENGTH_DEFAULT_DISABLE_CLEAR', FALSE);
 
 /**
  * Implementation of hook_help().
@@ -77,6 +78,7 @@ function maxlength_field_remove_submit($form, &$form_state) {
 function maxlength_remove_field_variables($field_name) {
   variable_del('maxlength_' . $field_name);
   variable_del('maxlength_' . $field_name .'_js');
+  variable_del('maxlength_' . $field_name .'_disable_clear');
   variable_del('maxlength_' . $field_name .'_text');
 }
 
@@ -85,8 +87,8 @@ function maxlength_remove_field_variables($field_name) {
  */
 function maxlength_node_type($op, $info) {
   $labels = array(
-    'title', 'js_title', 'text_title',
-    'body', 'js_body', 'text_body');
+    'title', 'js_title', 'disable_clear_title', 'text_title',
+    'body', 'js_body', 'disable_clear_body', 'text_body');
 
   switch ($op) {
     case 'delete':
@@ -165,6 +167,7 @@ function _maxlength_format_element(&$element) {
   $element['#max_length_properties'] += array(
     'text' => MAXLENGTH_DEFAULT_TEXT,
     'use_js' => MAXLENGTH_DEFAULT_USE_JS,
+    'disable_clear' => MAXLENGTH_DEFAULT_DISABLE_CLEAR,
     'value_key' => 'default_value',
   );
 
@@ -206,6 +209,7 @@ function _maxlength_format_element(&$element) {
       $js_settings = array(
         'maxlength' => array(
           $element['#id'] => $values['limit'],
+          $element['#id'].'_disable_clear' => $values['disable_clear'],
         ),
       );
       drupal_add_js($js_settings, 'setting');
-- 
1.7.5.GIT

