// ***********************************************************************
// * FILE HEADER:                                                        *
// ***********************************************************************
// * Filename:  functions.inc                                            *
// * Owner:     Martin Francis                                           *
// * Created:   10/12/2002 (MF)                                          *
// * Revised:   20/05/2003 (MF)  (UTF-8 Encoding)                        *
// ***********************************************************************
// Functions here are used with:
// * DX Range and Bearing List
// * DX Station Mapper

// ***********************************************************************
// * FUNCTION LIST:                                                      *
// ***********************************************************************
// Functions (in alpabetical order, except progress() which is called early by inline code)
// VOID =			progress(message,script)
//				  Writes message and executes optional body.onload() event if script given.
//
// Inline code:			  Opens progress window (no script)
//				  Sets up array of station objects
//				  Loads array of stations (held in stations.js, loaded after this)
//
// S =				channel(kHz)
//				  Returns correct colour code for channel type:
//				    'clear' if clear channel,       (Green)
//				    'extended' if extended channel, (Blue)
//				    'local' if local channel,       (Red)
//				    'regional' if regional channel, (Orange)
//
// S =				channelKey()
//				  Reurns chart with channel key
//
// VOID =			initHelp()
//				  Writes Help information to top.results.document
//
// VOID =			initSearch()
//				  Writes search form to top.search.document
//
// VOID =			initialise()
//				  Triggered by top.onload() event
//				  Calls initHelp() and initSearch()
//				  Closes progress window (opened with inline code)
//
// VOID =			list(dump)
//				  Opens progress window (no script)
//				  Reads form parameters for QTH location, distance and frequency span
//				  Sets cookie with selected values (expires 1 year)
//				  If !dump:
//				    writes the list to top.results.document
//				  If dump:
//				    writes the Javascript list to top.results.document
//
// S =				optionsDX(val)
//				  Returns a form Select control listing distances with current value selected.
//
// S =				optionsFont(val)
//				  Returns a form Select control listing font sizes with current value selected.
//
// S =				optionsKHz(val)
//				  Returns a form Select control listing Frequencies with current value selected.
//
// N[bearing,km,miles] =	rangeAndBearing(qth_lat,qth_lon,dx_lat,dx_lon)
//				  Returns array with range and bearing from qth to dx
//				  (adapted from http://www.geocities.com/CapeCanaveral/2265/gcsail.htm)
//
// VOID =			readCookies()
//				  Sets up default values (used if no cookies defined)
//				  Reads cookies (if defined) to overide defaults
//

// ************************************
// * progress()                       *
// ************************************
function progress(message,script) {
  Wait =	window.open('','Searching', 'width=200,height=50,resizable=0,menubar=0,location=0,toolbar=0');
  var out =	"<html>\n<head>\n<title>"+message+"</title>\n"
		+"<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>\n"
		+"</head>\n\n"
		+"<body bgcolor='#ffffe0' topmargin='5' "+script+">\n"
		+"<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n"
		+"  <tr>\n"
  		+"    <td valign='top' height='20'><font face='arial' color='Red'><b>"+message+"</b><br>\n"
		+"Please wait.<br></font><br>\n"
		+"<img src='progress.gif' height='8' width='180' border='1'></td>\n"
		+"  </tr>\n"
		+"</table></body>\n</html>";

  Wait.focus();Wait.document.write(out);Wait.document.close();
}



// ************************************
// * Inline code:                     *
// ************************************
top.progress("Loading Data... ","")

// Set up array containing clear and regional channel values (do here to avoid repeating)
channels =		new Array()
channels['clear'] =	[540,640,650,660,670,680,690,700,710,720,730,740,750,760,770,780,
			 800,810,820,830,840,850,860,870,880,890,900,940,990,
			 1000,1010,1020,1030,1040,1160,1170,1180,1190,1200,1210,1220,
			 1500,1510,1520,1530,1540,1550,1560,1570,1580];

channels['local'] =	[1230,1240,1340,1400,1450,1490];

channelKey =	 "<table cellpadding='0' cellspacing='0' border='1' bordercolor='#000000' bgcolor='#fffff0'><tr>\n"
		+"<th width='25%'><font class='clear'>&nbsp;Clear&nbsp;</font>&nbsp;</th>\n"
		+"<th width='25%'><font class='regional'>&nbsp;Regional&nbsp;</font>&nbsp;</th>\n"
		+"<th width='25%'><font class='local'>&nbsp;Local&nbsp;</font>&nbsp;</th>\n"
		+"<th width='25%'><font class='extended'>&nbsp;Extended&nbsp;</font>&nbsp;</th>\n"
		+"</tr></table>";

