<!--
var enter = 0;
var maxPile = 7;

var isEntered = false;
var isDone = false;
var localKomma = ("" + eval("3/2")).substr(1,1);

var isDeg = true;
var isRad = false;
var isGrad = false;

var Deg2Rad = Math.PI / 180;
var Grad2Rad = Math.PI / 200;

var R0 = 0;
var R1 = 0;
var RS = "document.forms[0].pile";

var isNS = false;

if(navigator.appName.indexOf("Netscape") != -1)
        isNS = true;

var PassThrough = "0123456789e";

var Commands = new Array();
Commands['+'] = 'fnBin("+")';
Commands['-'] = 'fnBin("-")';
Commands['*'] = 'fnBin("*")';
Commands['/'] = 'fnBin("/")';
Commands['d'] = 'fnDrop("0")';
Commands['s'] = 'fnSwap("1")';
Commands['c'] = 'fnChangeSign()';

var Cmds = new Array();
Cmds["sin"] = "Math.sin(x * c)";
Cmds["asin"] = "Math.asin(x) / c";
Cmds["sinh"] = "(Math.exp(x) - Math.exp(-x)) / 2";
Cmds["asinh"] = "Math.log(x + Math.sqrt(x * x + 1))";
Cmds["cos"] = "Math.cos(x * c)";
Cmds["acos"] = "Math.acos(x) / c";
Cmds["acosh"] = "Math.log(x + Math.sqrt(x * x - 1))";
Cmds["cosh"] = "(Math.exp(x) + Math.exp(-x)) / 2";
Cmds["tan"] = "Math.tan(x * c)";
Cmds["atan"] = "Math.atan(x) / c";
Cmds["tanh"] = "(Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x))";
Cmds["atanh"] = "Math.log((1 + x) / (1 - x)) / 2";
Cmds["cot"] = "1 / Math.tan(x * c)";
Cmds["acot"] = "Math.atan(1 / x) / c";
Cmds["coth"] = "1 / ((Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x)))";
Cmds["acoth"] = "Math.log((x + 1) / (x - 1)) / 2";
Cmds["sec"] = "1 / Math.cos(x * c)";
Cmds["asec"] = "Math.acos(1 / x) / c";
Cmds["sech"] = "1 / ((Math.exp(x) + Math.exp(-x)) / 2)";
Cmds["asech"] = "Math.log((1 / x) + Math.sqrt(1 / (x * x) + 1))";
Cmds["csc"] = "1 / Math.sin(x * c)";
Cmds["acsc"] = "Math.asin(1 / x) / c";
Cmds["csch"] = "1 / ((Math.exp(x) - Math.exp(-x)) / 2)";
Cmds["acsch"] = "Math.log((1 / x) + Math.sqrt(1 / (x * x) - 1))";
Cmds["ln"] = "Math.log(x)";
Cmds["exp"] = "Math.exp(x)";
Cmds["log"] = "Math.log(x) / Math.log(10)";
Cmds["10^"] = "Math.pow(10,x)";
Cmds["sqrt"] = "Math.pow(x,1 / 2)";
Cmds["x^2"] = "x * x";
Cmds["inv"] = "1 / x";
Cmds["ip"] = "Math.floor(x)";
Cmds["fp"] = "x - Math.floor(x)";
Cmds["Q"] = "Q(x)";
Cmds["num"] = "x";
Cmds["fact"] = "Fact(x)";

function fnCopy(p)
{
        var i = eval(RS + p).value;

        if(i == "")
                return;
        PilePush();
        R0.value = i;
        isEntered = true;
        isDone = false;
}

function fnSto(p)
{
        if(eval(RS + p).value == "")
                return;
        document.forms[0].mem.options[document.forms[0].mem.length] = new Option(eval(RS + p).value,eval(RS + p).value);
        document.forms[0].mem.options[document.forms[0].mem.length - 1].selected = true;
}

function fnRcl(p)
{
        if(!isNaN(parseInt(p)))
        {
                if(document.forms[0].mem.length == 0)
                        return;

                p = parseInt(p);
                if(p > 0)
                {
                        p--;
                        while(eval(RS + p).value == "")
                        {
                                if(--p < 0)
                                        break;
                        }
                        p++;
                }

                for(var i = maxPile; i > p; i--)
                        eval(RS + i).value = eval(RS + (i - 1)).value;

                eval(RS + p).value = document.forms[0].mem.options[document.forms[0].mem.selectedIndex].value;
        }
        else
        {
                switch(p)
                {
                        case "pi":
                        PilePush();
                        R0.value = Math.acos(-1);
                        break;
                        case "e":
                        PilePush();
                        R0.value = Math.exp(1);
                        break;
                        case "rnd":
                        PilePush();
                        R0.value = Math.random();
                        break;
                }
        }

        isDone = true;
        isEntered = false;
}

