//v1.0
//utils form

function UtilsForm(id, formName, formRegAlerts, toplayerId) {
  this.debug = true;
  this.id = id;
  this.formName = formName;
  this.formRegAlerts = formRegAlerts;
  this.form = document.forms[formName];
  this.toplayerId = (toplayerId==undefined?false:toplayerId);
  
  this.classNameObligatory = 'obligatory';
  this.classNameOptional = 'optional';
  this.classNameMissing = 'missing';
  this.classNameError = 'error';
  this.classNameAlert = 'alert';
  this.fieldValueNl = '<br />';
  this.valueSeparator = '|';
  this.timeoutAlert = 3000;

  this.valid = true;
  this.alert = true;

  this.nop = nop;
  this.init = init;
  this.initAlerts = initAlerts;
  this.fieldValue = fieldValue;
  this.checkField = checkField;
  this.checkAndSubmit = checkAndSubmit;

//nic
  function nop() {}

//inicjuje formularz
  function init() {
    this.initAlerts();
  }

//inicjuje pola komunikatów w formularzu
  function initAlerts() {
    if(this.formRegAlerts != undefined) {
      var divs = this.form.getElementsByTagName('div');
      for(var i = 0; i < divs.length; i++)
        for(var j = 0; j < 2*Math.floor(formRegAlerts.length/2); j+=2)
          if(divs[i].className == formRegAlerts[j])
            divs[i].innerHTML = formRegAlerts[j+1];
    }
  }
  
//zwraca wartość pola do podsumowania
  function fieldValue(f, getText) {
    try {
      if(this.form.elements[f] != undefined)
        f = this.form.elements[f];
    } catch(ex) {}
    try {
      if(f.tagName.toLowerCase() == 'input') {
        if(f.type.toLowerCase() == 'radio')
          return radioValue(this, f, getText);
        else if(f.type.toLowerCase() == 'checkbox')
          return checkboxValue(this, f, getText);
        else if(f.type.toLowerCase() == 'text')
          return textValue(this, f, getText);
      } else if(f.tagName.toLowerCase() == 'select') {
        return selectValue(this, f, getText);
      } else if(f.tagName.toLowerCase() == 'textarea') {
        return textareaValue(this, f, getText);
      } else {
        return null;
      }
    } catch(ex) {
      if(this.debug) alert(ex);
      return null;
    }
  }

//sprawdza czy jest wypełnione pole obowiązkowe
  function checkField(f) {
    var n;
    try {
      if(this.form.elements[f] != undefined)
        f = this.form.elements[f];
    } catch(ex) {}
    try {
      var valid = true;
      if(f.tagName.toLowerCase() == 'input') {
        if(f.type.toLowerCase() == 'radio')
          valid = radioValue(this, f);
        else if(f.type.toLowerCase() == 'checkbox')
          valid = checkboxValue(this, f);
        else if(f.type.toLowerCase() == 'text')
          valid = textValue(this, f);
      } else if(f.tagName.toLowerCase() == 'select') {
        valid = selectValue(this, f);
      } else if(f.tagName.toLowerCase() == 'textarea') {
        valid = textareaValue(this, f);
      }
      if(!valid) {
        this.valid = false;
        n = f;
        while(n = getParentTag(n, 'div'))
          if(n.className.indexOf(this.classNameObligatory) == 0) {
            if(this.fieldValue(f, true)) {
              n.className = this.classNameObligatory+' '+this.classNameError;
            } else {
              n.className = this.classNameObligatory+' '+this.classNameMissing;
            }
            break;
          } else if(n.className.indexOf(this.classNameOptional) == 0) {
            n.className = this.classNameOptional+' '+this.classNameError;
            break;
          }
      } else {
        n = f;
        while(n = getParentTag(n, 'div'))
          if(n.className.indexOf(this.classNameObligatory) == 0) {
            n.className = this.classNameObligatory;
            break;
          } else if(n.className.indexOf(this.classNameOptional) == 0) {
            n.className = this.classNameOptional;
            break;
          }
      }
    } catch(ex) {
      if(this.debug) alert(ex);
    }
  }

//sprawdza czy są widoczne jakiekolwiek błędy
  function checkAndSubmit(alrt) {
    var en = this.valueSeparator;
    if(alrt != undefined && !alrt)
      this.alert = false;
    this.valid = true;
    for(var i = 0; i < this.form.elements.length; i++)
      if(en.indexOf(this.valueSeparator+this.form.elements[i].name+this.valueSeparator != -1)) {
        en += this.form.elements[i].name+this.valueSeparator;
        this.checkField(this.form.elements[i]);
      }
    if(this.valid)
      advAJAX.submit(this.form, {
        tag: this
        , onSuccess: function(obj) {
          if(obj.tag.alert) {
            alert(obj.responseText.replace(/<[^>]+>/g, ''));
          } else {
            var alrt = document.createElement('div');
            alrt.id = obj.tag.id+'Alert';
            alrt.className = obj.tag.classNameAlert;
            alrt.innerHTML = obj.responseText;
            document.body.appendChild(alrt);
            alrt.style.left = ((document.all?document.documentElement.clientWidth:window.innerWidth) - alrt.offsetWidth) / 2 + 'px';
            alrt.style.top = ((document.all?document.documentElement.clientHeight:window.innerHeight) - alrt.offsetHeight) / 2 + 'px';
            alrt.style.visibility = 'visible';
            setTimeout('document.body.removeChild(document.getElementById("'+alrt.id+'"));', obj.tag.timeoutAlert);
          }
          if(obj.tag.toplayerId)
            eval(obj.tag.toplayerId+'.destroy(true);');
        }
        , onError: function(obj) { alert('Błąd: ' + obj.status); }
      });
  }

// prywatne --------------------------------------------
//zwraca wartość dla wybranego radio lub false jeżeli niewybrane
  function radioValue(o, f, getText) {
    var v = false;
    f = o.form.elements[f.name];
    for(var i = 0; i < f.length; i++)
      if(f[i].checked)
        if(getText != undefined && getText)
          v = f[i].title;
        else
          v = f[i].value;
    return getText!=undefined&&getText?v:obligatoryValue(o, f, v);
  }
  
//zwraca wartości dla wybranych checkboxów lub false jeżeli niewybrane
  function checkboxValue(o, f, getText) {
    var v = '';
    f = o.form.elements[f.name];
    if(f.length == undefined) {
      if(f.checked) {
        if(getText != undefined && getText)
          v = f.title;
        else
          v = f.value;
      }
    } else {
      for(var i = 0; i < f.length; i++)
        if(f[i].checked) {
          if(getText != undefined && getText)
            v += (v==''?'':o.fieldValueNl) + f[i].title;
          else
            v += (v==''?'':o.valueSeparator) + f[i].value;
        }
    }
    return getText!=undefined&&getText?(v==''?false:v):obligatoryValue(o, f, v==''?false:v);
  }
  
//zwraca wartość dla wybranego selecta lub false jeżeli niewybrany
  function selectValue(o, f, getText) {
    var v = false;
    f = o.form.elements[f.name];
    if(f[f.selectedIndex].value != '')
      if(getText != undefined && getText)
        v = f[f.selectedIndex].text;
      else
        v = f[f.selectedIndex].value;
    return getText!=undefined&&getText?v:obligatoryValue(o, f, v);
  }
  
//zwraca wartość dla wybranego input text lub false jeżeli pusty
  function textValue(o, f, getText) {
    var v = false;
    if(f.value.length != 0)
      v = f.value;
    return getText!=undefined&&getText?v:obligatoryValue(o, f, v);
  }

//zwraca wartość dla wybranego textarea lub false jeżeli pusty
  function textareaValue(o, f, getText) {
    var v = false;
    if(f.value.length != 0)
      v = f.value;
    return getText!=undefined&&getText?v:obligatoryValue(o, f, v);
  }

//zwraca false jeśli pole jest obowiązkowe i puste
  function obligatoryValue(o, f, v) {
    var n = f;
    if(n.length != undefined)
      n = n[0];
    while(n = getParentTag(n, 'div'))
      if(n.className.indexOf(o.classNameObligatory) == 0) {
        if(!v)
          return false;
        break;
      } else if(n.className.indexOf(o.classNameOptional) == 0) {
        break;
      }
    if(v != false) {
      try {
        if(!eval(f.name+'RE').test(v))
          return false;
      } catch(ex) {}
      try {
        if(!eval(f.name+'Validate("'+v+'");'))
          return false;
      } catch(ex) {}
    }
    return true;
  }

//parent tag 'tag' węzła n
  function getParentTag(n, tag) {
    if(n == null || n.parentNode == undefined) return null;
    n = n.parentNode;
    while(n.parentNode != undefined && n.nodeName.toLowerCase() != tag.toLowerCase())
      n = n.parentNode;
    return (n.nodeName != undefined && n.nodeName.toLowerCase() == tag.toLowerCase())?n:null;
  }

}
