<!--

/* This script is mailware. Feel free to use and modify it as you want. 
   Please send a mail to andrea_gfg@hotmail.com just to notify me you liked it. */


/* Arrotonda ad un dato numero di decimali */
function round(value, digits) {
	var multiplier = Math.pow(10, digits);
	return Math.round(value * multiplier) / multiplier;
}

/* Converte millimetri in metri */
function toMeters(millimeters) {
	return round(millimeters / 1000, 2);
}

/* Calcola la distanza iperfocale */
function iperfocale(lunghezzaFocale, diaframma, cerchioDiConfusione){
	return (Math.pow(lunghezzaFocale, 2) / (diaframma * cerchioDiConfusione));
}

/* Calcola il punto pił vicino di corretta messa a fuoco */
function nearFocusLimit(lunghezzaFocale, diaframma, cerchioDiConfusione, distanza) {
	var h = iperfocale(lunghezzaFocale, diaframma, cerchioDiConfusione)
	return (h * distanza) / (h + (distanza - lunghezzaFocale));
}

/* Calcola il punto pił distante di corretta messa a fuoco */
function farFocusLimit(lunghezzaFocale, diaframma, cerchioDiConfusione, distanza) {
	var h = iperfocale(lunghezzaFocale, diaframma, cerchioDiConfusione);
	if (toMeters(distanza) >= toMeters(h))
		return "inf";
	else
		return (h * distanza) / (h - (distanza - lunghezzaFocale));
}

/* Calcola il diaframma a partire dalla zona nitida e dalla lunghezza focale */
function diaframmaDaZonaNitida(lunghezzaFocale, cerchioDiConfusione, distanzaMinima, distanzaMassima) {
	var h = ((lunghezzaFocale / distanzaMinima) + (lunghezzaFocale / distanzaMassima) - 2) / ((1 / distanzaMassima) - (1 / distanzaMinima));
	return Math.pow(lunghezzaFocale, 2) / (h * cerchioDiConfusione);
}

/* Calcola la distanza di messa a fuoco a partire dalla zona nitida e dalla lunghezza focale */
function distanzaDaZonaNitida(lunghezzaFocale, cerchioDiConfusione, distanzaMinima, distanzaMassima) {
	var h = ((lunghezzaFocale / distanzaMinima) + (lunghezzaFocale / distanzaMassima) - 2) / ((1 / distanzaMassima) - (1 / distanzaMinima));
	return (h - lunghezzaFocale) / ((h / distanzaMinima) - 1);
}

/* Calcola il numero guida equivalente */
function numeroGuidaEquivalente(numeroGuida100Iso, iso) {
	return Math.round(Math.sqrt(iso / 100) * numeroGuida100Iso);
}

/* Esegue i calcoli della formDistanzaIperfocale */
function calcolaFormDistanzaIperfocale() {
	var l = document.forms["formDistanzaIperfocale"].focale.value;
	var f = document.forms["formDistanzaIperfocale"].fstop.value;
	try {
		if (l == "" || isNaN(l))
			throw "focaleIsNaN";
		else if (f == "" || isNaN(f))
			throw "diaframmaIsNaN";
		var cdc;
		if (document.forms["formDistanzaIperfocale"].mm35.checked)
			cdc = 0.024;
		else if (document.forms["formDistanzaIperfocale"].cm6x6.checked)
			cdc = 0.05;
		else if (document.forms["formDistanzaIperfocale"].in4x5.checked)
			cdc= 0.115;
		else {
			var lmf = document.forms["formDistanzaIperfocale"].digitalLMF.value;
			if (lmf == "" || isNaN(lmf))
				document.forms["formDistanzaIperfocale"].digitalLMF.value = 1;
			cdc = 0.024 / document.forms["formDistanzaIperfocale"].digitalLMF.value;
		}

		var h = iperfocale(l, f, cdc);
		var distanzaMinima = h / 2;
		document.forms["formDistanzaIperfocale"].iperfocale.value = toMeters(h);
		document.forms["formDistanzaIperfocale"].distanzaMinima.value = toMeters(distanzaMinima);
	}
	catch (e) {
		switch(e) {
			case "focaleIsNaN" :
					alert("Inserire la focale utilizzata!");
					document.forms["formDistanzaIperfocale"].focale.select();
					document.forms["formDistanzaIperfocale"].focale.focus();
					break;
			case "diaframmaIsNaN" :
					alert("Inserire il diaframma di lavoro!");
					document.forms["formDistanzaIperfocale"].fstop.select();
					document.forms["formDistanzaIperfocale"].fstop.focus();
					break;
		}
	}
}

/* Esegue i calcoli della formZonaNitida nel caso 
   di click sul pulsante 'Calcola zona nitida' */