function fnDel()
{
        var t = document.forms[0].mem.selectedIndex;
        if(document.forms[0].mem.length <= 0)
                return;

        for(var i = document.forms[0].mem.selectedIndex + 1; i < document.forms[0].mem.length; i++)
        {
                document.forms[0].mem.options[i - 1].text = document.forms[0].mem.options[i].text;
                document.forms[0].mem.options[i - 1].value = document.forms[0].mem.options[i].value;
        }

        if(document.forms[0].mem.length <= t + 1)
                t--;
        if(t >= 0)
                document.forms[0].mem.options[t].selected = true;
        document.forms[0].mem.length -= 1;
}

function AddNumber(n)
{
        if(isDone)
        {
                PilePush();
                isEntered = false;
                isDone = false;
                R0.value = "";
        }
        if(isEntered)
        {
                isEntered = false;
                isDone = false;
                R0.value = "";
        }
        R0.value += n;
}

function AddKomma()
{
        if(isDone)
        {
                PilePush();
                isDone = false;
                isEntered = false;
                R0.value = "";
        }
        if(isEntered)
        {
                isEntered = false;
                isDone = false;
                R0.value = "";
        }
        if(R0.value.indexOf(localKomma) != -1 || R0.value.indexOf("e") != -1)
                return;
        if(R0.value == "")
                R0.value = "0";
        R0.value += localKomma;
}

function AddEex()
{
        if(isDone)
        {
                PilePush();
                isDone = false;
                isEntered = false;
                R0.value = "";
        }
        if(isEntered)
        {
                isEntered = false;
                isDone = false;
                R0.value = "";
        }
        if(R0.value.indexOf("e") != -1)
                return;
        if(R0.value == "")
                R0.value = "1";
        R0.value += "e";
}

function PilePush()
{
        for(var i = maxPile; i > 0; i--)
                eval(RS + i).value = eval(RS + (i - 1)).value;
}

function PilePop()
{
        for(i = 1; i < maxPile; i++)
                eval(RS + i).value = eval(RS + (i + 1)).value;
        eval(RS + maxPile).value = "";
        isDone = true;
}

function fnDrop(p)
{
        if(eval(RS + p).value == "")
                return;
        for(var i = 0; i <= p; i++)
        {
                R0.value = R1.value;
                PilePop();
        }
        isEntered = false;
}

function fnSwap(p)
{
        var i = RS + p;
        if(eval(i).value != "")
        {
                var t = eval(i).value;
                eval(i).value = R0.value;
                R0.value = t;
                isDone = true;
        }
}

function fnRoll(p)
{
        if(eval(RS + p).value == "")
                return;
        var t = R0.value;
        for(var i = 0; i < p; i++)
                eval(RS + i).value = eval(RS + (i + 1)).value;
        eval(RS + p).value = t;
        isDone = true;
}

function fnRot(p)
{
        if(eval(RS + p).value == "")
                return;
        var t = eval(RS + p).value;
        for(; p > 0; p--)
                eval(RS + p).value = eval(RS + (p - 1)).value;
        R0.value = t;
        isDone = true;
}

function fnChangeSign()
{
        if(R0.value == "")
                return;
        if(R0.value.indexOf("e") == -1)
        {
                R0.value = -parseFloat(eval(R0.value));
                return;
        }
        R0.value = R0.value.split("e").join("e-").split("e--").join("e").split("e-+").join("e-");
}

function fnBin(op)
{
        if(R1.value == "")
                return;
        R0.value = eval(eval(parseFloat(eval(R1.value)) + op + "(" + parseFloat(eval(R0.value)) + ")"));
        PilePop();
        fnRoundLastDecimal();
        isDone = true;
}

function fnPow()
{
        if(R1.value == "")
                return;
        R0.value = Math.pow(parseFloat(eval(R1.value)),parseFloat(eval(R0.value)));
        PilePop();
        fnRoundLastDecimal();
        isDone = true;
}

function fnMod()
{
        if(R1.value == "")
                return;
        if(eval(R1.value).toString().indexOf(localKomma) != -1)
                return;
        if(eval(R0.value).toString().indexOf(localKomma) != -1)
                return;
        R0.value = parseInt(eval(R1.value)) - parseInt(eval(R0.value)) * Math.floor(parseInt(eval(R1.value)) / parseInt(eval(R0.value)));
        PilePop();
        fnRoundLastDecimal();
        isDone = true;
}

