trimill.xyz/flaskr/templates/projects/converter/main.js

116 lines
3.4 KiB
JavaScript

Number.prototype.decimals = function() {
if(Math.floor(this.valueOf()) === this.valueOf()) return 0;
return (this.toString().split(".")[1] || '').length;
}
Math.trueRound = function(number, precision) {
var shift = function (number, precision, reverseShift) {
if (reverseShift) {
precision = -precision;
}
var numArray = ("" + number).split("e");
return +(numArray[0] + "e" + (numArray[1] ? (+numArray[1] + precision) : precision));
};
return shift(Math.round(shift(number, precision, false)), precision, true);
}
window.onload = function() {
measureUpdate();
}
function measureUpdate() {
let units = length.units;
let select = length.select;
switch($('#measure').val()) {
case 'length': units = length.units; select = length.select; break;
case 'temp': units = temp.units; select = temp.select; break;
case 'mass': units = mass.units; select = mass.select; break;
case 'area': units = area.units; select = area.select; break;
case 'time': units = time.units; select = time.select; break;
case 'volume': units = volume.units; select = volume.select; break;
case 'energy': units = energy.units; select = energy.select; break;
case 'computing': units = computing.units; select = computing.select; break;
}
updateUnits(units, select);
recalc();
}
function updateUnits(units, select) {
$('#unit1').empty();
$('#unit2').empty();
s1 = units.indexOf(select[0]);
s2 = units.indexOf(select[1]);
for(let i = 0; i < units.length; i++) {
let elem = $('<option></option>').val(units[i]).text(units[i]);
if(i == s1) elem = elem.attr('selected', true);
$('#unit1').append(elem);
}
for(let i = 0; i < units.length; i++) {
let elem = $('<option></option>').val(units[i]).text(units[i]);
if(i == s2) elem = elem.attr('selected', true);
$('#unit2').append(elem);
}
}
function recalc() {
let m = length;
switch($('#measure').val()) {
case 'length': m = length; break;
case 'temp': m = temp; break;
case 'mass': m = mass; break;
case 'area': m = area; break;
case 'time': m = time; break;
case 'volume': m = volume; break;
case 'energy': m = energy; break;
case 'computing': m = computing; break;
}
let value = $('#val1').val();
let result = 0;
if(m.ctype == 'mul') {
// Simple multiplication
let u1 = $('#unit1').val(), u2 = $('#unit2').val();
let done = false;
// Check custom conversions
for(let i = 0; i < m.custom.length; i++) {
let c = m.custom[i];
if(c[0] == u1 && c[1] == u2) {
result = Math.trueRound(value*c[2], 12);
done = true;
} else if(c[0] == u2 && c[1] == u1) {
result = Math.trueRound(value/c[2], 12);
done = true;
}
}
if(!done) {
// Convert
let indexFrom = m.units.indexOf(u1), indexTo = m.units.indexOf(u2);
let fc = m.conversions[indexFrom], tc = m.conversions[indexTo];
newv = value*fc/tc;
result = Math.trueRound(newv, 12);
}
} else if(m.ctype == 'funct') {
// Function (for temp)
newv = m.conversions[':'+$('#unit2').val()](m.conversions[$('#unit1').val()+':'](value))
result = Math.trueRound(newv, 8);
}
$('#val2').val(result);
}
function swap() {
let u1 = $('#unit1').val();
let u2 = $('#unit2').val();
let v1 = $('#val1').val();
let v2 = $('#val2').val();
$('#unit1').val(u2);
$('#unit2').val(u1);
$('#val1').val(v2);
$('#val2').val(v1);
}