unit unit2;
interface
uses
SysUtils,System.Math;
type
stTimes=Array[0..5] of TDateTime;
//********************
PTime = record
Time:TDateTime;
SstringTime: string;
Position: Byte ;
name:string;
end;
//********************
Tyear = record
Year: integer;
Month: Byte;
Day: Byte;
end;
PrayTime = record
Fajr, Sunrise, Dhuhr, Asr, Maghrib, Isha, Sunset,Midnight, Imsak :TDateTime;
end;
//********************// Functions //********************
function getQibla (latitude,longitude:Extended):Extended;
function CalcPray(Lon, Lat, Zone,_Elevation:Real; PrayDate:TDateTime; CalcWay:Byte;school,view:string;_StatusElevation:Boolean=False): PrayTime;
function GregorianToHijri(Ggr: Tyear): Tyear;
implementation
procedure modulo(var deg: Extended;const base:integer );
begin
if deg > 0 then deg:= deg - base * trunc(deg / base) else deg:= deg - base*(trunc(deg/base)-1);
end;
{-------------------------------------------------------------------------------}
function getQibla (latitude,longitude:Extended):Extended;
const K_latitude = 21.423333; K_longitude = 39.823333;
begin
Result := RadToDeg( ArcTan(sin(DegToRad(K_longitude - longitude)) /((cos(DegToRad(latitude)) * tan(DegToRad(K_latitude))) -(sin(DegToRad(latitude))* cos(DegToRad(K_longitude - longitude))))) );
if (latitude > 21.423333) then
Result :=Result+ 180;
end;
//==========================================================================
function DateToJulianDay(_date:TDateTime; After:Boolean = true): Extended ;
var
b: integer;
y,m,d: word;
begin
DecodeDate(_date,y,m,d);
if m <= 2 then begin y:= y-1; m:= m + 12; end;
b:=0;
if After then
begin b:= 2- (trunc(y/100)) + trunc((trunc(y/100))/4); end;
result:= trunc(365.25 * (y+ 4716)) + trunc (30.6001 * (m +1)) + d + b - 1524.5;
end;
function JDToHijir(JD: extended): Tyear;
var
L,N,J:integer;
begin
L := Trunc(JD) - 1948440 + 10632;
N := Trunc((L - 1) / 10631);
L := L - 10631 * N + 354;
J := Trunc((10985 - L) / 5316) * Trunc((50 * L) / 17719)
+ Trunc(L / 5670) * Trunc((43 * L) / 15238);
L := L - Trunc((30 - J) / 15) * Trunc((17719 * J) / 50)
- Trunc(J / 16) * Trunc((15238 * J) / 43) + 29;
result.Month := Trunc((24 * L) / 709);
Result.Day := L - Trunc((709 * result.Month) / 24);
Result.Year := Trunc(30 * N + J - 30);
end;
function GregorianToHijri(Ggr: Tyear): Tyear;
begin
Result:= JDToHijir(DateToJulianDay(EncodeDate(Ggr.year,Ggr.Month,Ggr.Day)));
end;
//==========================================================================
function CalcPray(Lon, Lat, Zone,_Elevation:Real; PrayDate:TDateTime; CalcWay:Byte;school,view:string;_StatusElevation:Boolean=False): PrayTime;
var month, day, year:Word;
a,b,jd,d,g,q,l,r,ra,e,eqt,alpha,n,_d,
MaghribSunni,MaghribShia,MidnightSunni,MidnightShia:Extended;
CalcWayFajr, CalcWayIsha: Real;
Begin
//0 Univ. Of Islamic Scinces, Karachi
//1 Islamic Society Of North America
//2 Muslim World League
//3 Umm Al-Qura University
//4 Egytion General Authority of Survey
CalcWayFajr:=-19.5;
CalcWayIsha:=-17.5;
Case CalcWay Of
0: Begin CalcWayFajr:=-18; CalcWayIsha:=-18 End;
1: Begin CalcWayFajr:=-15; CalcWayIsha:=-15 End;
2: Begin CalcWayFajr:=-18; CalcWayIsha:=-17 End;
3: Begin CalcWayFajr:=-19; CalcWayIsha:=-18 End;
4: Begin CalcWayFajr:=-19.5; CalcWayIsha:=-17.5 End;
End;
DecodeDate(PrayDate, Year, Month, Day);
if (month <= 2) then begin
year := year - 1;
month := month + 12;
end else begin
year := year;
month := month;
end ;
A := trunc(year / 100);
B := 2 - A + trunc(A / 4);
jd := trunc(365.25 * (year + 4716)) + trunc(30.6001 * (month + 1))+ day + B - 1524.5;
d := jd - 2451545.0; // jd is the given Julian date
g := 357.529 + 0.98560028 * d;
modulo(g,360);
q := 280.459 + 0.98564736 * d;
modulo(q,360);
L := q + 1.915 * sin(DegToRad(g)) + 0.020 * sin(DegToRad(2 * g));
modulo(l,360);
R := 1.00014 - 0.01671 * cos(DegToRad(g)) - 0.00014 * cos(DegToRad(2 * g));
e := 23.439 - 0.00000036 * d;
RA := RadToDeg(ArcTan2(cos(DegToRad(e))* sin(DegToRad(L)), cos(DegToRad(L))))/ 15;
if (RA < 0) then
RA := 24 + RA;
_d := RadToDeg(ArcSin(sin(DegToRad(e))* sin(DegToRad(L))));
EqT := (q/15) - RA; // equation of time
Result.Dhuhr := 12 + zone - (lon/15) - EqT;
alpha := 0.833 + 0.0347 * sqrt(_elevation);
n := -1 * sin(DegToRad(alpha)) - sin(DegToRad(lat)) * sin(DegToRad(_d));
d := cos(DegToRad(lat)) * cos(DegToRad(_d));
Result.Sunrise := Result.Dhuhr - (1/15) * RadToDeg(ArcCos(n / d));
Result.Sunset := Result.Dhuhr + (1/15) * RadToDeg(ArcCos(n / d));
n := -1 * sin(DegToRad(abs(CalcWayfajr))) - sin(DegToRad(lat))
* sin(DegToRad(_d));
Result.Fajr := Result.Dhuhr - (1/15) * RadToDeg(ArcCos(n / d));
Result.Imsak := Result.Fajr - (10/60);
n := -1 * sin(DegToRad(abs(CalcWayIsha))) - sin(DegToRad(lat))
* sin(DegToRad(_d));
Result.Isha := Result.Dhuhr + (1/15) * RadToDeg(ArcCos(n / d));
if (school = 'Shafi') then
n := sin(ArcTan(1/(1 + tan(DegToRad(lat - _d))))) - sin(DegToRad(lat)) * sin(DegToRad(_d))
else
n := sin(ArcTan(1/(2 + tan(DegToRad(lat - _d)))))- sin(DegToRad(lat)) * sin(DegToRad(_d));
Result.Asr := Result.Dhuhr + (1/15) * RadToDeg(ArcCos(n / d));
MaghribSunni := Result.Sunset + 2/60;
n := -1 * sin(DegToRad(4)) - sin(DegToRad(lat)) * sin(DegToRad(_d));
MaghribShia := Result.Dhuhr + (1/15) * RadToDeg(ArcCos(n / d));
if (view = 'Sunni') then
Result.Maghrib := MaghribSunni
else
Result.Maghrib := MaghribShia;
MidnightSunni := Result.Sunset + 0.5 * (Result.Sunrise - Result.Sunset);
if (MidnightSunni > 12) then
MidnightSunni := MidnightSunni - 12;
MidnightShia := 0.5 * (Result.Fajr - Result.Sunset);
if (MidnightShia > 12) then
MidnightShia := MidnightShia - 12;
if (view = 'Sunni') then
Result.Midnight := MidnightSunni
else
Result.Midnight := MidnightShia;
//********************************************
Result.Fajr:=(Frac(Result.Fajr/24));
Result.Sunrise:=(Frac(Result.Sunrise/24));
Result.Dhuhr:=(Frac(Result.Dhuhr/24));
Result.Asr:=(Frac(Result.Asr/24)) ;
Result.Maghrib:=(Frac(Result.Maghrib/24));
Result.Isha:=(Frac(Result.Isha/24)) ;
Result.Sunset:=(Frac(Result.Sunset/24) ) ;
Result.Midnight:=(Frac(Result.Midnight/24));
Result.Imsak:=(Frac(Result.Imsak/24));
//********************************************
End;
End.