///////////////////////////////////////////////////////////////////////////
//
//	Copyright (C) 2008 Michael V. Newberry. All Rights Reserved.
//
//	This copyright notice must be included in any portion of this source
//	code that is used in any form and for any purpose.
//

var _apermin = 0.1;
var _apermax = 1000.0;
var _seeingmin = 0.01;

var _pix = 10;			// microns
var _fl = 2700;			// mm
var _bin = 1;
var _darkcur = 0;
var _darkcurbinned = 0;	// for binned pixel
var _base = 0;
var _scale = 1;			// arcsec/pix
var _gain = 1;			// e-/ADU
var _rnoise = 0;			// e-
var _vfluxatmagzero = 0;
var _fluxatmagzero = 0;
var _skyflux = 0;			// ADU/s/pix
var _vstar = 0;
var _vsky = 0;
var _bw = 800;			// Angstroms
var _eff = 75;			// percent
var _qe = 80;			// percent
var _diam = 300;			// mm
var _diamsec = 75;		// mm
var _totalbgflux = 0;		// ADU/s/pix
var _exptime = 0;		// sec
var _bgsnr = 0;
var _seeing = 2;			// arcsec
var _aper = 3;			// pixels
var _aperxfwhm = 0;
var _objareasec2 = 0;
var _objareapix = 0;
var _aperarcsec = 0;
var _objflux = 0;			// object flux through aperture
var _snr = 0;
var _magerr = 0;
var _str;
var _aperfrac = 0;		// aperture fraction of 2D Gaussian
var _trans;				// filter transmission, percent
var _plot_snr = 0;
var _mark_aper = true;

//////////////////////////////////////////////////////////////
function DefaultInputs( form )
{
	Camera_ST8e( form );
	Telescope_1( form );
	Observation_1( form );
}

//////////////////////////////////////////////////////////////
function DarkCurrent( form )
{
/*
	t = eval( form.TEMP.value ) + 273;
	t3 = t * t * t;
	_darkcur = 1300 * 122 * t3 * Math.exp( -6400 / t )
*/
	_pix = eval( form.PIX.value );
	_bin = eval( form.BIN.value );
	
	dref = eval( form.DREF.value );
	temp = eval( form.TEMP.value );
	tref = eval( form.TREF.value );
	tdbl = eval( form.TDBL.value );

	// dark current for unbinned pixel
	_darkcur = _pix * _pix * (dref / 16.022) * Math.exp( 0.69315 * (temp - tref) / tdbl );
	
	// dark current for binned pixel
	_darkcurbinned = _darkcur * _bin * _bin;
}

//////////////////////////////////////////////////////////////
function BaseNoise( form )
{
	dn = eval( form.EXPTIME.value ) * _darkcurbinned;

	_rnoise = eval( form.RN.value );
	rn = _rnoise * _rnoise;
	
	_gain = eval( form.GAIN.value );
	gn = (_gain * _gain - 1) / 12;
	
	_base = Math.sqrt( dn + rn + gn );
}

//////////////////////////////////////////////////////////////
function ImageScale( form )
{
	_fl = eval( form.FL.value );
	
	_scale = _pix * _bin / ( _fl / 206264.8062 ) / 1000;
}

//////////////////////////////////////////////////////////////
function VFluxAtMagZero( form )
{
	_bw = eval( form.BW.value );
	_eff = eval( form.EFF.value );
	_qe = eval( form.QE.value );
	_diam = eval( form.DIAM.value );
	_diamsec = eval( form.DIAMSEC.value );
		
	_vfluxatmagzero = 940 * _bw * (_eff / 100) * (_qe / 100) * Math.PI * (_diam * _diam - _diamsec * _diamsec) / (4 * 10 * 10);
}

//////////////////////////////////////////////////////////////
function FluxAtMagZero( form )
{
	_eff = eval( form.EFF.value );
	_qe = eval( form.QE.value );
	_diam = eval( form.DIAM.value );
	_diamsec = eval( form.DIAMSEC.value );
	_filter = form.FILTER.value;
	_trans = eval( form.TRANS.value );
	
	if ( _filter == 'Johnson V' )
		flux0 = 8.66e5;
	else if ( _filter == 'Johnson B' )
		flux0 = 3.9e5;
	else if ( _filter == 'Johnson U' )
		flux0 = 5.5e5;
	else if ( _filter == 'Cousins R' )
		flux0 = 1.1e+6;
	else if ( _filter == 'Cousins I' )
		flux0 = 6.75e5;
	else if ( _filter == 'Clear' )
		flux0 = 4.3e6;
	else
		flux0 = 0;

	_fluxatmagzero = flux0 * (_trans / 100) * (_eff / 100) * (_qe / 100) * Math.PI * (_diam * _diam - _diamsec * _diamsec) / (4 * 10 * 10);
}


