/**
 *  @fileoverview Functions for the on-line grant application.
 */

// match the php constants
var LOGIN = 1;
var PICK_GRANT = 2;
var REV_BUDGET = 3;
var EXPENDITURES = 4;
var FINAL_EVAL = 5;

/**
 *  Validates and formats a phone number. If arg is not a valid phone number,
 *  alerts the user.
 *
 *  @param  {HTMLInputElement} el   text input for phone numbers
 *  @type void
 */
function verifyPhone(el)
{
  var phonef;

  if (el.value) {
    phonef = formatPhone(el.value);
    if (phonef != -1) {
      el.value = phonef;
    }
    else {
      el.value = "";
      window.alert("Invalid phone number.\nUse format nnn nnn nnnn.");
    }
  }
}

/**
 *  Converts EIN string to nn-nnnnnnn format.
 *
 *  @param  {String} s        String to convert
 *  @return {mixed}           if success, converted (String) s, else false
 */
function formatEin(s)
{
  var c;
  var d = "";
  var einf = "";

  for (var i = 0; i < s.length; i++) {
    c = s.substr(i, 1);
    if (isNaN(parseInt(c))) {
      c = "";
    }
    d += c;
  }

  if (d.length != 9) {
    return false;
  }
  else {
    einf += d.substr(0, 2);
    einf += "-";
    einf += d.substr(2);
    return einf;
  }
}

/**
 *  Validates and formats EIN. If argument is not a valid EIN,
 *  alerts the user.
 *
 *  @param  {HTMLInputElement} el   text input for EINs
 *  @type void
 */

function verifyEin(el)
{
  var einf;

  if (el.value) {
    einf = formatEin(el.value);
    if (einf) {
      el.value = einf;
    }
    else {
      el.value = "";
      window.alert("Invalid EIN number.\nUse format nn-nnnnnnn.");
    }
  }
}

var helpWin;

/**
 *  Opens a window and loads the help document. Function closes any window it
 *  previously opened.
 *
 *  @param  {String} queryStr   Query string to append to uri.
 *  @type void
 */
function showHelp(queryStr)
{
  closeHelp();

  var features = "width=640,height=480,scrollbars";
  var uri = "help.php?" + queryStr;

  helpWin = window.open(uri, "helpwin", features);
}

/**
 *  Closes the help window if it is open.
 *
 *  @type void
 */
function closeHelp()
{
  try {
    helpWin.close();
  }
  catch (e) {
  }
}

/**
 *  Sums earned income on the revenue form.
 *
 *  @param  {HTMLFormElement}  form
 *  @type void
 */
function sumEi(form)
{
  var els = form.elements;
  var n;
  var t = 0;

  for (var i = 0; i < els.length; i++) {
    if (els[i].id.indexOf("ei_") == 0) {
      n = parseInt(stripSeparators(els[i].value));
      if (!isNaN(n)) {
        t += n;
      }
    }
  }
  els["total_ei"].value = addSeparators(t);
}

/**
 *  Sums unearned income on the revenue form.
 *
 *  @param  {HTMLFormElement}  form
 *  @type void
 */
function sumUei(form)
{
  var els = form.elements;
  var n;
  var t = 0;

  for (var i = 0; i < els.length; i++) {
    if (els[i].id.indexOf("uei") == 0) {
      n = parseInt(stripSeparators(els[i].value));
      if (!isNaN(n)) {
        t += n;
      }
    }
  }
  els["total_uei"].value = addSeparators(t);
}

/**
 *  Sums grants on the revenue form.
 *
 *  @param  {HTMLFormElement}  form
 *  @type void
 */
function sumGrants(form)
{
  var els = form.elements;
  var n;
  var t = 0;

  for (var i = 0; i < els.length; i++) {
    if (els[i].id.indexOf("grt") == 0) {
      n = parseInt(stripSeparators(els[i].value));
      if (!isNaN(n)) {
        t += n;
      }
    }
  }
  els["total_grants"].value = addSeparators(t);
}

/**
 *  Verifies carry-over and sums it with income and grants on the revenue form.
 *
 *  @param  {HTMLFormElement}  form
 *  @type void
 */
function sumCash(form)
{
  var els = form.elements;
  var n = parseInt(stripSeparators(els["carry_over"].value));
  var carryOver = (!isNaN(n)) ? n : 0;

  els["total_cash"].value = addSeparators(
    parseInt(stripSeparators(els["total_ei"].value)) +
    parseInt(stripSeparators(els["total_uei"].value)) +
    parseInt(stripSeparators(els["total_grants"].value)) +
    carryOver);
}

/**
 *  Verifies and adds MNAC Request to cash fields on the revenue form. If
 *  Request is not numeric, set it to zero.
 *
 *  @param  {HTMLFormElement}  form
 *  @type void
 */
