function CalcPrayerTimes(anydate:TDateTime;Long, Lat, Zone:Real;myMethod:Integer=2;Juristic_Methods:Integer=0;Summer:Boolean=False):TstTimes;
var _Summer:0..1;
D,L,M,Lambda,Obliquity,Alpha,ST,Dec,Durinal_Arc,Noon,UT_Noon,Local_Noon,Asr_Alt,Asr_Arc
,Asr_Time,Sun_Rise,Sun_Set,Esha_Arc,Esha_Time,Fajr_Arc,Fajr_Time:Real;
C_Method :TMethodCal;
function _arct(Value:Real):Real;
begin
result:= RadToDeg(Arccos((Sin(DegToRad(Value)) - Sin(DegToRad(Dec)) * Sin(DegToRad(Lat))) / (Cos(DegToRad(Dec)) * Cos(DegToRad(Lat)))));
end;
function _Frac24(Value:Real):Real;
begin
result:= Frac(Value/24);
end;
begin
_Summer:=0 ;
if Summer then _Summer:=1 ;
C_Method:=Calculation_Method(myMethod) ;
{نحسب اليوم اليولياني D}
D:=DateTimeToJulianDate(anydate)-2451545.0; //الطريقة السهلة
{ نحسب طول الشمس الوسطي}
L := FloatMod((280.461 + 0.9856474 * D) , 360);
L := LessMore360(L);
{نحسب حصة الشمس الوسطي M}
M := FloatMod((357.528 + 0.9856003 * D) , 360);
M := LessMore360(M);
{طول الشمس البروجي Lambda }
Lambda := L + 1.915 * Sin(DegToRad(M)) + 0.02 * Sin(DegToRad(2 * M));
Lambda := LessMore360(Lambda);
{نحسب الميل الكلي لدائرة البروج Obliquity}
Obliquity := 23.439 - 0.0000004 * D;
{نحسب المطالع المستقيمة للشمس Alpha}
Alpha := RadToDeg(Arctan((Cos(DegToRad(Obliquity)) * Tan(DegToRad(Lambda)))));
Alpha := LessMore360(Alpha);
Alpha := Alpha - (360 * int(Alpha / 360));
Alpha := (Alpha + 90 * (Floor(Lambda / 90) - Floor(Alpha / 90)));
{نحسب الزمن النجمي بالدرجات st}
ST := FloatMod((100.46 + 0.985647352 * D) , 360);
{نحسب ميل الشمس الزاوي DEC}
Dec := RadToDeg(Arcsin(Sin(DegToRad(Obliquity)) * Sin(DegToRad(Lambda))));
{نحسب زوال الشمس الوسطي noon}
Noon := Alpha - ST;
Noon := LessMore360(Noon);
{نحسب الزوال العالمي UT Noon}
UT_Noon := Noon - Long;
{نحسب الزوال المحلي الذي هو وقت الظهر Local noon}
Local_Noon := UT_Noon / 15 + Zone;
Asr_Alt := RadToDeg(Arctan((1+Juristic_Methods )+ Tan(DegToRad(Lat - Dec))));
{نحسب نصف قوس النهار Durinal_Arc}
Durinal_Arc := _arct(-0.8333);
Asr_Arc := _arct(90 - Asr_Alt);
Esha_Arc := _arct(-C_Method.AngleIsha);
Fajr_Arc := _arct(-C_Method.AngleFajr);
{نحسب الآن وقت الصلوات الناتج يجب تحويله إلى زمن}
Fajr_Time := Local_Noon - (Fajr_Arc / 15);
Sun_Rise := Local_Noon - (Durinal_Arc / 15);
Asr_Time := Local_Noon + (Asr_Arc / 15);
Sun_Set := Local_Noon + (Durinal_Arc / 15);
Esha_Time := Local_Noon + (Esha_Arc / 15);
// Adjust Isha for Umm Al-Qura University
// 90 Min after Maghrib on all Months but Ramadan 120 Min.
If myMethod=3 Then //begin
If GregorianToHijri(anydate).Month=9 Then
Esha_Time:=Sun_Set+2
Else
Esha_Time:=Sun_Set+1.5;
If Sun_rise>=Local_Noon Then
Begin
Sun_rise := 0;
Fajr_Time := 0;
End Else
If Fajr_Time>=Sun_Rise Then
Fajr_Time := 0;
If Sun_set<=Local_Noon Then
Begin
Sun_set := 0;
Esha_Time := 0;
End Else
If Esha_Time<=Sun_set Then
Esha_Time := 0;
Result[0] := _Frac24(Fajr_Time+_Summer);
Result[1] := _Frac24(Sun_Rise+_Summer);
Result[2] := _Frac24(Local_Noon+_Summer);
Result[3] := _Frac24(Asr_Time+_Summer);
Result[4] := _Frac24(Sun_Set+_Summer);
Result[5] := _Frac24(Esha_Time+_Summer);
end;