function fnIDv()
{
        if(R1.value == "")
                return;
        if(eval(R1.value).toString().indexOf(localKomma) != -1)
                return;
        if(eval(R0.value).toString().indexOf(localKomma) != -1)
                return;
        R0.value = Math.floor(parseInt(eval(R1.value)) / parseInt(eval(R0.value)));
        PilePop();
        fnRoundLastDecimal();
        isDone = true;
}

function fnComb()
{
        if(R1.value == "")
                return;
        if(eval(R1.value).toString().indexOf(localKomma) != -1)
                return;
        if(eval(R0.value).toString().indexOf(localKomma) != -1)
                return;
        var x = parseInt(eval(R1.value));
        var y = parseInt(eval(R0.value));
        R0.value = parseInt(Fact(x) / (Fact(y) * Fact(x - y)));
        PilePop();
        fnRoundLastDecimal();
        isDone = true;
}

function fnPerm()
{
        if(R1.value == "")
                return;
        if(eval(R1.value).toString().indexOf(localKomma) != -1)
                return;
        if(eval(R0.value).toString().indexOf(localKomma) != -1)
                return;
        var x = parseInt(eval(R1.value));
        var y = parseInt(eval(R0.value));
        R0.value = parseInt(Fact(x) / Fact(x - y));
        PilePop();
        fnRoundLastDecimal();
        isDone = true;
}

function Fact(n)
{
        if(n == 0)
        {
                return 1;
        }

        if(n < 0 & n > -1)
        {
                n = n + 1;
                return Math.exp((n + 0.5) * Math.log(n + 1) - n - n * (0.1121105 + n * 0.08106103) / (1.452342+n * (2.410858 + n))) / n;
        }

        var a = 0;

        if(n < 0)
        {
                n = Math.abs(n) - 1;
                a = 1
        }

        var r = n;

        if((n % 1) == 0)
        {
                while(n > 1)
                {
                        n = n - 1;
                        r = r * n
                }
        }
        else
        {
                r = Math.exp(Math.abs((n + 0.5) * Math.log(n + 1) - n - n * (0.1121105 + n * 0.08106103) / (1.452342 + n * (2.410858 + n))));
        }

        if(a == 1)
        {
                r = -Math.PI / (r * Math.sin(Math.PI * n));
        }

        return r;
}

function fnFactor()
{
        if(R0.value == "" || R0.value.indexOf("e") != -1 || R0.value.indexOf(localKomma) != -1)
                return;
        var n = parseInt(eval(R0.value));
        var r = "";
        var c = 0;
        var a = 5;
        var b = 2;

        if(n == 0)
                return;
        if(n == 1)
        {
                alert(1);
                return;
        }
        if(n < 0)
                n = -n;

        c = 0;
        while(n - 2 * Math.floor(n / 2) == 0)
        {
                c++;
                n /= 2;
        }
        if(c == 0)
                r = "";
        else if(c == 1)
                r = "2";
        else
                r = "2^" + c;

        c = 0;
        while(n - 3 * Math.floor(n / 3) == 0)
        {
                c++;
                n /= 3;
        }
        if(c == 1)
        {
                if(r != "")
                        r += " * "; // '\n';
                r += "3";
        }
        else if(c > 1)
        {
                if(r != "")
                        r += " * "; // '\n';
                r += "3^" + c;
        }

        while(a * a <= n)
        {
                c = 0;
                while(n - a * Math.floor(n / a) == 0)
                {
                        c++;
                        n /= a;
                }
                if(c == 1)
                {
                        if(r != "")
                                r += " * "; // '\n';
                        r += "" + a;
                }
                else if(c > 1)
                {
                        if(r != "")
                                r += " * "; // '\n';
                        r += a + "^" + c;
                }
                a += b;
                b = 6 - b;
        }

        if(n != 1)
        {
                if(r != "")
                        r += " * ";
                r += n; // '\n' + n;
        }

        alert(r);
}