//////////////////////////////////////////////////////////////
function SkyFlux( form )
{
	_vsky = eval( form.VSKY.value );
	_gain = eval( form.GAIN.value );
	
	_skyflux = ( _fluxatmagzero * Math.exp( -0.4 * Math.LN10 * _vsky ) * _scale * _scale ) / _gain;
}


//////////////////////////////////////////////////////////////
function TotalBgFlux( form )
{
	_totalbgflux = _skyflux + ( _darkcurbinned ) / _gain;
}


//////////////////////////////////////////////////////////////
function BgSnr( form )
{
	_exptime = eval( form.EXPTIME.value );
	
	_bgsnr = Math.sqrt( _totalbgflux * _exptime * _gain );
}

/*
//////////////////////////////////////////////////////////////
function AperRadPix( form )
{
	_aper = eval( form.APER.value );
	_seeing = eval( form.SEEING.value );
	if ( _aper < 0.1 )
	{
		Message( form, "Aperture too small" );
		return;
	}
	if ( _seeing < 0.1 )
	{
		Message( form, "Seeing too small" );
		return;
	}
		
//	_aper is entered in units of FWHM (e.g., "3" means 3 times FWHM in arcsec)
//	_aperradpix = _aper * _seeing / ( 2 * _scale );
//	_objareasec2 = Math.PI * _aper * _aper * _seeing * _seeing / 4;
//	_objareapix = _objareasec2 / ( _scale * _scale );

	aperradpix = _aper;
	_aperxfwhm = 2 * _aper * _scale / _seeing;
	_objareasec2 = Math.PI * (aperradpix * _scale) * (aperradpix * _scale);
	_objareapix = _objareasec2 / ( _scale * _scale );
	_aperarcsec = 2 * _aper * _scale;
}
*/

//////////////////////////////////////////////////////////////
function AperRadPix( form, radius )
{
	var argc = AperRadPix.arguments.length;
	if ( argc > 1 )
	{
		var argv = AperRadPix.arguments;
		_aper = Number( argv[1] );
	}
	else
		_aper = Number( form.APER.value );
		
	if ( _aper < _apermin )
	{
		alert( sprintf( 'Aperture %f is smaller than %f', _aper, _apermin ) );
		return false;
	}
	
	_seeing = Number( form.SEEING.value );
	
	if ( _seeing < _seeingmin )
	{
		alert( sprintf( 'Seeing %f is smaller than %f', _seeing, _seeingmin ) );
		return false;
	}
	
	aperradpix = _aper;
	_aperxfwhm = 2 * _aper * _scale / _seeing;
	_objareasec2 = Math.PI * (aperradpix * _scale) * (aperradpix * _scale);
	_objareapix = _objareasec2 / ( _scale * _scale );
	_aperarcsec = 2 * _aper * _scale;

	return true;
}


//////////////////////////////////////////////////////////////
// comptes object flux through aperture using circular Gaussian profile
function ObjFlux( form )
{
	_vstar = eval( form.VSTAR.value );
	
	_objflux = _aperfrac * _fluxatmagzero * Math.exp( -0.4 * Math.LN10 * _vstar ) / _gain;
}


//////////////////////////////////////////////////////////////
function Snr( form )
{
	_snr = Math.sqrt( (_objflux * _exptime * _gain)
		 / ( 1 + Math.max( 1, _objareapix ) * ( (_totalbgflux * _exptime * _gain)
		  + ((_gain * _gain - 1) / 12) + (_rnoise * _rnoise) ) / (_objflux * _exptime * _gain) ) );
}


//////////////////////////////////////////////////////////////
function MagErr( form )
{
	_magerr = 2.5 / Math.LN10 / _snr;
}


//////////////////////////////////////////////////////////////
function ToStr( num )
{
	_str = sprintf( '%.3f', num );
	return _str;
}


