//tape functions
//------------------------

tapeCounter = 0;

function appendToTape(hms, op, equalsOp) {
  var tape = byId('tape');
  if(error) {
    if(errorDisplayed) return;
    setOperator('E');
    var row = crEl('TR');
    row.className = 'error';
    if(++tapeCounter % 2 == 0) row.className += ' highlight';
    var cell = crEl('TD');
    cell.setAttribute('colspan', 8);
    cell.innerHTML = error;
    row.appendChild(cell);
    tape.appendChild(row);
    var scroller = tape.parentNode.parentNode;
    scroller.scrollTop = scroller.scrollHeight;
    errorDisplayed = true;
    return;
  }
  //if(hms[2] >= 60 || hms[3] >= 60) hms = s2hms(hms2s(hms));
  hms = formatDisplay(hms);
  var row = crEl('TR');
  row.className = 'entry';
  row.title = 'Click to set the display to this value.';
  if(++tapeCounter % 2 == 0) row.className += ' highlight';
  if(op == '=' || op == 'M') row.className += ' equals';
  if(op == 'M') {
    row.className += ' memory';
    row.title = 'This shows the value stored in memory.';
  }
  if(op == 'AC') row.className += ' ac';
  if(hms[0] >= 0 && hms[0] < 10) hms[0] = '&nbsp;' + hms[0];
  var s = hms[2] + '';
  var decimal = 0;
  if(s.indexOf('.') != -1) {
    decimal = s.split('.');
    s = decimal[0];
    decimal = decimal[1];
  }
  var h = crEl('TD');
  h.className = 'h';
  h.innerHTML = hms[0];
  var m = crEl('TD');
  m.className = 'm';
  m.innerHTML = hms[1];
  var sWhole = crEl('TD');
  sWhole.className = 'sWhole';
  sWhole.innerHTML = s;
  var dot = crEl('TD');
  dot.className = 'dot';
  dot.innerHTML = (decimal == 0) ? '&nbsp;' : '.';
  var fraction = crEl('TD');
  fraction.className = 'fraction';
  fraction.innerHTML = (decimal == 0) ? '&nbsp;' : decimal;
  var colon = crEl('TD');
  colon.innerHTML = ':';
  op = tapeFormatOperator(op);
  var operation = crEl('TD');
  operation.className = 'operator';
  operation.innerHTML = op;
  if(equalsOp) operation.innerHTML = '&nbsp;&nbsp;';
  row.appendChild(h);
  row.appendChild(colon);
  row.appendChild(m);
  row.appendChild(colon.cloneNode(true));
  row.appendChild(sWhole);
  row.appendChild(dot);
  row.appendChild(fraction);
  row.appendChild(operation);
  tape.appendChild(row);
  var scroller = tape.parentNode.parentNode;
  scroller.scrollTop = scroller.scrollHeight;
  row.onclick = function () {
    setDisplay(getRowValue(this));
    operatorPressedLast = false;
    /*if(this.lastChild.innerHTML.indexOf('=') == -1) {
      clearOnNext = false;
    }*/
  };
}

function getRowValue(row) {
  var cells = row.children;
  var h,m,s,cell,dot,fraction;
  var neg = false;
  for(var i=0; i<cells.length; i++) {
    cell = cells[i]
    switch(cell.className) {
      case 'h':
        h = new BigDecimal(cell.innerHTML.replace(/[^0-9-]+/, '')); break;
      case 'm':
        m = new BigDecimal(cell.innerHTML); break;
      case 'sWhole':
        s = cell.innerHTML;
        dot = cell.nextSibling.innerHTML;
        s += (dot == '.') ? dot : '';
        fraction = cell.nextSibling.nextSibling.innerHTML;
        s += (fraction == '&nbsp;') ? '' : fraction;
        s = new BigDecimal(s);
        if(h.compareTo(ZERO) < 0) {
          neg = true;
          h = h.multiply(MINUS_ONE);
        }
        return [neg, h, m, s];
    }
  }
}

function tapeChangeLastOperator(op) {
  var tape = byId('tape');
  var lastRowIndex = tape.children.length - 1;
  var lastRow = tape.children[lastRowIndex];
  var cell = lastRow.children[lastRow.children.length - 1];
  cell.innerHTML = tapeFormatOperator(op);
}

function tapeFormatOperator(operator) {
  var op = '&nbsp;&nbsp;';
  switch(operator) {
    case '+':
      op = '+&nbsp;'; break
    case '-':
      op = '&minus;&nbsp;'; break;
    case '*':
      op = '&times;&nbsp;'; break;
    case '/':
      op = '&divide;&nbsp;'; break;
    case '=':
      op = '=&nbsp;'; break;
    case 'M':
      op = 'M&nbsp;'; break;
  }
  return op;
}

