function CSFormData(str)
{
  this.data_ = new ParameterHandler(str);
  this.version_ = this.data_.getVersion();
}

CSFormData.prototype.asString = function ()
{
  return this.data_.asString();
}

CSFormData.prototype.restoreForm = function (form)
{
  var elems = form.elements;
  for (var i = 0; i < elems.length; i ++)
  {
    this.restoreFormElement(elems[i]);
  }
}

CSFormData.prototype.restoreFormElement = function (elem)
{
  var data = this.data_;
  
  var type = elem.type; // form element type
  var name = elem.name; // form element name
  if (type == 'password' || type == 'text' || type == 'textarea')
  { // simple text fields
    elem.value = data.get(name)[0] || '';
  }
  else if (type == 'checkbox' || type == 'radio')
  { // checkboxes or radios
    if (data.isIndexOf(name, elem.value))
    {
      elem.checked = true;
    }
    else
    {
      elem.checked = false;
    }
  }
  else if (type == 'select-one' || type == 'select-multiple')
  { // select lists
    var options = elem.options;
    var is_single = type == 'select-one';
    var full_info = data.get(name + "_full_restore_informations_");
    if (full_info.length)
    {
      options.length = 0;
      for (var i = 0; i < full_info.length; i ++)
      {
        var vals = full_info[i].split('&');
        if (this.version_ == 1) {
          options[i] = new Option(unescape(vals[0]), unescape(vals[1]), vals[2] == "true", vals[3] == "true");
        }
        else {
          options[i] = new Option(decodeURIComponent(vals[0]), decodeURIComponent(vals[1]), vals[2] == "true", vals[3] == "true");
        }
      }
    }

    for (var i = 0; i < options.length; i ++)
    {
      var curr_value = options[i].value;
      if (data.isIndexOf(name, curr_value))
      {
        options[i].selected = true;
        if (is_single)
        { // in case of select one fields we can stop now
          break;
        }
      }
      else if (!is_single)
      { // if it's single select -> don't deselect options
        options[i].selected = false;
      }
    }
  }
}

CSFormData.prototype.readForm = function (form, aParam)
{
  var data = this.data_;
  var elems = form.elements;
  for (var i = 0; i < elems.length; i ++)
  {
    if (elems[i].name.indexOf('HW_Hidden'))
    { // element will be ignored if indexOf('HW_Hidden') is 0
      this.readFormElement(elems[i], aParam);
    }
  }
  return data.asString();
}

CSFormData.prototype.readFormElement = function (elem, aParam)
{
  var pars = aParam || {};
  var full_info_for = pars.storeFullList || {};
  var store_hidden = pars.storeHiddenFields || false;
  var data = this.data_;

  var name  = elem.name; // element name
  var type  = elem.type; // element type
  if (((type == 'hidden' && store_hidden) || type == 'password' || type == 'text' || type == 'textarea') && (elem.value != ''))
  { // simple text fields
    data.add(name, elem.value);
  }
  else if ((type == 'checkbox' || type == 'radio') && elem.checked)
  { // checkboxes or radios
    data.add(name, elem.value);
  }
  else if (type == 'select-one' || type == 'select-multiple')
  { // select lists
    var options = elem.options;
    var is_single = type == 'select-one';
    for (var i = 0; i < options.length; i ++)
    {
      if (options[i].selected)
      {
        data.add(name, options[i].value);
        if (is_single)
        { // in case of select one fields we can stop now
          break;
        }
      }
    }
  }
  // special handling for local search scopes
  if (full_info_for[elem.name] && (type == 'select-one' || type == 'select-multiple'))
  {
    var options = elem.options;
    for (var i = 0; i < options.length; i ++)
    {
      if (this.version_ == 1) {
        data.add(elem.name + '_full_restore_informations_', escape(options[i].text) + "&" + escape(options[i].value) + "&" + options[i].defaultSelected + "&" + options[i].selected);
      }
      else {
        data.add(elem.name + '_full_restore_informations_', encodeURIComponent(options[i].text) + "&" + encodeURIComponent(options[i].value) + "&" + options[i].defaultSelected + "&" + options[i].selected);
      }
    }
  }
}