////////////////////////////////////////////////////////////////////
function Message( form, msg )
{
	w = 400;
	h = 150;
	var pos = sprintf( 'left=%d,top=%d,width=%d,height=%d', window.event.screenX-w/2, window.event.screenY-h/2, w, h );
	var generator=window.open( '', 'MsgWin', pos );

	generator.document.write( '<html><head><title>SNR Calculator Message</title>' );
	generator.document.write( '<link rel="stylesheet" href="styles/mirametrics.css">' );
	generator.document.write( '</head><body>' );
	generator.document.write( '<br><p class="norm140">' );
	generator.document.write( msg );
	generator.document.write( '</p>' );
	//  generator.document.write( '<p><a href="javascript:self.close()">Close</a></p>' );
	generator.document.write( '</body></html>' );
	generator.document.close();
}

//////////////////////////////////////////////////////
function ClearResults( form )
{
	form.snr.value="";
	form.magerr.value="";
	form.dark_current.value="";
	form.base_noise.value="";
	form.image_scale.value="";
	form.sky_flux.value="";
	form.total_bg_flux.value="";
	form.noise_ratio.value="";
	form.bg_snr.value="";
	form.aper_x_fwhm.value="";
	form.aper_arcsec.value="";
	form.obj_area_sec2.value="";
	form.obj_flux.value="";
	form.ap_frac.value="";
}

//////////////////////////////////////////////////////
function ClearInputs( form )
{
	form.PIX.value="";
	form.QE.value="";
	form.RN.value="";
	form.GAIN.value="";
	form.BIN.value="";
	form.TEMP.value="";
	form.TDBL.value="";
	form.TREF.value="";
	form.DREF.value="";
	form.FL.value="";
	form.DIAM.value="";
	form.DIAMSEC.value="";
	form.EFF.value="";
	form.VSTAR.value="";
	form.EXPTIME.value="";
	form.SEEING.value="";
	form.VSKY.value="";
	form.APER.value="";
	form.APERMIN.value="";
	form.APERMAX.value="";
	form.TRANS.value="";
}

//////////////////////////////////////////////////////
function Camera_ST8e( form )
{
	form.PIX.value=9;
	form.QE.value=70;
	form.RN.value=15;
	form.GAIN.value=2.3;
	form.BIN.value=1;
	form.TEMP.value=-15;
	form.TDBL.value=6.3;
	form.TREF.value=25;
	form.DREF.value=6;
}

//////////////////////////////////////////////////////
function Telescope_1( form )
{
	form.FL.value=3000;
	form.DIAM.value=300;
	form.DIAMSEC.value=75;
	form.EFF.value=90;
}

//////////////////////////////////////////////////////
function Observation_1( form )
{
	form.VSTAR.value=15;
	form.EXPTIME.value=60;
	form.SEEING.value=2.5;
	form.VSKY.value=20;
	form.APER.value=5;
	form.APERMIN.value = 0.5;
	form.APERMAX.value = 15.0;
	form.TRANS.value=100;
	form.FILTER.value = 'Johnson R';
}

////////////////////////////////////////////////////////////////////////////
function GaussFrac2dLookup( form )
{
	// integral of 2-D Gaussian function I(r/sigma) = integral[ 10 * r/sigma ]
	integral = new Array();
	
	integral[0] = 0.000000;
	integral[1] = 0.005159;
	integral[2] = 0.020478;
	integral[3] = 0.043585;
	integral[4] = 0.077596;
	integral[5] = 0.118150;
	integral[6] = 0.164268;
	integral[7] = 0.217997;
	integral[8] = 0.274646;
	integral[9] = 0.332261;
	integral[10] = 0.393318;	// 1 sigma
	integral[11] = 0.454462;
	integral[12] = 0.512948;
	integral[13] = 0.570322;
	integral[14] = 0.624838;
	integral[15] = 0.675165;
	integral[16] = 0.722630;
	integral[17] = 0.764472;
	integral[18] = 0.802221;
	integral[19] = 0.835890;
	integral[20] = 0.864689;	// 2 sigmas
	integral[21] = 0.889805;
	integral[22] = 0.911216;
	integral[23] = 0.929147;
	integral[24] = 0.943950;
	integral[25] = 0.956116;
	integral[26] = 0.965995;
	integral[27] = 0.973828;
	integral[28] = 0.980198;
	integral[29] = 0.985077;
	integral[30] = 0.988897;	// 3 sigmas
	integral[31] = 0.991824;
	integral[32] = 0.994022;
	integral[33] = 0.995690;
	integral[34] = 0.996918;
	integral[35] = 0.997812;
	integral[36] = 0.998470;
	integral[37] = 0.998938;
	integral[38] = 0.999268;
	integral[39] = 0.999503;
	integral[40] = 0.999665;
	integral[41] = 0.999776;
	integral[42] = 0.999853;
	integral[43] = 0.999904;
	integral[44] = 0.999938;
	integral[45] = 0.999960;
	integral[46] = 0.999975;
	integral[47] = 0.999984;
	integral[48] = 0.999990;
	integral[49] = 0.999994;
	integral[50] = 0.999996;
	integral[51] = 0.999998;
	integral[52] = 0.999999;
	integral[53] = 0.999999;
	integral[54] = 1.000000;
	integral[55] = 1.000000;
	integral[56] = 1.000000;
	integral[57] = 1.000000;
	integral[58] = 1.000000;
	integral[59] = 1.000000;

	sigmas = _aperxfwhm * 2.354820 / 2;	// convert diameter to sigma's
	index = sigmas * 10;
	index1 = Math.floor( index );
	
	if ( index1 < 0 )	// below 0 radius
	{
		_aperfrac = 0;
	}
	else if ( index > 59 )	// 6 sigmas or greater
	{
		_aperfrac = 1;
	}
	else
	{
		var frac = index - index1;
		_aperfrac = (1-frac) * integral[ index1 ] + frac * integral[ index1+1 ];
	}

	return _aperfrac;
}

