function FormValidator2(formname){
  this.formname = formname;
  this.empty_arr = [];
  this.alnum_arr = [];
  this.min_len = [];
  this.equal_arr = [];
  this.email_arr = [];
  this.phone_arr = [];
  this.checkForErrors = checkForErrors;
  this.dictionary = [];
  this.addToDictionary = addToDictionary;
  this.addToArray = addToArray; 
}

function addToArray(arr_name, obj){
  switch(arr_name){
    case "empty_arr":
      this.empty_arr.push(obj);
      break;
    case "alnum_arr":
      this.alnum_arr.push(obj);
      break;
    case "min_len":
      this.min_len.push(obj);
      break;
    case "equal_arr":
      this.equal_arr.push(obj);
      break;
    case "email_arr":
      this.email_arr.push(obj);
      break;
    case "phone_arr":
      this.phone_arr.push(obj);
      break;
  }
}

function FormValidator(formname, empty_arr, alnum_arr, min_len, equal_arr, email_arr)
{
  this.formname = formname;
  this.empty_arr = empty_arr;
  this.alnum_arr = alnum_arr;
  this.min_len = min_len;
  this.equal_arr = equal_arr;
  this.email_arr = email_arr;
  this.phone_arr = [];
  this.checkForErrors = checkForErrors;
  this.dictionary = [];
  this.addToDictionary = addToDictionary;
}

function addToDictionary(word, tr_word) {
  this.dictionary[word] = tr_word;
}

function checkForErrors(){
  document.getElementById('formErrors').style.display='block';
  var globalErrors = "";
  var num = 0;

  //steps to check
  rt = checkEmpty(this.formname, this.empty_arr, this.dictionary);
  globalErrors = globalErrors + rt;

  rt = checkAlNum(this.formname, this.alnum_arr, this.dictionary);
  globalErrors = globalErrors + rt;

  rt = checkLength(this.formname, this.min_len, this.dictionary);
  globalErrors = globalErrors + rt;

  rt = checkEqual(this.formname, this.equal_arr, this.dictionary);
  globalErrors = globalErrors + rt;

  rt = checkEmail(this.formname, this.email_arr, this.dictionary);
  globalErrors = globalErrors + rt;

  rt = checkPhone(this.formname, this.phone_arr, this.dictionary);
  globalErrors = globalErrors + rt;

  if (globalErrors.length != 0)
    document.getElementById('formErrors').innerHTML = globalErrors;
  else {
    document.getElementById('formErrors').style.display='none';
    this.formname.submit();
  }
}

function checkLength(formname, empty_fields, dic) {
   var i, n = 0;
   var reterr = "";

   //format   ['username', 2] - check for len not smaller than 2

   for(i=0; i<empty_fields.length; i++){
	var element = document.getElementById(empty_fields[i][0]);

	if(element.value.length < empty_fields[i][1]) {
	   element.style.borderColor='red';
	   element.style.borderWidth='2px';
         tr = (dic[empty_fields[i][0]] == undefined ? empty_fields[i][0] : dic[empty_fields[i][0]]);
	   reterr = reterr + "<br>" + tr + " меньше "+ empty_fields[i][1];
	} else {
	   element.style.borderColor='green';
	   element.style.borderWidth='2px';
	} 
    }
    return reterr;
}

function checkEqual(formname, empty_fields, dic) {
   var i, n = 0;
   var reterr = "";

   //format   ['username', 'username2'] - check equal 1 and 2 field

   for(i=0; i<empty_fields.length; i++){
	var element = document.getElementById(empty_fields[i][0]);
	var element2 = document.getElementById(empty_fields[i][1]);

	if(element.value != element2.value) {
	   element.style.borderColor='red';
	   element.style.borderWidth='2px';
	   element2.style.borderColor='red';
	   element2.style.borderWidth='2px';
	   tr = (dic[empty_fields[i][0]] == undefined ? empty_fields[i][0] : dic[empty_fields[i][0]]);
	   tr2 = (dic[empty_fields[i][1]] == undefined ? empty_fields[i][1] : dic[empty_fields[i][1]]);
	   reterr = reterr + "<br>" + tr + " не равен "+ tr2;
	} else {
	   element.style.borderColor='green';
	   element.style.borderWidth='2px';
	   element2.style.borderColor='green';
	   element2.style.borderWidth='2px';
	} 
    }
    return reterr;
}

// calculate the ASCII code of the given character
function CalcKeyCode(aChar) {
  var character = aChar.substring(0,1);
  var code = aChar.charCodeAt(0);
  return code;
}

