var ErrorText = "";
var cServerData = "";
var nBicAccountFocus = 0;
var helpWindow = null;

// BIC loss focus
function bicChange(nRace) {
  var oBic
  if (nRace == 0) {
    oBic = window.form.FIELD11;
  } else {
    oBic = window.form.FIELD14;
  }
  // Begin test - white color
  oBic.style.backgroundColor = "#F0F0F0";
  if (! (new RegExp("^\\d{9}$")).test(oBic.value)) {
    // Wrong value
    oBic.style.backgroundColor = "#F0F080";
  } else {
    // Request to server
    var n1 = new ContentLoader("bnkseek.php?BIC=" + oBic.value, bicChangeCallBack, nRace);
  }
}


function bicChangeCallBack() {
  var oBic, oBankName, oCorrAcc
  var nRace = this.addParam1;
  if (nRace == 0) {
    oBic      = window.form.FIELD11;
    oBankName = window.form.FIELD10;
    oCorrAcc  = window.form.FIELD12;
  } else {
    oBic      = window.form.FIELD14;
    oBankName = window.form.FIELD13;
    oCorrAcc  = window.form.FIELD15;
  }
  var cBankInfo = this.req.responseText;
  if (cBankInfo.substr(0, 9) == oBic.value) {
    // Ответ с нужным БИК
    if (cBankInfo.length <= 9) {
      // On server not found
      oBic.style.backgroundColor = "#F0F080";
    } else {
      oBic.style.backgroundColor = "#A0F0A0";
      oBankName.value = cBankInfo.substr(29);
      oCorrAcc.value  = cBankInfo.substr(9, 20).replace(/^\s{20}$/, "");
    }
  }
}


// INN loss focus
function innChange(nRace) {
  var oInn, cInn
  if (nRace == 0) {
    oInn = window.form.FIELD60;
  } else {
    oInn = window.form.FIELD61;
  }
  oInn.style.backgroundColor = "#A0FFFF";
  cInn = oInn.value;
  if ((new RegExp("^\\d{10}$")).test(cInn)) {
    // Begin test - white color
    oInn.style.backgroundColor = "#F0F0F0";
    if (! (new RegExp("^\\d{10}$")).test(cInn)) {
      // Wrong value
      oInn.style.backgroundColor = "#F0F080";
    } else {
      // Request to server
      var n1 = new ContentLoader("orgseek.php?INN=" + cInn, innChangeCallBack, nRace);
    }
  }
}


function innChangeCallBack() {
  var oInn, oOrgName
  var nRace = this.addParam1;
  if (nRace == 0) {
    oInn  = window.form.FIELD60;
    oName = window.form.FIELD8;
  } else {
    oInn  = window.form.FIELD61;
    oName = window.form.FIELD16;
  }
  cInn = oInn.value;
  var cOrgInfo = this.req.responseText;
  if (cOrgInfo.substr(0, 20).replace(/\s+/, "") == cInn) {
    // Ответ с нужным INN
    if (cOrgInfo.length <= 20) {
      // On server not found
      if (oInn.style.backgroundColor.toUpperCase() != "#F08080") {
        // Не красное
        oInn.style.backgroundColor = "#F0F080";
      }
    } else {
      oInn.style.backgroundColor = "#A0F0A0";
      if (oName.value == "") {
        oName.value = cOrgInfo.substr(20);
      }
    }
  }
}