/////////////////////////////////////////////////////////////////////////
function SaveCookie()
{
	var form = document.forms['apphotopt'];
	if ( form == null )
		return;
		
	var dt = new Date();
	expires = sprintf( '%d,%d,%d', dt.getUTCFullYear() + 10, dt.getUTCMonth(), dt.getUTCDate() );

	var str = 
	form.elements['PIX'].value + '^' +
	form.elements['QE'].value + '^' +
	form.elements['RN'].value + '^' +
	form.elements['GAIN'].value + '^' +
	form.elements['BIN'].value + '^' +
	form.elements['TEMP'].value + '^' +
	form.elements['TDBL'].value + '^' +
	form.elements['TREF'].value + '^' +
	form.elements['DREF'].value + '^' +
	form.elements['FL'].value + '^' +
	form.elements['DIAM'].value + '^' +
	form.elements['DIAMSEC'].value + '^' +
	form.elements['FILTER'].value + '^' +
	form.elements['EFF'].value + '^' +
	form.elements['VSTAR'].value + '^' +
	form.elements['EXPTIME'].value + '^' +
	form.elements['SEEING'].value + '^' +
	form.elements['VSKY'].value + '^' +
	form.elements['APER'].value + '^' +
	form.elements['APERMIN'].value + '^' +
	form.elements['APERMAX'].value + '^' +
	form.elements['TRANS'].value + '^' +
	form.elements['MARKAPER'].checked + '^' +
	GetSetTypeRadio( form ) + '^';

	var sCookieName = window.location.pathname;
	_delete_cookie( sCookieName );
	_set_cookie( sCookieName, str, expires );
}

/////////////////////////////////////////////////////////////////////////
function LoadCookie()
{
	var form = document.forms['apphotopt'];
	if ( form == null )
		return;
	
	var sCookieName = window.location.pathname;	

	var sCookie = _get_cookie( sCookieName );
	if ( sCookie )
	{
		var ca = sCookie.split('^');
		if ( ca.length >= 24 )
		{
			form.elements['PIX'].value = ca[0];
			form.elements['QE'].value = ca[1];
			form.elements['RN'].value = ca[2];
			form.elements['GAIN'].value = ca[3];
			form.elements['BIN'].value = ca[4];
			form.elements['TEMP'].value = ca[5];
			form.elements['TDBL'].value = ca[6];
			form.elements['TREF'].value = ca[7];
			form.elements['DREF'].value = ca[8];
			form.elements['FL'].value = ca[9];
			form.elements['DIAM'].value = ca[10];
			form.elements['DIAMSEC'].value = ca[11];
			form.elements['FILTER'].value = ca[12];
			form.elements['EFF'].value = ca[13];
			form.elements['VSTAR'].value = ca[14];
			form.elements['EXPTIME'].value = ca[15];
			form.elements['SEEING'].value = ca[16];
			form.elements['VSKY'].value = ca[17];
			form.elements['APER'].value = ca[18];
			form.elements['APERMIN'].value = ca[19];
			form.elements['APERMAX'].value = ca[20];
			form.elements['TRANS'].value = ca[21];
			_mark_aper = (ca[22] == 'true');
			form.elements['MARKAPER'].checked = _mark_aper;
			_plot_snr = ca[23];
			InitSetTypeRadio( form, _plot_snr );

			//window.status="Your default settings were loaded";
			return;
		}
	}
	
	// no cookie, first time initialization
	form.elements['PIX'].value = 9;
	form.elements['QE'].value = 70;
	form.elements['RN'].value = 14;
	form.elements['GAIN'].value = 2.3;
	form.elements['BIN'].value = 1;
	form.elements['TEMP'].value = -10;
	form.elements['TDBL'].value = 6.3;
	form.elements['TREF'].value = 25;
	form.elements['DREF'].value = 6;
	form.elements['FL'].value = 2700;
	form.elements['DIAM'].value = 300;
	form.elements['DIAMSEC'].value = 89;
	form.elements['FILTER'].value = 'Clear';
	form.elements['EFF'].value = 90;
	form.elements['VSTAR'].value = 15;
	form.elements['EXPTIME'].value = 60;
	form.elements['SEEING'].value = 2.5;
	form.elements['VSKY'].value = 20;
	form.elements['APER'].value = 5;
	form.elements['APERMIN'].value = 0.5;
	form.elements['APERMAX'].value = 12;
	form.elements['TRANS'].value = 90;
	_mark_aper = false;
	form.elements['MARKAPER'].checked = _mark_aper;
	_plot_snr = 0;
	InitSetTypeRadio( form, _plot_snr );
}

