// Calculators.lib.js
// Loaded by the echoHTMLHead php function.
// This variable not yet used.  Intended for addRows function.
var numRows = 0;

// initializeTableCalculator
// is the onload function that populates a table calculator
// pageWriteNonTabular() and pageTableCalculator() must be defined on the page 
// or the do-nothing functions in this file will run.
var initializeTableCalculator = function (cookieName, numCookieColumns) {
  'use strict';
  var cookie = readCookie(cookieName),
    cookieData,
    rowData = [];
  if (cookie) {
    cookieData = cookie.split(",").reverse();
    pageWriteNonTabular(cookieData);
    while (cookieData.length > 0) {
      for (var columnCounter = 0;columnCounter<numCookieColumns;columnCounter++) {
        rowData.push(cookieData.pop());
      }
      addRow();
      tableData[tableData.length-1]=rowData;
      rowData = new Array();
    }
  }
  else {
    addRow();
    addRow();
  }
  pageTableCalculator();
  writeTableData();
};
// Two do-nothing functions in case they aren't defined on the calling page.
// For development only.
var pageWriteNonTabular = function (cookieData) {
  'use strict';
};
var pageTableCalculator = function () {
  'use strict';
};

var calcAndSave = function (objForm, strCookieName) {
  'use strict';
  pageCalculator(objForm);
  formToCookie(objForm, strCookieName);
};

var readAndCalc = function (strCookieName, objForm) {
  'use strict';
  if (cookieToForm(strCookieName, objForm)) {
    pageCalculator(objForm);
  }
};

var addStation = function (station, elevation) {
  'use strict';
  numStations = numStations + 1;
  var tbody = document.getElementById("CalcsTable").getElementsByTagName("TBODY")[0],
  row = document.createElement("TR"),
  td1 = document.createElement("TD"),
  input1 = document.createElement("INPUT"),
  td2 = document.createElement("TD"),
  input2 = document.createElement("INPUT"),
  td3 = document.createElement("TD"),
  td4 = document.createElement("TD"),
  td5 = document.createElement("TD");
  input1.type="text";
  input1.size="6";
  input1.name="station";
  input1.value=String(station);
  td1.appendChild(input1);
  input2.type="text";
  input2.size="6";
  input2.name="elevation";
  input2.value=String(elevation);
  td2.appendChild(input2);
  td3.setAttribute("name", "d");
  td4.setAttribute("name", "qi");
  td5.setAttribute("name", "qc");
  row.appendChild(td1);
  row.appendChild(td2);
  row.appendChild(td3);
  row.appendChild(td4);
  row.appendChild(td5);
  tbody.appendChild(row);
};

// Not yet used.
var addTextInput = function (size, name, value, parent) {
  'use strict';
  var input1;
  input1.type="text";
  input1.size=size;
  input1.name=name;
  input1.value=value;
  td1.appendChild(parent);
};
// addRow
// Add a row to the standard tbody id="CalcsTable" and to the tableData array 
// (they are always kept in sync)
var addRow = function (data){
  'use strict';
  // Add a row to tableData array
  tableData.push(new Array());  
  var oRow, oCell,
  sRowId = "CalcsRow" + (tableData.length + 10000).toString().substr(1),
  oTBody = document.getElementById("CalcsTable").getElementsByTagName("TBODY")[0];
  //Insert a row at the end of the table
  oRow = oTBody.insertRow(-1);
  oRow.id=sRowId;
  for (columnCounter=0; columnCounter<columnFormats.length; columnCounter++) {
    oCell = oRow.insertCell(-1);
    /**
      * The format of the columnFormats is like this:  
      *   t = text
      *   i,12 = a 12 character input box
      *   s,option1,option2,option3,optioni =  a drop-down list
      */
    switch(columnFormats[columnCounter].substr(0, 1)) {
      case 'i':
        oCell.innerHTML = '<input size="'+columnFormats[columnCounter].substr(1)+'" value="" />';
        break;
      case 's':
        oCell.innerHTML = ' ';
        break;
      default:
        oCell.innerHTML = ' ';
        break;
    }
  }
};

var deleteRow = function () {
  'use strict';
// pop() deletes the last element within array and returns the deleted element. Original array is modified.
  tableData.pop();  
  var tbody = document.getElementById("CalcsBody");
  tbody.removeChild(tbody.getElementsByTagName("TR")[tableData.length]);
};