function sumRevenue(form)
{
  var els = form.elements;
  var n = parseInt(stripSeparators(els["mnac_request"].value));
  var mnacRequest = (!isNaN(n)) ? n : 0;

  els["total_rev"].value = addSeparators(
    parseInt(stripSeparators(els["total_cash"].value)) +
      mnacRequest);
}

/**
 *  Sums all fields on the revenue form.
 *
 *  @param  {HTMLFormElement}  form
 *  @type void
 */
function sumRevenues(form)
{
  sumEi(form);
  sumUei(form);
  sumGrants(form);
  sumCash(form);
  sumRevenue(form);
}

/**
 *  Verifies numeric value of argument. Rounds argument to integer and adds
 *  thousands separators. This function is an on-change event handler for
 *  general number input fields. If arg is not numeric, alerts the user.
 *
 *  @param  {HTMLInputElement}  input   text input field
 *  @type void
 */
function verifyNatNum(input)
{
  if (isBlank(input.value)) {
    return;
  }

  var val = verifyInt(stripSeparators(input.value));

  if (val !== false) {
    input.value = addSeparators(val);
  }
  else {
    window.alert("Non-numeric entry. Please try again.");
    input.value = "";
  }
}

/**
 *  Sums all the fields on the expenditure form. Form fields which contain
 *  values to save must have an id in the format 'line_cash' and a name like
 *  'line[cash]'.
 *
 *  @param  {HTMLFormElement}  form
 *  @type void
 */
function sumExpend(form)
{
  var req = 0, cash = 0, len, line;
  var els = form.elements;
  var totalReq = 0;
  var totalCash = 0;
  var currentLine = "";

  for (var i = 0; i < els.length; i++) {
    // skip total fields
    if (els[i].id.indexOf("total") != -1) {
      continue;
    }

    switch (els[i].id) {
      case "grant_id":
      case "submit_revbdg":
      case "is_submitted":
      case "current_award":
      case "new_award":
      case "submit":
      case "reset":
      case "help_button":
      case "btn_submit":
      case "btn_reset":
      case "btn_help_button":
      case "btn_submit_report":
        continue;
    }

    len = els[i].id.lastIndexOf("_");
    line = els[i].name.substr(0, len);

    if (line && line != currentLine) {
      currentLine = line;

      req = (form[line + "_req"].value) ?
        parseInt(stripSeparators(form[line + "_req"].value)) :
        0;

      cash = (form[line + "_cash"].value) ?
        parseInt(stripSeparators(form[line + "_cash"].value)) :
        0;

      form["total_" + line].value = addSeparators(req + cash);
      totalReq += req;
      totalCash += cash;
    }
  }

  els["total_req"].value = addSeparators(totalReq);
  els["total_cash"].value = addSeparators(totalCash);
  els["total_expend"].value = addSeparators(totalReq + totalCash);
}

/**
 *  Verifies numeric value of argument and sums expenditures. Rounds argument value to integer and
 *  adds thousands separators. This function is an on-change event handler for expenditure forms. If
 *  argument is not numeric, alerts the user.
 *
 *  @param  {HTMLInputElement} input   text input field
 *  @type void
 */
function verifyExpend(input)
{
  if (input.value != "") {
    var val = verifyInt(stripSeparators(input.value));
  
    if (val !== false) {
      input.value = addSeparators(val);
    }
    else {
      window.alert("Non-numeric entry. Please try again.");
      input.value = "";
    }
  }

  sumExpend(input.form);
}

/**
 *  Verifies numeric value of argument and sums revenues. Rounds argument value
 *  to integer and adds thousands separators. This functino is an on-change
 *  event handler for revenue forms. If argument is not numeric, alerts the
 *  user.
 *
 *  @param  {HTMLInputElement}  input   text input field
 *  @type void
 */
function verifyRevenue(input)
{
  if (input.value != "") {
    var val = verifyInt(stripSeparators(input.value));
  
    if (val !== false) {
      input.value = addSeparators(val);
    }
    else {
      window.alert("Non-numeric entry. Please try again.");
      input.value = "";
    }
  }

  sumRevenues(input.form);
}

/**
 *  Sums fields on the financial summary expenditure form. Form fields which
 *  contain values to save must have an id in the format 'line_cash' and a name
 *  like 'line[cash]'.
 *
 *  @param  {HTMLFormElement}  form
 *  @type void
 */
