/*
  form-charlimit
   Enforce a character limit on a text field, with an 
   updating countdown

  Usage:
   In HTML, create your text field like so:
    <textarea name="..." class="formValReq formValCharLimit" id="my_field"></textarea>
    <div id="my_field_error" style="visibility:hidden"></div>
    <div id="my_field_limit"></div>
    <script type="text/javascript">
      form.limitCharacters('my_field', 'my_field_limit', 500);
    </script>


  my_field will behave as a normal text field.  my_field_error will be 
  used as an error message display area, for any validation errors or 
  character limit problems. my_field_limit will display text such as 
  '500 characters remaining'.

  Prerequisite: form.js
        
  Namespace: form        

*/

var form;
var yui = YAHOO.util;

form.cl_data = {};


/*-------------------------------------------------------------*/
/*                     Public Interface                        */
/*-------------------------------------------------------------*/

form.limitCharacters = function(textfield_id, counter_id, limit) {

    // Store config info
    var counter = new yui.Element(counter_id);
    var textfield = new yui.Element(textfield_id);

    var info = {
        'counter' : counter,
        'textfield' : textfield,
        'limit' : limit
    };
    form.cl_data[textfield_id] = info;

    // Setup listeners
    textfield.addListener('paste',   form.cl_handlePaste);
    textfield.addListener('keydown', form.cl_handleKey);
    textfield.addListener('keyup',   form.cl_handleKey);

    // Init message
    form.cl_enforceLimit(textfield_id);

}

form.updateCharacterLimit = function(textfield_id) {
    form.cl_enforceLimit(textfield_id);
}

/*-------------------------------------------------------------*/
/*                       Event Listeners                       */
/*-------------------------------------------------------------*/
form.cl_handlePaste = function(evt) {
    var elem = yui.Event.getTarget(evt);
    setTimeout('form.cl_enforceLimit(' + elem.id + ');', 10);
}

form.cl_handleKey = function(evt) {
    var elem = yui.Event.getTarget(evt);
    form.cl_enforceLimit(elem.id);
}

form.cl_enforceLimit = function(textfield_id) {
    var info = form.cl_data[textfield_id];
    var text = info.textfield.get('value');
    var current_length = text.length;
    if (current_length > info.limit) {
        text = text.subtring(0, info.limit);
        current_length = info.limit;
        info.textfield.set('value', text);
    }
    var remaining = info.limit - current_length;
    var msg = remaining + ' character' + (remaining == 1 ? '' : 's') + ' remaining';
    info.counter.set('innerHTML', msg);
}


/*-------------------------------------------------------------*/
/*                     Install Validator                       */
/*-------------------------------------------------------------*/
form.validateCharacterLimit = function(elem) {
    var textfield_id = elem.get('id');
    var info = form.cl_data[textfield_id];
    return info.textfield.get('value').length >= info.limit;
}
form.addCustomValidator(
    'formValCharLimit', 
    'The character limit has been exceeded.', 
    form.validateCharacterLimit
);