function fnDivisor()
{
        if(R0.value == "" || R0.value.indexOf("e") != -1 || R0.value.indexOf(localKomma) != -1)
                return;
        var n = parseInt(eval(R0.value));
        if(n == 0)
                return;
        if(n < 0)
                n = -n;
        if(n < 2)
                return;

        var r = "1";
        var l = "" + n;
        var a = 1;
        var b = n;
        var s = 0;
        var p = 1;

        while(true)
        {
                a++;
                if(a >= b)
                        break;
                if(n - a * Math.floor(n / a) == 0)
                {
                        r += "\n" + a;
                        b = n / a;
                        if(b != a)
                                l = (n / a) + "\n" + l;
                }
                else
                        b--;
        }

        r += "\n" + l;
        l = r.split("\n");
        for(a = 0; a < l.length; a++)
        {
                s += parseInt(l[a]);
                p *= parseInt(l[a]);
        }

        window.open("","Divisors","width=200,height=300,scrollbars=yes,resizable=yes").document.write("<html><head><title>Divisors</title></head><body><pre>" + r + "\n\nCount: " + l.length + "\nSum:   " + s + "\nProd:   " + p + '</pre><p><form><input type="button" value="Close" onClick="window.close()"></form></p></body></html>');
}

function fnMath(which)
{
        var x = R0.value;
        var c = 1;

        if(x == "")
                return;

        if(isDeg)
                c = Deg2Rad;
        if(isGrad)
                c = Grad2Rad;

        x = parseFloat(eval(x));
        R0.value = eval(Cmds[which]);
        if(which != "Q" && which != "num")
                fnRoundLastDecimal();
        isDone = true;
}

function Q(x)
{
        var l1 = 0; var r1 = 1;
        var l2 = 1; var r2 = 1;
        var t1 = 1; var t2 = 2;
        var y = x - Math.floor(x);

        if(y == 0)
                return x;

        while(Math.abs((t1 / t2) - y) > 10e-7)
        {
                if(t1 / t2 > y)
                {
                        r1 = t1;
                        r2 = t2;
                }
                else
                {
                        l1 = t1;
                        l2 = t2;
                }
                t1 = l1 + r1;
                t2 = l2 + r2;
        }

        return (Math.floor(x) * t2 + t1) + "/" + t2;
}

function fnRoundLastDecimal()
{
        if(R0.value.indexOf("e") != -1)
                return;
        if(R0.value.indexOf(localKomma) == -1)
                return;
        if(R0.value.indexOf("00000") == -1 && R0.value.indexOf("99999") == -1)
                return;
        R0.value = eval(Q(parseFloat(eval(R0.value))));
}

function fnBackSpace()
{
        if(isDone || isEntered)
                return;

        if(R0.value != "")
                R0.value = R0.value.substring(0,R0.value.length - 1);
}

function KeyDownIE()
{
        var which = String.fromCharCode(event.keyCode);

        if(which == "n" || which == "E")
        {
                if(isDone)
                {
                        PilePush();
                        isEntered = false;
                        isDone = false;
                        R0.value = "";
                }
                if(isEntered)
                {
                        isEntered = false;
                        isDone = false;
                        R0.value = "";
                }
                if(which == "E")
                {
                        if(R0.value.indexOf("e") != -1)
                                return false;
                        if(R0.value == "")
                                R0.value = "1";
                        return true;
                }
                if(R0.value.indexOf(localKomma) != -1 || R0.value.indexOf("e") != -1)
                        return false;
                if(R0.value == "")
                        R0.value = "0";
                return true;
        }
        if(which.charCodeAt(0) == 13)
        {
                fnCopy("0");
                return false;
        }
        if(which.charCodeAt(0) == 8 || which.charCodeAt(0) == 46)
        {
                isDone = false;
                isEntered = false;
        }
        return true;
}

function KeyPressIE()
{
        var which = String.fromCharCode(event.keyCode).toLowerCase();

        if(which == localKomma || which == "e")
                return true;
        if(which.charCodeAt(0) == 13 || which.charCodeAt(0) == 8 || which.charCodeAt(0) == 46)
                return true;

        for(var i in Commands)
        {
                if(i == which)
                {
                        eval(Commands[i]);
                        return false;
                }
        }
        if(PassThrough.indexOf(which) != -1)
        {
                if(isDone)
                {
                        PilePush();
                        isEntered = false;
                        isDone = false;
                        R0.value = "";
                }
                if(isEntered)
                {
                        isEntered = false;
                        isDone = false;
                        R0.value = "";
                }
                return true;
        }
        return false;
}