function calcolaZonaNitida() {
	var l = document.forms['formZonaNitida'].focale.value;
	var f = document.forms['formZonaNitida'].fstop.value;
	var d = document.forms['formZonaNitida'].distanza.value;
	try {
		if (l == "" || isNaN(l))
			throw "focaleIsNaN";
		else if (f == "" || isNaN(f))
			throw "diaframmaIsNaN";
		else if (d == "" || isNaN(d))
			throw "distanzaIsNaN";
		else
			d = d * 1000;
		var cdc;
		if (document.forms['formZonaNitida'].mm35ZonaNitida.checked)
			cdc = 0.024;
		else if (document.forms['formZonaNitida'].cm6x6ZonaNitida.checked)
			cdc = 0.05;
		else if (document.forms['formZonaNitida'].in4x5ZonaNitida.checked)
			cdc= 0.115;
		else {
			var lmf = document.forms['formZonaNitida'].digitalLMFZonaNitida.value;
			if (lmf == "" || isNaN(lmf))
				document.forms['formZonaNitida'].digitalLMFZonaNitida.value = 1;
			cdc = 0.024 / document.forms['formZonaNitida'].digitalLMFZonaNitida.value;
		}

		var distanzaMinima = nearFocusLimit(l, f, cdc, d);
		var distanzaMassima = farFocusLimit(l, f, cdc, d);
		if (isNaN(distanzaMassima)) {
			document.forms['formZonaNitida'].distanzaMassima.value = distanzaMassima;
			document.forms['formZonaNitida'].pdc.value = "- - -";
		}
		else {
			document.forms['formZonaNitida'].distanzaMassima.value = toMeters(distanzaMassima);
			document.forms['formZonaNitida'].pdc.value = toMeters(distanzaMassima - distanzaMinima);
		}
		document.forms['formZonaNitida'].distanzaMinima.value = toMeters(distanzaMinima);
	}
	catch (e) {
		switch(e) {
			case "focaleIsNaN" :
					alert("Inserire la focale utilizzata!");
					document.forms['formZonaNitida'].focale.select();
					document.forms['formZonaNitida'].focale.focus();
					break;
			case "diaframmaIsNaN" :
					alert("Inserire il diaframma di lavoro!");
					document.forms['formZonaNitida'].fstop.select();
					document.forms['formZonaNitida'].fstop.focus();
					break;
			case "distanzaIsNaN" :
					alert("Inserire la distanza di messa a fuoco!");
					document.forms['formZonaNitida'].distanza.select();
					document.forms['formZonaNitida'].distanza.focus();
					break;
		}
	}
}

/* Esegue i calcoli della formZonaNitida nel caso 
   di click sul pulsante 'Calcola diaframma e distanza di messa a fuoco'*/
function calcolaDiaframmaDistanza() {
	var l = document.forms['formZonaNitida'].focale.value;
	var nl = document.forms['formZonaNitida'].distanzaMinima.value;
	var fl = document.forms['formZonaNitida'].distanzaMassima.value;
	try {
		if (l == "" || isNaN(l))
			throw "focaleIsNaN";
		else if (nl == "" || isNaN(nl))
			throw "nlIsNaN";
		else if (fl == "" || isNaN(fl))
			throw "flIsNaN";
		else {
			nl = nl * 1000;
			fl = fl * 1000;
		}
		var cdc;
		if (document.forms['formZonaNitida'].mm35ZonaNitida.checked)
			cdc = 0.024;
		else if (document.forms['formZonaNitida'].cm6x6ZonaNitida.checked)
			cdc = 0.05;
		else if (document.forms['formZonaNitida'].in4x5ZonaNitida.checked)
			cdc= 0.115;
		else {
			var lmf = document.forms['formZonaNitida'].digitalLMFZonaNitida.value;
			if (lmf == "" || isNaN(lmf))
				document.forms['formZonaNitida'].digitalLMFZonaNitida.value = 1;
			cdc = 0.024 / document.forms['formZonaNitida'].digitalLMFZonaNitida.value;
		}

		var diaframma = diaframmaDaZonaNitida(l, cdc, nl, fl);
		var distanza = distanzaDaZonaNitida(l, cdc, nl, fl);
		var pdc = fl - nl;
		
		document.forms['formZonaNitida'].fstop.value = round(diaframma, 1);
		document.forms['formZonaNitida'].distanza.value = toMeters(distanza);
		document.forms['formZonaNitida'].pdc.value = toMeters(pdc);		
	}
	catch (e) {
		switch(e) {
			case "focaleIsNaN" :
					alert("Inserire la focale utilizzata!");
					document.forms['formZonaNitida'].focale.select();
					document.forms['formZonaNitida'].focale.focus();
					break;
			case "nlIsNaN" :
					alert("Inserire il limite inferiore della zona nitida!");
					document.forms['formZonaNitida'].distanzaMinima.select();
					document.forms['formZonaNitida'].distanzaMinima.focus();
					break;
			case "flIsNaN" :
					alert("Inserire il limite superiore della zona nitida!");
					document.forms['formZonaNitida'].distanzaMassima.select();
					document.forms['formZonaNitida'].distanzaMassima.focus();
					break;
		}
	}
}