/////////////////////////////////////////////////////////////////////////
function GetSetTypeRadio( form )
{
	var radio = form.elements['SETTYPE'];
	if ( radio != null )
	{
		for ( var i = 0; i < radio.length; i++ )
		{
			if ( radio[i].checked )
				return i;
		}
	}
	return 0;
}

/////////////////////////////////////////////////////////////////////////
function InitSetTypeRadio( form, nIndex )
{
	var radio = form.elements['SETTYPE'];
	if ( radio != null )
	{
		for ( var i = 0; i < radio.length; i++ )
		{
			if ( i == Number(nIndex) )
			{
				radio[i].click();
				return;
			}
		}
	}
}

//////////////////////////////////////////////////////////////
function SetMagErr( form )
{
	_plot_snr = 0;
}

//////////////////////////////////////////////////////////////
function SetSnr( form )
{
	_plot_snr = 1;
}

//////////////////////////////////////////////////////////////
function SetMarkAper( form )
{
	_mark_aper = (form.MARKAPER.checked == true) ? true : false;
}

//////////////////////////////////////////////////////////////
function CalcAll( form )
{
	DarkCurrent( form );
	BaseNoise( form );
	ImageScale( form );
	FluxAtMagZero( form );
	SkyFlux( form );
	TotalBgFlux( form );
	BgSnr( form );
	
	if ( AperRadPix( form ) != true )
		return;

	GaussFrac2dLookup( form );
	ObjFlux( form );
	Snr( form );
	MagErr( form );

	form.dark_current.value = ToStr( _darkcurbinned );
	form.base_noise.value = ToStr( _base );
	form.image_scale.value = ToStr( _scale );
	form.sky_flux.value = ToStr( _skyflux );
	form.total_bg_flux.value = ToStr( _totalbgflux );
	form.noise_ratio.value = ToStr( _skyflux / _totalbgflux );
	form.bg_snr.value = ToStr( _bgsnr );
	form.aper_x_fwhm.value = ToStr( _aperxfwhm );
	form.aper_arcsec.value = ToStr( _aperarcsec );
	form.obj_area_sec2.value = ToStr( _objareasec2 );
	form.obj_flux.value = ToStr( _objflux );
	form.snr.value = ToStr( _snr );
	form.magerr.value = ToStr( _magerr );
	form.ap_frac.value = ToStr( 100 * _aperfrac );	// convert to percent

	PlotSnr( form );
}