isLocal =	document.URL.match(/http/);

// set up for reading stations contained in stations.js
a =	new Array();
n =	0;

station =	new Array();

// ************************************
// * initHelp()                       *
// ************************************
function initHelp() {
  var out =	 "<html>"
		+"<style>\n"
		+".clear    { color: RGB(32,128,32); }\n"
		+".extended { color: RGB(0,0,255); }\n"
		+".local    { color: RGB(128,0,0); }\n"
		+".regional { color: RGB(255,128,0); }\n"
		+".heading  { font-size: 16pt; }\n"
		+"td        { font-family: arial; }\n"
		+"th        { font-family: arial; font-weight: normal;}\n"
		+"body      { font-family: arial; }\n"
		+"</style>\n"
		+"<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>\n"
		+"</head>\n"
		+"<body bgcolor='#ffffe0'><p align='center'><font color='#797900' class='heading'><b>Help</b></big></font></p>\n"
		+"<p align='justify'><b>Use this program to generate a printable list showing the range and bearing of all AM radio stations "
		+"within a given radius of your location, using 'Great Circle' calculations.&nbsp; &nbsp;"
		+"Data is mainly taken from the <a href='http://www.fcc.gov/mb/audio/amq.html' target='blank'>FCC database</a> "
		+"(see this <a href='update.doc' target='_blank'>note</a>).</b></p>\n<p align='justify'>"
		+((top.isLocal)?
		  ( "This cut-down version only contains the <b>"+a.length+"</b> stations within <b>2000km</b> of Richmond Hill "
		   +"in Soutern Ontario, Canada (reducing the time you must wait for results), "
		   +"but you can <b><a href='download.zip' target='blank'>download</a> the full version for free</b>"
		   +", including all <b>12000</b>\n"):
		  ("This full version contains all <b>"+a.length+"</b>"))
		+" stations in <b>North, South and Central America<b>.</p>\n"
		+"<table cellpadding='0' cellspacing='0' border='0'>\n"
		+"  <tr><td colspan='2'><b>Please enter:</b></td></tr>"
		+"  <tr><td valign='top'>&nbsp;*&nbsp;</td><td><b>Latitude</b> and <b>Longitude</b> for your location (I used "
		+"<a href='http://www.mapquest.com/maps/latlong.adp' target='blank'>this</a> site to zoom in on mine);</td>\n"
		+"  <tr><td valign='top'>&nbsp;*&nbsp;</td><td><b>Frequency</b> range in kHz;</td>\n"
		+"  <tr><td valign='top'>&nbsp;*&nbsp;</td><td>Maximum <b>Distance</b> in <b>km</b> or <b>miles</b> from your location;</td>\n"
		+"  <tr><td valign='top'>&nbsp;*&nbsp;</td><td><b>Font Size</b> for displayed result (7pt is good for printing, 12pt is better for viewing on screen);</td>\n"
		+"  <tr><td valign='top'>&nbsp;*&nbsp;</td><td>Press <b>'GO'</b> to execute your search.</td>\n"
		+"  <tr><td valign='top'>&nbsp;*&nbsp;</td><td>Press <b>'?'</b> to return to this Help screen.</td>\n"
		+"  <tr><td valign='top'>&nbsp;*&nbsp;</td><td>This system uses cookies to remember your chosen settings between visits.</td>\n"
		+"</table>\n<br>"
		+"<table cellpadding='0' cellspacing='1' border='0'>\n"
		+"  <tr><td colspan='2'><b>Notes:</b></td></tr>"
		+"  <tr><td valign='top'>&nbsp;*&nbsp;</td><td>"
		+"It is a good idea to print just one page of results prior to attempting a larger run to "
		+"ensure that you are happy with your settings.</td></tr>\n"
		+"  <tr><td valign='top'>&nbsp;*&nbsp;</td><td><table cellpadding='0' cellspacing='0' border='0'>\n"
		+"<tr><td>Key for AM Frequency Channels:&nbsp;</td><td>\n"
		+"<table cellpadding='0' cellspacing='0' border='1' bordercolor='#000000' bgcolor='#fffff0'><tr>\n"
		+"<th width='25%'><font class='clear'><b>&nbsp;Clear&nbsp;</b></font>&nbsp;</th>\n"
		+"<th width='25%'><font class='regional'><b>&nbsp;Regional&nbsp;</b></font>&nbsp;</th>\n"
		+"<th width='25%'><font class='local'><b>&nbsp;Local&nbsp;</b></font>&nbsp;</th>\n"
		+"<th width='25%'><font class='extended'><b>&nbsp;Extended&nbsp;</b></font>&nbsp;</th>\n"
		+"</tr></table></td></tr></table>\n"
		+"<td></tr>"
		+"  <tr><td valign='top'>&nbsp;*&nbsp;</td><td>"
		+"Please <a href='mailto:martin@classaxe.com'><b>contact</b></a> me with any comments, suggestions or corrections you may have.</td></tr>\n"
		+"</table><br>\n"
		+"&copy; <a href='http://www.classaxe.com/' target='blank'>Martin Francis</a>, 2003"
		+"</body>\n"
		+"</html>";
  top.results.document.write(out);
  top.results.document.close();
}


