function check(strForm) {
  //Properties
  this.strForm = strForm;
  this.arrErrors = new Array();

  //Methods
  this.getInput = check_getInput;
  this.getNextPosition = check_getNextPosition;
  this.checkError = check_checkError;
  this.checkFixedError = check_checkFixedError;
  this.isDate = check_isDate;

  this.checkString = check_string;
  this.checkNroSerie = check_nroSerie;
  this.checkFixedString = check_fixedString;
  this.checkNumber = check_number;
  this.checkNumberPos = check_numberPos;
  this.checkFloat = check_float;
  this.checkDate = check_date;
  this.checkEmail = check_email;
  this.checkCombo = check_combo;
  this.compareDates = check_compareDates;
  this.checkImagen = check_imagen;
  this.toString = check_toString;
}

function check_getInput (strInput) {
	return eval("document." + this.strForm + "." + strInput);
}

function check_getNextPosition () {
	return this.arrErrors.length;
}

function check_checkError (objInput, strNameShow, strRegExp, intMinLen, intMaxLen, blnOptional, strErrorMessage) {
  var intPosition = this.getNextPosition();
  var objRegExp = new RegExp(strRegExp);

  if (!objInput.value.length) {
    if (!blnOptional){
            this.arrErrors[intPosition] = "Por favor, ingrese su " + strNameShow;
            return false;
    }else
            return true;
  }else{
    if ((!objRegExp.test(objInput.value))) {
            this.arrErrors[intPosition] = "El campo " + strNameShow + (strErrorMessage ? strErrorMessage : " contiene caracteres inválidos" );
            return false;
    }else if (objInput.value.length < intMinLen) {
                    this.arrErrors[intPosition] = "El campo " + strNameShow + " debe tener más de " + intMinLen + " caracteres";
                    return false;
            }else if (objInput.value.length > intMaxLen) {
                            this.arrErrors[intPosition] = "El campo " + strNameShow + " no debe tener más de " + intMaxLen + " caracteres";
                            return false;
                    }
                    else
                            return true;
  }
}

function check_checkFixedError (objInput, strNameShow, strRegExp, intLen, blnOptional, strErrorMessage) {
  var intPosition = this.getNextPosition();
  var objRegExp = new RegExp(strRegExp);

  if (!objInput.value.length) {
          if (!blnOptional){
                  this.arrErrors[intPosition] = "Por favor, ingrese su " + strNameShow;
                  return false;
          }else
                  return true;
  }else{
          if ((!objRegExp.test(objInput.value))) {
                  this.arrErrors[intPosition] = "El campo " + strNameShow + (strErrorMessage ? strErrorMessage : " contiene caracteres inválidos" );
                  return false;
          }else if (objInput.value.length != intLen) {
                          this.arrErrors[intPosition] = "El campo " + strNameShow + " debe tener " + intLen + " caracteres";
                          return false;
                  } else
                          return true;
  }
}

function check_isDate(datFecha) {
  var arrFecha = datFecha.split("/");
  var datFechaValida = new Date(arrFecha[2], arrFecha[1] - 1, arrFecha[0]);

  if ((arrFecha[0] == datFechaValida.getDate()) &&
          (arrFecha[1] == (datFechaValida.getMonth() + 1)) &&
          (arrFecha[2] == datFechaValida.getFullYear()))
          return true;
  else
          return false;
}

function check_string (strInput, strNameShow, intMinLen, intMaxLen, blnOptional) {
  var objInput = this.getInput(strInput);
  var strRegExp = "^[^<]+$";

  return this.checkError(objInput, strNameShow, strRegExp, intMinLen, intMaxLen, blnOptional, false);
}

function check_nroSerie (strInput, strNameShow, intMinLen, intMaxLen, blnOptional) {
  var intPosition = this.getNextPosition();
  var objInput = this.getInput(strInput);
  //var strRegExp = "(^\\w{2})+(\\[0-9]{4})+$";
  //var strRegExp = "(^[^<>'0123456789]{2})+\([0-9]{4})+$";
  //var strRegExp = "^[^<>'0123456789]{1,2}-?[0-9]{4}$";
  var strRegExp = "(^[^<>'0123456789]{1,2})+\(-?[0-9]{4})+$";
  var strRegExp = "(^[a-zA-Z]{1,2})+\(-?[0-9]{4})+$";
  
  if(this.checkError(objInput, strNameShow, strRegExp, intMinLen, intMaxLen, blnOptional, false)){
		return true;
	} else {
  	this.arrErrors[intPosition] = "Cargue de nuevo su Nº de Serie, el mismo debe estar compuesto por una o dos letras y cuatro números";
		return false;
	}	
	
}

function check_fixedString (strInput, strNameShow, intLen, blnOptional) {
  var objInput = this.getInput(strInput);
  var strRegExp = "^[^<>']+$";

  return this.checkFixedError(objInput, strNameShow, strRegExp, intLen, blnOptional, false);
}