function form_check() {
  ErrorText = '';
  check_field("FIELD3", "Номер платёжного поручения", ".{1,13}");
  check_field("FIELD4", "Дата платёжного поручения", "(0[1-9]|[12][0-9]|3[01])\\.(0[1-9]|1[0-2])\\.20\\d\\d");
  check_field("FIELD5", "Вид платежа", "(1|2|3|4|5)");
  check_field("FIELD101", "Статус составителя", "(0[1-9]|1[0-5]|)");
  check_field("FIELD60", "ИНН плательщика", "(\\d{5}|\\d{10}|\\d{12}|0|\\s{10})");
  check_field("FIELD102", "КПП плательщика", "(\\d{9}|0|)");
  check_field("FIELD7", "Сумма", "\\d+(\\.\\d\\d|,\\d\\d|-\\d\\d|=|)");
  check_field("FIELD8", "Плательщик", "[^\\r\\n]+(.|\\n)*");
  check_field("FIELD9", "Счёт плательщика", "\\d{20}");
  check_field("FIELD10", "Банк плательщика", "[^\\r\\n]+(.|\\n)*");
  check_field("FIELD11", "БИК банка плательщика", "\\d{9}");
  check_field("FIELD12", "Корсчёт банка плательщика", "(\\d{20}|)");
  checkBicAccCorracc("FIELD11", "FIELD9" , "FIELD12", 0, "плательщика");
  check_field("FIELD13", "Банк получателя", "[^\\r\\n]+(.|\\n)*");
  check_field("FIELD14", "БИК банка получателя", "\\d{9}");
  check_field("FIELD15", "Корсчёт банка получателя", "(\\d{20}|)");
  check_field("FIELD61", "ИНН получателя", "(\\d{5}|\\d{10}|\\d{12}|0|\\s{10})");
  check_field("FIELD103", "КПП получателя", "(\\d{9}|0|)");
  check_field("FIELD17", "Счёт получателя", "\\d{20}");
  checkBicAccCorracc("FIELD14", "FIELD17", "FIELD15", 1, "получателя");
  check_field("FIELD16", "Получатель", "[^\\r\\n]+(.|\\n)*");
  check_field("FIELD21", "Очерёдность платежа", "[123456]{1}");
  if (window.form.FIELD17.value.substr(0, 5) == "40314") {
    // Таможенные платежи
    check_field("FIELD104", "КБК", "(\\d{20}|)");
    check_field("FIELD105", "ОКАТО", "(\\d{11}|0|)");
    check_field("FIELD106", "Основание платежа", "(ДЕ|ПО|КВ|КТ|ИД|ИП|ТУ|БД|ИН|КП|0|)");
    check_field("FIELD107", "Код таможенного органа", "(\\d{8}|0|)");
    check_field("FIELD108", "Номер документа", "");
    check_field("FIELD109", "Дата документа", "(((0[1-9]|[12]\\d|3[01])\\.(0[1-9]|1[0-2])\\.20\\d\\d)|0|)");
    check_field("FIELD110", "Тип платежа", "(ШТ|ЗД|ПЕ|ТП|0|)");
  } else {
    // Налоговые платежи
    check_field("FIELD104", "КБК", "(\\d{20}|)");
    check_field("FIELD105", "ОКАТО", "(\\d{11}|)");
    check_field("FIELD106", "Основание налогового платежа", "(ТП|ЗД|БФ|ТР|РС|ОТ|РТ|ВУ|ПР|АП|АР|0|)");
    check_field("FIELD107", "Налоговый период", "(((((Д1|Д2|Д3|МС)\\.(0[1-9]|1[0-2]))|(КВ\\.(0[1-4]))|(ПЛ\\.(0[12]))|(ГД\\.00))\\.20\\d\\d)|0|)");
    check_field("FIELD108", "Номер налогового документа", "");
    check_field("FIELD109", "Дата налогового документа", "(((0[1-9]|[12]\\d|3[01])\\.(0[1-9]|1[0-2])\\.20\\d\\d)|0|)");
    check_field("FIELD110", "Тип налогового платежа", "(НС|ПЛ|ГП|ВЗ|АВ|ПЕ|ПЦ|СА|АШ|ИШ|0|)");
  }
  check_field("FIELD24", "Назначение платежа", "[^\\r\\n]+(.|\\n)*");
  if (window.form.FORMAT(0).checked) {
    check_field("PRINT_MARGIN_LEFT", "Левое поле печати", "\\d+(\\.\\d+|)");
    check_field("PRINT_MARGIN_TOP", "Верхнее поле печати", "\\d+(\\.\\d+|)");
  }
  if (ErrorText.length > 0) {
    alert(ErrorText.substr(1));
    return false;
  }
}


function check_field(cFieldShortName, cFieldName, cCheckRegExp) {
  var oField = eval("window.form." + cFieldShortName);
  var cFieldValue = oField.value;
  var cPredErrorText = ErrorText;
  if (cCheckRegExp !== "") {
    var regCheckExp = new RegExp("^" + cCheckRegExp + "$");
    if (! regCheckExp.test(cFieldValue)) {
      if (cFieldValue == "") {
        ErrorText = ErrorText + "\nНе заполнено поле '" + cFieldName + "'";
        if (cFieldName.substr(0, 3) == "ИНН" && cPredErrorText == "") {
          ErrorText = ErrorText + ". Чтобы напечатать документ с пустым ИНН нужно ввести 10 пробелов";
        }
      } else {
        ErrorText = ErrorText + "\nНеправильно заполнено поле '" + cFieldName + "'";
      }
    }
  }
  if (cFieldShortName.substr(5) >= 102 && cFieldShortName.substr(5) <= 110) {
    // Бюджетные реквизиты
    if (window.form.FIELD101.value !== "" && cFieldValue =="") {
      ErrorText = ErrorText + "\nНе заполнено поле '" + cFieldName + "', а поле 'Статус составителя' заполнено";
    }
  }
  if (cFieldName.substr(0, 4) == "Дата" && 
      ErrorText == cPredErrorText &&
      ! validDate(cFieldValue)) {
    ErrorText = ErrorText + "\nНеправильно заполнено поле '" + cFieldName + "'";
  }
  if (cFieldName.substr(0, 3) == "ИНН" && 
      ErrorText == cPredErrorText &&
      ! validInn(cFieldValue)) {
    ErrorText = ErrorText + "\nНеправильно заполнено поле '" + cFieldName + "'";
  }
  if (cPredErrorText == "" && ErrorText != "") {
    oField.focus();
  }
  if (ErrorText == cPredErrorText) {
    // Нет ошибки
    if (oField.style.backgroundColor.toUpperCase() == "#F08080") {
      // Если красное, то делаем голубое
      oField.style.backgroundColor = "#80F0F0";
    }
  } else {
    oField.style.backgroundColor = "#F08080";
  }
}


