﻿
var isval = 0;
var oplast = 0;
var val1 = 0;
var val2 = "";
var val3 = "";
var op1 = "";
var op2 = "";
var op3 = "";

function digit(d) {
  if (isval) {
    if (document.forms[0].val.value == "0")
      document.forms[0].val.value = d;
    else
      document.forms[0].val.value += d;
  }
  else {
    document.forms[0].val.value = d;
    isval = 1;
  }
  oplast = 0;
}

function decimal() {
  if (document.forms[0].val.value == "0" || !isval)
    document.forms[0].val.value = "0.";
  else if (document.forms[0].val.value.indexOf('.') != -1)
    return;
  else 
    document.forms[0].val.value += '.';

  isval = 1;
  oplast = 0;
}

function binary(op) {
  if (oplast) {
    op1 = op + " ";
    return;
  }

  var temp = "" + document.forms[0].val.value;

  if (op == '+' || op == '-') {
    if (op1) {
      if (op1 == "p")
        temp = Math.pow(val1, temp);
      else
        temp = eval(val1 + op1 + temp);

      if (op2) {
        temp = eval(val2 + op2 + temp);
        val2 = "";
        op2 = "";

        if (op3) {
          temp = eval(val3 + op3 + temp);
          val3 = "";
          op3 = "";
        }
      }
    }
  }

  else { /* x or / */
    if (op1) {
      if (op1 == "+ " || op1 == "- ") {
        val2 = "" + val1;
        op2 = "" + op1;
      }
      else {
        if (op1 == "p")
          temp = Math.pow(val1, temp);
        else
          temp = eval(val1 + op1 + temp);
      }

      if (op2) {
        if (op2 == "+ " || op2 == "- ") {
          val1 = "" + val2;
          op1 = "" + op2;
        }
        else {
          temp = eval(val2 + op2 + temp);
          val2 = "";
          op2 = "";
        }

        if (op3) { /* must be + or - */
          val2 = "" + val3;
          op2 = "" + op3;
          val3 = "";
          op3 = "";
        }
      }
    }
  }

  document.forms[0].val.value = "" + temp;

  val1 = "" + temp;
  op1 = op + " ";
  isval = 0;
  oplast = 1;
}

function pow() {
  if (oplast) {
    op1 = 'p';
    return;
  }

  var temp = "" + document.forms[0].val.value;

  if (op1) {
    if (op1 == 'p') {
      temp = Math.pow(val1, temp);
    }
    else {
      if (op2) {
        val3 = "" + val2;
        op3 = "" + op2;
      }
      val2 = "" + val1;
      op2 = "" + op1;
    }
  }

  document.forms[0].val.value = "" + temp;
  val1 = "" + temp;
  op1 = 'p';
  isval = 0;
  oplast = 1;
}

function equals() {
  var temp = "" + document.forms[0].val.value;

  if (op1) {
    if (op1 == 'p')
      temp = Math.pow(val1, temp);
    else
      temp = eval(val1 + op1 + temp);
    op1 = "";
    val1 = 0;

    if (op2) {
      temp = eval(val2 + op2 + temp);
      op2 = "";
      val2 = "";

      if (op3) {
        temp = eval(val3 + op3 + temp);
        op3 = "";
        val3 = "";
      }
    }
  }

  document.forms[0].val.value = "" + temp;
  isval = 0;
  oplast = 0;
}

function negate() {
  document.forms[0].val.value = eval("- " + document.forms[0].val.value);
}

function unary(func) {
  document.forms[0].val.value = func(document.forms[0].val.value);
  isval = 0;
  oplast = 0;
}

function log10(x) {
  return Math.log(x) / Math.LN10;
}

function pow10(x) {
  return Math.pow(10, x);
}

function inv(x) {
  return 1 / x;
}

function square(x) {
  return x * x;
}

function setconst(x) {
  document.forms[0].val.value = x;
  isval = 1;
  oplast = 0;
}

function clear() {
  if (oplast) clear_all();
  document.forms[0].val.value = 0;
  isval = 0;
}

function clear_all() {
  document.forms[0].val.value = 0;
  
  isval = 0;
  oplast = 0;
  val1 = 0;
  val2 = "";
  val3 = "";
  op1 = "";
  op2 = "";
  op3 = "";
}

function parse_input() {
  document.forms[0].val.blur();
  window.status = document.forms[0].val.value;

  document.forms[0].val.focus();
  return false;
}