function KeyDownNS(evnt)
{
        var which = String.fromCharCode(evnt.which);

        if(which == localKomma || which == 'e')
        {
                if(isDone)
                {
                        PilePush();
                        isEntered = false;
                        isDone = false;
                        R0.value = "";
                }
                if(isEntered)
                {
                        isEntered = false;
                        isDone = false;
                        R0.value = "";
                }
                if(which == "e")
                {
                        if(R0.value.indexOf("e") != -1)
                                return false;
                        if(R0.value == "")
                        {
                                R0.value = "1e";
                                return false;
                        }
                }
                else
                {
                        if(R0.value.indexOf(localKomma) != -1 || R0.value.indexOf("e") != -1)
                                return false;
                        if(R0.value == "")
                        {
                                R0.value = "0.";
                                return false;
                        }
                }
                return true;
        }
        if(which.charCodeAt(0) == 13)
        {
                fnCopy("0");
                return false;
        }
        if(which.charCodeAt(0) == 8 || which.charCodeAt(0) == 46)
        {
                isDone = false;
                isEntered = false;
        }
        return true;
}

function KeyPressNS(evnt)
{
        var which = String.fromCharCode(evnt.which).toLowerCase();

        if(which == localKomma || which == "e")
                return true;
        if(which.charCodeAt(0) == 13 || which.charCodeAt(0) == 8 || which.charCodeAt(0) == 46)
                return true;

        for(var i in Commands)
        {
                if(i == which)
                {
                        eval(Commands[i]);
                        return false;
                }
        }
        if(PassThrough.indexOf(which) != -1)
        {
                if(isDone)
                {
                        PilePush();
                        isEntered = false;
                        isDone = false;
                        R0.value = "";
                }
                if(isEntered)
                {
                        isEntered = false;
                        isDone = false;
                        R0.value = "";
                }
                return true;
        }
        return false;
}

function KeyUpNS(evnt)
{
        if(evnt.which == 0)
        {
                isDone = false;
                isEntered = false;
        }
        return true;
}

function setDg(d)
{
        document.forms[0].dg[d].checked = true;
        isDeg = false;
        isRad = false;
        isGrad = false;
        if(d == 0)
                isDeg = true;
        else if(d == 1)
                isRad = true;
        else
                isGrad = true;
}

function fnDRGcnv(which)
{
        if(R0.value == "")
                return;
        var x = parseFloat(eval(R0.value));

        switch(which)
        {
                case "dr":
                R0.value = x * Deg2Rad;
                break;
                case "dg":
                R0.value = x * Deg2Rad / Grad2Rad;
                break;
                case "rd":
                R0.value = x / Deg2Rad;
                break;
                case "rg":
                R0.value = x / Grad2Rad;
                break;
                case "gd":
                R0.value = x * Grad2Rad / Deg2Rad;
                break;
                case "gr":
                R0.value = x * Grad2Rad;
                break;
        }
        isDone = true;
}

function DoOnLoad()
{
        if(isNS)
        {
                if(navigator.appVersion < 4.5)
                {
                        alert("Sorry, newer browser required !");
                }
        }
        else
        {
                if(navigator.appVersion <  5.0)
                {
                        alert("Sorry, newer browser required !");
                }
        }
        document.forms[0].mem.length = 0;
        setDg(0);
        R0 = document.forms[0].pile0;
        R1 = document.forms[0].pile1;
        R0.focus();
        if(isNS)
        {
                document.captureEvents(Event.KEYDOWN |Event.KEYPRESS | Event.KEYUP);
                document.onkeydown = KeyDownNS;
                document.onkeypress = KeyPressNS;
                document.onkeyup = KeyUpNS;
        }
        for(var i = 0; i <= maxPile; i++)
                eval(RS + i).value = "";
        if(isNS)
        {
                window.setResizable(true);
                if(document.width < 750 || document.height < 430)
                {
                        window.moveTo(16,10);
                        window.resizeTo(750,550);
                }
        }
        else
        {
                if(document.body.clientWidth < 750 || document.body.clientHeight < 550)
                {
                        window.moveTo(16,10);
                        window.resizeTo(750,550);
                }
        }
}

function showNotes()
{
        var w2 = window.open("","Notes","width=500,height=300,scrollbars=yes,resizable=yes")
        w2.document.write('<html><head><title>Notes</title></head><body><blockquote>');
        w2.document.write('<p>It is perfectly possible to enter "illegal" numbers,<br>');
        w2.document.write('like 0.e or similar, which, obviously, will lead to<br>');
        w2.document.write('some JavaScript error if you try to e.g. add them</p>');
        w2.document.write('<p>You can safely ignore those errors</p>');
        w2.document.write('<p>Simply correct the number entered or drop it</p>');
        w2.document.write('</blockquote><p><form><center><input type="button" value="Close" onClick="window.close()"></center></form></p></body></html>');
        return false;
}
// -->


