You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
582 lines
16 KiB
582 lines
16 KiB
/*
|
|
* 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();
|
|
};
|
|
|