/*
  JavaScript testování formulářů 
  použití:
    funkce CheckForms.check(form) vrací true pokud je formulář správně vyplněn   
  formát inputu a chybové hlášky:
    <*><input class="... testy ('req, 'mail' a pod.) ..."><span class="form-error"></span></*>
  testy:
    'req'   - musí být vplněn
    'num'   - pouze číslice
    'dec'   - pouze platná čísla
    'phone' - pouze platná telefonní čísla (formáty platné v CZ a SK)
    'mail'  - pouze E-mail
    'pass'  - podmínka pro hleslo (zde minimálně 6 znaků, nebo prázdný)
  nastavení:
    this.bg_error - barva pozadí inputu při chybě;
    this.bg_ok    - parva pozadí inputu pokud je OK;
*/

var CheckForms = new function()
{
  String.prototype.trim = function()
  {
    return this.replace(/(^\s*)|(\s*$)/g, "")
  };
  
  Array.prototype.in_array = function(value) 
  {
  	for(var i = 0, l = this.length; i < l; i++) if(this[i] == value) return true;
  	return false;
  };
  
  this.elementPos = function(e)
  { 
    var left = 0; 
    var top  = 0;  
    while (e.offsetParent)
    { 
        left += e.offsetLeft; 
        top  += e.offsetTop; 
        e     = e.offsetParent; 
    } 
 
    left += e.offsetLeft; 
    top  += e.offsetTop;  
    return {x:left, y:top}; 
  }
  
  this.bg_error = "#ffd0d0";
  this.bg_ok = "#d0ffd0";
  
  this.inputs = new Array();
  this.result = true;
  
  this.getClasses = function(tag)
  {
    var str = tag.className.trim();
    var rel=/[\s]+/;
    return str.split(rel); 
  }
  
  this.setError = function(input, color, echo)
  {
    var parent = input.parentNode;
    var spans = parent.getElementsByTagName('span');
    input.style.backgroundColor = color;
    for(var i in spans)
    {
      if(spans[i].className)
      {
        classes = this.getClasses(spans[i]);
        if (classes.in_array('form-error')) spans[i].innerHTML = echo;
      }
    }
  }
  
  this.errorTest = function(input, type)
  {
    var classes;
    var echo;
    var rel;
    var str = input.value.trim();
    switch(type)
    {
    case 'mail':
      rel =  /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
      echo = 'Chybný E-mail';
      break;
    case 'num':
      rel =  /^\d*$/;
      echo = 'Pouze číslice';
      break;
    case 'dec':
      rel =  /^[\+\-]?\d*\.?\d*$/;
      echo = 'Pouze číslo';
      break;
    case 'phone':                 // GSM, CZ a SK formáty
      rel = /^(\d{9}|\+\d{3}\s?\d{3}\s?\d{3}\s?\d{3}|\d{3}\-\d\-\d{9}|\+\d{3}\s*\(\d\)\s*\d{9})?$/;
      echo = 'Chybný formát';
      break;
    case 'req':
      rel =  /[^\s]+/;
      echo = 'Nevyplněno';
      break;
    case 'pass':
      rel =  /^(.{6,}|)$/;
      echo = 'Krátké heslo';
      break;
    }
    if(rel.test(str)) 
    {
      this.setError(input, this.bg_ok, '');
      return false;
    }
    this.setError(input, this.bg_error, echo);
    return true;
  }
  
  this.check = function(form)
  {
    this.result = true;
    var classes;
    var tests = new Array('req', 'mail', 'num', 'dec', 'phone', 'pass');
    var tags = new Array('input', 'textarea');
    var inputs;
    for(var t in tags)
    {
      inputs = form.getElementsByTagName(tags[t]);
      for(var i in inputs)
      {
        if(inputs[i].className)
        {
          classes = this.getClasses(inputs[i]);
          for(var n in tests)
          {
            if (classes.in_array(tests[n])) 
            {
              if(this.errorTest(inputs[i], tests[n])) 
              {
                this.result = false;
                break;
              }
            }          
          }
        }
      }
    }
    return this.result;
  }
}
