//                                                                          //
//  resetforms.js - Clear all fields in a form                              //
//  Copyright (c) 2009 Medial Gesellschaft für digitale Medien mbH          //
//                                                                          //
//--------------------------------------------------------------------------//
 
if( typeof MedialFormExpert == "undefined" ) MedialFormExpert = new Object();
if( typeof MedialFormExpert.clearAllFormFields == "undefined" ) {
 
 var curry0 = function (callable, array, length) {
  return function () {
   var vector = new Array();
   for( var k = 0; k < length; ++k ) vector.push(array[k]);
   for( var k = 0; k < arguments.length; ++k ) vector.push(array[k]);
   return callable.apply(this, vector);
  };
 };
 
 var curry = function (callable) {
  
  var array = new Array();
  var length = arguments.length;
  
  for( var k = 1; k < length; ++k ) array.push(arguments[k]);
  return curry0(callable, array, length - 1);
 };
 
 var clearInput = function (node) {
  var type = node.getAttribute("type").toLowerCase();
  switch( type ) {
  
  case "submit": case "image": case "button": case "reset": 
   /* Value is actually the label text, so don't clear! */ return;
  
  case "hidden":
   /* Value not seen by the user => not cleared */ return;
   
  case "checkbox": case "radio":  
   node.checked = false; node.defaultChecked = false; return;
  
  case "text": case "password": 
   node.value = ""; node.defaultValue = ""; return;
  
  case "file": 
   /* 1. Can we reset a file-input? 2. How the hell did that thing get here? */ return;
  
  default:
   /* What could it be? */
   return;
  }
 };
 
 var theForm = function theForm (spec) {
  if( !spec ) return null;
  else {
   if( typeof spec == "object" ) return spec;
   return document.getElementById(spec);
  }
 };
 
 var recurse = function recurse (node) {
  
  if( node ) {
   
   if( node.nodeType == 1 ) {
    
    var name = node.nodeName.toUpperCase();
    
    switch( name ) {
 
    case "BR": case "HR": case "IMG": case "LINK":
     // Empty elements according to the HTML 4 specs
     return;
     
    case "BUTTON":
     // Not used by Formular-Expert
     return;
    
    case "INPUT":
     clearInput(node);
     return;
     
    case "SELECT":
    var options = node.getElementsByTagName("OPTION");
    var count = options? options.length : 0;
    for( var k = 0; k < count; ++k ) {
        var option = options[k];
        option.selected = option.defaultSelected = false;
    }
    return;
     
    case "TEXTAREA":
     node.value = ""; node.defaultValue = "";
     return;
    }
   }
   
   for( var child = node.firstChild; child !== null; child = child.nextSibling )
    recurse(child);
  }
 };
 
 var wireReset = function (formElement) {
  
  var form = theForm(formElement);
  
  if( form ) {
   
   var inputs = form.getElementsByTagName("INPUT");
   var length = inputs? inputs.length : 0;
   
   for( var k = 0; k < length; ++k ) {
    
    var input = inputs[k];
    var type = input.getAttribute("type").toLowerCase();
    
    if( type == "reset" ) {
     
     input.onclick = curry(MedialFormExpert.clearAllFormFields, formElement);
    }
   }
  }
 };
 
 MedialFormExpert.clearAllFormFields = function (formElement) {
  recurse(theForm(formElement));
  return formElement;
 };
 
 MedialFormExpert.wireUpResetButtons = function (formElement) {
     wireReset(formElement);
     return formElement;
 };
 
 MedialFormExpert.wireUpAllResetButtons = function () {
     var forms = document.getElementsByTagName("BODY")[0].getElementsByTagName("FORM");
     for( var k = 0; k < forms.length; ++k ) {
        MedialFormExpert.wireUpResetButtons(forms[k]);
     }
 };
}