/*
 * Optimaster Framework - Form Scripts
 * Copyright (C) 2010-2011 Krisztian Kocsis, Optimaster <krisztian.kocsis@optimaster.eu>
 * All rights reserved.
 */

omIsIntegerWithSignRegEx = /^([\+\-]?\d+)$/;
omIsIntegerWithoutSignRegEx = /^(\d+)$/;
omIsFloatWithSignRegEx = /^(([\+\-]?\d+)|([\+\-]?\d+[\.]{1}\d+))$/;
omIsFloatWithoutSignRegEx = /^((\d+)|(\d+[\.]{1}\d+))$/;

function omValidateFormControls(configuration, validColor, invalidColor) {
  var result = true;
  
  for (var index = 0; index < configuration.rules.length; index++) {
    var rule = configuration.rules[index];
    var control = document.getElementById(rule.id);
    var controlResult = true;
    var value;
    var isInteger;
    var isFloat;
    var itemFound;
    
    if (control.disabled) {
      control.style.borderColor = "";
      continue;
    }
    
    if ((rule.control == "input") || (rule.control == "textarea")) {
      value = control.value;
    } else if (rule.control == "select") {
      value = control.options[control.selectedIndex].value;
    } else {
      control.style.borderColor = invalidColor;
      result = false;
      continue;
    }
    
    if ((rule.trim != undefined) && (rule.trim == "yes")) {
      value = omTrimString(value);
    }
    
    switch (rule.type) {
    case "integer":
      if ((rule.sign != undefined) && (rule.sign == "yes")) {
        isInteger = omIsIntegerWithSignRegEx.test(value);
      } else {
        isInteger = omIsIntegerWithoutSignRegEx.test(value);
      }
      
      if (!isInteger) {
        controlResult = false;
        break;
      }
      
      if (rule.minValue != undefined) {
        if (value < rule.minValue) {
          controlResult = false;
          break;
        }
      }
      
      if (rule.maxValue != undefined) {
        if (value > rule.maxValue) {
          controlResult = false;
          break;
        }
      }
      
      break;
      
    case "float":
      if ((rule.sign != undefined) && (rule.sign == "yes")) {
        isFloat = omIsFloatWithSignRegEx.test(value);
      } else {
        isFloat = omIsFloatWithoutSignRegEx.test(value);
      }
      
      if (!isFloat) {
        controlResult = false;
        break;
      }
      
      if (rule.minValue != undefined) {
        if (value < rule.minValue) {
          controlResult = false;
          break;
        }
      }
      
      if (rule.maxValue != undefined) {
        if (value > rule.maxValue) {
          controlResult = false;
          break;
        }
      }
      
      break;
      
    case "text":
      if (rule.minLength != undefined) {
        if (value.length < rule.minLength) {
          controlResult = false;
          break;
        }
      }
      
      if (rule.maxLength != undefined) {
        if (value.length > rule.maxLength) {
          controlResult = false;
          break;
        }
      }
      
      break;
      
    case "mixed":
      if (rule.minLength != undefined) {
        if (value.length < rule.minLength) {
          controlResult = false;
          break;
        }
      }
      
      if (rule.maxLength != undefined) {
        if (value.length > rule.maxLength) {
          controlResult = false;
          break;
        }
      }
      
      if ((rule.sign != undefined) && (rule.sign == "yes")) {
        isInteger = omIsIntegerWithSignRegEx.test(value);
        isFloat = omIsFloatWithSignRegEx.test(value);
      } else {
        isInteger = omIsIntegerWithoutSignRegEx.test(value);
        isFloat = omIsFloatWithoutSignRegEx.test(value);
      }
      
      if ((rule.minValue != undefined) && (isInteger || isFloat)) {
        if (value < rule.minValue) {
          controlResult = false;
          break;
        }
      }
      
      if ((rule.maxValue != undefined) && (isInteger || isFloat)) {
        if (value > rule.maxValue) {
          controlResult = false;
          break;
        }
      }
      
      break;
      
    default:
      controlResult = false;
      break;
    }
    
    if (!controlResult) {
      control.style.borderColor = invalidColor;
      result = false;
      continue;
    }
    
    if (rule.validItems != undefined) {
      itemFound = false;
      
      for (itemIndex = 0; itemIndex < rule.validItems.length; itemIndex++) {
        if (value == rule.validItems[itemIndex]) {
          itemFound = true;
          break;
        }
      }
      
      if (!itemFound) {
        control.style.borderColor = invalidColor;
        result = false;
        continue;
      }
    }
    
    if (rule.invalidItems != undefined) {
      itemFound = false;
      
      for (itemIndex = 0; itemIndex < rule.invalidItems.length; itemIndex++) {
        if (value == rule.invalidItems[itemIndex]) {
          itemFound = true;
          break;
        }
      }
      
      if (itemFound) {
        control.style.borderColor = invalidColor;
        result = false;
        continue;
      }
    }
    
    if (rule.regEx != undefined) {
      if (!rule.regEx.test(value)) {
        control.style.borderColor = invalidColor;
        result = false;
        continue;
      }
    }
    
    control.style.borderColor = validColor;
  }
  
  return result;
}

