function Validation() {
  //encoded وب  \u010D \u010C \u0161 \u0160 \u017E \u017D
  
  var fields = Array();
  var errors = Array();
  var validationPassed = true;
  
  this.addField = addField;
  this.validateFields = validateFields;
  
  
  function addField(fieldId, fieldDesc, validations) {
    
    fields[fields.length] = { "id" : fieldId, "description" : fieldDesc, "validations" : validations};
  }
  
  function validateEmail(field)
  {
    var domField = document.getElementById(field["id"]);
    if (domField != null) {
      var apos=domField.value.indexOf("@");
      var dotpos=domField.value.lastIndexOf(".");
      if (apos<1||dotpos-apos<2) {
        errorMsg = field["description"]+ " ni v pravilnem formatu!";
        failValidation(domField,errorMsg);  
      } else {
        clearValidationError(domField);
      }
    }
  }
  
  function validateTextNoSymbols(field)
  {
    var domField = document.getElementById(field["id"]);
    if (domField != null) {
      var regPattern = /^[a-zA-Z0-9_. \u010D\u010C\u0161\u0160\u017E\u017D]*$/;
      var regex = new RegExp(regPattern);
      if (!regex.test(domField.value)) {
        var errorMsg = field["description"]+" lahko vsebuje samo &#x10D;rke in &#x161;tevilke!";
        failValidation(domField,errorMsg);
      } else {
        clearValidationError(domField);
      }
    }
  }
  
  function validateTextNoSymbolsNotEmpty(field)
  {
    var domField = document.getElementById(field["id"]);
    if (domField != null) {
      var regPattern = /^[a-zA-Z0-9_. \u010D\u010C\u0161\u0160\u017E\u017D]{3,}$/;
      var regex = new RegExp(regPattern);
      if (!regex.test(domField.value)) {
        var errorMsg = field["description"]+" mora vsebovati vsaj 3 &#x10D;rke ali &#x161;tevilke (Znaki niso dovoljeni)!";
        failValidation(domField,errorMsg);
      } else {
        clearValidationError(domField);
      }
    }
  }
  
  function validateTextOnlyLetters(field)
  {
    var domField = document.getElementById(field["id"]);
    if (domField != null) {
      var regPattern = /^[a-zA-Z_. \u010D\u010C\u0161\u0160\u017E\u017D]*$/;
      var regex = new RegExp(regPattern);
      if (!regex.test(domField.value)) {
        var errorMsg = field["description"]+" lahko vsebuje samo &#x10D;rke!";
        failValidation(domField,errorMsg);
      } else {
        clearValidationError(domField);
      }
    }
  }
  
  function validatePassword(field)
  {
    var domField = document.getElementById(field["id"]);
    if (domField != null) {
      var regPattern = /^.{5,}$/;
      var regex = new RegExp(regPattern);
      if (!regex.test(domField.value)) {
        var errorMsg = field["description"] + " je prekratko. Dol&#x17E;ina mora biti vsaj 5 znakov!";
        failValidation(domField,errorMsg);
      } else {
        clearValidationError(domField);
      }
    }
  }
  
  function validateNumberOnly(field)
  {
    var domField = document.getElementById(field["id"]);
    if (domField != null) {
      var regPattern = /^[0-9]*$/;
      var regex = new RegExp(regPattern);
      if (!regex.test(domField.value)) {
        var errorMsg = field["description"] + " lahko vsebuje samo &#x161;tevilke!";
        failValidation(domField,errorMsg);
      } else {
        clearValidationError(domField);
      }
    }
  }
  
    function validateDate(field) {
    var domField = document.getElementById(field["id"]);
    if (domField != null) {
      var regPattern= /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
      var regex = new RegExp(regPattern);
      if (domField.value != "" && !regex.test(domField.value)) {
        var errorMsg = field["description"] + " mora biti v formatu leto-mesec-dan oz. yyyy-mm-dd";
        failValidation(domField,errorMsg);
      } else {
        clearValidationError(domField);
      }
    }
  }
  
  function validateNotEmpty(field) {
    var domField = document.getElementById(field["id"]);
    if (domField != null) { 
      if (domField.value == null || domField.value == "" || domField.value.lenght < 1) {
        var errorMsg = "polje " + field["description"]+ " ne sme biti prazno!";
        failValidation(domField,errorMsg);
      } else {
        clearValidationError(domField);
      }
    }
  }
  
  function failValidation(domField,errorMsg) {
    if (domField != null) {
      errors[errors.length] = errorMsg;
      domField.className = "validationFailed";
      validationPassed = false;
    }
  }

  function validateFields() {
    document.getElementById("messages").innerHTML = "";
    errors = Array();
    for (var i=0; i<fields.length; i++) {
      var validations = fields[i]["validations"];
      var validationsArr = validations.split(',');
      for (var j=0; j<validationsArr.length;j++) {
        switch (validationsArr[j])  {
          case "NOTEMPTY" :
            validateNotEmpty(fields[i]);
            break;
          case "EMAIL" :
            validateEmail(fields[i]);
            break;
          case "TXTNOSYMBOLS" :
            validateTextNoSymbols(fields[i]);
            break;
          case "TXTNOSYMBOLSNOTEMPTY" :
            validateTextNoSymbolsNotEmpty(fields[i]);
            break;
          case "TXTLETTERSONLY" :
            validateTextOnlyLetters(fields[i]);
            break;
          case "NUMBER" :
            validateNumberOnly(fields[i]);
            break;
          case "TXTPASSWORD" :
            validatePassword(fields[i]);
            break;
          case "DATE" :
            validateDate(fields[i]);
            break;
        }
      }
    }
    if (!validationPassed) {
      displayErrors(errors);
      return false;
    } else {
      showHideElement('msgPanel');
      return true;
    }
  }
  
  function displayErrors(errors) {
    var msgPanel = document.getElementById("msgPanel");
    var messages = document.getElementById("messages");
    for (var i=0;i<errors.length;i++) {
      messages.innerHTML += "<p>" + errors[i] + "</p>";
    }
    msgPanel.style.display = "block";
  }
  
  function clearValidationError(domField) {
    domField.className = "validated";
  }
  
}
  

