<?php
# ******************************************************************************
# ***  QRB-Calculation DC7CCC                                                ***
# ***                                                                        ***
# ***  email: 
dc7ccc@darc.de                                                 ***
# ***  www  : 
www.AdventureRadio.de                                          ***
# ***                                                                        ***
# ***  Die Berechnung erfolgt(e) nach Folke Rosvall, SM5AGM.                 ***
# ***  Das Programm war in BASIC geschrieben fuer den                        ***
# ***  COMMODORE PET 2001-32 Personal Computer.                              ***
# ***                                                                        ***
# ***  24-Mar-1991 Basic umgesetzt in Turbo Pascal                           ***
# ***  07-Nov-1993 QRBberechnung nach DL5FBD eingebaut (Turbo Pascal)        ***
# ***  01-Oct-1995 umgesetzt in Object-Pascal fuer Borland DELPHI 1.0        ***
# ***  07-Apr-1998 umgesetzt in JAVA-Script                                  ***
# ***  15-Mar-1999 umgesetzt in die JAVA Klasse QwjLocator                   ***
# ***  11-Sep-2002 umgesetzt in PHP4                                         ***
# ***  17-Aug-2010 verschiedene Rundungsmoeglichkeiten in function qrbQtf    ***
# ***                                                                        ***
# ******************************************************************************
#-------------------------------------------------------------------------------------
#
# Berechnung des Cosinus zu einem gegebenen Gradwinkel    
#
#-------------------------------------------------------------------------------------
function gCos($winkel) {
	return cos($winkel * pi() / 180.0);
}
#-------------------------------------------------------------------------------------
#
# Berechnung des Gradwinkels zum gegebenen Cosinuswer
#
#-------------------------------------------------------------------------------------
function arcgCos($cosinus) {
	$arcBog = 0; // Hilfsvariable vor Gradumrechnung
	$result = 0; // return-Wert
	if ($cosinus >= 1.0) {
		$result = 0.0;
	} // Sonderfall   0 Grad
	else
		if ($cosinus <= -1.0) {
			$result = 180.0;
		} // Sonderfall 180 Grad
		else {
			// ARCBOG:=PI/2-ARCTAN(COSINUS/(SQRT(1-SQR(COSINUS))));
			$arcBog = pi() / 2.0 - atan($cosinus / (sqrt(1 - ($cosinus * $cosinus))));
			// Umrechnung vom Bogenmass in Grad
			$result = $arcBog * 180.0 / pi();
		};
	return $result;
}
#-------------------------------------------------------------------------------------
#
# Berechnung des Sinus zu einem gegebenen Gradwinkel     
#
#-------------------------------------------------------------------------------------
function gSin($winkel) {
  $gsin=sin($winkel*pi()/180);
  return $gsin;
}
#-------------------------------------------------------------------------------------
#
# Die Funktion "QrbQtf" berechnet die Entfernung (QRB) zwischen zwei geografischen 
# Koordinaten und den Winkel (Antennenrichtung, QTF)
#
#-------------------------------------------------------------------------------------
function QrbQtf($o1, $n1, $o2, $n2) {
global $yqrb;
global $yqtf;
global $yqrbround;
  $yqrb = 0;
  $yqtf = 0; 
  if (($o1 == $o2) && ($n1 == $n2)) return;
  
$ew = 0; // Entfernungswinkel
$rv = 0; // vorlaeufige Richtung
//  Entfernungsberechnung 
  $ew = arcgCos(gSin($n1) * gSin($n2) + gCos($n1) * gCos($n2) * gCos($o2 - $o1));
  $yqrb = 40009.0 / 360.0 * $ew;
// Richtungsberechnung 
  $rv = arcgCos((gSin($n2) - gSin($n1) * gCos($ew)) / (gCos($n1) * gSin($ew)));
  
  $oo = gSin($o2 * -1 - $o1 * -1);
  
  if ($oo >= 0)
    $yqtf = $rv;
  else    
    $yqtf = 360.0 - $rv;
  switch ($yqrbround):  
    case 1  : $yqrb = round($yqrb,1); break;
    case 2  : $yqrb = round($yqrb,2); break;
    default : $yqrb = round($yqrb); 
  endswitch;
  $yqtf = round($yqtf);
  return;
}
#-------------------------------------------------------------------------------------
#
# Die Funktion "toDeg" rechnet einen QTH-Locator in geografische Koordinaten um
#
#-------------------------------------------------------------------------------------
function toDeg($yqth, $yeast, $ynorth) {
global $yeast;
global $ynorth;
$ywi    = array (0,0,0,0,0,0);
$ychr   = array ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9');
$yeast   = 0.0;
$ynorth  = 0.0;
$yqth=strtoupper($yqth);
# Ermittlung der Indexziffern aus dem QTH-Kenner 
$yc = 0;
while ($yc < 6) {
 $yco = substr($yqth,$yc,1);
 $yy=0;
 foreach ($ychr as $letter)
  {
  $yy++;
  if ($letter==$yco) {
  $ywi[$yc]=$yy;
  if ($ywi[$yc]>26) $ywi[$yc] = $yy-26;
  $ywi[$yc] = $ywi[$yc] -1 ;
  }
  }
 $yc++;
}
# Berechnung der geografischen Koordinate aus den Indexziffern
$yeast = (-180 + ($ywi[0]*20) + ($ywi[2]*2) + ($ywi[4]/12.0) + (1/24.0)) * -1;
$ynorth=  -90 + ($ywi[1]*10) + ($ywi[3]*1) + ($ywi[5]/24.0) + (1/48.0);
return;
}
#-------------------------------------------------------------------------------------
#
# Die Funktion "QRB" erhaelt zwei Maidenhead-Locator und initialisiert die globalen
# Variablen "$yqrb" und "$yqtf".
#
#-------------------------------------------------------------------------------------
function qrb ($locfrom, $locto, $errcode) {
global $yeast;
global $ynorth;
global $yqrb;
global $yqtf;
$errcode=0;
  $yc=""; 
  $yc=checkLoc($locfrom);
  if ($yc>"") {
    $yqrb=0;
    $yqtf=0;
    return $yc;
  }
  
  $yc=""; 
  $yc=checkLoc($locto);
  if ($yc>"") {
    $yqrb=0;
    $yqtf=0;
    return $yc;
  }
  if ($locfrom == $locto) {
    $yqrb=0;
    $yqtf=0;
    return $errcode;
    }
  toDeg($locfrom, $yeast, $ynorth);
  $yeast1  = $yeast;
  $ynorth1 = $ynorth;
  toDeg($locto, $yeast, $ynorth);
  QrbQtf($yeast1, $ynorth1, $yeast, $ynorth);
}
#-------------------------------------------------------------------------------------
#
# QTH-Locator auf Gueltigkeit pruefen
#
#-------------------------------------------------------------------------------------
function checkLoc($yploc) {
$ych1   = array ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S');
$ych2   = array ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X');
$ynum   = array ('0','1','2','3','4','5','6','7','8','9');
$yrtn   = "";
  $yploc=strtoupper($yploc);
  if (strlen($yploc)<>6)  {
    return "error: wrong locator length";
  }
  
 if (! in_array (substr($yploc,0,1), $ych1)) {return "error in locator (char 1 out of bounds)"; }
 if (! in_array (substr($yploc,1,1), $ych1)) {return "error in locator (char 2 out of bounds)"; }
 if (! in_array (substr($yploc,2,1), $ynum)) {return "error in locator (num 1 out of bounds)"; }
 if (! in_array (substr($yploc,3,1), $ynum)) {return "error in locator (num 2 out of bounds)"; }
 if (! in_array (substr($yploc,4,1), $ych2)) {return "error in locator (char 5 out of bounds)"; }
 if (! in_array (substr($yploc,5,1), $ych2)) {return "error in locator (char 6 out of bounds)"; }
  
return $yrtn;
}