function checkBicAccCorracc(cBicShortName, cAccShortName, cCorraccShortName, nRace, cRaceName) {
  var oBic     = eval("window.form." + cBicShortName    );
  var oAcc     = eval("window.form." + cAccShortName    );
  var oCorracc = eval("window.form." + cCorraccShortName);
  if ((new RegExp("^\\d{9}$")).test(oBic.value)) {
    if (! ValidAccountKey(oBic.value, oAcc.value) && ErrorText.indexOf("Счёт " + cRaceName) < 0) {
      if (ErrorText == "") {
        nBicAccountFocus = (nBicAccountFocus + 1) % 2;
        if (nBicAccountFocus == 0) {
          oBic.focus();
        } else {
          oAcc.focus();
        }
      }
      ErrorText = ErrorText + "\nСчёт " + cRaceName + " не соответствует БИКу банка " + cRaceName;
    }

    // Request to server
    cServerData = "";
    var n1 = new ContentLoader("bnkseek.php?BIC=" + oBic.value, testBankCallBack, nRace);
    // Скоро появится информация
    var nTimeOut = 7 * 10; // 7 sec    ### => 2sec
    while (nTimeOut > 0 && cServerData.substr(0, 9) !== oBic.value) {
      sleep(100);
      nTimeOut = nTimeOut - 1;
    }
    var bErrorFound = false;
    if (cServerData.substr(0, 9) == oBic.value && cServerData.length > 9) {
      // Bank data exist, can test
      if (oCorracc.value !== cServerData.substr(9, 20).replace(/\s*$/, "")) {
        bErrorFound = true;
      }
    } else {
      // On server not found
      if (isKommerBank(oBic.value) == (oCorracc.value == "")) {
        bErrorFound = true;
      }
    }
    if (bErrorFound) {
      if (ErrorText.indexOf("Корсчёт банка " + cRaceName) < 0) {
        if (ErrorText == "") {
          nBicAccountFocus = (nBicAccountFocus + 1) % 2;
          if (nBicAccountFocus == 0) {
            oBic.focus();
          } else {
            oCorracc.focus();
          }
        }
        ErrorText = ErrorText + "\nКорсчёт банка " + cRaceName + 
         " не соответствует БИКу банка " + cRaceName;
      }
    }
  }
}


function testBankCallBack() {
  cServerData = this.req.responseText;
}


function keyF1(e) {
  var nKey;
  var cField;
  if (window.event) {
    nKey = window.event.keyCode;
    cField = window.event.srcElement.getAttribute("NAME");
    if (cField == null) {
      cField = "ALL_DOC";
    }
  } else {
    nKey = e.keyCode;
  }
  if (nKey == 112) {
    if (! helpWindow || helpWindow.closed) {
      helpWindow = open("help.html#" + cField, "Справка");
    } else {
      helpWindow.location.replace("help.html#" + cField);
    }
    if (helpWindow) {
      helpWindow.focus();
    }

    if (window.event) {
      window.event.cancelBubble = true; //отключить бег события выше для ИЕ
      window.event.returnValue = false; //отключить стандартное действие

      //то же самое для Мозиллы
      if (window.event.preventDefault) {
        window.event.preventDefault();
      }
      if (window.event.stopPropagation) {
        window.event.stopPropagation();
      }
    } else {
      e.cancelBubble = true; //отключить бег события выше для ИЕ
      e.returnValue = false; //отключить стандартное действие

      //то же самое для Мозиллы
      if (e.preventDefault) {
        e.preventDefault();
      }
      if (e.stopPropagation) {
        e.stopPropagation();
      }
    }
    return false;
  }
}