function sumFinexp(form)
{
  var els = form.elements;
  var len, line;
  var currentLine = "";
  var cash = 0;
  var totalCash = 0;

  for (var i = 0; i < els.length; i++) {
    // skip total fields
    if (els[i].id.indexOf("total") != -1) {
      continue;
    }
    switch (els[i].id) {
      case "grant_id":
      case "finode":
      case "submit":
      case "reset":
      case "help_button":
        continue;
    }
    len = els[i].id.lastIndexOf("_");
    line = els[i].name.substr(0, len);
    if (line != currentLine) {
      currentLine = line;
      cash = (form[line + "[cash]"] && form[line + "[cash]"].value) ?
        parseInt(stripSeparators(form[line + "[cash]"].value)) :
        0;
      totalCash += cash;
    }
  }
  els["total_cash"].value = addSeparators(totalCash);
}

/**
 *  Verifies numeric value of argument and sums financial summary expenditures.
 *  Rounds argument value to integer and adds thousands separators. This
 *  functino is an on-change event handler for expenditure forms. If argument is
 *  not numeric, alerts the user.
 *
 *  @param  {HTMLInputElement}  input   text input field
 *  @type void
 */
function verifyFinexp(input)
{
  if (input.value != "") {
    var val = verifyInt(stripSeparators(input.value));
  
    if (val !== false) {
      input.value = addSeparators(val);
    }
    else {
      window.alert("Non-numeric entry. Please try again.");
      input.value = '';
    }
  }

    sumFinexp(input.form);
}

/**
 *  Validates and formats currency amounts. If argument is not numeric, alerts
 *  the user.
 *
 *  @param  {HTMLInputElement}  input   text input field
 *  @type void
 */
function verifyCurrency(input)
{
  if (isBlank(input.value)) {
    return;
  }

  var val = verifyInt(stripSeparators(input.value));

  if (val !== false) {
    input.value = addSeparators(val);
  }
  else {
    input.value = "";
    window.alert("Non-numeric entry. Please try again.");
  }
}

/**
 *  Sums revenue line items on the preview page.
 *
 *  @param  {HTMLFormElement} form
 *  @param  {boolean}         isBos   is grant Basic Opertating Support?
 *  @type void
 */
function sumPreviewRev(form, isBos)
{
  var els = form.elements;
  var n;
  var tlaei = 0;
  var tcbei = 0;
  var tpbei = 0;
  var tlauei = 0;
  var tcbuei = 0;
  var tpbuei = 0;
  var tlagrt = 0;
  var tcbgrt = 0;
  var tpbgrt = 0;

  for (var i = 0; i < els.length; i++) {
    switch (els[i].id.substr(0, 5)) {
      case "laei_":
        n = parseInt(stripSeparators(els[i].value));
        if (!isNaN(n)) {
          tlaei += n;
        }
        break;
      case "cbei_":
        n = parseInt(stripSeparators(els[i].value));
        if (!isNaN(n)) {
          tcbei += n;
        }
        break;
      case "pbei_":
        n = parseInt(stripSeparators(els[i].value));
        if (!isNaN(n)) {
          tpbei += n;
        }
        break;
      case "lauei":
        n = parseInt(stripSeparators(els[i].value));
        if (!isNaN(n)) {
          tlauei += n;
        }
        break;
      case "cbuei":
        n = parseInt(stripSeparators(els[i].value));
        if (!isNaN(n)) {
          tcbuei += n;
        }
        break;
      case "pbuei":
        n = parseInt(stripSeparators(els[i].value));
        if (!isNaN(n)) {
          tpbuei += n;
        }
        break;
      case "lagrt":
        n = parseInt(stripSeparators(els[i].value));
        if (!isNaN(n)) {
          tlagrt += n;
        }
        break;
      case "cbgrt":
        n = parseInt(stripSeparators(els[i].value));
        if (!isNaN(n)) {
          tcbgrt += n;
        }
        break;
      case "pbgrt":
        n = parseInt(stripSeparators(els[i].value));
        if (!isNaN(n)) {
          tpbgrt += n;
        }
        break;
    }
  }

  document.getElementById("total_pbei_amt").innerHTML = "$ " + addSeparators(tpbei);
  document.getElementById("total_pbuei_amt").innerHTML = "$ " + addSeparators(tpbuei);
  document.getElementById("total_pbgrt_amt").innerHTML = "$ " + addSeparators(tpbgrt);

  var pbcarry_over = parseInt(stripSeparators(els["pbcarry_over[amt]"].value));
  if (isNaN(pbcarry_over)) {
    pbcarry_over = 0;
  }

  var tpbcash = tpbei + tpbuei + tpbgrt + pbcarry_over;
  document.getElementById("total_pbcash_amt").innerHTML = "$ " + addSeparators(tpbcash);

  var pbmnac_request = parseInt(stripSeparators(els["pbmnac_request[amt]"].value));
  if (isNaN(pbmnac_request)) {
    pbmnac_request = 0;
  }

  document.getElementById("total_pbrev_amt").innerHTML = "$ " +
    addSeparators(tpbcash + pbmnac_request);

  if (isBos) {
    document.getElementById("total_laei_amt").innerHTML = "$ " + addSeparators(tlaei);
    document.getElementById("total_cbei_amt").innerHTML = "$ " + addSeparators(tcbei);
    document.getElementById("total_lauei_amt").innerHTML = "$ " + addSeparators(tlauei);
    document.getElementById("total_cbuei_amt").innerHTML = "$ " + addSeparators(tcbuei);
    document.getElementById("total_lagrt_amt").innerHTML = "$ " + addSeparators(tlagrt);
    document.getElementById("total_cbgrt_amt").innerHTML = "$ " + addSeparators(tcbgrt);

    var cbcarry_over = parseInt(stripSeparators(els["cbcarry_over[amt]"].value));
    if (isNaN(cbcarry_over)) {
      cbcarry_over = 0;
    }
    var lacarry_over = parseInt(stripSeparators(els["lacarry_over[amt]"].value));
    if (isNaN(lacarry_over)) {
      lacarry_over = 0;
    }
    var tlacash = tlaei + tlauei + tlagrt + lacarry_over;
    document.getElementById("total_lacash_amt").innerHTML = "$ " + addSeparators(tlacash);

    var tcbcash = tcbei + tcbuei + tcbgrt + cbcarry_over;
    document.getElementById("total_cbcash_amt").innerHTML = "$ " + addSeparators(tcbcash);

    var cbmnac_request =
      parseInt(stripSeparators(els["cbmnac_request[amt]"].value));
    if (isNaN(cbmnac_request)) {
      cbmnac_request = 0;
    }
    var lamnac_request =
      parseInt(stripSeparators(els["lamnac_request[amt]"].value));
    if (isNaN(lamnac_request)) {
      lamnac_request = 0;
    }
    document.getElementById("total_larev_amt").innerHTML =
      "$ " + addSeparators(tlacash + lamnac_request);

    document.getElementById("total_cbrev_amt").innerHTML =
      "$ " + addSeparators(tcbcash + cbmnac_request);
  }
}