function check_number (strInput, strNameShow, intMinLen, intMaxLen, blnOptional) {
  var objInput = this.getInput(strInput);
  var strRegExp = "^[0-9]+$";

  return this.checkError(objInput, strNameShow, strRegExp, intMinLen, intMaxLen, blnOptional, false);
}

function check_numberPos (strInput, strNameShow, intMinLen, intMaxLen, blnOptional) {
  var objInput = this.getInput(strInput);
  var strRegExp = "^[0-9]+$";

  if (this.checkError(objInput, strNameShow, strRegExp, intMinLen, intMaxLen, blnOptional, false)) {
          if (objInput.value > 0)
                  return true;
          else {
                  this.arrErrors[this.getNextPosition()] = "El campo " + strNameShow + " debe ser positivo";
                  return false;
          }
  } else
          return false;
}

function check_float (strInput, strNameShow, intMinLen, intMaxLen, blnOptional) {
  var objInput = this.getInput(strInput);
  var strRegExp = "^[0-9]+(\\.[0-9]+)?$";

  return this.checkError(objInput, strNameShow, strRegExp, intMinLen, intMaxLen, blnOptional, false);
}

function check_date (strInput, strNameShow, blnOptional) {
  var objInput = this.getInput(strInput);
  var strRegExp = "^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}";
  var intPosition;

  if ((objInput.value.length == 0) && (blnOptional)) return true;
  if (this.checkError(objInput, strNameShow, strRegExp, 8, 10, blnOptional, " no contiene una fecha válida"))
          if (!this.isDate(objInput.value)) {
                  var intPosition = this.getNextPosition();
                  this.arrErrors[intPosition] = "El campo " + strNameShow + " no contiene una fecha válida";
                  return false;
          } else
                  return true;
}

function check_email (strInput, strNameShow, intMinLen, intMaxLen, blnOptional) {
  var objInput = this.getInput(strInput);
  var strRegExp = "^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,3})+$";

  return this.checkError(objInput, strNameShow, strRegExp, intMinLen, intMaxLen, blnOptional, false);
}

function check_combo (strInput, strNameShow, blnOptional) {
  var objInput = this.getInput(strInput);

  if (blnOptional) {
          return true;
  }
  else {
          if (objInput.selectedIndex > 0) {
                  return true;
          }
          else {
                  var intPosition = this.getNextPosition();
                  this.arrErrors[intPosition] = "Debe elegir una opción para el campo " + strNameShow;

                  return false;
          }
  }
}

function check_compareDates(strInput1, strInput2, strUnidad) {
  if ((!this.isDate(strInput1)) || (!this.isDate(strInput2)))
          return null;

//        Si son fechas válidas, las paso a arrays para compararlas.
  var arrFecha1 = strInput1.split("/");
  var datFechaValida1 = new Date(arrFecha1[2], arrFecha1[1] - 1, arrFecha1[0]);
  var arrFecha2 = strInput2.split("/");
  var datFechaValida2 = new Date(arrFecha2[2], arrFecha2[1] - 1, arrFecha2[0]);
  var intAjuste;

  switch (strUnidad) {
//                El resultado te lo devuelve en años
          case "a":
          case "A":
                  intAjuste = 86400000 * 365;
                  break;
//                El resultado te lo devuelve en horas
          case "h":
          case "H":
                  intAjuste = 86400000 / 24;
                  break;
//                El resultado te lo devuelve por default en días
          case "d":
          case "D":
          default:
                  intAjuste = 86400000;
                  break;
  }

  return ((datFechaValida1 - datFechaValida2) / intAjuste);
}

function check_toString () {
  var strErrors = "";
  var i;

  for (i = 0; i < this.arrErrors.length; i++) {
          strErrors = strErrors + this.arrErrors[i] + "\n";
  }

  return strErrors;
}


function check_imagen (strInput, strNameShow) {
  var intPosition = this.getNextPosition();
  var objRegExp = new RegExp(strRegExp);
  var arrImagen = new Array()
  var objInput = this.getInput(strInput);
  var strRegExp = "^[^<>']+$";

  if (!objInput.value.length)
  {
          return true;
  }
  else
  {
          if ((!objRegExp.test(objInput.value)))
          {
             this.arrErrors[intPosition] = "El campo " + strNameShow +  " contiene caracteres inválidos";
             return false;
          }
          else
          {
              arrImagen = objInput.value.split(".");
              if (arrImagen.length == 2)
              {
                      if(arrImagen[1] == "jpg" || arrImagen[1] == "jpeg" || arrImagen[1] == "png" )
                      {
                              return true;
                      }
                      else
                      {
                         this.arrErrors[intPosition] = "La imagen del campo " + strNameShow + arrImagen[1] + " debe ser jpg, jpeg o png";
                         return false;

                      }
              }
              else
              {
                  this.arrErrors[intPosition] = "El campo " + strNameShow + " contiene caracteres inválidos";
                  return false;

              }
          }
  }
}