function ValidatorClass() {
}

ValidatorClass.prototype.validateField = function(value, type, params, elementId) {
  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;
    // Radio button
    case 'radio':
      var elementName = $(elementId).name;
      if(elementName) {
        var parent = $(elementId).parentNode;
        while(parent && parent.tagName != 'FORM') {
          parent = parent.parentNode;
        }
        var returnTrue = false;
//        $$('form' + (parent && parent.id ? '#' + parent.id : '') + ' input[name=' + elementName + ']').each(function(input) {
        //$$('form input[name=' + elementName.replace('[', '\[').replace(']', '\]') + ']').each(function(input) {
        $$('form input').each(function(input) {
            if(input.name == elementName && input.checked) {
              returnTrue = true
              return true;
            }
        });
      }
      return returnTrue;
      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 URL
    case 'url':
      var reg = /^http:\/\/([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,6}/;
      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, useFocus) {
  if(!$(formId)) {
    return false;
  }
  if(!elementId) {
    elementId = false;
  };
  var functions;
  var haveErrors = false;
  var localError = false;
  var focusMoved = false;
  var localValue;
  var isMultiple = false;
  
  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]);
    } else if(textareas[i].className.indexOf('inputError') > -1) {
      textareas[i].className = textareas[i].className.replace('inputError', '');
    } else if(textareas[i].className.indexOf('inputOk') > -1) {
      textareas[i].className = textareas[i].className.replace('inputOk', '');
    }
  }
  for(var i=0; i<selects.length; i++) {
    if(selects[i].getAttribute('alt')) {
      els.push(selects[i]);
    } else if(selects[i].className.indexOf('inputError') > -1) {
      selects[i].className = selects[i].className.replace('inputError', '');
    } else if(selects[i].className.indexOf('inputOk') > -1) {
      selects[i].className = selects[i].className.replace('inputOk', '');
    }
  }
  for(var i=0; i<inputs.length; i++) {
    if(inputs[i].getAttribute('alt')) {
      els.push(inputs[i]);
    } else if(inputs[i].className.indexOf('inputError') > -1) {
      inputs[i].className = inputs[i].className.replace('inputError', '');
    } else if(inputs[i].className.indexOf('inputOk') > -1) {
      inputs[i].className = inputs[i].className.replace('inputOk', '');
    }
  }
  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(functions[j][0] == 'radio') isMultiple = true;
            if(!this.validateField(localValue, functions[j][0], functions[j], els[i].id)) {
              if(els[i].className.indexOf('inputError') == -1) {
                els[i].className = els[i].className + ' inputError';
              }
              if(useFocus) {
                els[i].focus();
                useFocus = false;
              }
              if(document.location.hash.indexOf('debugValidator') > -1) {
                alert('error - ' + els[i].id);
              }
              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, useFocus)}
              if(!focusMoved && !elementId) {
                //els[i].focus();
                focusMoved = true;
              }
              break;
            }
          }
        }
        if(!localError) {
          toChange = 'inputOk';
          if(!needTests) {
            toChange = '';
          }
          if(functions && functions.length) {
            els[i].className = els[i].className.replace('inputError', toChange);
          }
          if(els[i].className.indexOf('inputOk') == -1) {
            els[i].className = els[i].className += ' ' + toChange;
          }
          if($(els[i].id + '_label')) {
            $(els[i].id + '_label').className = $(els[i].id + '_label').className.replace('inputError', '');
          }
          if(isMultiple && els[i].id) {
            var inputs = $(els[i].id).parentNode.getElementsByTagName('input');
            for(var j=0; j<inputs.length; j++) {
              if(inputs[j].name == els[i].name && inputs[j].id != els[i].id) {
                inputs[j].className = inputs[j].className.replace('inputError', toChange);
                if($(inputs[j].id + '_label')) {
                  $(inputs[j].id + '_label').className = $(inputs[j].id + '_label').className.replace('inputError', '');
                }
              }
            }            
          }
        }
      }
    }
  }
  if(document.location.hash.indexOf('debugValidator') > -1) {
      alert('result - ' + haveErrors);
  }
  return !haveErrors;
}

var Validator = new ValidatorClass();