// ************************************
// * initSearch()                     *
// ************************************
function initSearch() {
  var out =	 "<html><head><style>\n"
		+"input.a { width: 22px; text-align: right;}\n"
		+"input.b { width: 30px; text-align: right;}\n"
		+"select.a { width:40px;}\n"
		+".header   { color: RGB(128,128,0); font-size: 16pt; font-weight: bold;}\n"
		+".clear    { color: RGB(32,128,32);}\n"
		+".extended { color: RGB(0,0,255);}\n"
		+".local    { color: RGB(128,0,0);}\n"
		+".regional { color: RGB(255,128,0);}\n"
		+"body      { font-family: arial; font-size: 14pt; font-weight: normal;}\n"
		+"</style>\n"
		+"<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>\n"
		+"</head>\n"
		+"<body bgcolor='#ffffe8' topmargin='0'>\n"
		+"<center><form name='form'>"
		+"<font class='header'>DX Range and Bearing Calculator - Version 1.1</font>"
		+"<table border='1' cellspacing='0' cellpadding='1' bordercolor='#000000'>\n"
		+"<tr><td><table cellspacing='0' cellpadding='2' border='0'>\n"
		+"<tr><td nowrap>Your Latitude:</td>\n"
		+"<td align='right'><input name='lat_deg' class='a' size='2' length='2' maxlength='2' value='"+lat[0]+"'></td><td>°</td>\n"
		+"<td><input name='lat_min' class='a' size='2' length='2' maxlength='2' value='"+lat[1]+"'></td><td>'</td>\n"
		+"<td><input name='lat_sec' class='a' size='2' length='2' maxlength='2' value='"+lat[2]+"'></td><td>\"</td>\n"
		+"<td><select name='lat_h' class='a'>\n"
		+"<option value='1'"+((lat[3]=="N")?(" selected"):(""))+">N</option>\n"
		+"<option value='-1'"+((lat[3]=="N")?(""):(" selected"))+">S</option>\n"
		+"</select></td>\n"
		+"</tr>\n"
		+"<tr><td nowrap>Your Longitude:</td>\n"
		+"<td align='right'><input name='lon_deg' class='b' size='3' length='3' maxlength='3' value='"+lon[0]+"'></td><td>°</td>\n"
		+"<td><input name='lon_min' class='a' size='2' length='2' maxlength='2' value='"+lon[1]+"'></td><td>'</td>\n"
		+"<td><input name='lon_sec' class='a' size='2' length='2' maxlength='2' value='"+lon[2]+"'></td><td>\"</td>\n"
		+"<td><select name='lon_h' class='a'>\n"
		+"<option value='1'"+((lon[3]=="E")?(" selected"):(""))+">E</option>\n"
		+"<option value='-1'"+((lon[3]=="E")?(""):(" selected"))+">W</option>\n"
		+"</select></td>\n"
		+"</tr></table></td>\n"

		+"<td valign='top'><table cellspacing='0' cellpadding='2' border='0'>\n"
		+"<tr><td align='center' colspan='3'>Range:</td></tr>\n<tr>"
		+"<td><select name='low'>\n"+optionsKHz(range[0])+"</select>\n</td>\n"
		+"<td>-</td>\n"
		+"<td><select name='high'>\n"+optionsKHz(range[1])+"</select>\n</td>\n"
		+"</tr></table></td>\n"

		+"<td valign='top'><table cellspacing='0' cellpadding='2' border='0'>\n"
		+"<tr><td align='center' colspan='3'>Distance:</td></tr>\n"
		+"<tr><td><select name='dx'>\n"+optionsDX(dx)+"</select></td><td><select name='units'>\n"
		+"<option value='km'>km</option>\n"
		+"<option value='mi'>miles</option>\n"
		+"</select></td>"
		+"</tr></table></td>\n"

		+"<td valign='top'><table cellspacing='0' cellpadding='2' border='0'>\n"
		+"<tr><td align='center' colspan='2'>Font Size:</td></tr>"
		+"<tr><td align='center'><select name='font'>"+optionsFont(font)+"</select></td>"

		+"<td nowrap><input TYPE='button' VALUE='GO' ONCLICK='top.list()'> "
		+"<input TYPE='button' VALUE='&nbsp;?&nbsp;' ONCLICK='top.initHelp()'></td></tr>\n"
		+"</table></td>"
		+"<td valign='top'><table cellspacing='0' cellpadding='2' border='0'>\n"
		+"<tr><td align='center' colspan='2'>Map:</td></tr>"
		+"<tr><td align='center'><input TYPE='button' VALUE='Show' ONCLICK='top.map_viewer()'></td>"
		+"</table></td>"
		+"<td><input TYPE='button' VALUE='Dump' ONCLICK='top.list(true)'></td>\n" // used by author to set up
		+"</tr></table>\n"
		+"</form></center></body></html>\n";

  top.search.document.write(out);
  top.search.document.close();
}


