
// 
// CLASS:
// - Form
// 
// VERSION:
// - 1.0.0 - 20071121 - Core design
// - 1.1.0 - 20071123 - Added method "handlePopulate"
//                    - Removed method "handleSubmit"
//                    - Bug fixes in handling form submission
// 
// DEPENDENCIES:
// - Ajax handler
// - Element Class
// 
// NOTES:
// - Some temporary/hard-coded routines,
//   - "handlePopulate" method where the target of the Ajax call has been hard-coded
//   - "handleSubmit" method where the returned "xmlDoc" must be inserted into an element with an id of "SearchResults"
// 

var Form = 
{
  init: function ()
  {
    var forms = document.getElementsByTagName('form');
    
    for (var i = 0; i < forms.length; i++)
    {
      if (Element.hasClass(forms[i], 'ajaxform'))
      {
        for (var j = 0; j < forms[i].elements.length; j++)
        {
          if (typeof forms[i].elements[j].type != 'undefined')
          {
            switch (forms[i].elements[j].type)
            {
              case 'select-multiple':
                this.handlePopulate(forms[i].elements[j]);
              break;
              case 'select-one':
                this.handlePopulate(forms[i].elements[j]);
              break;
              case 'submit':
                forms[i].elements[j]._form = forms[i];
                forms[i].elements[j]._elements = forms[i].elements;
                forms[i].elements[j]._status = Element.getByClass('status', forms[i])[0];
                
                if (forms[i].elements[j]._status)
                {
                  forms[i].elements[j]._process = Element.getByClass('process', forms[i].elements[j]._status)[0];
                  forms[i].elements[j]._timeout = Element.getByClass('timeout', forms[i].elements[j]._status)[0];
                  forms[i].elements[j]._success = Element.getByClass('success', forms[i].elements[j]._status)[0];
                  forms[i].elements[j]._failed = Element.getByClass('failed', forms[i].elements[j]._status)[0];
                  
                  this.hideAll(forms[i].elements[j]);
                }
                
                this.handleSubmit(forms[i], forms[i].elements[j]);
              break;
            }
          }
        }
      }
    }
  },
  
  handleInput: function (element)
  {
    var data = '';
    
    switch (element.type)
    {
      case 'button': break;
      
      case 'checkbox':
        if (element.checked)
        {
          data = element.name + '=' + 1;
        }
      break;
      
      case 'file':
        // :NOTE: Use this site for reference, http://www.captain.at/ajax-file-upload.php
        // var z = 0; var tmp = ''; for (key in element) { tmp += key + ':' + "\r\n"; if (z >= 10) { alert(tmp); tmp = ''; z = 0; } z++ } alert(tmp);
      break;
      
      case 'hidden': 
        data = element.name + '=' + encodeURIComponent(element.value);
      break;
      
      case 'image': break;
      
      case 'password': 
        data = element.name + '=' + encodeURIComponent(element.value);
      break;
      
      case 'radio':
        if (element.checked)
        {
          data = element.name + '=' + element.value;
        }
      break;
      
      case 'reset': break;
      
      case 'select-multiple':
        data = element.name + '=';
        
        for (var i = 0; i < element.options.length; i++)
        {
          if (element.options[i].selected)
          {
            data += element.options[i].value + ',';
          }
        }
        data = data.substr(0, data.length - 1);
      break;
      
      case 'select-one':
        data = element.name + '=' + encodeURIComponent(element.value);
      break;
      
      case 'submit': break;
      
      case 'text': 
        data = element.name + '=' + encodeURIComponent(element.value);
      break;
      
      case 'textarea': 
        data = element.name + '=' + encodeURIComponent(element.value);
      break;
    }
    
    return data;
  },
  
  handlePopulate: function (element)
  {
    if (element.className.match(/(^| )populate_(.+)( |$)/))
    {
      var p = /(^| )populate_(.+)( |$)/.exec(element.className)[2];
      
      Ajax.send('./WebNET.aspx?u=WebNETGuest&p=list&p2=' + p, { 
        type: 'GET', 
        onComplete: function (xmlDoc) {
          var list = xmlDoc.getElementsByTagName('list')[0];
          
          if (list)
          {
            var items = list.getElementsByTagName('item');
            var option = '';
            
            for (var i = 0; i < items.length; i++)
            {
              var caption = items[i].childNodes[0].nodeValue;
              if (caption.length > 25) caption = items[i].childNodes[0].nodeValue.substr(0,25) + '...';
              
              option = document.createElement('option');
              //option.value = Element.getAttribute('id', items[i]);
              option.value = items[i].childNodes[0].nodeValue;
              option.appendChild(document.createTextNode(caption));
              element.appendChild(option);
            }
          }
        },
        onStatus: function (httpCode) {
          // ...
        }
      });
    }
  },
  
  handleSubmit: function (form, element)
  {
    form.onsubmit = function (event)
    {
      Form.showProcess(element);
      
      var data = '';
      var tmp = '';
      
      for (var i = 0; i < element._elements.length; i++)
      {
        tmp = '';
        
        if (
          typeof element._elements[i].type != 'undefined' && element._elements[i].type
          && typeof element._elements[i].name != 'undefined' && element._elements[i].name
        )
        {
          tmp = Form.handleInput(element._elements[i]);
        }
        
        if (tmp)
        {
          data += tmp + '&';
        }
      }
      
      data = data.substr(0, data.length - 1);
      data += '&mode=ajax';
      
      // Verbs
      switch (element._form.method.toLowerCase())
      {
        case 'get':
          if (element._form.action.match(/\?/))
          {
            formAction = element._form.action + '&' + data;
          }
          
          else
          {
            formAction = element._form.action + '?' + data;
          }
          
          formData = '';
        break;
        case 'post':
          formAction = element._form.action;
          formData = data;
        break;
        default:
          formAction = '';
          formData = '';
        break;
      }
      
      tmp = /(^| )format_(.+)( |$)/.exec(element._form.className);
      if (tmp) formFormat = tmp[2];
      else formFormat = 'xml';
      
      /*
      // :NOTE: Debug
      alert(
        '--- NOTE: This is not an error message. This message is used to view the contents being submitted. ---' + "\r\n\r\n" + 
        'Form Action: ' + formAction + "\r\n\r\n" + 
        'Form Post Data: ' + formData + "\r\n\r\n" + 
        'Return Format: ' + formFormat + "\r\n\r\n"
      );
      */
      
      Ajax.send(formAction, { 
        post: formData, 
        format: formFormat, 
        type: element._form.method, 
        onComplete: function (xmlDoc) {
          // Status
          if (typeof element._status != 'undefined' && formFormat == 'xml')
          {
            var form = xmlDoc.getElementsByTagName('form')[0];
            
            if (form)
            {
              var status = parseInt(xmlDoc.getElementsByTagName('code')[0].childNodes[0].nodeValue);
              
              if (status) Form.showSuccess(element);
              else if (!status) Form.showFailed(element);
            }
          }
          // SearchResults handle
          var results = document.getElementById('SearchResults');
          
          if (formFormat == 'html' && results)
          {
            results.innerHTML = (xmlDoc && xmlDoc != '<div class="Results"></div>' ? xmlDoc : 'No results found. Consider revising your search query.');
          }
        },
        onStatus: function (httpCode) {
          switch (httpCode)
          {
            case 408: Form.showTimeout(element); break;
            default: Form.showFailed(element); break;
          }
        }
      });
      
      return false;
    }
  }, 
  
  hideAll: function (element)
  {
    Form.hideFailed(element);
    Form.hideProcess(element);
    Form.hideSuccess(element);
    Form.hideTimeout(element);
  }, 
  
  hideFailed: function (element)
  {
    if (element._failed)
    {
      element._failed.style.display = 'none';
    }
  }, 
  
  hideProcess: function (element)
  {
    if (element._process)
    {
      element._process.style.display = 'none';
    }
  }, 
  
  hideSuccess: function (element)
  {
    if (element._success)
    {
      element._success.style.display = 'none';
    }
  }, 
  
  hideTimeout: function (element)
  {
    if (element._timeout)
    {
      element._timeout.style.display = 'none';
    }
  }, 
  
  showFailed: function (element)
  {
    Form.hideAll(element);
    
    if (element._failed)
    {
      element._failed.style.display = '';
    }
  }, 
  
  showProcess: function (element)
  {
    Form.hideAll(element);
    
    if (element._process)
    {
      element._process.style.display = '';
    }
  }, 
  
  showSuccess: function (element)
  {
    Form.hideAll(element);
    
    if (element._success)
    {
      element._success.style.display = '';
    }
  }, 
  
  showTimeout: function (element)
  {
    Form.hideAll(element);
    
    if (element._timeout)
    {
      element._timeout.style.display = '';
    }
  }
};

Event.run(Form);