function checkEmpty(formname, empty_fields, dic) {
   var i, n = 0;
   var reterr = "";

   for(i=0; i<empty_fields.length; i++){
	var element = document.getElementById(empty_fields[i]);

	if(!validateNotEmpty(element.value)) {
	   element.style.borderColor='red';
	   element.style.borderWidth='2px';
         tr = (dic[empty_fields[i]]== undefined ? empty_fields[i] : dic[empty_fields[i]]);
	   reterr = reterr + "<br>" + tr + " пуст(о)";
	} else {
	   element.style.borderColor='green';
	   element.style.borderWidth='2px';
	} 
    }
    return reterr;
}

function checkAlNum(formname, empty_fields, dic) {
   var i, n = 0;
   var reterr = "";

   for(i=0; i<empty_fields.length; i++){
	var element = document.getElementById(empty_fields[i]);
	
	if(!validateIsAlNum(element.value)) {
	   element.style.borderColor='red';
	   element.style.borderWidth='2px';
         tr = (dic[empty_fields[i]]== undefined ? empty_fields[i] : dic[empty_fields[i]]);
	   reterr = reterr + "<br>" + tr + " имеет некорректные символы";
	} else {
	   element.style.borderColor='green';
	   element.style.borderWidth='2px';
	} 
    }
    return reterr;
}

function checkEmail(formname, empty_fields, dic) {
   var i, n = 0;
   var reterr = "";

   for(i=0; i<empty_fields.length; i++){
	var element = document.getElementById(empty_fields[i]);
	
	if(!validateEmail(element.value)) {
	   element.style.borderColor='red';
	   element.style.borderWidth='2px';
	   tr = (dic[empty_fields[i]]== undefined ? empty_fields[i] : dic[empty_fields[i]]);
	   reterr = reterr + "<br>" + tr + " некорректный e-mail";
	} else {
	   element.style.borderColor='green';
	   element.style.borderWidth='2px';
	} 
    }
    return reterr;
}

function checkPhone(formname, empty_fields, dic) {
   var i, n = 0;
   var reterr = "";

   //format   ['username', 'username2'] - check equal 1 and 2 field

   for(i=0; i<empty_fields.length; i++){
	var element = document.getElementById(empty_fields[i][0]);
	var element2 = document.getElementById(empty_fields[i][1]);

	if(!validateUSPhone('('+element.value+')'+element2.value)) {
	   element.style.borderColor='red';
	   element.style.borderWidth='2px';
	   element2.style.borderColor='red';
	   element2.style.borderWidth='2px';
	   tr = (dic[empty_fields[i][0]] == undefined ? empty_fields[i][0] : dic[empty_fields[i][0]]);
	   tr2 = (dic[empty_fields[i][1]] == undefined ? empty_fields[i][1] : dic[empty_fields[i][1]]);
	   reterr = reterr + "<br>" + tr + " и " + tr2 + " не составляют корректного телефона. Формат XX[XX] XXX.. (где X цифра)";
	} else {
	   element.style.borderColor='green';
	   element.style.borderWidth='2px';
	   element2.style.borderColor='green';
	   element2.style.borderWidth='2px';
	} 
    }
    return reterr;
}


function checkNumeric(formname, empty_fields, dic) {
   var i, n = 0;
   var reterr = "";

   for(i=0; i<empty_fields.length; i++){
	var element = document.getElementById(empty_fields[i]);
	
	if(!validateNumeric(element.value)) {
	   element.style.borderColor='red';
	   element.style.borderWidth='2px';
         tr = (dic[empty_fields[i]]== undefined ? empty_fields[i] : dic[empty_fields[i]]);
	   reterr = reterr + "<br>" + tr + " не число";
	} else {
	   element.style.borderColor='green';
	   element.style.borderWidth='2px';
	} 
    }
    return reterr;
}


function validateEmail( strValue) {
  var objRegExp = /^[a-z]([a-z0-9_\-\.]*)@[a-z0-9\-_\.]+\.[a-z]{2,3}/i;

  //check for valid email
  return objRegExp.test(strValue);
}

function validateUSPhone( strValue ) {
  var objRegExp  = /^\(\d{2,4}\)\s?\d+$/;

  //check for valid us phone with or without space between
  //area code
  return objRegExp.test(strValue);
}

function  validateNumeric( strValue ) {
  var objRegExp  =  /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;

  //check for numeric characters
  return objRegExp.test(strValue);
}

function validateInteger( strValue ) {
  var objRegExp  = /(^-?\d\d*$)/;

  //check for integer characters
  return objRegExp.test(strValue);
}

function validateNotEmpty( strValue ) {
   var strTemp = strValue;
   strTemp = trimAll(strTemp);
   if(strTemp.length > 0){
     return true;
   }
   return false;
}

function validateUSZip( strValue ) {
var objRegExp  = /(^\d{5}$)|(^\d{5}-\d{4}$)/;

  //check for valid US Zipcode
  return objRegExp.test(strValue);
}