// ************************************
// * channel()                        *
// ************************************
function channel(kHz) {
  for (var j=0; j<channels['clear'].length; j++) {
    if (kHz==channels['clear'][j]) {
      return	'clear';
    }
  }
  for (var j=0; j<channels['local'].length; j++) {
    if (kHz==channels['local'][j]) {
      return	'local';
    }
  }
  if (kHz>=1610) {
    return 'extended';
  }
  return 'regional';
}


// ************************************
// * initialise()                     *
// ************************************
function initialise() {
  top.readCookies();
  top.initHelp();
  top.initSearch();
  Wait.window.close();
}



// ************************************
// * list()                           *
// ************************************
function list(dump) {
  top.progress("Searching Database... ","");
  var frm =	top.search.document.form;

  // Read location from form:
  top.qth_lat =	((eval(frm.lat_deg.value))
		+(eval(frm.lat_min.value)/60)
		+(eval(frm.lat_sec.value)/3600))
		*(eval(frm.lat_h.options[frm.lat_h.selectedIndex].value));

  top.qth_lon =	((eval(frm.lon_deg.value))
		+(eval(frm.lon_min.value)/60)
		+(eval(frm.lon_sec.value)/3600))
		*(eval(frm.lon_h.options[frm.lon_h.selectedIndex].value));

  // Read Frequency Range from form:
  var low =	eval(frm.low.options[frm.low.selectedIndex].value);
  var high =	eval(frm.high.options[frm.high.selectedIndex].value);
  if (low>high) {
    frm.low.selectedIndex=(high/10)-52;
    frm.high.selectedIndex=(low/10)-52;
    var swap =	low;
    low =	high;
    high =	swap;
  }

  // Read Distance from form:
  var dx =	eval(frm.dx.options[frm.dx.selectedIndex].value);
  var units =	frm.units.options[frm.units.selectedIndex].value;

  // Read Font Size from form:
  var font =	eval(frm.font.options[frm.font.selectedIndex].value);

  // Set cookies:
  var theDate =	new Date();
  theDate.setFullYear(theDate.getFullYear()+1);
  document.cookie = "Location="
		+eval(frm.lat_deg.value)+"|"
		+eval(frm.lat_min.value)+"|"
		+eval(frm.lat_sec.value)+"|"
		+eval(frm.lat_h.options[frm.lat_h.selectedIndex].value)+"|"
		+eval(frm.lon_deg.value)+"|"
		+eval(frm.lon_min.value)+"|"
		+eval(frm.lon_sec.value)+"|"
		+eval(frm.lon_h.options[frm.lon_h.selectedIndex].value)+"&"
		+"Range="+low+"|"+high+"&"
		+"DX="+dx+"|"+units+"&"
		+"Font="+font+"; expires="+theDate.toGMTString();


  out =		new Array();
  n =		0;

  if (!dump) {
    var lat_txt =	frm.lat_deg.value+"°"+frm.lat_min.value+"'"+frm.lat_sec.value+"\""+((frm.lat_h.options[frm.lat_h.selectedIndex].value=="1")?("N"):("S"));
    var lon_txt =	frm.lon_deg.value+"°"+frm.lon_min.value+"'"+frm.lon_sec.value+"\""+((frm.lon_h.options[frm.lon_h.selectedIndex].value=="1")?("N"):("S"));
    var title =		(((low!=520)||(high!=1700))?("Stations between "+low+"kHz and "+high+"kHz "):("All AM stations "))
    var title2 =	"listed within "+dx+" "+((units=='km')?("km"):("miles"))+" of "+lat_txt+", "+lon_txt;

    out[n++] =	 "<html><head><title>"+title+" "+title2+"</title>\n"
		+"<style>\n"
		+"td { font-family: arial; font-size:"+font+"pt;}\n"

		+".clear    { color: RGB(32,128,32); }\n"
		+".extended { color: RGB(0,0,255); }\n"
		+".local    { color: RGB(128,0,0); }\n"
		+".regional { color: RGB(255,128,0); }\n"


		+".head {font-family: arial; font-size: "+font+"pt; text-align: left; vertical-align: bottom;\n"
		+"border-left: 0px; border-right: 1px solid rgb(0,0,0);\n"
		+"border-top: 1px solid rgb(0,0,0); border-bottom: 1px solid rgb(0,0,0); }\n"

		+".head_a {font-family: arial; font-size: "+font+"pt; text-align: left; vertical-align: bottom;"
		+"border-left:  1px solid rgb(0,0,0); border-right: 1px solid rgb(0,0,0);\n"
		+"border-top: 1px solid rgb(0,0,0); border-bottom: 1px solid rgb(0,0,0);}\n"

		+".results {font-family: arial; font-size: "+font+"pt; vertical-align: bottom;\n"
		+"border-left: 0px; border-right: 1px solid rgb(0,0,0);\n"
		+"border-top: 1px solid rgb(223,223,223); border-bottom: 0px;}\n"

		+".results_a {font-family: arial; font-size: "+font+"pt; vertical-align: bottom;\n"
		+"border-left: 1px solid rgb(0,0,0); border-right: 1px solid rgb(0,0,0);\n"
		+"border-top: 1px solid rgb(223,223,223); border-bottom: 0px;}\n"

		+".results_gap {font-family: arial; font-size: "+font+"pt; vertical-align: bottom;\n"
		+"border-left:  0px; border-right: 1px solid rgb(0,0,0);\n"
		+"border-top: 1px solid rgb(0,0,0); border-bottom: 0px;}\n"

		+".results_gap_a {font-family: arial; font-size: "+font+"pt; vertical-align: bottom;\n"
		+"border-left:  1px solid rgb(0,0,0); border-right: 1px solid rgb(0,0,0);\n"
		+"border-top: 1px solid rgb(0,0,0); border-bottom: 0px;}\n"

		+".foot {font-family: arial; font-size: "+(font*1.5)+"pt; text-align: center; vertical-align: bottom;\n"
		+"background-color: rgb(255,255,255);\n"
		+"border-left:  1px solid rgb(0,0,0); border-right: 1px solid rgb(0,0,0);\n"
		+"border-top: 1px solid rgb(0,0,0); border-bottom: 1px solid rgb(0,0,0);}\n"


		+"th {font-family: arial; font-size: "+font+"pt; text-align: left; vertical-align: bottom;}\n"

		+"h1 {font-family: arial; font-size: "+(font*1.5)+"pt; text-align: center;}\n"
		+"</style>\n"
		+"<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>\n"
		+"</head>\n"
		+"<body bgcolor='#ffffe0'>"
		+"<center><h1><font color='#797900'><big><b><u>DX Range and Bearing Calculator</u></b></big> - "
		+"<i>By <a href='mailto:martin@classaxe.com'>Martin Francis</a></i></font><br>\n"
		+title+"<br>"+title2+"</h1></center>\n"
		+" <a href='javascript:if (window.print) { top.results.focus();window.print();} "
		+"else {alert(\"Netscape users, please use the print button on your browser.\")}' "
		+"onmouseover='window.status=\"Print these results\";return true;' onmouseout='window.status=\"\";return true;'>Print these results...</a></h1>\n"
		+"<table cellpadding='0' cellspacing='0' border='1' bordercolor='#000000' bgcolor='#fffff0'><tr>\n"
		+"<th>Key for AM Frequency Channels:&nbsp;</th>\n"
		+"<th><font class='clear'>&nbsp;Clear&nbsp;</font>&nbsp;</th>\n"
		+"<th><font class='regional'>&nbsp;Regional&nbsp;</font>&nbsp;</th>\n"
		+"<th><font class='local'>&nbsp;Local&nbsp;</font>&nbsp;</th>\n"
		+"<th><font class='extended'>&nbsp;Extended&nbsp;</font>&nbsp;</th>\n"
		+"</tr></table><br>\n"

		+"<table cellpadding='2' cellspacing='0' border='0'>"
		+"<tr bgcolor='#d0d0c0'>"
		+"<th class='head_a'>kHz</th>"
		+"<th class='head'>Call</th>"
		+"<th class='head'>D<br>kW</th>"
		+"<th class='head'>N<br>kW</th>"
		+"<th class='head'>Location</th>"
		+"<th class='head'>Latitude</th>"
		+"<th class='head'>Longitude</th>"
		+"<th class='head'>Bg.</th>"
		+"<th class='head'>"+((units=='km')?("km"):("miles"))+"</th>"
		+"<th class='head' width='100%'>Your Reception Notes</th>"
		+"</tr>";
  }
  else {
    out[n++] =	"<pre>\n";
  }

  var count =	0;
  top.b =	new Array();

  for (var i=0; i<top.a.length; i++) {
    if (top.a[i][1]>=low && top.a[i][1]<=high) {
      var bkm =	rangeAndBearing(top.qth_lat,top.qth_lon,top.a[i][10],top.a[i][11]);
      if ((units=="km" && bkm[1]<dx)||(units=='mi' && bkm[2]<dx)) {
        top.b[count] =	top.a[i];
        top.b[count][12] = bkm;
        count++;
      }
    }
  }


  if (!dump) {
    top.b.sort(top.sortBy_call).sort(top.sortBy_dx).sort(top.sortBy_fre);
    var color1 =	'#ffffd0';
    var color2 =	'#ffffff';
  }

  for (var i=0; i<top.b.length; i++) {
    var gap='';
    if (!dump) {
      if (!i) {
        fre = top.b[i][1];	// first frequency for comparing
        bgcolor = color1;
        kHz =	channel(fre);
      }
      else {
        if (top.b[i][1] != fre) {
          fre = top.b[i][1];
          bgcolor = ((bgcolor==color1)?(color2):(color1))
          kHz =	channel(fre);
          gap='_gap';
        }

      }
      out[n++] = "<tr bgcolor='"+bgcolor+"'>"
		+"<td class='results"+gap+"_a' align='right'><b class='"+channel(top.b[i][1])+"'>"+top.b[i][1]+"</b></td>"
		+"<td class='results"+gap+"' nowrap><a href='http://www.fcc.gov/fcc-bin/amq?list=0&facid="+top.b[i][7]+"' target='blank'><b>"+top.b[i][0]+"</b></a></td>"
		+"<td class='results"+gap+"'>"+((eval(top.b[i][2]))?(top.b[i][2]):("&nbsp;"))+"</td>"
		+"<td class='results"+gap+"'>"+((eval(top.b[i][3]))?(top.b[i][3]):("&nbsp;"))+"</td>"
		+"<td class='results"+gap+"' nowrap><a href='javascript:top.map(\""+top.b[i][10]+"\",\""+top.b[i][11]+"\")'>"
		+top.b[i][4]
		+((top.b[i][5])?(", "+top.b[i][5]):(""))
		+((top.b[i][6])?(", "+top.b[i][6]):(""))
		+"</a></td>"
		+"<td class='results"+gap+"' nowrap>"+top.b[i][8]+"</td>"
		+"<td class='results"+gap+"' nowrap>"+top.b[i][9]+"</td>"
		+"<td class='results"+gap+"' align='right'>"+top.b[i][12][0]+"°</td>"
		+"<td class='results"+gap+"' align='right'>"+((units=='km')?(top.b[i][12][1]):(top.b[i][12][2]))+"</td>"
		+"<td class='results"+gap+"'>&nbsp;</td>"
		+"</tr>\n";
    }
    else {
      out[n++] = "a[n++] = [\""
		+b[i][0]+"\","		// call
		+b[i][1]+","		// freq
		+b[i][2]+","		// day
		+b[i][3]+",\""		// night
		+b[i][4]+"\",\""	// location
		+b[i][5]+"\",\""	// state
		+b[i][6]+"\","		// country
		+b[i][7]+",\""		// fcc
		+b[i][8].replace("\"","\\\"")+"\",\""		// lat
		+b[i][9].replace("\"","\\\"")+"\","		// lon
		+(Math.round(100*(b[i][10]))/100)+","		// latd
		+b[i][11]+"];\n";				// lond
    }
  }
  if (!dump) {
    out[n++] =	 "<tr>\n"
		+"  <td colspan='10' class='foot'><b><i>"+top.b.length+" of "+top.a.length+" records matched.</i></b></td>"
		+"</tr>"
    out[n++] =	 "</table></center>"
		+"</body></html>";
  }
  results.document.write(out.join(''));
  results.document.close();
  Wait.window.close();
}



