/**
* Form library
*
* This library provides functions to manipulate HTML form elements.
*
* @author       Alexander Rinass
* @copyright    triple-i new media system design gmbh
* @version      2.0.1
* @package      triple-i
*/

/**
* Recursively search through layers for a form in Netscape 4.x (PRIVATE FUNCTION).
*
* @param  string  form name
* @param  object  document to search in (optional, default is current document)
* @return object  form object on success or null
*/
function __getFormNS(name,doc) {
  if(typeof(doc)=="undefined") { var doc=window.document; }
  var f=doc.forms[name];
  if(f==null) {
    for(var i=0;i<doc.layers.length;i++) {
      if((f=__getFormNS(name,doc.layers[i].document))!=null) { return f; }
    }
  }
  return f;
}

/**
* Recursively search through layers for a form element in Netscape 4.x (PRIVATE FUNCTION).
*
* @param  string  form element name
* @param  object  document to search in (optional, default is current document)
* @param  string  form name to search in (optional, default is to search all forms)
* @return object  form element object on success or null
*/
function __getFormElementNS(name,doc,form) {
  if(typeof(doc)=="undefined") { var doc=window.document; }
  if(typeof(form)=="undefined") { var form=null; }
  if(form==null) {
    for(var i=0;i<doc.forms.length;i++) {
      if((e=doc.forms[i].elements[name])!=null) return e;
    }
  } else {
    if((e=doc.forms[form].elements[name])!=null) return e;
  }
  for(var j=0;j<doc.layers.length;j++) {
    if((e=__getFormElementNS(name,doc.layers[j].document))!=null) { return e; }
  }
  return null;
}

/**
* Get form object by name.
*
* @param  string  form name
* @param  object  document of form (optional, default is current document)
* @return object  form object on success or null
*/
function _getForm(name,doc) {
  if(typeof(doc)=="undefined") { var doc=window.document; }
  var f=null;
  if(document.layers) { f=__getFormNS(name,document); }
  else { f=document.forms[name]; }
  return f;
}

/**
* Get form element object by name.
*
* @param  string  form element name
* @param  object  document of form element (optional, default is current document)
* @param  string  form name of element (optional, default is to search all forms)
* @return object  form element object on success or null
*/
function _getFormElement(name,doc,form) {
  if(typeof(doc)=="undefined") { var doc=window.document; }
  if(typeof(form)=="undefined") { var form=null; }
  var e=null;
  if(form!=null) {
    var f=_getForm(form,doc);
    e=f.elements[name];
  } else {
    if(document.layers) { e=__getFormElementNS(name,doc,form); }
    else {
      for(var i=0;i<doc.forms.length;i++) {
        if((e=doc.forms[i].elements[name])!=null) { return e; }
      }
    }
  }
  return e;
}

/**
* Get value of a form element.
*
* @param  string  form element name
* @param  object  document of form element (optional, default is current document)
* @param  string  form name of element (optional, default is to search all forms)
* @return string  form element value on success or null
*/
function _getFormElementValue(name,doc,form) {
  if(typeof(doc)=="undefined") { var doc=window.document; }
  if(typeof(form)=="undefined") { var form=null; }
  var e=_getFormElement(name,doc,form);
  if(e!=null) { return e.value; }
  return null;
}

/**
* Set value of a form element.
*
* @param  string  form element name
* @param  object  document of form element (optional, default is current document)
* @param  string  form name of element (optional, default is to search all forms)
* @return boolean true on success or false (element did not exist)
*/
function _setFormElementValue(name,val,doc,form) {
  if(typeof(doc)=="undefined") { var doc=window.document; }
  if(typeof(form)=="undefined") { var form=null; }
  var e=_getFormElement(name,form);
  if(e!=null) {
    e.value=val;
    return true;
  }
  return false;
}

/**
* Select an element in a select field.
*
* @param  string  form element name
* @param  string  list value to select (SPECIAL: '*' selects all, '!*' deselects all)
* @param  boolean true to select field, false to deselect (optional, default is true)
* @param  object  document of form element (optional, default is current document)
* @param  string  form name of element (optional, default is to search all forms)
* @return boolean true on success or false (element did not exist)
*/
function _setListSelection(name,val,sel,doc,form) {
  if(typeof(sel)=="undefined") { var sel=true; }
  if(typeof(doc)=="undefined") { var doc=window.document; }
  if(typeof(form)=="undefined") { var form=null; }
  var e=_getFormElement(name,doc,form);
  if(e!=null) {
    for(var i=0;i<e.length;i++) {
      if(val=='*') { e[i].selected=true; }
      else if(val=='!*') { e[i].selected=false; }
      else { 
        if(e[i].value==val) { e[i].selected=sel; }
      }
    }
    return true;
  } else { return false; }  
}

