// Original Script Copyright (c) 2001 Brian Chandler <chandler [at] yomogi.or.jp>
// http://imaginatorium.org/stuff/photocalc.js
// Script is copylefted: you may use it freely, or redistribute it
// and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation. I do not guarantee
// anything about it other than that I did my best. Please send me
// comments or corrections.

// 1/u + 1/v = 1/f calculator (lensx, x=u, v, f; lensclear)
function lensuinf(form) { // oneindig button
form.u.value = 'oneindig'; //Oneindig; //Infinity; //niet vertalen
lensclear(form);
}

function lensu(form) { // bereken u
var v = form.v.value;
var f = form.f.value;
var u = 1 / (1/f - 1/v);
if (isNaN(u) || u==0)
{ form.u.value="";
return;
}
if (u < 0)
{ form.u.value="";
alert("Ongeldig. (Negatieve waarde)");
return;
}
form.u.value= (u == Infinity)?'oneindig':Math.round(u);
form.mag.value=magstring(v/u).replace('Infinity','oneindig');
return 0;
}

function lensv(form) { // bereken v
if (form.u.value == 'oneindig'){
var u = Infinity;
}else{
var u = form.u.value;
}
var f = form.f.value;
var v = 1 / (1/f - 1/u);
if (isNaN(v) || v==0)
{ form.v.value="";
return;
}
if (v < 0)
{ form.v.value="";
alert("Ongeldig. (Negatieve waarde)");
return;
}

form.v.value=(v == Infinity)?'oneindig':Math.round(v);
form.mag.value=magstring(v/u).replace('Infinity','oneindig');
return 0;
}

function lensf(form) { // bereken f
if (form.u.value == 'oneindig'){
var u = Infinity;
}else{
var u = form.u.value;
}
var v = form.v.value;
var f = 1 / (1/u + 1/v);
if (isNaN(f) || f==0)
{ form.f.value="";
return;
}
form.f.value=(f == Infinity)?'oneindig':Math.round(f);
form.mag.value=magstring(v/u).replace('Infinity','oneindig');
return 0;
}

function lensclear(form) { // leeg voor vulling
if (badno(form.f.value)) form.f.value="";
if ((isNaN(form.u.value) || form.u.value<=0) && form.u.value != 'oneindig') form.u.value="";
if (isNaN(form.v.value) || form.v.value<=0) form.v.value="";
form.mag.value = "";
}

// Dioptrie calculator in f waarden (1/f1 + 1/f2 = 1/ff) en dioptrie waarden (d1, d2, dd)
function diopf1(form) {
var f1 = form.f1.value;
if (isNaN(f1/f1)) // ongeldig
{ if (form.f1.value=='-')
form.d1.value='-';
else
{ form.f1.value='';
form.d1.value='';
}
form.ff.value='';
form.dd.value='';
return;
}
var d1 = Math.round(100000/f1) / 100;
form.d1.value=d1;
var f2 = form.f2.value;
if (isNaN(f2/f2)) return;
form.ff.value = Math.round(1 / (1/f1 + 1/f2));
form.dd.value = Number(form.d1.value) + Number(form.d2.value);
}

function diopf2(form) {
var f2 = form.f2.value;
if (isNaN(f2/f2)) // invalid
{ if (form.f2.value=='-')
form.d2.value='-';
else
{ form.f2.value='';
form.d2.value='';
}
form.ff.value='';
form.dd.value='';
return;
}
var d2 = Math.round(100000/f2) / 100;
form.d2.value=d2;
var f1 = form.f1.value;
if (isNaN(f1/f1)) return;
form.ff.value = Math.round(1 / (1/f1 + 1/f2));
form.dd.value = Number(form.d1.value) + Number(form.d2.value);
}

function diopd1(form) {
var d1 = form.d1.value;
if (isNaN(d1/d1)) // invalid
{ if (form.d1.value=='-')
form.f1.value='-';
else
{ form.f1.value='';
if (!(Number(d1) == 0 || d1=='.'))
form.d1.value='';
}
form.ff.value='';
form.dd.value='';
return;
}
var f1 = Math.round(1000/d1);
form.f1.value=f1;
var f2 = form.f2.value;
if (isNaN(f2/f2)) return;
form.ff.value = Math.round(1 / (1/f1 + 1/f2));
form.dd.value = Number(form.d1.value) + Number(form.d2.value);
}

function diopd2(form) {
var d2 = form.d2.value;
if (isNaN(d2/d2)) // invalid
{ if (form.d2.value=='-')
form.f2.value='-';
else
{ form.f2.value='';
if (!(Number(d2) == 0 || d2=='.'))
form.d2.value='';
}
form.ff.value='';
form.dd.value='';
return;
}
var f2 = Math.round(1000/d2);
form.f2.value=f2;
var f1 = form.f1.value;
if (isNaN(f1/f1)) return;
form.ff.value = Math.round(1 / (1/f1 + 1/f2));
form.dd.value = Number(form.d1.value) + Number(form.d2.value);
}
function magstring(mag) {
if (mag > 10) return "x "+Math.round(mag);
if (mag < 0.05) return "x 1/" + Math.round(1/mag);
return "x " + Math.round(100*mag) / 100;
}
function badno(x) { // foutmelding bij negatieve waarde
return (isNaN(x/x) || x < 0);
}

