var pi=Math.PI, e=Math.E;

function cos(aValue) { return Math.cos(aValue); }
function sin(aValue) { return Math.sin(aValue); }
function tan(aValue) { return Math.tan(aValue); }
function cotan(aValue) { return 1.0/Math.tan(aValue); }
function arcsin(aValue) { return Math.asin(aValue); }
function arccos(aValue) { return Math.acos(aValue); }
function arctan(aValue) { return Math.atan(aValue); }
function arccot(aValue) { return (pi/2) - Math.atan(aValue) }
function exp(aValue) { return Math.exp(aValue); }
function ln(aValue) { return Math.log(aValue); }
function log(aValue) { return Math.log(aValue)/Math.ln10; }
function ld(aValue) { return Math.log(aValue)/Math.ln2; }
function sqrt(aValue) { return Math.sqrt(aValue); }
function sqr(aValue) { return aValue*aValue; }
function abs(aValue) { return Math.abs(aValue); }
function trunc(aValue) { if (aValue > 0) return Math.floor(aValue); else return Math.ceil(aValue); }
/* Die folgende Funktion funktioniert nur im Internet Explorer.
function int(aValue) { return trunc(aValue); }
*/
function round(aValue) { return Math.round(aValue); }
function ceil(aValue) { return Math.ceil(aValue); }
function floor(aValue) { return Math.floor(aValue); }
function frac(aValue) { return aValue - trunc(aValue); }
function heav(aValue) { if (aValue > 0) return 1; else return 0; }
function sgn(aValue) { if (aValue > 0) return 1; else if (aValue < 0) return -1; else return 0; }
function phase(aValue) { return aValue - 2*pi*round(aValue/2/pi); }
function rnd(aValue) { return Math.random()*aValue; }

function prepareInputString(src)
{
    var res = src.toLowerCase();
    var start, end;
    var ch;
    var empty = escape(" ");
    var code_a = escape("a");
    var code_z = escape("a");
    var code_0 = escape("0");
    var code_9 = escape("9");
    var code_on = escape("(");
    var code_off = escape(")");
    var brLevel = 0;
    var pos = res.indexOf("^");
    while (pos > -1)
    {
        if ((pos == 0) || (pos == src.length-1))  break;  // error in string
        start = pos;
        while (start > 0)
        {
            start--;
            ch = escape(src.charAt(start));
            if (ch == empty) continue;
            // bracket handling; we are going backward
            if ((brLevel == 0) && (ch == code_on)) {brLevel--; continue; }
            if (ch == code_off) {brLevel++; continue; }
            if (((ch >= code_a) && (ch <= code_z)) || ((ch >= code_0) && (ch <= code_9))) continue;
            if (brLevel == 0) { start++;  break; } // expression complete
        }
        end = pos;
        var len1 = res.length-1;
        while (end < len1)
        {
            end++;
            ch = escape(src.charAt(end));
            if (ch == empty) continue;
            // bracket handling; we are going forward
            if (ch == code_on) {brLevel++; continue; }
            if ((brLevel == 0) && (ch == code_off)) {brLevel--; continue; }
            if (((ch >= code_a) && (ch <= code_z)) || ((ch >= code_0) && (ch <= code_9))) continue;
            if (brLevel == 0) { end--;  break; } // expression complete
        }
        // insert "pow" operation, inserts '@' instead of ','
        res = res.substring(0, start) + "Math.pow(" + res.substring(start, pos)
            + "@" + res.substring(pos+1, end+1) + ")" + res.substring(end+1, res.length);
        // next
        pos = res.indexOf("^");
    }
    // exchanging of chars
    res = res.replace(/,/, ".");  // changes ',' to '.'
    res = res.replace(/@/, ",");  // changes '@' to ','
    res = res.replace(/\n/, " "); // changes '\n' to ' '
    res = res.replace(/\r/, " "); // changes '\r' to ' '

    return res;
}

function CalcResult(PeteCalc)
{
    var x = 0;
    x = eval(prepareInputString(PeteCalc.InputField.value));
    PeteCalc.ResultField.value = x;
    PeteCalc.InputField.focus();
    return false;
}

/*
function doInputKeyUp()
{
    var returnCode = 13;
    var field = window.document.PeteCalc.InputField;
    var code;
    code = window.event.keyCode;
    if (code == returnCode)
    {
        field.value = field.value + "+";
    }
}
*/

/*
var CalcResultHint = "Hiermit wird das Ergebnis des eingegebenen Ausdrucks berechnet\n Sie k�nnen auch \"Eingabe\" stattdessen dr�cken.";

var timeOutHandle, cancelHintFlag;

function GetCurrentMilliseconds()
{
   var d = new Date();
   return d.valueOf();
}

function ShowHint(hint, x, y, h)
{
    cancelHintFlag = false;
    startHintFlag = false;
    var finish = GetCurrentMilliseconds() + 1500;
    while (!cancelHintFlag && (finish > GetCurrentMilliseconds()))
        window.captureEvents(Event.MOUSEOUT) ;
    if (cancelHintFlag) return;
    var hintWin;
    hintWin=window.open("", "HintWindow", "left=" + String(x) + ",top=" + String(y) + ",height="+String(h)+",width=150");
    hintWin.document.write("<small>"+hint+"</small>");
    hintWin.setTimeout('window.close()', 3000);
}

function CancelHint()
{
    cancelHintFlag = true;
    alert("CancelHint");
}
*/


function ShowVarWindow()
{
   alert("Hier können Sie in der Offline-Version Variablen definieren.");
}

function ShowAdvancedWindow()
{
   alert("Hier können Sie in der Offline-Version:\n"
       + "- Näherungen nach Newton berechnen\n"
       + "- Funktionsterme symbolisch und numerisch differenzieren und integrieren");
}

function ShowHistoryWindow()
{
   alert("Hier können Sie in der Offline-Version vorherige Terme erneut auswählen.");
}