/////////////////////////////////////////////////////////////////
function PlotSnr( form )
{
	PlotData = new plotdata3;
	
	PlotData.sLabelX = 'Radius';
	PlotData.sLabelY = 'SNR';
	PlotData.sLabelZ = 'MagErr';
	
	var dMin = Math.max( _apermin, Number( form.APERMIN.value ) );
	var dMax = Math.max( dMin, Math.min( Number( form.APERMAX.value ), _apermax ) );
	var dStep = (dMax - dMin) / 100;

	for ( var dRadius = dMin; dRadius <= dMax; dRadius+=dStep )
	{
		if ( AperRadPix( form, dRadius ) != true )
			return;
		GaussFrac2dLookup( form );
		ObjFlux( form );
		Snr( form );
		MagErr( form );
		
		PlotData.add( dRadius, _snr, (1.0857/_snr) );
	}

	if ( PlotData.array.length < 1 )
	{
		alert( 'No points to plot' );
		return;
	}
	
	if ( form.APERMIN.value == '' || Number(form.APERMIN.value) < _apermin )
	{
		alert( sprintf( 'Minimum radius is not specified or is less than %f', _apermin ) );
		return;
	}
	
	if ( form.APERMAX.value == '' || Number(form.APERMAX.value) > _apermax )
	{
		alert( sprintf( 'Maximum radius is not specified or is greater than %f', _apermax ) );
		return;
	}
	
	_DiagramTarget = window.frames[ 'graph' ];
	_DiagramTarget.document.open();
	_DiagramTarget.document.writeln( "<html><head></head><body bgcolor='#eeeeee'>" );

	var Plot = new Diagram();

	Plot.SetFrame( 70, 25, 400, 210 );
	var dEdgeX = (PlotData.Xmax - PlotData.Xmin) / 20.0;
	var Xmin = 0;	//PlotData.Xmin;
	var Xmax = PlotData.Xmax + dEdgeX;
	
	if ( _plot_snr == 1 )	//SNR
	{
		PlotData.sTitle = 'SNR vs Radius (binned pixels)';

		var dEdgeY = (PlotData.Ymax - 0) / 10.0;
		var Ymin = 0;	//PlotData.Ymin;
		var Ymax = PlotData.Ymax + dEdgeY;
		
		Plot.SetBorder( Xmin, Xmax, Ymin, Ymax );
		Plot.SetText( PlotData.sLabelX, PlotData.sLabelY, PlotData.sTitle );
		Plot.SetGridColor( '#dddddd' );
		Plot.Draw( '#ffffff', '#000000', true, '', null );	//'Click on me !', 'DiagramClick()' );
	
		for ( var i = 0; i < PlotData.array.length-1; i++ )
		{
			pt1 = PlotData.array[ i ];
			pt2 = PlotData.array[ i+1 ];
			Line( Plot.ScreenX( pt1.x ), Plot.ScreenY( pt1.y ), Plot.ScreenX( pt2.x ), Plot.ScreenY( pt2.y ), '#cc9966', 2, 'SNR' );
		}
		
		if ( _mark_aper == true )
		{
			var nRefAper = Math.max( _apermin, eval( form.APER.value ) );
			Line( Plot.ScreenX( nRefAper), Plot.ScreenY( Ymin+dEdgeY/2 ), Plot.ScreenX( nRefAper ), Plot.ScreenY( Ymax-dEdgeY/2 ), '#44cc44', 1, 'Aperture' );
		}
	}
	else	// MagErr
	{
		PlotData.sTitle = 'MagErr vs Radius (binned pixels)';
		
		var dEdgeY = (PlotData.Zmax - 0) / 10.0;
		var Ymin = 0;	//PlotData.Zmin;
		var Ymax = PlotData.Zmax + dEdgeY;
		
		Plot.SetBorder( Xmin, Xmax, Ymin, Ymax );
		Plot.SetText( PlotData.sLabelX, PlotData.sLabelZ, PlotData.sTitle );
		Plot.SetGridColor( '#dddddd' );
		Plot.Draw( '#ffffff', '#000000', true, '', null );	//'Click on me !', 'DiagramClick()' );
	
		for ( var i = 0; i < PlotData.array.length-1; i++ )
		{
			pt1 = PlotData.array[ i ];
			pt2 = PlotData.array[ i+1 ];
			Line( Plot.ScreenX( pt1.x ), Plot.ScreenY( pt1.z ), Plot.ScreenX( pt2.x ), Plot.ScreenY( pt2.z ), '#cc9966', 2, 'SNR' );
		}
		
		if ( _mark_aper == true )
		{
			var nRefAper = Math.max( _apermin, eval( form.APER.value ) );
			Line( Plot.ScreenX( nRefAper), Plot.ScreenY( Ymin+dEdgeY/2 ), Plot.ScreenX( nRefAper ), Plot.ScreenY( Ymax-dEdgeY/2 ), '#44cc44', 1, 'Aperture' );
		}
	}

	_DiagramTarget.document.writeln( '</body></html>' );
	_DiagramTarget.document.close();
}

function DiagramClick()
{
	alert("function goes here.");
}