// ************************************
// * optionsDX()                      *
// ************************************
function optionsDX(val) {
  var out =	new Array;
  var dxes =	new Array(50,100,200,400,600,800,1000,1500,2000,4000,8000,12000)
  for (var n=0; n<dxes.length; n++) {
    out[n] =	"<option value='"+dxes[n]+"'" + ((val==dxes[n])?(" selected"):("")) +">"+dxes[n]+"</option>\n";
  }
  return out.join("");
}


// ************************************
// * optionsFont()                    *
// ************************************
function optionsFont(val) {
  var out =	new Array;
  for (var n=6; n<=14; n++) {
    out[n] =	"<option value='"+n+"'" + ((val==n)?(" selected"):("")) +">"+n+"</option>\n";
  }
  return out.join("");
}


// ************************************
// * optionsKHz()                     *
// ************************************
function optionsKHz(val) {
  var out =	new Array;
  for (var n=530; n<=1700; n=n+10) {
    out[n] =	"<option value='"+n+"'" + ((val==n)?(" selected"):("")) +" class='"+channel(n)+"'>"+n+"</option>\n";
  }
  return out.join("");
}



// ************************************
// * pad()                            *
// ************************************
function pad(number,pre,post){					// FUNCTION: Returns zero-padded number
  var num_int=parseInt(number);					// INPUT:    Number and length when padded
  num_dec = parseFloat(number)-(number*10^post);
//  var num_dec=(parseInt(number));		// INPUT:    Number and length when padded

  var pad_pre="";						// OUTPUT:   Padded string
  for (var i=0 ; i<(pre-num_int.toString().length); i++){	// EXAMPLE:  a=pad(15,6,2)
    pad_pre+="0";						//           a="000015.00"
  }

  var pad_post=(num_dec.toString()+"000000").substr(2,post);	// OUTPUT:   Padded string
  return(pad_pre+num_int+"."+pad_post);
}



