/* Copyright (c) 2008 Jeremy English <jhe@jeremyenglish.org>
 *
 * Permission to use, copy, modify, distribute, and sell this software and its
 * documentation for any purpose is hereby granted without fee, provided that
 * the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation.  No representations are made about the suitability of this
 * software for any purpose.  It is provided "as is" without express or
 * implied warranty.
 *
 * Created: 09-October-2008
 */


function buildButtonAdder(row,idPrefix){
    var count = 0;
    return function(text, cssClass, onclick){
        var td = row.insertCell(count);
        td.innerHTML = text;
        td.className = cssClass;
        if (onclick) {td.onclick = onclick;}
        td.id = idPrefix+count;
        count++;
    }
}

function clearLed(){
    var input = document.getElementById("led");
    input.value = "";
}

function evalExp(){
    var input = document.getElementById("led");
    var exp = input.value;
    var ans = evalArith(exp);
    input.value = ans;
}

function buildOnClick(value){
    return function(){
        var input = document.getElementById("led");
        var exp = input.value;
        input.value = exp + value;
    }
}

function createLed(container){
    var led = document.createElement("input");
    led.id = "led";
    led.type = "text";
    led.value = "";
    container.appendChild(led);
}

function createLayout(){
    var layout =
        [["C",            "funcKeys", clearLed],
         ["&#960;",       "funcKeys", buildOnClick("pi ")],
         ["&#x212f;",     "funcKeys", buildOnClick("e ")],
         ["&#x03d5;",     "funcKeys", buildOnClick("phi ")],
         ["(",            "funcKeys", buildOnClick("(")],

         ["sin",          "funcKeys", buildOnClick("sin ")],
         ["cos",          "funcKeys", buildOnClick("cos ")],
         ["tan",          "funcKeys", buildOnClick("tan ")],
         ["x<sup>n</sup>","funcKeys", buildOnClick("^")],
         [")",            "funcKeys", buildOnClick(") ")],

         ["log",          "funcKeys", buildOnClick("log ")],
         ["ln",           "funcKeys", buildOnClick("ln ")],
         ["lg",           "funcKeys", buildOnClick("lg ")],
         ["exp",          "funcKeys", buildOnClick("exp ")],
         ["/",            "funcKeys", buildOnClick(" / ")],

         ["asin",         "funcKeys", buildOnClick("asin ")],
         ["7",            "numKeys",  buildOnClick("7")],
         ["8",            "numKeys",  buildOnClick("8")],
         ["9",            "numKeys",  buildOnClick("9")],
         ["*",            "funcKeys", buildOnClick(" * ")],

         ["acos",         "funcKeys", buildOnClick("acos ")],
         ["4",            "numKeys",  buildOnClick("4")],
         ["5",            "numKeys",  buildOnClick("5")],
         ["6",            "numKeys",  buildOnClick("6")],
         ["-",            "funcKeys", buildOnClick(" - ")],

         ["atan",         "funcKeys", buildOnClick("atan ")],
         ["1",            "numKeys",  buildOnClick("1")],
         ["2",            "numKeys",  buildOnClick("2")],
         ["3",            "numKeys",  buildOnClick("3")],
         ["+",            "funcKeys", buildOnClick(" + ")],

         ["&#x221a",      "funcKeys", buildOnClick("sqrt ")],
         ["0",            "numKeys",  buildOnClick("0")],
         [".",            "numKeys",  buildOnClick(".")],
         ["=",            "equalKey", evalExp],
         ["!",            "funcKeys", buildOnClick("!")]];
    return layout;
}

function buildcalc(){
    var container = document.getElementById("calcTable");
    createLed(container);
    var table = document.createElement("table");
    table.className="calc";
    var layout = createLayout();
    var btnsInRow = 5;
    var rowCount = 0;
    var row, addButton;
    for (i =0; i < layout.length; i++){
        if ((i % btnsInRow) == 0){
            row = table.insertRow(rowCount++);
            addButton = buildButtonAdder(row,"row" + rowCount + "_");
        }
        addButton(layout[i][0],layout[i][1],layout[i][2]);
    }
    container.appendChild(table);
}