function validateUSDate( strValue ) {
  var objRegExp = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/

  //check to see if in correct format
  if(!objRegExp.test(strValue))
    return false; //doesn't match pattern, bad date
  else{
    
    // var strSeparator = strValue.substring(2,3)
    // bug fix by Radovan Radic to get the first separator
    for (i=0; i<strValue.length; i++) {
      if (strValue.charAt(i)>'9') or (strValue.charAt(i)<'0')
        break;
    }
    var strSeparator=str.charAt(i);

    var arrayDate = strValue.split(strSeparator); //split date into month, day, year
    //create a lookup for months not equal to Feb.
    var arrayLookup = { '01' : 31,'03' : 31, '04' : 30,'05' : 31,'06' : 30,'07' : 31,
                        '08' : 31,'09' : 30,'10' : 31,'11' : 30,'12' : 31}
    var intDay = parseInt(arrayDate[1]);

    //check if month value and day value agree
    if(arrayLookup[arrayDate[0]] != null) {
      if(intDay <= arrayLookup[arrayDate[0]] && intDay != 0)
        return true; //found in lookup table, good date
    }

    //check for February (bugfix 20050322)
    var intMonth = parseInt(arrayDate[0]);
    if (intMonth == 2) { 
       var intYear = parseInt(arrayDate[2]);
       if( ((intYear % 4 == 0 && intDay <= 29) || (intYear % 4 != 0 && intDay <=28)) && intDay !=0)
          return true; //Feb. had valid number of days
       }
  }
  return false; //any other values, bad date
}

function validateValue( strValue, strMatchPattern ) {
var objRegExp = new RegExp( strMatchPattern);

 //check if string matches pattern
 return objRegExp.test(strValue);
}


function rightTrim( strValue ) {
var objRegExp = /^([\w\W]*)(\b\s*)$/;

      if(objRegExp.test(strValue)) {
       //remove trailing a whitespace characters
       strValue = strValue.replace(objRegExp, '$1');
    }
  return strValue;
}

function leftTrim( strValue ) {
var objRegExp = /^(\s*)(\b[\w\W]*)$/;

      if(objRegExp.test(strValue)) {
       //remove leading a whitespace characters
       strValue = strValue.replace(objRegExp, '$2');
    }
  return strValue;
}

function trimAll( strValue ) {
 var objRegExp = /^(\s*)$/;

    //check for all spaces
    if(objRegExp.test(strValue)) {
       strValue = strValue.replace(objRegExp, '');
       if( strValue.length == 0)
          return strValue;
    }

   //check for leading & trailing spaces
   objRegExp = /^(\s*)([\W\w]*)(\b\s*$)/;
   if(objRegExp.test(strValue)) {
       //remove leading and trailing whitespace characters
       strValue = strValue.replace(objRegExp, '$2');
    }
  return strValue;
}

function removeCurrency( strValue ) {
  var objRegExp = /\(/;
  var strMinus = '';

  //check if negative
  if(objRegExp.test(strValue)){
    strMinus = '-';
  }

  objRegExp = /\)|\(|[,]/g;
  strValue = strValue.replace(objRegExp,'');
  if(strValue.indexOf('$') >= 0){
    strValue = strValue.substring(1, strValue.length);
  }
  return strMinus + strValue;
}

function addCurrency( strValue ) {
  var objRegExp = /-?[0-9]+\.[0-9]{2}$/;

    if( objRegExp.test(strValue)) {
      objRegExp.compile('^-');
      strValue = addCommas(strValue);
      if (objRegExp.test(strValue)){
        strValue = '(' + strValue.replace(objRegExp,'') + ')';
      }
      return '$' + strValue;
    }
    else
      return strValue;
}

function removeCommas( strValue ) {
  var objRegExp = /,/g; //search for commas globally

  //replace all matches with empty strings
  return strValue.replace(objRegExp,'');
}

function addCommas( strValue ) {
  var objRegExp  = new RegExp('(-?[0-9]+)([0-9]{3})');

    //check for match to search criteria
    while(objRegExp.test(strValue)) {
       //replace original string with first group match,
       //a comma, then second group match
       strValue = strValue.replace(objRegExp, '$1,$2');
    }
  return strValue;
}

function removeCharacters( strValue, strMatchPattern ) {
 var objRegExp =  new RegExp( strMatchPattern, 'gi' );

 //replace passed pattern matches with blanks
  return strValue.replace(objRegExp,'');
}

function validateIsAlNum( strValue ) {
  var objRegExp  = /^[a-zA-Z\_0-9А-я\-\ ]+$/;

  return objRegExp.test(strValue);
}