// ************************************
// * rangeAndBearing()                *
// ************************************
function rangeAndBearing(qth_lat,qth_lon,dx_lat,dx_lon) {
// Check for same point:
  if (qth_lat == dx_lat && qth_lon==dx_lon) {
    return new Array(0,0,0);
  }
  var dlon = (dx_lon - qth_lon)
  if (Math.abs(dlon) > 180) {
    dlon = (360 - Math.abs(dlon))*(0-(dlon/Math.abs(dlon)));
  }
  var rinlat =	qth_lat*0.01745;	// convert to radians
  var rinlon =	qth_lon*0.01745;
  var rfnlat =	dx_lat*0.01745;
  var rdlon =	dlon*0.01745;
  var rgcdist =	(Math.sin(rinlat)*Math.sin(rfnlat)+Math.cos(rinlat)*Math.cos(rfnlat)*Math.cos(rdlon))
  rgcdist =	Math.acos(rgcdist)
  var gcdist =	rgcdist*57.3;

  var rincourse = (Math.sin(rfnlat)-Math.cos(rgcdist)*Math.sin(rinlat))/(Math.sin(rgcdist)*Math.cos(rinlat))
  rincourse = Math.acos(rincourse)
  incourse = rincourse*57.3;
  if (dlon < 0) {
    incourse = 360 - incourse;
  }
  return new Array(Math.round(incourse),Math.round(Math.abs(gcdist)*111.18),Math.round(Math.abs(gcdist)*69.08));
}


