//
// Functions that perform the calculations required for the panoguide.com
// lens calculator http://www.panoguide.com/reference/lens_calculator.html
//
// (c) copyright 2000 James Rigg.  All Rights Reserved
//

//rounds to two decimal places
function round2dec(value) {
	return ( ( Math.round ( 100 * value ) ) / 100 );
}


//notsupported
function fisheyeNotSupported(checkbox) {
	checkbox.checked = false;
	alert ("Sorry fisheye lenses are not yet supported.");
}


//filmType function sets dimensions of film based on a film size description
//and film orientation.  e.g. 35mm portrait means 24 x 36
function filmType(size, orientation, dimensionX, dimensionY) {
	if (getselected(size) == '35mm') {
		if (getselected(orientation) == 'portrait') {
			dimensionX.value = 24;
			dimensionY.value = 36;
		} else {
			dimensionX.value = 36;
			dimensionY.value = 24;
		}
	}
	if (getselected(size) == 'APS') {
		if (getselected(orientation) == 'portrait') {
			dimensionX.value = 19.2;
			dimensionY.value = 28.8;
		} else {
			dimensionX.value = 28.8;
			dimensionY.value = 19.2;
		}
	}
	if (getselected(size) == 'APSHD') {
		if (getselected(orientation) == 'portrait') {
			dimensionX.value = 16.2;
			dimensionY.value = 28.8;
		} else {
			dimensionX.value = 28.8;
			dimensionY.value = 16.2;
		}
	}
	if (getselected(size) == 'APSPan') {
		if (getselected(orientation) == 'portrait') {
			dimensionX.value = 19.2;
			dimensionY.value = 57.6;
		} else {
			dimensionX.value = 19.2;
			dimensionY.value = 57.6;
		}
	}
	if (getselected(size) == 'CP990') {
		if (getselected(orientation) == 'portrait') {
			dimensionX.value = 25.4;
			dimensionY.value = 45.72;
		} else {
			dimensionX.value = 45.72;
			dimensionY.value = 25.4;
		}
	}
	if (getselected(size) == 'CP99032') {
		if (getselected(orientation) == 'portrait') {
			dimensionX.value = 30.48;
			dimensionY.value = 45.72;
		} else {
			dimensionX.value = 45.72;
			dimensionY.value = 30.48;
		}
	}
	if (getselected(orientation) == 'landscape' && dimensionX.value < dimensionY .value) {
		var tmp = dimensionX.value;
		dimensionX.value = dimensionY.value;
		dimensionY.value = tmp;
	}
	if (getselected(orientation) == 'portrait' && dimensionY.value < dimensionX .value) {
		var tmp = dimensionX.value;
		dimensionX.value = dimensionY.value;
		dimensionY.value = tmp;
	}
}


//handle custom film sizes
function customFilmType(size, orientation, dimensionX, dimensionY) {
	makeselected(size, '');
	if (dimensionX.value > dimensionY.value) {
		makeselected(orientation, 'landscape');
	} else {
		makeselected(orientation, 'portrait');
	}
}
	

//calculate field-of-view for a given image dimension and focal length
function fov(imageDimension, focalLength) {
	return round2dec( (2 * ( Math.atan((imageDimension/(2 * focalLength))) ) ) / (2*(Math.PI/360)) );
}

//calculate field of view in both dimensions for a given image size
//at a given focal length
function fovXY(imageDimensionX, imageDimensionY, focalLength, fovX, fovY) {
	fovX.value = fov(imageDimensionX, focalLength);
	fovY.value = fov(imageDimensionY, focalLength);
}

//calculate dimensions in millimetres given pixel size and pixel resolution
//in pixels per inch
function imageRealSize(pixelX, pixelY, resolution) {
	if (isNaN(pixelX.value) || isNaN(pixelY.value) || isNaN(resolution.value)) {
		return 0;
	}
	var resm;
	resm = (resolution.value / 25.4); //resolution as pixels per mm
	pixelX.value = round2dec(pixelX.value / resm);
	pixelY.value = round2dec(pixelY.value / resm);
	return 1;
}


//calculate scan accuracy given dimensions of source and target
function scanAccuracy(sourceX, sourceY, targetX, targetY) {
	return round2dec( ((targetX * targetY) / (sourceX * sourceY)) * 100 );
}


//calculate whatever can be calculated from the entered information
//display errors, warnings or questions as appropriate
function calculateLens (form) {
	//check we have what we need
	if (form.lens_focal_length.value == '' || isNaN(form.lens_focal_length.value)) {
		alert("You must enter the lens focal length which must be a number with no letters or spaces");
		return 0;
	}
	//determine film dimensions if focal length is specified
	filmType(form.film_type, form.lens_orientation, form.film_size_x, form.film_size_y);
	//Now check we have the film dimensions we need
	if (isNaN(form.film_size_x.value) || isNaN(form.film_size_y.value)) {
		alert("Please make sure you enter only numbers for the film dimensions!");
	}
	//now determine FOV
	fovXY(form.film_size_x.value, form.film_size_y.value, form.lens_focal_length.value, form.film_fov_x, form.film_fov_y);
	//return true if no errors occur
	return 1;
}


//calculate whatever can be calculated from the entered informaion
//display errors, warnings or questions as appropriate
function calculateScan (form) {
	//check we have what we need
	//basic requirements are same as for Film, so process re-process film first
	if (!calculateLens(form)) {
		return; //an error occured
	}
	//convert image dimensions to millimetres if currently pixels
	if (getselected(form.scan_size_units) != 'mm') {
		if (form.scan_resolution.value != '' && !isNaN(form.scan_resolution.value)) {
			if (imageRealSize(form.scan_size_x, form.scan_size_y, form.scan_resolution)) {
				makeselected(form.scan_size_units, 'mm');
			} else {
				alert("Please make sure you enter only numbers for the scan dimensions and scan resolution!");
				return;
			}
		} else {
			alert("You must either specify the image size as actual scan area in millimetres, or give the scan size in pixels and specify the resolution in ppi!");
			return;
		}
	} else {
		if (form.scan_size_x.value == '' || form.scan_size_y.value == '' || isNaN(form.scan_size_x.value) || isNaN(form.scan_size_y.value)) {
			alert("Please make sure you enter only numbers for the scan dimensions!");
			return;
		}
	}
	//Calculate scan accuracy
	form.scan_accuracy.value = scanAccuracy(form.film_size_x.value, form.film_size_y.value, form.scan_size_x.value, form.scan_size_y.value);
	//check scan size does not exceed film size
	if (form.scan_size_x.value > form.film_size_x.value || form.scan_size_y.value > form.film_size_y.value) {
		alert("The scan area exceeds the size of the film.  The calculations may therefore give meaningless results");
	}
	//now determine FOV
	fovXY(form.scan_size_x.value, form.scan_size_y.value, form.lens_focal_length.value, form.scan_fov_x, form.scan_fov_y);
	//now determine effective focal length
	form.scan_efocal_length_x.value = round2dec( (form.film_size_x.value * form.lens_focal_length.value) / form.scan_size_x.value );
	form.scan_efocal_length_y.value = round2dec( (form.film_size_y.value * form.lens_focal_length.value) / form.scan_size_y.value);
}


//wrapper functions
function calcLens(form) {
	var bin;
	bin = calculateLens(form);
}
function calcScan(form) {
	var bin;
	bin = calculateScan(form);
}

