function ValidatorClass() {
}

ValidatorClass.prototype.validateField = function(value, type, params) {
  switch(type) {
    // Value is empty
    case 'empty':
      if(value == '') {
        return false;
      }
      break;
    // Value is integer
    // @param1: if > 0 value hvae to be positive, if < 0 - negative
    case 'int':
      if(new Number(value) != value) {
        return false;
      }
      if(typeof params[1] != 'undefined' && params[1] == 1 && value < 0) {
        return false;
      }
      if(typeof params[1] != 'undefined' && params[1] == -1 && value > 0) {
        return false;
      }
      break;
    // Value string length
    // @param1: min length
    // @param2: max length
    case 'strlen':
      value = new String(value);
      if(typeof params[1] != 'undefined' && typeof params[2] != 'undefined') {
        if(value.length < params[1] || value.length > params[2]) {
          return false;
        }
      } else if(typeof params[1] != 'undefined') {
        if(value.length < params[1]) {
          return false;
        }
      }
      break;
    // Checkbox 
    case 'checkbox':
      if(!value) {
        return false;
      }
      break;
    // AccountNumber
    case 'account':
      var reg = /^([0-9]+-)?[0-9]+\/[0-9]{4}$/;
      if(!reg.test(value)) {
        return false;
      }
      break;
    // AccountNumber
    case 'account-short':
      //var reg = /^[0-9]+\/[0-9]{4}$/;
      var reg = /^([0-9]+-)?[0-9]+$/;
      if(!reg.test(value)) {
        return false;
      }
      break;
    // Value is email
    case 'email':
      var reg = /^[a-zA-Z0-9\.\-]+@[a-zA-Z0-9\.\-]+\.[a-z]{2,5}(\s+)?$/;
      if(!reg.test(value)) {
        return false;
      }
      break;
    // Value is equal to another field
    case 'equal':
      if(typeof params[1] != 'undefined' && !($(params[1]) && $(params[1]).value == value)) {
        return false;
      }
      break;
    // Fake
    case 'blank':
      break;
    // Default - like an empty
    default:
      if(!value) {
        return false;
      }
      break;
  }
  return true;
}

ValidatorClass.prototype.validateGetFunctions = function(alt) {
  var functions = false;
  if(!alt) {
    return functions;
  }
  var fs = alt.split('|');
  for(var i=0; i<fs.length; i++) {
    if(!functions) {
      functions = new Array();
    }
    functions.push(fs[i].split(':'));
  }
  return functions;
}

ValidatorClass.prototype.validateForm = function(formId, elementId) {
  if(!$(formId)) {
    return false;
  }
  if(!elementId) {
    elementId = false;
  };
  var functions;
  var haveErrors = false;
  var localError = false;
  var focusMoved = false;
  var localValue;
  
  var inputs = $(formId).getElementsByTagName('input');
  var textareas = $(formId).getElementsByTagName('textarea');
  var selects = $(formId).getElementsByTagName('textarea');
  
  els = new Array();
  for(var i=0; i<textareas.length; i++) {
    if(textareas[i].getAttribute('alt')) {
      els.push(textareas[i]);
    }
  }
  for(var i=0; i<selects.length; i++) {
    if(selects[i].getAttribute('alt')) {
      els.push(selects[i]);
    }
  }
  for(var i=0; i<inputs.length; i++) {
    if(typeof inputs[i].alt != 'undefined') {
      els.push(inputs[i]);
    }
  }
  for(var i=0; i<els.length; i++) {
    if((!elementId || els[i].id == elementId) && !els[i].disabled) {
      if(functions = this.validateGetFunctions(els[i].getAttribute('alt'))) {
        localError = false;
        needTests = true;
        // If we have 'blank' function, value can be empty.
        // So, test it and if it`s true skip other tests.
        // It`s needed for example for non-obligatory emails
        // value have to valid email or blank, so we can use "email|blank"
        for(var j=0; j<functions.length; j++) {
          if(functions[j][0] == 'blank' && els[i].value == '')  {
            needTests = false;
          }
        }
        
        if(needTests) {
          for(var j=0; j<functions.length; j++) {
            localValue = functions[j][0] == 'checkbox' ? els[i].checked : els[i].value;
            if(!this.validateField(localValue, functions[j][0], functions[j])) {
              if(els[i].className.indexOf('inputError') == -1) {
                els[i].className = els[i].className + ' inputError';
              }
              if($(els[i].id + '_label') && $(els[i].id + '_label').className.indexOf('inputError') == -1) {
                $(els[i].id + '_label').className = $(els[i].id + '_label').className + ' inputError';
              }
              localError = haveErrors = true;
              els[i].onblur = function() {Validator.validateForm(formId, this.id)}
              if(!focusMoved && !elementId) {
                //els[i].focus();
                focusMoved = true;
              }
              break;
            }
          }
        }
        if(!localError) {
          if(functions && functions.length) {
            els[i].className = els[i].className.replace('inputError', 'inputOk');
          }
          if(els[i].className.indexOf('inputOk') == -1) {
            els[i].className = els[i].className += ' inputOk';
          }
          if($(els[i].id + '_label')) {
            $(els[i].id + '_label').className = $(els[i].id + '_label').className.replace('inputError', '');
          }
        }
      }
    }
  }
  return !haveErrors;
}

var Validator = new ValidatorClass();