/* Esegue i calcoli della formNumeroGuida */
function calcolaFormNumeroGuida() {
	var declaredNG = document.forms['formNumeroGuida'].numeroGuida100ISO.value;
	var filmISO = document.forms['formNumeroGuida'].iso.value;
	try {
		if (declaredNG == "" || isNaN(declaredNG))
			throw "declaredNGIsNaN";
		else if (filmISO == "" || isNaN(filmISO))
			throw "filmISOIsNaN";
		document.forms['formNumeroGuida'].numeroGuida.value = numeroGuidaEquivalente(declaredNG, filmISO);
	}
	catch (e) {
		switch(e) {
			case "declaredNGIsNaN" :
					alert("Inserire il numero guida per 100 ISO!");
					document.forms['formNumeroGuida'].numeroGuida100ISO.select();
					document.forms['formNumeroGuida'].numeroGuida100ISO.focus();
					break;
			case "filmISOIsNaN" :
					alert("Inserire la sensibilitą della pellicola!");
					document.forms['formNumeroGuida'].iso.select();
					document.forms['formNumeroGuida'].iso.focus();
					break;
		}
	}
}

/* Esegue i calcoli della formDimensioniSchermo nel caso 
   di click sul pulsante 'Calcola dimensioni schermo'*/
function calcolaDimensioniSchermo() {
	var f = document.forms['formDimensioniSchermo'].focaleDimensioniSchermo.value;
	var d = document.forms['formDimensioniSchermo'].distanzaDiProiezione.value;
	try {
		if (f == "" || isNaN(f))
			throw "focaleIsNaN";
		else if (d == "" || isNaN(d))
			throw "distanceIsNaN";
		var filmBase, filmHeight;
		if (document.forms['formDimensioniSchermo'].mm35DimensioniSchermo.checked) {
			filmBase = 35;
			filmHeight = 23;
		}
		else if (document.forms['formDimensioniSchermo'].cm6x6DimensioniSchermo.checked) {
			filmBase = 59;
			filmHeight = 59;
		}

		document.forms['formDimensioniSchermo'].baseSchermo.value = round((filmBase * d) / f, 2);
		document.forms['formDimensioniSchermo'].altezzaSchermo.value = round((filmHeight * d) / f, 2);
		
	}
	catch (e) {
		switch(e) {
			case "focaleIsNaN" :
					alert("Inserire la focale utilizzata!");
					document.forms['formDimensioniSchermo'].focaleDimensioniSchermo.select();
					document.forms['formDimensioniSchermo'].focaleDimensioniSchermo.focus();
					break;
			case "distanceIsNaN" :
					alert("Inserire la distanza di proiezione!");
					document.forms['formDimensioniSchermo'].distanzaDiProiezione.select();
					document.forms['formDimensioniSchermo'].distanzaDiProiezione.focus();
					break;
		}
	}
}


/* Esegue i calcoli della formDimensioniSchermo nel caso 
   di click sul pulsante 'Calcola distanza di proiezione'*/
function calcolaDistanzaDiProiezione() {
	var f = document.forms['formDimensioniSchermo'].focaleDimensioniSchermo.value;
	var b = document.forms['formDimensioniSchermo'].baseSchermo.value;
	var h = document.forms['formDimensioniSchermo'].altezzaSchermo.value;
	try {
		if (f == "" || isNaN(f))
			throw "focaleIsNaN";
		else if (b == "" || isNaN(b))
			throw "baseIsNaN";
		else if (h == "" || isNaN(h))
			throw "heightIsNaN";
		var filmBase, filmHeight;
		if (document.forms['formDimensioniSchermo'].mm35DimensioniSchermo.checked) {
			filmBase = 35;
			filmHeight = 23;
		}
		else if (document.forms['formDimensioniSchermo'].cm6x6DimensioniSchermo.checked) {
			filmBase = 59;
			filmHeight = 59;
		}

		var distance = Math.min((b * f) / filmBase, (h * f) / filmHeight);
		document.forms['formDimensioniSchermo'].distanzaDiProiezione.value = round(distance, 1);
	}
	catch (e) {
		switch(e) {
			case "focaleIsNaN" :
					alert("Inserire la focale utilizzata!");
					document.forms['formDimensioniSchermo'].focaleDimensioniSchermo.select();
					document.forms['formDimensioniSchermo'].focaleDimensioniSchermo.focus();
					break;
			case "baseIsNaN" :
					alert("Inserire la larghezza dello schermo!");
					document.forms['formDimensioniSchermo'].baseSchermo.select();
					document.forms['formDimensioniSchermo'].baseSchermo.focus();
					break;
			case "heightIsNaN" :
					alert("Inserire l'altezza dello schermo!");
					document.forms['formDimensioniSchermo'].altezzaSchermo.select();
					document.forms['formDimensioniSchermo'].altezzaSchermo.focus();
					break;
		}
	}
}

-->