var deleteStation = function (station, elevation) {
  'use strict';
  numStations = numStations - 1;
  var tbody = document.getElementById("CalcsBody");
  tbody.removeChild(tbody.getElementsByTagName("TR")[numStations]);
};
/**
  * readTableInputs() reads current table inputs from the "CalcsTable" element
  * into the global tableData array.  Modifies tableData.
  *
  */
var readTableInputs = function () {
  'use strict';
  var columnCounter, rowCounter, rowElement;
  for (rowCounter=0; rowCounter<tableData.length; rowCounter++) {
    rowElement = document.getElementById("CalcsBody").getElementsByTagName('tr')[rowCounter];
    for (columnCounter=0; columnCounter<columnFormats.length; columnCounter++) {
      /**
        * The format of the columnFormats is like this:  
        *   t = text
        *   i,12 = a 12 character input box
        *   s,option1,option2,option3,optioni =  a drop-down list
        */
      if (columnFormats[columnCounter].substr(0, 1) == "i") {
        tableData[rowCounter][columnCounter] = rowElement.getElementsByTagName('td')[columnCounter].getElementsByTagName('input')[0].value;
      }
    }
  }
};

/**
  * writeTableData () saves tableData (inputs and outputs) 
  * into the "CalcsTable" element of the page.
  *
  */
var writeTableData = function () {
  'use strict';
  var columnCounter, rowCounter, rowElement;
  for (rowCounter=0; rowCounter<tableData.length; rowCounter++) {
    rowElement = document.getElementById("CalcsBody").getElementsByTagName('tr')[rowCounter];
    for (columnCounter=0; columnCounter<tableData[0].length; columnCounter++) {
      /**
        * The format of the columnFormats is like this:  
        *   t = text
        *   i,12 = a 12 character input box
        *   s,option1,option2,option3,optioni =  a drop-down list
        */
      switch(columnFormats[columnCounter].substr(0, 1)) {
        case 'i':
          rowElement.getElementsByTagName('td')[columnCounter].getElementsByTagName('input')[0].value = tableData[rowCounter][columnCounter];
          break;
        case 's':
          break;
        default:
          rowElement.getElementsByTagName('td')[columnCounter].innerHTML = tableData[rowCounter][columnCounter].toFixed(2);
      }
    }
  }
};

// The argument f is not used here.
var weirCalcs = function (f) {
  'use strict';
  var row,
  station0,
  station1,
  elev0,
  elev1,
  d0,
  d1,
  l,
  rise,
  s,
  qi,
  qc = 0,
  cookie;
  // Get the global values and save them to a cookie
  hw = document.formweir.hw.value;
  cw = document.formweir.cw.value;
  cookie= hw+","+cw;

  for (station=1;station<=numStations;station++) {
    // Save the old variables if this is not the first row
    if(station1) {
      station0=station1;
      elev0=elev1;
    }
    // Get the input, make the cookie text, and calc and output d1 even for first row
    row = document.getElementById("CalcsBody").getElementsByTagName( 'tr' )[station-1];
    station1 = row.getElementsByTagName( 'input' )[0].value;
    elev1 = row.getElementsByTagName( 'input' )[1].value;
    d1=Math.max(hw-elev1,0);
    row.getElementsByTagName( 'td' )[2].innerHTML = d1.toFixed(2);
    cookie+= "," + station1 + "," + elev1;
    
    // Do the calcs and output if this is not the first row
    if(station0) {
      d0=Math.max(hw-elev0,0);
      l=station1-station0;
      rise=elev1-elev0;
      s=rise/l;
      // Two shorthand "if" statements nested/strung together
      qi = (l==0) ? 0 : (s==0) ? cw*l*Math.pow(d0,1.5) : cw/(2.5*s)*(Math.pow(d0,2.5)-Math.pow(d1,2.5));
      qc = qc + qi
      row.getElementsByTagName( 'td' )[3].innerHTML = qi.toFixed(2);
      row.getElementsByTagName( 'td' )[4].innerHTML = qc.toFixed(2);
    }
  }
  // Save a cookie for next time
  createCookie("Segmented-Weir-Flow",cookie,36000);
};
var submitForm = function () {
  'use strict';
  calcAndSave(document.forms['formInput'],cookieName);
};
var syncUnits = function (unit) {
  'use strict';
  var unitSets= new Array();
};