// ************************************
// * readCookies()                    *
// ************************************
function readCookies() {
  // Set up defaults until cookies (if present) are loaded:
  top.lat =	new Array("43","53","8","N");
  top.lon =	new Array("79","27","30","W");
  top.range =	new Array("530","1700");
  top.dx =	200;
  top.units =	"km";
  top.font =	7;

  if (document.cookie){
    // Read cookie for location:
    var start =	document.cookie.indexOf("Location=")+9;
    var end =	document.cookie.indexOf(";", start);
    if (end == -1) {
      end =	document.cookie.length;
    }
    var RexpCookie =	/([0-9]+)\|([0-9]+)\|([0-9]+)\|([0-9\-]+)\|([0-9]+)\|([0-9]+)\|([0-9]+)\|([0-9\-]+)/;
    var loc =	document.cookie.substring(start,end).match(RexpCookie);
    if (loc) {
      if (start != -1) {
        top.lat =	new Array(loc[1],loc[2],loc[3],((loc[4]==1)?("N"):("S")));
        top.lon =	new Array(loc[5],loc[6],loc[7],((loc[8]==1)?("E"):("W")));
      }
    }

    // Read cookie for frequency range:
    var start =	document.cookie.indexOf("Range=")+6;
    var end =	document.cookie.indexOf(";", start);
    if (end == -1) {
      end =	document.cookie.length;
    }
    var RexpCookie =	/([0-9]+)\|([0-9]+)/;
    var loc =	document.cookie.substring(start,end).match(RexpCookie);
    if (loc) {
      if (start != -1) {
        top.range =	new Array(loc[1],loc[2]);
      }
    }

    // Read cookie for frequency range:
    var start =	document.cookie.indexOf("Range=")+6;
    var end =	document.cookie.indexOf(";", start);
    if (end == -1) {
      end =	document.cookie.length;
    }
    var RexpCookie =	/([0-9]+)\|(mi|km)/;
    var loc =	document.cookie.substring(start,end).match(RexpCookie);
    if (loc) {
      if (start != -1) {
        top.dx =	loc[1];
        top.units =	loc[2];
      }
    }

    // Read cookie for font size:
    var start =	document.cookie.indexOf("Font=")+5;
    var end =	document.cookie.indexOf(";", start);
    if (end == -1) {
      end =	document.cookie.length;
    }
    var loc =	document.cookie.substring(start,end);
    if (loc) {
      if (start != -1) {
        top.font =	eval(loc);
      }
    }
  }
}

