
// Form Guard

// Last Updated: Jan-19-2005

// This script is free as long as the copyright notice remains intact.

// to consolidate all error messages
var totalAlert="";

// form submit counter
var submitCounter=0;

// regular expressions used by checking functions
var reNonBlank=/[\S]/;
var reSelectNonBlank=/^(([1-9][0-9]*)|([A-zА-я]+))$/;
var reHexColor=/^#[0-9a-fA-F]{6}$/;
var reInt=/^\d+$/;
var reSignedInt=/^(\+|-)?\d+$/;
var reFloat=/^\d+(\.\d+)?$/;
var reSignedFloat=/^(\+|-)?\d+(\.\d+)?$/;
var reChar=/^[\w\-]+$/;
var reEMail=/^\w[\w\-\.]+\@\w[\w\-]+(\.\w[\w\-]+)+$/;
var reIP=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
var rePostalCA=/^(\w\d){3}$/;
var reURL=/^http(s)?\:\/\/\w[\w\-]+(\.\w[\w\-]+)+([\/\%\?\&\+\#\.\w\-]+)*$/;
var rePhone=/^(\(\d{3,5}\)[ ]?)?\d{1,3}([-]?\d{1,2}([-]?\d{1,2})?)?$/;
var reKorp=/^(\d+)[ ]*([A-zА-я]+)?$/;
var reNameChar = /^(([A-zА-я]+[- ])*[A-zА-я]+)?$/;
var reNazvChar = /^(([A-zА-я0-9]+[- ])*[A-zА-я0-9]+)?$/;



var IsSelect = true;

function rpChar(f) {
  var df=f;

  df=df.replace(/\\/g, '\\\\');
  df=df.replace(/\//g, '\\\/');
  df=df.replace(/\[/g, '\\\[');
  df=df.replace(/\]/g, '\\\]');
  df=df.replace(/\(/g, '\\\(');
  df=df.replace(/\)/g, '\\\)');
  df=df.replace(/\{/g, '\\\{');
  df=df.replace(/\}/g, '\\\}');
  df=df.replace(/\</g, '\\\<');
  df=df.replace(/\>/g, '\\\>');
  df=df.replace(/\|/g, '\\\|');
  df=df.replace(/\*/g, '\\\*');
  df=df.replace(/\?/g, '\\\?');
  df=df.replace(/\+/g, '\\\+');
  df=df.replace(/\^/g, '\\\^');
  df=df.replace(/\$/g, '\\\$');

  return df;
}

/*
function rePhone(f) {
  var df=rpChar(f);

  df=df.replace(/d/gi, '\\d');
  df=df.replace(/w/gi, '(\\w|\\d)');

  return new RegExp('^'+df+'$');
}
*/

function reDate(f) {
  var df=rpChar(f);

  df=df.replace(/dd/gi, '\\d\\d');
  df=df.replace(/mm/gi, '\\d\\d');
  df=df.replace(/yyyy/gi, '\\d\\d\\d\\d');

  return new RegExp('^'+df+'$');
}

function reCharNM(n,m) {
  return new RegExp("\^[\\w-]{"+n+","+m+"}\$");
}

// Буквы и дефис
function reRA_NM(n,m) {
  return new RegExp("\^[A-zА-я-_]{"+n+","+m+"}\$");
}

// Буквы, цифры и дефис
function reRAN_NM(n,m) {
  return new RegExp("\^[A-zА-я0-9-_]{"+n+","+m+"}\$");
}

// Буквы, цифры, дефис и пробел
function reRANW_NM(n,m) {
  return new RegExp("\^[A-zА-я0-9-_ ]{" + n + "," + m + "}\$");
}

// Буквы, цифры, дефис и знаки препинания
function reRANWZ_NM(n,m) {
  return new RegExp("\^[A-zА-я0-9-_() .,:;!?\"']{" + n + "," + m + "}\$");
}

var reRA = /^(([A-zА-я]+[-_])*[A-zА-я]+)?$/;
var reRAN = /^(([A-zА-я0-9]+[-_])*[A-zА-я0-9]+)?$/;
var reRANW = /^(([A-zА-я0-9]+[-_ ])*[A-zА-я0-9]+)?$/;
var reRANWZ = /^(([\"']?[A-zА-я0-9]+[\"']?[-_ ,:;.!?])*[\"']?[A-zА-я0-9]+[\"']?[.!?]?)?$/;

function goodRA_Len(n, m, field, msg, mode) {
  return _checkIt(reRA, field, msg, mode) &&
         _checkIt(reRA_NM(n,m), field, msg, mode);
}

function goodRAN_Len(n, m, field, msg, mode) {
  return _checkIt(reRAN, field, msg, mode) &&
         _checkIt(reRAN_NM(n,m), field, msg, mode);
}

function goodRANW_Len(n, m, field, msg, mode) {
  return _checkIt(reRANW, field, msg, mode) &&
         _checkIt(reRANW_NM(n,m), field, msg, mode);
}

function goodRANWZ_Len(n, m, field, msg, mode) {
  return _checkIt(reRANWZ, field, msg, mode) &&
         _checkIt(reRANWZ_NM(n,m), field, msg, mode);
}

var msgName  = "<br/>-  Поле должно состоять из слова или слов, разделенных дефисом.<br/>-  Каждое слово начинается с большой буквы<br/>-  При заполнении разрешается использовать только русские буквы";
var msgFIO  = "<br/>-  Поле должно состоять из слова или слов, разделенных дефисом или пробелом.<br/>-  Каждое слово начинается с большой буквы<br/>-  При заполнении разрешается использовать только русские буквы";
var msgNazv  = "<br/>-  Поле должно состоять из слова или слов, разделенных дефисом или пробелом.<br/>-  При заполнении разрешается использовать только русские буквы, цифры и точку";
var msgLogin = "<br/>-  Поле должно состоять из слова или слов, разделенных дефисом или подчерком<br/>-  При заполнении разрешается использовать только русские буквы, латинские буквы и цифры";
var msgPassword = "<br/>-  При заполнении разрешается использовать все печатные символы";
var msgEMail = "<br/>-  Пример правильного заполнения - name@ru.ru";
var msgPhone = "<br/>-  Маска заполнения телефона x (xxx-xxx) xxx-xx-xx";



var msgRNP = "<br/>-  Поле должно состоять из слова или слов, разделенных пробелом<br/>-  При заполнении разрешается использовать только русские буквы и цифры";
var msgRegN = "<br/>-  Поле должно состоять из слова или слов, разделенных дефисом или пробелом<br/>-  При заполнении разрешается использовать только русские буквы, латинские буквы и цифры";
var msgWho = "<br/>-  Поле должно состоять из слова или слов, разделенных следующим набором символов \"- .,\\\/\"<br/>-  При заполнении разрешается использовать только русские буквы, цифры и кавычки";
var msgDate = "<br/>-  В поле должна быть дата в формате ДД.ММ.ГГГГ<br/>-  Дата должна быть не больше, чем текущая дата (дата на настоящий момент времени)";
var msgDateTime = "<br/>-  В поле должна быть дата-время в формате ДД.ММ.ГГГГ ЧЧ:ММ<br/>-  Дата должна быть не больше, чем текущая дата (дата на настоящий момент времени)";
var msgPasspSeries = "'<br/>-  Серия паспорта должна состоять из 4 цифр";
var msgPasspNum = "<br/>-  Номер паспорта должна состоять из 6 цифр";
var msgWorkSeries = "<br/>-  Серия разрешения должна состоять из 2 цифр";

function msgIntLen(n)
{
    return "\n-  Поле должно состоять из цифр\n-  При заполнении можно использовать до " + n + " разрядов";
}

function CreateMessage(msg, isNonEmpty, n, m, isString)
{

    /([^\n\r]+)(?:[\n\r]((.|\s)+))?/.test(msg);
    s = "Проверьте правильность заполнения поля " + RegExp.$1+" :<br/>";
//    s += "Перечень условий:\n";
    if(isNonEmpty)
        s += "-  Поле обязательно для заполнения<br/>";
    if(m)
    {
        if(isString)
            s += "-  Длина текста от " + n + " до " + m + " (включительно) символов<br/>";
        else
            s += "-  Диапазон значений от " + n + " до " + m + " (включительно)<br/>";
    }
    else if(n)
    {
        s+= "-  Значение поля должно быть больше " + n + "<br/>";
    }
    s += RegExp.$2;
    return s;
}

// Русские буквы, дефис
var reCheckName = /^(([А-ЯЁ][А-яЁё]*[-])*[А-ЯЁ][А-яЁё]*)?$/;
function reCheckName_NM(n,m) {
  return new RegExp("\^[А-яЁё-]{" + n + "," + m + "}\$");
}
function checkName(n, m, field, msg, mode)
{
    msg = CreateMessage(msg + msgName, n, n, m, true);
    return _checkIt(reCheckName_NM(n,m), field, msg, mode) &&
           _checkIt(reCheckName, field, msg, mode);
}

// Русские буквы, дефис, пробел
var reCheckFIO = /^(([А-ЯЁ][А-яЁё]*[- ])*[А-ЯЁ][А-яЁё]+)?$/;
function reCheckFIO_NM(n,m) {
  return new RegExp("\^[А-яЁё -]{" + n + "," + m + "}\$");
}
function checkFIO(n, m, field, msg, mode)
{
    msg = CreateMessage(msg + msgFIO, n, n, m, true);
    return _checkIt(reCheckFIO_NM(n,m), field, msg, mode) &&
           _checkIt(reCheckFIO, field, msg, mode);
}

var reCheckKV = /^(([А-яЁё0-9]+[ ])*[А-яЁё0-9]+)?$/;
function checkKemvidan(field, msg, mode) {

    msg = CreateMessage(msg + msgRNP, true);    
    
  if (field.value == "")
		{	             
			
			_alertIt(msg);	
			return false;
		}
    
    return _checkIt(reCheckKV, field, msg, mode);
}



// русские буквы, цифры, дефис, точка и пробел
var reCheckNazv = /^(([А-яЁё0-9]+\.?[ -])*[А-яЁё0-9]+\.?)?$/;
function reCheckNazv_NM(n,m) {
  return new RegExp("\^[А-яЁё0-9 \.-]{" + n + "," + m + "}\$");
}
function checkNazv(n, m, field, msg, mode) {
    msg = CreateMessage(msg + msgNazv, n, n, m, true);
    return _checkIt(reCheckNazv_NM(n,m), field, msg, mode) &&
           _checkIt(reCheckNazv, field, msg, mode);
}

// Комментарий
function reCheckComm_NM(n,m) {
  return new RegExp("\^(.|\\s){"+n+","+m+"}\$");
}
function checkComm(n, m, field, msg, mode)
{
    msg = CreateMessage(msg, n, n, m, true);    
    return _checkIt(reCheckComm_NM(n,m), field, msg, mode);
}
// Имя пользователя в системе
var reCheckLogin = /^([A-zА-яЁё]([A-zА-яЁё0-9]+[-_])*[A-zА-яЁё0-9]+)?$/;
function reCheckLogin_NM(n,m) {
  return new RegExp("\^[A-zА-яЁё0-9_-]{" + n + "," + m + "}\$");
}
function checkLogin(n, m, field, msg, mode) {
    msg = CreateMessage(msg + msgLogin, n, n , m, true);    
    return _checkIt(reCheckLogin_NM(n,m), field, msg, mode) &&
           _checkIt(reCheckLogin, field, msg, mode);
}
// Пароль
function reCheckPass_NM(n,m) {
  return new RegExp("\^[^\\s]{"+n+","+m+"}\$");
}
function checkPasswords(n, m, field1, field2, msg1, msg2, isnew, mode)
{
  if(!isnew && field1.value == "" && field2.value == "")
  {
      return true;
  }
  msg1 = CreateMessage(msg1 + msgPassword, isnew ? true : false, n, m, true);    
  if(_checkIt(reCheckPass_NM(n, m), field1, msg1, mode))
  {
    if (field1.value == field2.value) {
      return true;
    }
    else {
      _alertIt(msg2, mode);
    }
  }
  return (mode && mode==1)?true:false;
}

// email
var reCheckEMail=/^[A-z0-9][A-z0-9\-\.]*\@[A-z0-9][A-z0-9\-]*(\.[A-z][A-z\-]+)+$/;
function checkEMail(field, msg, mode) {
    msg = CreateMessage(msg + msgEMail, true);    
    return _checkIt(reCheckEMail, field, msg, mode);
}

// телефон
var reCheckPhone=/^\d?[ ]?(\(\d{3,5}([-]\d{1,3})?\)[ ]?)?\d{1,3}([-]?\d{1,2}([-]?\d{1,2})?)?$/;
function checkPhone(field, msg, mode) {
  msg = CreateMessage(msg + msgPhone, true);    
  return _checkIt(reCheckPhone, field, msg, mode);
}


// целые числа с n разрядов
function checkIntLen(n, field, msg, mode) {
  msg = CreateMessage(msg + msgIntLen(n), true);    
  return _checkIt(reNumberN(n,0), field, msg, mode);
}

// русские буквы, цифры и пробел
var reCheckRNP = /^(([А-яЁё0-9]+[ ])*[А-яЁё0-9]+)?$/;
function reCheckRNP_NM(n,m) {
  return new RegExp("\^[А-яЁё0-9 ]{" + n + "," + m + "}\$");
}
function checkRNP(n, m, field, msg, mode) {
  msg = CreateMessage(msg + msgRNP, n, n, m, true);    
  return _checkIt(reCheckRNP_NM(n,m), field, msg, mode) &&
           _checkIt(reCheckRNP, field, msg, mode);
}


// русские буквы, цифры и пробел
var reCheckKV = /^(([А-яЁё0-9]+[ ])*[А-яЁё0-9]+)?$/;
function reCheckKV(n,m) {
	 msg = CreateMessage(msg + msgRNP, n, n, m, true);  
  return new RegExp("\^[А-яЁё0-9 ]{" + n + "," + m + "}\$");
}
function checkRNP(n, m, field, msg, mode) {
  msg = CreateMessage(msg + msgRNP, n, n, m, true);    
  return _checkIt(reCheckRNP_NM(n,m), field, msg, mode) &&
           _checkIt(reCheckRNP, field, msg, mode);
}

// проверка рег номера
var reCheckRegN = /^(([А-яЁёA-z0-9]+[ -])*[А-яЁёA-z0-9]+)?$/;
function reCheckRegN_NM(n,m) {
  return new RegExp("\^[A-zА-яЁё0-9 -]{" + n + "," + m + "}\$");
}
function checkRegN(n, m, field, msg, mode) {
  msg = CreateMessage(msg + msgRegN, n, n, m, true);    
  return _checkIt(reCheckRegN_NM(n,m), field, msg, mode) &&
           _checkIt(reCheckRegN, field, msg, mode);
}

// проверка "Кем выдан"
var reCheckWho = /^((["]?[А-яЁё0-9]+[- ,."\x5c\x2f\x5c\x5c]+)*["]?[А-яЁё0-9]+[."]?)?$/;
function reCheckWho_NM(n,m) {
  return new RegExp("\^[А-яЁё0-9 \.,\"\x5c\x2f\x5c\x5c-]{" + n + "," + m + "}\$");
}
function checkWho(n, m, field, msg, mode) {
  msg = CreateMessage(msg + msgWho, n, n, m, true);    
  return _checkIt(reCheckWho_NM(n,m), field, msg, mode) &&
           _checkIt(reCheckWho, field, msg, mode);
}

// Проверка номера корпуса
function checkKorpNumber(n, m, field, msg, mode) {
  return checkRNP(n, m, field, msg, mode);
}

// Проверка дробного числа
function checkRangeFloat(field, r1, r2, msg, nononblank, mode) {
  msg = CreateMessage(msg, nononblank ? false : r1 > 0, r1, r2);    
  if (goodFloat(field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function checkRangeInt(field, r1, r2, msg, mode) {
  msg = CreateMessage(msg, r1 > 0, r1, r2);    
  if (goodInt(field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

// Проверка на заполненность поля
function checkNonBlank(field, msg, mode) {
  msg = CreateMessage(msg, true);    
  if (field.type) {
    if (/file|text|password/.test(field.type)) {
      return _checkIt(reNonBlank, field, msg, mode);
    }
    if (/select|hidden/.test(field.type)) {
      return _checkIt(reSelectNonBlank, field, msg, mode);
    }
    else if (/radio|checkbox/.test(field.type)) {
      if (field.checked) {
        return true;
      }
      else {
        _alertIt(msg, mode);
        field.focus();
        return (mode && mode==1)?true:false;
      }
    }
    else {
      _alertIt("Invalid field for nonBlank() checking", mode);
      return (mode && mode==1)?true:false;
    }
  }
  else if (field.length && field[0].type && /radio|checkbox/.test(field[0].type)) {
    for (var i=0; i<field.length; i++) {
      if (field[i].checked) { return true; }
    }

    _alertIt(msg, mode);
    field[0].focus();
    return (mode && mode==1)?true:false;
  }
  else {
    _alertIt("Invalid field for nonBlank() checking", mode);
    return (mode && mode==1)?true:false;
  }
}

function parseDate(field, isend)
{
    /(\d+)\.(\d+)\.(\d+)(?: (\d+):(\d+))?/.test(field.value);
    h = RegExp.$4;
    min = RegExp.$5;
    sec = 0;
    if(isend)
    {
        if(h == "")
            h = 23;
        if(min == "")
            min = 59;
        sec = 59;      
    }
    return new Date(RegExp.$3, (RegExp.$2 - 1), RegExp.$1, h, min, sec);
}

function parseDateAndCheck(field)
{
    if(!/^(\d+)\.(\d+)\.(\d+)(?: (\d+):(\d+))?/.test(field.value))
    {
        return false;
    }
    h = RegExp.$4;
    min = RegExp.$5;
    if(h == "")
        h = 0;
    if(min == "")
        min = 0;        
    m = RegExp.$2 - 1;
    
    var dd = new Date(RegExp.$3, m, RegExp.$1, h, min, 0);
        
    if (RegExp.$3==dd.getFullYear()  &&
            m==dd.getMonth()         &&
            RegExp.$1==dd.getDate()  &&
            RegExp.$4==dd.getHours() &&
            RegExp.$5==dd.getMinutes()
        )
    {
        var dDate = new Date();
        dDate.setHours(23, 59, 59, 99);
        if(dd > dDate)
            return false;
        return true;
    }
    
    return false;    
}



function checkDate(field1, field2, msg, mode)
{
    if(field1.value == "" || field2.value == "")
        return true;

    msg = CreateMessage(msg, false, field1.value);    
        
    var d1 = parseDate(field1), d2 = parseDate(field2, true);

    if (d2 > d1)
        return true;
    _alertIt(msg, mode);
    
    if(IsSelect)
    {
        field2.select();
        field2.focus();
    }
    return (mode && mode==1)?true:false;
}

// Проверка даты
var reCheckDateTime = /^\d+\.\d+\.\d+(?: \d+:\d+)?$/;
var reCheckDate = /^\d+\.\d+\.\d+$/;
function checkDateTime(field, msg, isnonblank, istime, mode)
{
    if(!isnonblank && field.value == "")
        return true;
    var b = false;  
    if(istime)
    {
        msg = CreateMessage(msg + msgDateTime, isnonblank);
        b = _checkIt(reCheckDateTime, field, msg, mode);
    }
    else
    {
        msg = CreateMessage(msg + msgDate, isnonblank);
        b = _checkIt(reCheckDate, field, msg, mode);
    }
    if(b)
    {
        b = parseDateAndCheck(field);
        if(!b)
        {
            _alertIt(msg, mode);
            
            if(IsSelect)
            {
                field.select();
                field.focus();
            }
        }
    }
    return b;
}


function reWordCharNM(n,m) {
  return new RegExp("\^[A-zА-яЁё-]{"+n+","+m+"}\$");
}



function reWordCharNM(n,m) {
  return new RegExp("\^[A-zА-яЁё-]{"+n+","+m+"}\$");
}

function reAllCharNM(n,m) {
  return new RegExp("\^(.|\\s){"+n+","+m+"}\$");
}


function reNazvCharNM(n,m) {
  return new RegExp("\^[A-zА-я0-9 -]{" + n + "," + m + "}\$");
}

function reNameCharNM(n,m) {
  return new RegExp("\^[A-zА-я -]{" + n + "," + m + "}\$");
}

function reNumberN(n,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{1,"+n+"}\$");
}

function reNumberN2(n,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{"+n+"}\$");
}

function reNumberN2Space() {
  return new RegExp("\^\\d{2}\040\\d{2}\$|\^\\d{4}\$");
}

function reNumberNM(n,m,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{1,"+n+"}(\\.\\d{1,"+m+"})?\$");
}

function reNumberNM2(n,m,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{"+n+"}\\.\\d{"+m+"}\$");
}

function reKorp2NM(n,m) {
  return new RegExp("\^[A-zА-я0-9 ]{"+n+","+m+"}\$");
}



// wrapper functions
function _alertIt(msg, mode) {
	$('form .errors').show();
	$('form.anketa .errors td').empty();
	$('form.anketa .errors td').append(msg+'<br/>');
}

function _checkIt(re, field, msg, mode) {
  if (!re.test(field.value)) {
    _alertIt(msg, mode);
    
    if(IsSelect && !(/hidden/.test(field.type)))
    {
        if (field.select) {
          field.select();
        }
        if (field.focus) {
          field.focus();
        }
    }
    return (mode && mode==1)?true:false;
  }

  return true;
}

function noErrors() {
  if (totalAlert=="") {
    return true;
  }
  else {
    alert(totalAlert);
    totalAlert="";
    return false;
  }
}

// the checking functions
function goodPasswords(field1, field2, msg1, msg2, mode) {
  if (nonBlank(field1, msg1, mode?2:0) && nonBlank(field2, msg1, mode?2:0)) {
    if (field1.value == field2.value) {
      return true;
    }
    else {
      _alertIt(msg2, mode);
    }
  }

  return (mode && mode==1)?true:false;
}

// the checking functions

/*
function goodPasswordsLen(field1, field2, n, m, msg1, msg2, msg3, mode) {
  if (nonBlank(field1, msg1, mode?2:0) && nonBlank(field2, msg1, mode?2:0)) {
    if (field1.value == field2.value) {
      if (goodCharLen(n, m, field1, msg3, mode?2:0)) {
        return true;
      }
    }
    else {
      _alertIt(msg2, mode);
    }
  }

  return (mode && mode==1)?true:false;
}
*/

function goodEMails(field1, field2, msg1, msg2, mode) {
  if (goodEMail(field1, msg1, mode?2:0) && goodEMail(field2, msg1, mode?2:0)) {
    if (field1.value == field2.value) {
      return true;
    }
    else {
      _alertIt(msg2, mode);
    }
  }

  return (mode && mode==1)?true:false;
}

/*function goodPhone(pf, field, msg, mode) {
  return _checkIt(rePhone(pf), field, msg, mode);
}*/

function goodPhone(field, msg, mode) {
  return _checkIt(rePhone, field, msg, mode);
}

function goodPostalCA(field, msg, mode) {
  return _checkIt(rePostalCA, field, msg, mode);
}

function goodDate(df, field, msg, mode) {
  if (_checkIt(reDate(df), field, msg, mode?2:0)) {
    var di=field.value;
    var y4=df.search(/yyyy/i), y=di.substring(y4, y4+4)-0;
    var m2=df.search(/mm/i), m=di.substring(m2, m2+2)-1;
    var d2=df.search(/dd/i), d=di.substring(d2, d2+2)-0;

    var dd=new Date(y, m, d);
    
    if (y==dd.getFullYear() && m==dd.getMonth() && d==dd.getDate()) {
      return true;
    }
    else {
      _alertIt(msg, mode);

      if(IsSelect)
      {
      field.select();
      field.focus();
      }
    }
  }

  return (mode && mode==1)?true:false;
}

function goodIP(field, msg, mode) {
  return _checkIt(reIP, field, msg, mode);
}

function goodChar(field, msg, mode) {
  return _checkIt(reChar, field, msg, mode);
}

function goodEMail(field, msg, mode) {
  return _checkIt(reEMail, field, msg, mode);
}

function goodInt(field, msg, mode) {
  return _checkIt(reInt, field, msg, mode);
}

function goodSignedInt(field, msg, mode) {
  return _checkIt(reSignedInt, field, msg, mode);
}

function goodFloat(field, msg, mode) {
  return _checkIt(reFloat, field, msg, mode);
}

function goodSignedFloat(field, msg, mode) {
  return _checkIt(reSignedFloat, field, msg, mode);
}

function goodIntLen(n, field, msg, mode) {
  return _checkIt(reNumberN(n,0), field, msg, mode);
}

function goodSignedIntLen(n, field, msg, mode) {
  return _checkIt(reNumberN(n,1), field, msg, mode);
}

function goodIntLen2(n, field, msg, mode) {
  return _checkIt(reNumberN2(n,0), field, msg, mode);
}

function goodSignedIntLen2(n, field, msg, mode) {
  return _checkIt(reNumberN2(n,1), field, msg, mode);
}

function goodCharLen(n, m, field, msg, mode) {
  return _checkIt(reCharNM(n,m), field, msg, mode);
}

function goodAllCharLen(n, m, field, msg, mode) {
  return _checkIt(reAllCharNM(n,m), field, msg, mode);
}

function goodWordCharLen(n, m, field, msg, mode) {
  return _checkIt(reWordCharNM(n,m), field, msg, mode);
}

function goodNameCharLen(n, m, field, msg, mode) {
  return _checkIt(reNameChar, field, msg, mode) &&
         _checkIt(reNameCharNM(n,m), field, msg, mode);
}

function goodNazvCharLen(n, m, field, msg, mode) {
  return _checkIt(reNazvChar, field, msg, mode) &&
         _checkIt(reNazvCharNM(n,m), field, msg, mode);
}

function goodFloatLen(n, m, field, msg, mode) {
  return _checkIt(reNumberNM(n,m,0), field, msg, mode);
}

function goodSignedFloatLen(n, m, field, msg, mode) {
  return _checkIt(reNumberNM(n,m,1), field, msg, mode);
}

function goodFloatLen2(n, m, field, msg, mode) {
  return _checkIt(reNumberNM2(n,m,0), field, msg, mode);
}

function goodSignedFloatLen2(n, m, field, msg, mode) {
  return _checkIt(reNumberNM2(n,m,1), field, msg, mode);
}

function _rangeIt(field, r1, r2, msg, mode) {
  if (field.value>=r1 && field.value<=r2) {
    return true;
  }
  else {
    _alertIt(msg, mode);

    if(IsSelect)
    {
    field.select();
    field.focus();
    }

    return (mode && mode==1)?true:false;
  }
}

function rangeInt(field, r1, r2, msg, mode) {
  if (goodInt(field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeSignedInt(field, r1, r2, msg, mode) {
  if (goodSignedInt(field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeFloat(field, r1, r2, msg, mode) {
  if (goodFloat(field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeSignedFloat(field, r1, r2, msg, mode) {
  if (goodSignedFloat(field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeIntLen(n, field, r1, r2, msg, mode) {
  if (goodIntLen(n, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeSignedIntLen(n, field, r1, r2, msg, mode) {
  if (goodSignedIntLen(n, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeIntLen2(n, field, r1, r2, msg, mode) {
  if (goodIntLen2(n, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeSignedIntLen2(n, field, r1, r2, msg, mode) {
  if (goodSignedIntLen2(n, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeFloatLen(n, m, field, r1, r2, msg, mode) {
  if (goodFloatLen(n, m, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeSignedFloatLen(n, m, field, r1, r2, msg, mode) {
  if (goodSignedFloatLen(n, m, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeFloatLen2(n, m, field, r1, r2, msg, mode) {
  if (goodFloatLen2(n, m, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function rangeSignedFloatLen2(n, m, field, r1, r2, msg, mode) {
  if (goodSignedFloatLen2(n, m, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }

  return (mode && mode==1)?true:false;
}

function _dd(n) {
  return (n<10)?"0"+n:""+n;
}

function _getOffset(n) {
  var d=new Date();
  if (n!=0) {
    d.setTime(d.getTime()+n*86400000);
  }
  return d.getFullYear()+""+_dd(d.getMonth()+1)+""+_dd(d.getDate())+"";
}

function _stringIt(df, d) {
  var y4=df.search(/yyyy/i), m2=df.search(/mm/i), d2=df.search(/dd/i);
  return d.substring(y4, y4+4)+d.substring(m2, m2+2)+d.substring(d2, d2+2);
}

function rangeDate(df, field, r1, r2, msg, mode) {
  if (goodDate(df, field, msg, mode?2:0)) {
    var d=_stringIt(df, field.value);

    var r1x="", r2x="";
    if (r1.search(/^\d+$/)!=-1) {
      r1x=_getOffset(r1-0);
    }
    else {
      r1x=_stringIt(df, r1);
    }
    if (r2.search(/^\d+$/)!=-1) {
      r2x=_getOffset(r2-0);
    }
    else {
      r2x=_stringIt(df, r2);
    }

    if (d<r1x || d>r2x) {
      _alertIt(msg, mode);

      if(IsSelect)
      {
      field.select();
      field.focus();
      }
    }
    else {
      return true;
    }
  }

  return (mode && mode==1)?true:false;
}

function goodDateRange(df, field1, field2, msg, mode) {
  if (goodDate(df, field1, msg, mode?2:0) && goodDate(df, field2, msg, mode?2:0)) {
    if (_stringIt(df, field1.value)>_stringIt(df, field2.value)) {
      _alertIt(msg, mode);
      field1.focus();
    }
    else {
      return true;
    }
  }

  return (mode && mode==1)?true:false;
}

function goodDateRange2(df, field1, field2, msg, mode) {
  if (goodDate(df, field1, msg, mode?2:0) && goodDate(df, field2, msg, mode?2:0)) {
    if (_stringIt(df, field1.value)>=_stringIt(df, field2.value)) {
      _alertIt(msg, mode);
      field1.focus();
    }
    else {
      return true;
    }
  }

  return (mode && mode==1)?true:false;
}

function goodHexColor(field, msg, mode) {
  return _checkIt(reHexColor, field, msg, mode);
}

function nonBlank(field, msg, mode) {
  if (field.type) {
    if (/file|text|password/.test(field.type)) {
      return _checkIt(reNonBlank, field, msg, mode);
    }
    if (/select/.test(field.type)) {
      return _checkIt(reSelectNonBlank, field, msg, mode);
    }
    else if (/radio|checkbox/.test(field.type)) {
      if (field.checked) {
        return true;
      }
      else {
        _alertIt(msg, mode);
        field.focus();
        return (mode && mode==1)?true:false;
      }
    }
    else {
      _alertIt("Invalid field for nonBlank() checking", mode);
      return (mode && mode==1)?true:false;
    }
  }
  else if (field.length && field[0].type && /radio|checkbox/.test(field[0].type)) {
    for (var i=0; i<field.length; i++) {
      if (field[i].checked) { return true; }
    }

    _alertIt(msg, mode);
    field[0].focus();
    return (mode && mode==1)?true:false;
  }
  else {
    _alertIt("Invalid field for nonBlank() checking", mode);
    return (mode && mode==1)?true:false;
  }
}

function goodRadioedFields(form, fn, re, msgs, msg, mode) {
  for (var i=0; i<form[fn].length; i++) {
    if (form[fn][i].checked) {
      return _checkIt(re, form[form[fn][i].value], msgs[i], mode);
    }
  }

  _alertIt(msg, mode);
  return (mode && mode==1)?true:false;
}

function goodRadioedFields2(form, fn, re, msgs, msg, mode) {
  for (var i=0; i<form[fn].length; i++) {
    if (form[fn][i].checked) {
      return _checkIt(re[i], form[form[fn][i].value], msgs[i], mode);
    }
  }

  _alertIt(msg, mode);
  return (mode && mode==1)?true:false;
}

function noBadWords(field, strict, words, msg, mode) {
  var lw=[], nwb=strict?'':'\\b';
  for (var i=0; i<words.length; i++) {
    lw[i]=nwb+words[i].toLowerCase()+nwb;
  }

  var re=new RegExp(lw.join("|"), "i");
  if (re.test(field.value)) {
    _alertIt(msg, mode);
    return (mode && mode==1)?true:false;
  }
  else {
    return true;
  }
}

// credit card checking codes taken from Netscape LivePayment samples codes and modified to fit Form Guard
function goodCreditCard(field, msg, mode) {
  var sum=0, mul=1, l=field.value.length;
  var digit, tproduct;

  if (_checkIt(reInt, field, msg, mode?2:0)) {
    for (var i=0; i<l; i++) {
      digit=field.value.substring(l-i-1,l-i);
      tproduct=parseInt(digit ,10)*mul;
      if (tproduct>=10) {
        sum+=(tproduct%10)+1;
      }
      else {
        sum+=tproduct;
      }

      if (mul==1) {
        mul++;
      }
      else {
        mul--;
      }
    }

    if ((sum%10)==0) {
      return true;
    }
    else {
      _alertIt(msg, mode);
      return (mode && mode==1)?true:false;
    }
  }
}

function goodVisa(field, msg, mode) {
  if ((field.value.length==16 || field.value.length==13) && field.value.substring(0,1)==4) {
    return goodCreditCard(field, msg, mode);
  }
  else {
    _alertIt(msg, mode);
    return (mode && mode==1)?true:false;
  }
}

function goodMasterCard(field, msg, mode) {
  var firstdig=field.value.substring(0,1), seconddig=field.value.substring(1,2);
  if (field.value.length==16 && firstdig==5 && (seconddig>=1 && seconddig<=5)) {
    return goodCreditCard(field, msg, mode);
  }
  else {
    _alertIt(msg, mode);
    return (mode && mode==1)?true:false;;
  }
}

function goodAmericanExpress(field, msg, mode) {
  var firstdig=field.value.substring(0,1), seconddig=field.value.substring(1,2);
  if (field.value.length==15 && firstdig==3 && (seconddig==4 || seconddig==7)) {
    return goodCreditCard(field, msg, mode);
  }
  else {
    _alertIt(msg, mode);
    return (mode && mode==1)?true:false;;
  }
}

function goodDinersClub(field, msg, mode) {
  var firstdig=field.value.substring(0,1), seconddig=field.value.substring(1,2);
  if (field.value.length==14 && firstdig==3 && (seconddig==0 || seconddig==6 || seconddig==8)) {
    return goodCreditCard(field, msg, mode);
  }
  else {
    _alertIt(msg, mode);
    return (mode && mode==1)?true:false;;
  }
}

function goodCarteBlanche(field, msg, mode) {
  return goodDinersClub(field, msg, mode);
}

function goodDiscover(field, msg, mode) {
  var first4digs=field.value.substring(0,4);
  if (field.value.length==16 && first4digs=="6011") {
    return goodCreditCard(field, msg, mode);
  }
  else {
    _alertIt(msg, mode);
    return (mode && mode==1)?true:false;;
  }
}

function goodEnRoute(field, msg, mode) {
  var first4digs=field.value.substring(0,4);
  if (field.value.length==15 && (first4digs=="2014" || first4digs=="2149")) {
    return goodCreditCard(field, msg, mode);
  }
  else {
    _alertIt(msg, mode);
    return (mode && mode==1)?true:false;;
  }
}

function goodJCB(field, msg, mode) {
  var first4digs=field.value.substring(0,4);
  if (field.value.length==16 && (first4digs=="3088" || first4digs=="3096" || first4digs=="3112" || first4digs=="3158" || first4digs=="3337" || first4digs=="3528")) {
    return goodCreditCard(field, msg, mode);
  }
  else {
    _alertIt(msg, mode);
    return (mode && mode==1)?true:false;;
  }
}

function notSubmitted(msg) {
  if (submitCounter==0) {
    submitCounter=1;
    return true;
  }
  else {
    alert(msg);
    return false;
  }
}

function goodURL(field, msg, mode) {
  return _checkIt(reURL, field, msg, mode);
}

function goodKorpNumber(field, r1, r2, n1, n2, msg, mode) {
  if (_checkIt(reKorp2NM(n1, n2), field, msg, mode?2:0) &&
        _checkIt(reKorp, field, msg, mode?2:0))
  {
      var val = RegExp.$1;
      if (val>=r1 && val<=r2) {
        return true;
      }
      else {
        _alertIt(msg, mode);
    
        if(IsSelect)
        {
        field.select();
        field.focus();
        }
    
        return (mode && mode==1)?true:false;
      }
  }

  return (mode && mode==1)?true:false;
}

function SetIsSelect(sel)
{
    IsSelect = sel;    
}





function VerifySubmit()
{
    var form = document.forms[0];

    var ret = 
    checkLogin(6, 40, form.FormUser, "Имя пользователя в системе") &&
    checkPasswords(6, 40, form.FormPassword, form.FormPassword2, "Пароль", "Пароль и подтверждение должны совпадать", true) &&
    checkName(1, 40, form.FormUserFamily, "Фамилия") &&
    checkName(1, 40, form.FormUserName, "Имя") &&
    checkName(1, 40, form.FormUserOtch, "Отчество") &&
    checkEMail(form.email, "E-mail") &&
    checkPhone(form.FormTelefon, "Телефон") &&
    checkNonBlank(form.FormRole, "Роль") &&
    checkComm(0, 1000, form.FormComment, "Комментарий");
    return ret;
}


function VerifyPassport()
{
    //var form = document.forms[0];
	var form = document.getElementById("work_permit");
    var ret =
    	checkFIO(0,100, form.lastname, "Фамилия") && 
	checkFIO(0,100, form.firstname, "Имя") &&
	checkFIO(0,100, form.middlename, "Отчество") &&
	checkSingleDate(form.birthdate, "Дата рождения") &&
	
checkKemvidan(form.kemvidan, "Кем выдан") &&

	checkPasspSeries(form.series, "Серия паспорта") && 
	checkPasspNum(form.num, "Номер паспорта") && 
	//checkSingleDate(form.date, "Дата выдачи", true) &&
    checkEMail(form.email, "E-mail") ;
    return ret;
}


function checkPasspSeries(field, msg, mode) {
    msg = CreateMessage(msg + msgPasspSeries, true);    
    return _checkIt(reNumberN2Space(), field, msg, mode);
}

function checkPasspNum(field, msg, mode) {
    msg = CreateMessage(msg + msgPasspNum, true);    
    return _checkIt(reNumberN2(6,0), field, msg, mode);
}


function ch(re, val)
{
	return new RegExp(re).test(val);

}
	
function VerifyWorkpermit()
{
    //var form = document.forms[0];
	var form = document.getElementById("work_permit");
    var ret =
	checkSingleDate(form.todate, "Период действия по") &&
	checkFIO(0,100, form.lastname, "Фамилия") && 
	checkFIO(0,100, form.firstname, "Имя") &&
	checkFIO(0,100, form.middlename, "Отчество") &&
	checkSingleDate(form.birthdate, "Дата рождения") &&
	checkWPSeries(form.series, "Серия разрешения") &&
	checkWPNum(form.num, "Номер разрешения") &&
	checkSingleDate(form.givendate, "Дата выдачи") &&
	checkEMail(form.email, "E-mail") &&
	checkSingleDate(form.ondate, "Период действия с") ;
    return ret;
}

function checkWPSeries(field, msg, mode) {
    msg = CreateMessage(msg + msgWorkSeries);    
    if(field.value == "") return true;
    return _checkIt(reNumberN2(2,0), field, msg, mode);
}

function checkWPNum(field, msg, mode) {

    return checkNonBlank(field, msg, mode);
}


function checkSingleDate(field1, msg, mode)
{
	msg = "Проверьте правильность заполнения поля '" + msg + "':<br/><br/> - Дата должна быть представлена в виде дд.мм.гггг, например 01.10.1971";	
	if (mode != null && mode==true)
	{
		if (field1.value == "" || field1.value == "дд.мм.гггг")
		{	             
			msg = msg+"<br/> - Поле обязательно для заполнения";
			_alertIt(msg);	
			return false;
		}
	}else if(field1.value == ""||field1.value == "дд.мм.гггг")
        return true;

    var d1 = parseDate(field1);
	var myDate=new Date();
	myDate.setFullYear(1901,0,1);
    if (d1>myDate)
    {
		return true;
	} 
    _alertIt(msg);
	return false;

    
}


function clearText(x)
{
	var value = document.getElementById(x).value;
	if (value == null || value == "") return;

	if (value == "дд.мм.гггг") document.getElementById(x).value = "";
}