/**
 *  Sums expenditure line items on the preview page.
 *
 *  @param  {HTMLFormElement} form
 *  @param  {boolean}         isBos   is grant Basic Opertating Support?
 *  @type void
 */
function sumPreviewExp(form, isBos)
{
  var els = form.elements;
  var req = 0;
  var cash = 0;
  var cashcb = 0;
  var cashla = 0;
  var totalReq = 0;
  var totalCash = 0;
  var totalCashcb = 0;
  var totalCashla = 0;
  var len, line;
  var currentLine = "";

  for (var i = 0; i < els.length; i++) {
    // skip total fields
    if (els[i].id.indexOf("total") != -1) {
      continue;
    }
    len = els[i].id.lastIndexOf("_");
    line = els[i].name.substr(0, len);
    if (line && line != currentLine) {
      currentLine = line;
      req = (form[line + "_req"] && form[line + "_req"].value) ?
        parseInt(stripSeparators(form[line + "_req"].value)) :
        0;
      cash = (form[line + "_cash"] && form[line + "_cash"].value) ?
        parseInt(stripSeparators(form[line + "_cash"].value)) :
        0;
      if (document.getElementById("total_" + line + "_td")) {
        document.getElementById("total_" + line + "_td").innerHTML =
          "$ " + addSeparators(req + cash);
      }

      totalReq += req;
      totalCash += cash;

      if (isBos) {
        cashcb = (form[line + "_cashcb"] && form[line + "_cashcb"].value) ?
          parseInt(stripSeparators(form[line + "_cashcb"].value)) :
          0;
        cashla = (form[line + "_cashla"] && form[line + "_cashla"].value) ?
          parseInt(stripSeparators(form[line + "_cashla"].value)) :
          0;

        totalCashcb += cashcb;
        totalCashla += cashla;
      }
    }
  }

  try {
    document.getElementById("total_req_td").innerHTML = "$ " + addSeparators(totalReq);
  }
  catch (e) {}
  try {
    document.getElementById("total_cash_td").innerHTML = "$ " + addSeparators(totalCash);
  }
  catch (e) {}
  try {
    document.getElementById("total_expend_td").innerHTML = "$ " + addSeparators(totalReq + totalCash);
  }
  catch (e) {}
  try {
    document.getElementById("total_cashcb_td").innerHTML = "$ " + addSeparators(totalCashcb);
  }
  catch (e) {}
  try {
    document.getElementById("total_cashla_td").innerHTML = "$ " + addSeparators(totalCashla);
  }
  catch (e) {}
}

function uploadPdf(id, item)
{
  window.open("upload_pdf.php?id=" + id + "&item=" + item, "upldwin");
}

function viewPdf(id, item)
{
  window.open("viewpdf.php?id=" + id + "&item=" + item, "viewwin");
}
