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.
567 lines
16 KiB
567 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; |
|
//alert(calc) |
|
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); |
|
//alert(fNumber + " | " + operation + " | " + lNumber) |
|
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 = fNumber * length; |
|
lNumber = 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); |
|
}; |
|
|
|
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(); |
|
};
|
|
|