input = "";//variable storing the current input
function add(text){//store input to variable "input"
  if(document.calc.show.value=="") input = "";
  document.calc.show.value += text;
  input +=(text+"#");
}

function clearInput(){//clear all input
  document.calc.show.value="";
  input="";
}

function removeInput(){//remove the last input element
  if(input!=""){
    arr = input.split("#");
    if(arr[arr.length-1]=="") arr.pop(arr.length-1);
    arr.pop(arr.length-1);
    input = arr.join("#")+"#";
    document.calc.show.value = arr.join("");
  }
}

function subEvaluate(string, remArray, counter1){//evaluate an sub-expression; used by "evaluate()"
  number = evaluate(string);
  return new Array(number, remArray, counter1);
}

function evaluate(string){//evaluate an expression
  expr = string.split("#");
  val = 0;
  for(i=0; i < expr.length;i++){
    if(isNaN(expr[i])){//no number
      if(expr[i].length>1){
        if(expr[i]=="PI"){//PI
          expr[i]="Math.PI";
        }else{//else than PI and no number
          number1 = "";
          if(expr[i+1]!="("){// expr[i+1]!="("
            for(j=i+1;!isNaN(expr[j])||expr[j]==".";j++){
              number1 += (""+expr[j]);
              expr[j]="";
            }
          }else{// expr[i+1]=="("
            g = 0;
            openBracks = 1;
            closeBracks = 0;
            for(g=i+2;g<expr.length;g++){//find corresponding brackets
              if(expr[g]=="(") openBracks++;
              if(expr[g]==")") closeBracks++;
              if(expr[g]==")" && openBracks==closeBracks) break;
            }
            for(j=i+2;j<g;j++){
              number1 += (""+expr[j]+"#");
              expr[j]="";
            }
            expr[g]="";
            expr[i+1]="";
            a = subEvaluate(number1, expr, i);//evaluate the expression within brackets
            number1 = ""+a[0];
            i = a[2];
            expr = a[1];
          }
          if(expr[i]=="lg"){
            expr[i]="Math.LOG10E*Math.log("+number1+")";
          }else{
            expr[i]="Math."+expr[i]+"("+number1+")";//make an expression which can be evaluated by eval()
          }
        }
      }else{//+-*/()^
        if(expr[i]=="^"){//pow-expression
          number2 = "";
          number3 = "";
          if(expr[i+1]!="("){
            for(j=i+1;!isNaN(expr[j]);j++){
              number3 += (""+expr[j]);
              expr[j]="";
            }
          }else{//with second argument in brackets
            g = 0;
            openBracks = 1;
            closeBracks = 0;
            for(g=i+2;g<expr.length;g++){//find brackets
              if(expr[g]=="(") openBracks++;
              if(expr[g]==")") closeBracks++;
              if(expr[g]==")" && openBracks==closeBracks) break;
            }
            for(j=i+2;j<g;j++){
              number3 += (""+expr[j]+"#");
              expr[j]="";
            }
            expr[g]="";
            expr[i+1]="";
            a = subEvaluate(number3, expr, i);//evaluate brackets
            number3 = ""+a[0];
            i = a[2];
            expr = a[1];
          }
          if(expr[i-1]!=")"){//first argument
            for(j=i-1;!isNaN(expr[j]);j--){
              number2 += (""+expr[j]);
              expr[j]="";
            }
          }else{//first argumnet in brackets
            g = 0;
            openBracks = 0;
            closeBracks = 1;
            for(g=i-2;g>=0;g--){//find brackets
              if(expr[g]=="(") openBracks++;
              if(expr[g]==")") closeBracks++;
              if(expr[g]=="(" && openBracks==closeBracks) break;
            }
            for(j=g+1;j<i-1;j++){
              number2 += (""+expr[j]);
              expr[j]="";
            }
            expr[g]="";
            expr[i-1]="";
          }
          expr[i]="Math.pow("+number2+","+number3+")";//evaluable expression
        }
      }
    }else{//Number
      //do nothing with the element
    }
  }//end of for, all elements evaluated
  val1 = expr.join("");//array to string
  val = eval(val1);//evaluate expression
  return val;
}

function calculate(){//calculate and show the value
  val = evaluate(input);
  document.calc.show.value=val;
  input = val+"#";
}