function map_viewer() {
  Map =	window.open('','MapViewer', 'width=800,height=600,status=1,resizable=1,menubar=0,location=1,toolbar=0');
  var out =	 "<html>\n"
		+"<head>\n"
		+"<script language=\"JavaScript\" type=\"text/javascript\">var a=new Array(); var n=0;</script>\n"
		+"<script language=\"JavaScript\" src=\"stations.js\" type=\"text/javascript\"></script>\n"
		+"<script language=\"JavaScript\" src=\"flash.js\" type=\"text/javascript\"></script>\n"
		+"<script language=\"VBScript\" src=\"flash.vbs\" type=\"text/vbscript\"></script>\n"
		+"<title>Map</title>\n</head>\n\n"
		+"<body bgcolor='#66CCFF' topmargin='5'>\n"
		+"<OBJECT classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" \n"
		+" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0\" \n"
		+" ID=dx WIDTH=100% HEIGHT=100%>\n"
		+" <PARAM NAME=play VALUE=false>\n"
		+" <PARAM NAME=movie VALUE=\"dx.swf\">\n"
		+" <PARAM NAME=loop VALUE=false>\n"
		+" <PARAM NAME=quality VALUE=high>\n"
		+" <PARAM NAME=bgcolor VALUE=#66CCFF>\n"
		+" <EMBED src=\"dx.swf\"\n"
		+"  loop=false\n"
		+"  quality=high\n"
		+"  bgcolor=#66CCFF\n"
		+"  WIDTH=100%\n"
		+"  HEIGHT=100%\n"
		+"  swLiveConnect=true\n"
		+"  NAME=dx\n"
		+"  play=false\n"
		+"  TYPE=\"application/x-shockwave-flash\"\n"
		+"  PLUGINSPAGE=\"http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash\"></EMBED>\n"
		+"</OBJECT></body>\n</html>";
  Map.focus();Map.document.write(out);Map.document.close();
}


// ************************************
// * Map:                             *
// ************************************

function map(lat,lon) {
  var map_hd =	window.open("http://www.mapquest.com/maps/map.adp?latlongtype=decimal&latitude="+lat+"&longitude="+lon+"&size=big&zoom=4","map","width=800,height=600,resizable=1,scrollbars=1,status=0,menubar=0,location=1,toolbar=0");
  map_hd.focus();
}


