var cversion = "1.01";
var cversionyear = GetCopyYear();
var FKeyPad = "CalcPad";
var Accum = 0;
var FlagNewNum = false;
var PendingOp = '';
var Mem = 0;
var InputActive = false;
var JustPasted = false;
var Language = 0;
var DecSep = ",";
var NumSep = ".";
var DisplaySize = 20;
var Settings = false;
var SettingsOpen = false;
var RoundDigits = 2;
var PctIva = 18;
var DoGrouping = false;
var OldGrouping = false;
var PermRound = false;
var NativeMode = false;
var MaxPrecision = 20;
var DoTrace = false;
var calcok = false;
var ctab = null;
var clogo = null;
var csettings = null;
var cdomain = "ww" + "w" + "." + "cal" + "culadora" + "." + "n" + "et";
var chome = "h" + "tt" + "p" + ":/" + "/" + cdomain;
var cbgimage = "fondo1.jpg";

function SetGrouping() {
    var a;
    try {
        a = Get_Cookie("calc-grouping")
    } catch (e) {
        a = false
    }
    DoGrouping = a == "true" ? true : false;
    OldGrouping = DoGrouping
}
function SetCalcForm(a) {
    if (a) {
        FKeyPad = a
    }
}
function calcst(a) {
    if (!a && !calcok) {
        calcok = false;
        return (calcok)
    }
    if (!ctab) {
        ctab = getElementById('calctable')
    }
    if (!clogo) {
        clogo = getElementById('calclogo')
    }
    if (!csettings) {
        csettings = getElementById('settings')
    }
    if (!ctab) {
        calcok = false;
        return (calcok)
    }
    if (!clogo) {
        calcok = false;
        return (calcok)
    }
    var b = 'url(' + chome + '/images/calc/' + cbgimage + ')';
    ctab.style.backgroundImage = b;
    if (!InStr(clogo.innerHTML, chome)) {
        calcok = false;
        return (calcok)
    }
    var l = clogo.innerHTML.length;
    if (l < 130 || l > 170) {
        calcok = false;
        return (calcok)
    }
    calcok = true;
    return (calcok)
}
function InitCalc(a) {
    var b = getElementById('Display');
    SetCalcForm(a);
    SetGrouping();
    b.focus();
    b.blur();
    calcst(true)
}
function SetCalcLang(l) {
    if (l >= 0) {
        Language = l
    }
    DecSep = (!Language) ? "," : ".";
    NumSep = (!Language) ? "." : ","
}
function SetDisplaySize(a) {
    if (a) {
        DisplaySize = a
    }
}
function SetPctIva(a) {
    var b;
    try {
        b = Get_Cookie("calc-ivapct")
    } catch (e) {
        b = ''
    }
    if (b) {
        PctIva = parseFloat(b)
    } else {
        if (a) {
            PctIva = a
        }
    }
}
function SetRoundDigits(a) {
    var b;
    try {
        b = Get_Cookie("calc-round-digits")
    } catch (e) {
        b = ''
    }
    if (b) {
        RoundDigits = parseInt(b, 10)
    } else {
        if (a) {
            RoundDigits = a
        }
    }
}
function SetNativeMode(a) {
    NativeMode = a
}
function SetTrace(a) {
    DoTrace = a
}
function DataEntry(o, a) {
    InputActive = a;
    try {
        o.select()
    } catch (e) {}
}
function SettingsStatus(a) {
    Settings = a
}
function GetDisplay() {
    var a = document[FKeyPad].Display.value.toString();
    a = ReplaceChar(a, NumSep, "");
    return (a)
}
function SetDisplay(a) {
    if (!calcst(false)) {
        return
    }
    a += '';
    a = a.replace(".", DecSep);
    a = numberFormat(a);
    document[FKeyPad].Display.value = a
}
function numberFormat(a) {
    if (!DoGrouping) {
        return (a)
    }
    a = a.toString();
    x = a.split(DecSep);
    x1 = x[0];
    x2 = x.length > 1 ? DecSep + x[1] : '';
    var b = /(\d+)(\d{3})/;
    while (b.test(x1)) {
        x1 = x1.replace(b, '$1' + NumSep + '$2')
    }
    return x1 + x2
}
function ReFormatDisplay() {
    var a = GetDisplay();
    a = a.replace(".", DecSep);
    a = numberFormat(a);
    document[FKeyPad].Display.value = a
}
function InsDecimal() {
    var a = GetDisplay();
    if (a.indexOf(DecSep) != -1 && !FlagNewNum) {
        return
    }
    if (FlagNewNum) {
        a = "0" + DecSep;

        FlagNewNum = false
    } else {
        if (a.indexOf(DecSep) == -1) {
            a += DecSep
        }
    }
    document[FKeyPad].Display.value = a;
    ReFormatDisplay()
}
function getIntegerPart(a) {
    var b = a.toString().split('.');
    return (b[0] === undefined ? "" : b[0])
}
function getDecimalPart(a) {
    var b = a.toString().split('.');
    return (b[1] === undefined ? "" : b[1])
}
function NumHit(a) {
    Trace("NumHit(" + a + ") FlagNewNum=" + FlagNewNum);
    if (FlagNewNum) {
        if (InputActive) {
            SetDisplay('')
        } else {
            SetDisplay(a)
        }
        FlagNewNum = false
    } else {
        var b = GetDisplay();
        if (b == '0') {
            if (!InputActive) {
                SetDisplay(a)
            }
        } else {
            if (b.length < DisplaySize) {
                if (!InputActive) {
                    SetDisplay(b + a)
                }
            }
        }
    }
}
function PasteVal(a) {
    FlagNewNum = true;
    NumHit(a)
}
function Pasted() {
    JustPasted = true
}
function CheckIfPasted() {
    if (JustPasted) {
        JustPasted = false;
        PasteVal(GetDisplay())
    }
    if (GetDisplay() === '') {
        SetDisplay("0")
    }
}
function MemoryOp(a) {
    if (a != 'C') {
        CheckIfPasted()
    }
    var b = parseFloat2(GetDisplay());
    var c = getElementById("Mem");
    switch (a) {
    case '+':
        Mem = CalcADD(Mem, b);
        break;
    case '-':
        Mem = CalcSUB(Mem, b);
        break;
    case 'R':
        PasteVal(Mem);
        break;
    case 'C':
        Mem = 0;
        break
    }
    c.innerHTML = (Mem) ? "M" : ""
}
function ShowMemVal(a) {
    if (SettingsOpen) {
        return
    }
    if (a) {
        OpenMsgBox(GetFormattedMem())
    } else {
        CloseMsgBox()
    }
}
function GetFormattedMem() {
    var a = Mem.toString();
    if (Mem) {
        a = a.replace(".", DecSep);
        a = numberFormat(a);
        a = ((Language) ? ' Memory: ' : ' Numero en Memoria: ') + a + ' '
    } else {
        a = ((Language) ? ' Empty memory ' : 'Memoria vacia  ')
    }
    return (a)
}
function parseFloat2(a) {
    a += '';
    if (DecSep != ".") {
        a = a.replace(DecSep, ".")
    }
    var f = parseFloat(a);
    return (f)
}
function addDecimal(a, b) {
    var c = getDecimalPart(a).length,
        l2 = getDecimalPart(b).length,
        places = c > l2 ? c : l2,
        v = a + b;
    return parseFloat(v.toFixed(places > MaxPrecision ? MaxPrecision : places))
}
function CalcADD(a, b) {
    return ((NativeMode) ? (parseFloat2(a) + parseFloat2(b)) : addDecimal(parseFloat2(a), parseFloat2(b)))
}
function subDecimal(a, b) {
    var c = getDecimalPart(a).length,
        l2 = getDecimalPart(b).length,
        places = c > l2 ? c : l2,
        v = a - b;
    return parseFloat(v.toFixed(places > MaxPrecision ? MaxPrecision : places))
}
function CalcSUB(a, b) {
    return ((NativeMode) ? (parseFloat2(a) - parseFloat2(b)) : subDecimal(parseFloat2(a), parseFloat2(b)))
}
function mulDecimal(a, b) {
    var c = getDecimalPart(a).length,
        l2 = getDecimalPart(b).length,
        places = c + l2,
        v = a * b;
    return parseFloat(v.toFixed(places > MaxPrecision ? MaxPrecision : places))
}
function mulFloats(a, b) {
    var c = Math.pow(10, String(a).length - String(a).indexOf('.') - 1),
        btens = Math.pow(10, String(b).length - String(b).indexOf('.') - 1);
    var d = (a * c) * (b * btens) / (c * btens);
    return (d)
}
function CalcMUL(a, b) {
    return ((NativeMode) ? (parseFloat2(a) * parseFloat2(b)) : mulDecimal(parseFloat2(a), parseFloat2(b)))
}
function divDecimal(a, b) {
    var v = (b) ? a / b : 0;
    return (parseFloat(v.toFixed(MaxPrecision)))
}
function CalcDIV(a, b) {
    return ((NativeMode) ? (parseFloat2(a) / parseFloat2(b)) : divDecimal(parseFloat2(a), parseFloat2(b)))
}
function Operation(c) {
    var a, b;
    CheckIfPasted();
    var d = GetDisplay();
    Trace("Operation1(" + c + ") FlagNewNum=" + FlagNewNum + " PendingOp=" + PendingOp);
    if (FlagNewNum && PendingOp != "=") {
        PendingOp = c
    } else {
        FlagNewNum = true;
        switch (PendingOp) {
        case '+':
            Accum = CalcADD(Accum, d);
            break;
        case '-':
            Accum = CalcSUB(Accum, d);
            break;
        case '/':
            Accum = CalcDIV(Accum, d);
            break;
        case '*':
            Accum = CalcMUL(Accum, d);
            break;
        case 's':
            a = CalcMUL(d, Accum);
            b = CalcDIV(a, "100.0");
            Accum = CalcSUB(Accum, b);
            break;
        case 'p':
            a = CalcDIV(Accum, d);
            Accum = CalcMUL(a, "100,0");
            break;
        case 'd':
            a = CalcSUB(Accum, d);
            b = CalcDIV(a, d);
            Accum = CalcMUL(b, "100,0");
            break;
        case 'm':
            Accum = iMod(Accum, parseFloat2(d));
            break;
        case 'i':
            Accum = iDiv(Accum, parseFloat2(d));
            break;
        default:
            Accum = parseFloat2(d);
            break
        }
        SetDisplay(Accum);
        PendingOp = c;
        Trace("Operation2(" + c + ") FlagNewNum=" + FlagNewNum + " Accum=" + Accum + " PendingOp=" + PendingOp)
    }
}
function Neg() {
    CheckIfPasted();
    SetDisplay(CalcMUL(GetDisplay(), -1));
    FlagNewNum = false
}
function Percent() {
    CheckIfPasted();
    var a = CalcMUL(GetDisplay(), Accum);
    SetDisplay(CalcDIV(a, 100.0));
    FlagNewNum = false
}
function GestIva() {
    CheckIfPasted();
    var x = CalcDIV(PctIva, 100.0);
    var y = CalcADD(x, 1);
    var a = CalcDIV(GetDisplay(), y);
    SetDisplay(a);
    FlagNewNum = false
}
function OpenSettings(a) {
    if (SettingsOpen) {
        CloseSettings(false, false);
        return
    }
    document[FKeyPad].PctIva.value = PctIva;
    document[FKeyPad].RoundDigits.value = RoundDigits;
    if (DoGrouping) {
        document[FKeyPad].Grouping.checked = true
    } else {
        document[FKeyPad].Grouping.checked = false
    }
    Show("settings", 1);
    if (a == "iva") {
        document[FKeyPad].PctIva.focus()
    }
    if (a == "dec") {
        document[FKeyPad].RoundDigits.focus()
    }
    SettingsOpen = true;
    SettingsStatus(true)
}
function CloseSettings(a, b) {
    if (a) {
        var c = (Language) ? 'Cannot save: check if cookies are enabled' : 'Imposible guardar: Las cookies están desactivadas';
        PctIva = parseFloat2(document[FKeyPad].PctIva.value);
        if (b) {
            try {
                Set_Cookie('calc-ivapct', PctIva, 3650)
            } catch (e1) {
                DisplayPopup(c);
                return
            }
        }
        RoundDigits = parseInt(document[FKeyPad].RoundDigits.value, 10);
        if (b) {
            try {
                Set_Cookie('calc-round-digits', RoundDigits, 3650)
            } catch (e2) {
                DisplayPopup(c);
                return
            }
        }
        DoGrouping = document[FKeyPad].Grouping.checked;
        if (b) {
            try {
                Set_Cookie('calc-grouping', DoGrouping, 3650)
            } catch (e3) {
                DisplayPopup(c);
                return
            }
        }
        if (OldGrouping != DoGrouping) {
            ReFormatDisplay();
            OldGrouping = DoGrouping
        }
    }
    Hide("settings", 1);
    SettingsOpen = false
}
function ShowInfo(s) {
    var a = "--------------------";
    if (Language) {
        s = "Web Calculator\n" + a + "\nVersion: " + cversion + "\n(c) 2012-" + cversionyear + " " + cdomain
    } else {
        s = "Calculadora online\n" + a + "\nVersione: " + cversion + "\n(c) 2012-" + cversionyear + " " + cdomain
    }
    DisplayPopup(s)
}
function Inv() {
    CheckIfPasted();
    var a = parseFloat2(GetDisplay());
    if (a) {
        SetDisplay(CalcDIV(1, a));
        FlagNewNum = false
    }
}
function RoundNum() {
    CheckIfPasted();
    var a = parseFloat2(GetDisplay());
    a = roundTo(a, RoundDigits);
    SetDisplay(a);
    FlagNewNum = false
}
function Sqrt() {
    CheckIfPasted();
    var a = parseFloat2(GetDisplay());
    if (a >= 0) {
        SetDisplay(Math.sqrt(a));
        FlagNewNum = false
    }
}
function Del() {
    if (FlagNewNum) {
        return
    }
    s = GetDisplay();
    if (s.length > 1) {
        s = s.substring(0, s.length - 1);
        SetDisplay(s)
    }
}
function ClearEntry() {
    SetDisplay("0");
    JustPasted = false
}
function Clear() {
    Accum = 0;
    PendingOp = "";
    ClearEntry()
}
function OnlyDigit(a) {
    if (!Settings) {
        return (false)
    }
    var b = GetEvt(a);
    if (b == 8 || b == 99 || b == 118) {
        return (true)
    }
    return (b >= 48 && b <= 57)
}
function Mid(a, b, c) {
    if (a === null) {
        return (false)
    }
    if (b > a.length) {
        return ('')
    }
    if (c === null || c.length === 0) {
        return (false)
    }
    return (a.substr((b - 1), c))
}
function InStr(b, c) {
    var a = 0;
    if (b === null || c === null) {
        return (false)
    }
    b = b.toLowerCase();
    c = c.toLowerCase();
    a = b.indexOf(c);
    if (a == -1) {
        return (0)
    } else {
        return (a + 1)
    }
}
function Len(a) {
    if (a === null) {
        return (false)
    }
    return (String(a).length)
}
function roundTo(a, b) {
    var i = a * Math.pow(10, b);
    i = Math.round(i);
    return (i / Math.pow(10, b))
}
function iMod(a, b) {
    if (!b) {
        return (0)
    }
    return (roundTo(a, 0) % roundTo(b, 0))
}
function iDiv(a, b) {
    if (!b) {
        return (0)
    }
    var c = a % b;
    var d = (a - c) / b;
    return (d)
}
function DisplayPopup(s) {
    alert(s)
}
function Dbg(s) {
    var a = getElementById("Dbgtext");
    a.innerHTML = s + '<br/>' + a.innerHTML
}
function Trace(s) {
    if (DoTrace) {
        Dbg(s)
    }
}
function OpenMsgBox(a) {
    var b = getElementById('msgbox');
    b.innerHTML = '<center>' + a + '</center>';
    Show("msgbox", 1)
}
function CloseMsgBox() {
    Hide("msgbox", 1)
}
function SelectToClipboard() {
    document[FKeyPad].Display.select()
}
function CopyToClipboard() {
    var a = getElementById('Display');
    RawCopyToClipboard(a)
}
function PasteToClipboard() {
    var a = getElementById('Display');
    RawPasteToClipboard(a)
}
function CutToClipboard() {
    SelectToClipboard();
    CopyToClipboard();
    SetDisplay("0")
}
function RawCopyToClipboard(a) {
    if (navigator.appName == "Microsoft Internet Explorer") {
        Holdtext.innerText = a.value;
        var b = Holdtext.createTextRange();
        b.execCommand("RemoveFormat");
        b.execCommand("Copy")
    }
}
function RawPasteToClipboard(a) {
    if (navigator.appName == "Microsoft Internet Explorer") {
        a.focus();
        PastedText = a.createTextRange();
        PastedText.execCommand("Paste")
    }
}
function GetEvt(a) {
    var b;
    try {
        b = (window.event) ? event.keyCode : (a.which) ? a.which : event.keyCode
    } catch (e) {
        b = 32
    }
    try {
        var c = navigator.appName == "Netscape" ? a : event;
        b = (c.ctrlKey) ? b + 1000 : b
    } catch (err) {}
    return (b)
}
document.onkeypress = function DataEntryWindow(a) {
    if (navigator.appName == "Opera") {
        return
    }
    var b = GetEvt(a);
    var c = false;
    if (SettingsOpen) {
        if (b == 13) {
            CloseSettings(true, false)
        } else {
            if (b == 27 || b == 32) {
                CloseSettings(false, false)
            }
        }
        return
    }
    if (b > 1000) {
        return (true)
    }
    switch (b) {
    case 8:
        Del();
        break;
    case 44:
    case 46:
        InsDecimal();
        break;
    case 43:
        Operation('+');
        break;
    case 45:
        Operation('-');
        break;
    case 42:
        Operation('*');
        break;
    case 47:
        Operation('/');
        break;
    case 13:
        Operation('=');
        break;
    case 37:
        Percent();
        break;
    case 100:
        OpenSettings('dec');
        break;
    case 105:
        if (!Language) {
            OpenSettings('iva')
        }
        break;
    case 112:
        if (Language) {
            OpenSettings('iva')
        }
        break;
    case 115:
        OpenSettings('none');
        break;
    case 114:
        if (Language) {
            RoundNum()
        }
        break;
    case 97:
        if (!Language) {
            RoundNum()
        }
        break;
    default:
        if (b < 48 || b > 57) {
            c = false
        } else {
            c = true
        }
        break
    }
    if (c) {
        NumHit(String.fromCharCode(b));
        return (true)
    } else {
        return (false)
    }
};