/**
* Check if an element in a select field is selected.
*
* @param  string  form element name
* @param  string  list value to select (SPECIAL: '*' selects all, '!*' deselects all)
* @param  object  document of form element (optional, default is current document)
* @param  string  form name of element (optional, default is to search all forms)
* @return boolean true if selected or false (element not selected or did not exist)
*/
function _getListSelection(name,val,doc,form) {
  if(typeof(sel)=="undefined") { var sel=true; }
  if(typeof(doc)=="undefined") { var doc=window.document; }
  if(typeof(form)=="undefined") { var form=null; }
  var e=_getFormElement(name,doc,form);
  if(e!=null) {
    for(var i=0;i<e.length;i++) {
      if(e[i].value==val) { return e[i].selected; }
    }
  }
  return false;
}

/**
* Get value of a list entry (select field).
*
* @param  string  form element name
* @param  string  name of element value to retrieve
* @param  object  document of form element (optional, default is current document)
* @param  string  form name of element (optional, default is to search all forms)
* @return string  list value on success or null
*/
function _getListEntry(name,val,doc,form) {
  if(typeof(doc)=="undefined") { var doc=window.document; }
  if(typeof(form)=="undefined") { var form=null; }
  var e=_getFormElement(name,doc,form);
  if(e!=null) {
    for(var i=0;i<e.length;i++) if(e[i].value==val) {
      return e[i];
    }
  }
  return null;
}

/**
* Add an entry to a select field.
*
* @param  string  name of select field
* @param  string  description of new entry
* @param  string  value of new entry
* @param  boolean true to select the field immediately or false  (optional, default is false)
* @param  boolean true if it should be selected by default (?)  (optional, default is false)
* @param  object  document of form element (optional, default is current document)
* @param  string  form name of element (optional, default is to search all forms)
* @return boolean true on success or false
*/
function _addListEntry(name,txt,val,sel,defsel,doc,form) {
  if(typeof(sel)=="undefined") { sel=false; }
  if(typeof(defsel)=="undefined") { defsel=false; }
  if(typeof(doc)=="undefined") { var doc=window.document; }
  if(typeof(form)=="undefined") { var form=null; }
  var e=_getFormElement(name);
  if(e!=null) {
    e[e.length]=new Option(txt,val,defsel,sel);
    return true;
  } else return false;
}

/**
* Remove an entry from a select field.
*
* @param  string  form element name
* @param  string  name of element value to remove
* @param  object  document of form element (optional, default is current document)
* @param  string  form name of element (optional, default is to search all forms)
* @return boolean true on success or false (entry did not exist)
*/
function _removeListEntry(name,val,doc,form) {
  if(typeof(doc)=="undefined") { var doc=window.document; }
  if(typeof(form)=="undefined") { var form=null; }
  var e=_getFormElement(name,doc,form);
  for(var i=0;i<e.length;i++) {
    if(e[i].value==val) {
      e[i]=null;
      return true;
    }
  }
  return false;
}

/**
* Clears a complete select field.
*
* @param  string  form element name
* @param  object  document of form element (optional, default is current document)
* @param  string  form name of element (optional, default is to search all forms)
* @return boolean true on success or false (entry did not exist)
*/
function _clearList(name,doc,form) {
  if(typeof(doc)=="undefined") { var doc=window.document; }
  if(typeof(form)=="undefined") { var form=null; }
  var e=_getFormElement(name,doc,form);
  if(e==null) { return false; }
  while(e.length>0) { e[0]=null; }
  return true;
}

/**
* Check if a form element is selected (radio button, checkbox, select field)
*
* @param  string  form element name
* @param  object  document of form element (optional, default is current document)
* @param  string  form name of element (optional, default is to search all forms)
* @return boolean true if element is selected or false
*/
function _isSomethingSelected(name,doc,form) {
  if(typeof(doc)=="undefined") { var doc=window.document; }
  if(typeof(form)=="undefined") { var form=null; }
  var e=_getFormElement(name,doc,form);
  if(e!=null) {
    var t=e.type+"";
    if(t.match("radio")||t.match("check")) { return e.checked; }
    else if(t.match("select")) {
      for(var i=0;i<e.length;i++) {
        if(e[i].selected&&e[i].value!="") { return true; }
      }
    }
    else if((t=="undefined")&&((e.length+"")!="undefined")) {
      for(var i=0;i<e.length;i++) {
        if(e[i].checked) { return true; }
      }
    }
  }
  return false;
}
//eof