/*
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

function init(){
    var h = 292;
    var w = 160;
    var wh = h+6;
    var ww = w+6;
    var clickFlag = false;
    
    var ubwidget = $("#ubwidget").ubwidget({
        width:w,
        height:h
    });
		
    var historyTab = $("<div></div>")
    .css({
        height:h,
        marginRight:0,
        width:20,
        float:"left",
        backgroundImage:"url(images/historytab.png)",
        backgroundRepeat:"no-repeat"
    })
    .toggle(
        function(){
            resizeWidget(370, 294);
            historyPanel.show();
            $(".ubw-container").css({
                backgroundImage:"url(images/back.png)",
                width:328
            });
            if(window.sankore){
                window.sankore.setPreference('historyTab', "visible");
            };
        },
        function(){
            resizeWidget(200, 294);
            historyPanel.hide();
            $(".ubw-container").css({
                backgroundImage:"url(images/back_small.png)",
                width:160
            });
            if(window.sankore){
                window.sankore.setPreference('historyTab', "hidden");
            };
        }
        )
    .hover(
        function(){
            $(this).css({
                backgroundImage:"url(images/historytabOver.png)"
            });
        },
        function(){
            $(this).css({
                backgroundImage:"url(images/historytab.png)"
            });
        }
        )
    .appendTo($("body"));

    var space = $("<div></div>");
    space.css({
        width:5, 
        height:1, 
        float:"left"
    });
	
    var keysPanel = $("<div id='keysPanel'></div>").css({
        float:"left"
    });
    var mode = "standard";
    var calc = "";
    var displayTrunk = "";
    var historyTrunk = "";
    var lastHistory = "";
    var subtrunk = 0;
    var itrunk = 0;
    var trunkpos = 0;
    var lastchar = {
        type:"NaN", 
        value:"null"
    };
    var inparenthesis = false;
    var erase = false;
    var abtn;
    var readyToCompute = false;
    var lastResult = "0";
    var gDecimalSeparator = "";
    var gThousandsSeparator = "";
    var gDecimalCode = 0;
    var gDecimalString = "";
    var gError = false;
	
    var historyTxt = "0";
	
    var display = $("<div id='display'>0</div>")
    .addClass("ubw-inputbox")
    .css({
        padding:"12px",
        marginLeft:"2px",
        marginBottom:"9px", 
        marginTop:7,
        backgroundImage:"url(images/display.png)",
        fontSize:"22px",
        fontFamily:"Arial, Helvetica, Sans-serif",
        color:"#777788",
        width:118,
        height:28,
        overflow:"hidden",
        textAlign:"right",
    });
		
    var standardPanel = $("<div></div>").css({
        float:"left"
    });
	
    var cKeySize = {
        w:33, 
        h:36
    };
	
    var btn7 = $("<div><img src='images/touche7.png'/></div>").ubwbutton({
        w:cKeySize.w, 
        h:cKeySize.h
    })
    .mousedown(function(){
        appendToDisplay("7", 1)
    });
    var btn8 = $("<div><img src='images/touche8.png'/></div>").ubwbutton({
        w:cKeySize.w, 
        h:cKeySize.h
    })
    .mousedown(function(){
        appendToDisplay("8", 1)
    });
    var btn9 = $("<div><img src='images/touche9.png'/></div>").ubwbutton({
        w:cKeySize.w, 
        h:cKeySize.h
    })
    .mousedown(function(){
        appendToDisplay("9", 1)
    });
    var btnDiv = $("<div><img src='images/touchediv.png'/></div>").ubwbutton({
        w:cKeySize.w, 
        h:cKeySize.h
    })
    .mousedown(function(){
        appendToDisplay("/", 0)
    });
    var btn4 = $("<div><img src='images/touche4.png'/></div>").ubwbutton({
        w:cKeySize.w, 
        h:cKeySize.h
    })
    .mousedown(function(){
        appendToDisplay("4", 1)
    });
    var btn5 = $("<div><img src='images/touche5.png'/></div>").ubwbutton({
        w:cKeySize.w, 
        h:cKeySize.h
    })
    .mousedown(function(){
        appendToDisplay("5", 1)
    });
    var btn6 = $("<div><img src='images/touche6.png'/></div>").ubwbutton({
        w:cKeySize.w, 
        h:cKeySize.h
    })
    .mousedown(function(){
        appendToDisplay("6", 1)
    });
    var btnMul = $("<div><img src='images/touchef.png'/></div>").ubwbutton({
        w:cKeySize.w, 
        h:cKeySize.h
    })
    .mousedown(function(){
        appendToDisplay("*", 0)
    });
    var btn1 = $("<div><img src='images/touche1.png'/></div>").ubwbutton({
        w:cKeySize.w, 
        h:cKeySize.h
    })
    .mousedown(function(){
        appendToDisplay("1", 1)
    });
    var btn2 = $("<div><img src='images/touche2.png'/></div>").ubwbutton({
        w:cKeySize.w, 
        h:cKeySize.h
    })
    .mousedown(function(){
        appendToDisplay("2", 1)
    });
    var btn3 = $("<div><img src='images/touche3.png'/></div>").ubwbutton({
        w:cKeySize.w, 
        h:cKeySize.h
    })
    .mousedown(function(){
        appendToDisplay("3", 1)
    });
    var btnSou = $("<div><img src='images/touchem.png'/></div>").ubwbutton({
        w:68, 
        h:34
    })
    .mousedown(function(){
        appendToDisplay("-", 0)
    });
    var btn0 = $("<div><img src='images/touche0.png'/></div>").ubwbutton({
        w:cKeySize.w, 
        h:cKeySize.h
    })
    .mousedown(function(){
        appendToDisplay("0", 1)
    });
    var btnDot = $("<div><img src='images/touchedot.png'/></div>").ubwbutton({
        w:cKeySize.w, 
        h:cKeySize.h
    })
    .mousedown(function(){
        appendToDisplay(".", 1)
    });
    var btnC = $("<div><img src='images/touchec.png'/></div>").ubwbutton({
        w:cKeySize.w, 
        h:cKeySize.h
    })
    .mousedown(function(){
        reset()
    });
    var btnAdd = $("<div><img src='images/touchep.png'/></div>").ubwbutton({
        w:68, 
        h:34
    })
    .mousedown(function(){
        appendToDisplay("+", 0)
    });
    var btnPaL = $("<div><img src='images/touchepg.png'/></div>").ubwbutton({
        w:cKeySize.w, 
        h:cKeySize.h
    })
    .mousedown(function(){
        appendToDisplay("(", 1)
    });
    var btnPaR = $("<div><img src='images/touchepd.png'/></div>").ubwbutton({
        w:cKeySize.w, 
        h:cKeySize.h
    })
    .mousedown(function(){
        appendToDisplay(")", 1)
    });
    var btnEqu = $("<div><img src='images/toucheeq.png'/></div>").ubwbutton({
        w:cKeySize.w, 
        h:cKeySize.h
    })
    .mousedown(function(){
        compute()
    });				
	
    var historyPanel = $("<div id='historyPanel'></div>")
    .css({
        backgroundImage:"url(images/historyback.png)",
        width:"auto",
        height:"auto",
        float:"left",
        marginLeft:3,
        marginRight:2,
        marginTop:6
    })
    .hide();

    var historyBox = $("<textarea id='historyBox'></textarea>")
    .css({
        padding:10,
        fontSize:"20px",
        fontFamily:"Arial, Helvetica, Sans-serif",
        width:143,
        height:236,
        backgroundColor:"transparent",
        resize:"none",
        border:"none",
        overlay:"none",
        color:"#eeeeee"
    })
    .val("0");
		
    historyPanel.append(historyBox);
	
    var stop = $("<div></div>");
    var sleft = $("<div></div>");
    var sright = $("<div></div>");
	
    stop.css({
        width:140
    })
    .append(btnAdd).append(btnSou)
    .append(btn7).append(btn8).append(btn9).append(btnMul)
    .append(btn4).append(btn5).append(btn6).append(btnDiv);
		
    sleft.css({
        width:105, 
        float:"left"
    })
    .append(btn1).append(btn2).append(btn3)
    .append(btn0).append(btnDot).append(btnC);
		
    sright.css({
        width:45, 
        float:"left"
    })
    .append(btnEqu);
	
	
    standardPanel.css({
        width:150
    })
    .append(stop)
    .append(sleft).append(sright);
	
    keysPanel
    .append(display)
    .append(standardPanel);
	
    ubwidget
    .append(historyPanel)
    .append(keysPanel);
		
    if(window.sankore){
        historyTxt = window.sankore.preference('historyTxt', historyTxt);
        var ht = window.sankore.preference('historyTab', "hidden");
        $("#historyBox").val(historyTxt);
        if(ht === "visible"){
            historyTab.trigger("click");
        };
    }
	
    function resizeWidget(w, h){
        window.sankore.resize(w+2, h+2);
    }

    function compute(){
        var result;
        if(calc.length <= 1)
            result = eval(calc);
        else{
            var fNumber, lNumber, operation = "", fMinus = "";
            if(calc.charAt(0) == '-'){
                fMinus = "-";
                calc = calc.substr(1, calc.length);
            }
            operation = (calc.indexOf("+", 0) != -1)?calc.charAt(calc.indexOf("+", 0)):((calc.indexOf("*", 0) != -1)?calc.charAt(calc.indexOf("*", 0)):((calc.indexOf("/", 0) != -1)?calc.charAt(calc.indexOf("/", 0)):((calc.indexOf("-", 0) != -1)?calc.charAt(calc.indexOf("-", 0)):"")));
            fNumber = fMinus + calc.substring(0, calc.indexOf(operation, 0));
            lNumber = calc.substring(calc.indexOf(operation, 0)+1, calc.length);
            result = calcIt(fNumber, operation, lNumber);
        }

        $("#display").text(updateDisplay(result));
        lastResult = result;
        lastchar.type = "Nan";
        lastchar.value = "";
        calc = "";
	
        $("#historyBox").val($("#historyBox").val()+historyTrunk+"\n= "+updateDisplay(result)+"\n\n");
        $("#historyBox").scrollTop(99999);
	
        displayTrunk = "";
        historyTrunk = "";
	
        if(window.sankore){
            window.sankore.setPreference('historyTxt', $("#historyBox").val());
        }
	
        lastHistory = $("#historyBox").val();
    }

    function calcIt(fNumber, operation, lNumber){
        var result, fCount = "", lCount = "", length = 0;
        fCount = (fNumber.indexOf(".", 0) != -1)?fNumber.substring(fNumber.indexOf(".", 0)+1, fNumber.length):"";
        lCount = (lNumber.indexOf(".", 0) != -1)?lNumber.substring(lNumber.indexOf(".", 0)+1, lNumber.length):"";
        length = (fCount.length >= lCount.length)?fCount.length:lCount.length;
        length = Math.pow(10, length);
        fNumber = Math.round(fNumber * length);
        lNumber = Math.round(lNumber * length);
        switch(operation){
            case "+":
                result = (fNumber + lNumber)/length;
                break;
            case "-":
                result = (fNumber - lNumber)/length;
                break;
            case "*":
                result = (fNumber * lNumber)/Math.pow(length, 2);
                break;
            case "/":
                result = fNumber/lNumber;
                break;
        }
        return result;
    }

    function reset(){
        $("#display").text("0");
        calc="";
        lastchar.type = "NaN";
        displayTrunk="";
        historyTrunk="";
        $("#historyBox").val(lastHistory);
        $("#historyBox").scrollTop(99999);
    }

    function formatNumberWithDelimiters(number) {
        var delimiter = gThousandsSeparator;
        var numString = number.toString();

        if (!numString)
            return "0";
		
        var dot = numString.indexOf(gDecimalSeparator);
        if (dot == -1)
            dot = numString.length;
		
        var stop = numString.length-dot;
        var characteristic = numString.substr(0, dot);
        if (!parseInt(characteristic))
            return numString;

        // see if it's a negative number
        var numIsNegative =  (parseInt(characteristic) < 0)

        var newNumber = "";
        var delimiterCount = Math.floor((characteristic.length-1) / 3);
        var extras = characteristic.length % 3;
        if (!extras && characteristic.length > 2)
            extras = 3;

        if (extras)
            newNumber = newNumber + characteristic.substr(0, extras);

        for (var i=0;i< delimiterCount; i++) {
	
            if ( (0 == i) && numIsNegative && (extras == 1))
                newNumber = newNumber + characteristic.substr(extras + (i * 3), 3);
            else
                newNumber = newNumber + delimiter + characteristic.substr(extras + (i * 3), 3);
        }
	
        return (dot ? (newNumber + numString.substr(dot, stop)) : newNumber);
    }


    function formatNumberWithScientificNotation(number) {
        if (number == 0)
            return number;
		
        var numString = number.toString();
        if (!numString)
            return "0";

        var num = new Number(numString);
        var sci = num.toExponential(5);
        if (sci == "NaN")
            sci = formatNumberWithDelimiters(numString);
        if (!sci)
            return "0";
		
        return sci;
    }

    function updateDisplay(number){
        if(String(number).length > 8){
            number = formatNumberWithScientificNotation(number);
        }
        else{
            number = number;
        }
	
        return number;
    }

    function appendToDisplay(_char, v){
        var char = _char;
	
        // Display
        if($("#historyBox").val() === "0"){
            $("#historyBox").val("");
        };
	
        if(char == "-" && lastchar.type == "NaN"){
            char = "m";
        };
	
        // char is a number 
        if(char <= 0 || char > 0 || char == "." || char == "m" || char == "(" || char == ")"){
            if(char == "m"){
                char = "-";
            };
		
            if(lastchar.type == "NaN"){
                displayTrunk = "";
            };
		
            if(lastchar.value == "." && char == "."){
                calc = calc.substr(0, calc.length-1);
                displayTrunk = displayTrunk.substr(0, displayTrunk.length-1);
            };

            if(calc == "0"){
                if(char != "0"){
                    if(char != "."){
                        calc = String(char);
                        displayTrunk = String(char);
                        historyTrunk = String(char);
                        lastchar.type = "Number";
                    } else{
                        calc += String(char);
                        displayTrunk += String(char);
                        historyTrunk += String(char);
                        lastchar.type = "Number";
                    }
                }
            } else {
                char = (char == ".")?((displayTrunk.indexOf(".", 0) != -1)?"":"."):char;
                calc += String(char);
                displayTrunk += String(char);
                historyTrunk += String(char);
                lastchar.type = "Number";
            }
        }
        // char is an operator
        else {
            if(calc.length === 0){
                var endCalc = calc;
                calc = lastResult + endCalc;
                historyTrunk = updateDisplay(lastResult);
            }
		
            if(lastchar.type == "NaN"){
                calc = calc.substr(0, calc.length-1);
                calc += char;
                $("#historyBox").val($("#historyBox").val().substr(0, $("#historyBox").val().length-1));
            }
            else{
                try{
                    calc = eval(calc) + String(char);
                }catch(e){}
            }
		
            lastchar.type = "NaN";
            try{
                displayTrunk = eval(calc.substr(0, calc.length-1));
            }catch(e){}
            $("#historyBox").val($("#historyBox").val()+historyTrunk+char);
            $("#historyBox").scrollTop(99999);
            historyTrunk = "";
        }
		
        lastchar.value = char;
        $("#display").text(updateDisplay(displayTrunk));
    }
    
    $("#historyBox").click(function(){
        if(!clickFlag){
            $(this).select();
            clickFlag = true; 
        }
        else{
            clickFlag = false;
            $(this).blur();
        }
    });
    $(document).disableTextSelect();
};
