FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Logiciel de planétarium.
Calculateur des heures de prière. Emptypar Pedro Aujourd'hui à 8:08

» Un autre pense-bête...
Calculateur des heures de prière. Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
Calculateur des heures de prière. Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
Calculateur des heures de prière. Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
Calculateur des heures de prière. Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
Calculateur des heures de prière. Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
Calculateur des heures de prière. Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
Calculateur des heures de prière. Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
Calculateur des heures de prière. Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
Calculateur des heures de prière. Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
Calculateur des heures de prière. Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
Calculateur des heures de prière. Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
Calculateur des heures de prière. Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
Calculateur des heures de prière. Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
Calculateur des heures de prière. Emptypar leclode Ven 20 Sep 2024 - 19:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier
Le Deal du moment : -38%
Ecran PC gaming 23,8″ – ACER KG241Y P3bip ...
Voir le deal
99.99 €

 

 Calculateur des heures de prière.

Aller en bas 
5 participants
Aller à la page : 1, 2  Suivant
AuteurMessage
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Calculateur des heures de prière. Empty
MessageSujet: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyLun 29 Avr 2019 - 5:54

Comme promis, voici mon code CalcPrayerTimes.bas le Calculateur des heures de prière.
Tout est dans le code.

Code:

rem ============================================================================
rem                         CalcPrayerTimes.bas
rem                 Calculateur des heures de prière par Papydall
rem                             Avril 2019
rem ============================================================================

Init()
Gui()
Grille(NbJours(month,year))
Run()

end
rem ============================================================================
SUB Init()
    label clic, change
    label 1, 2, 3, 4, 5, 6, 7, 8 : ' pour restore_label
    dim year, month, day
    dim longitude, latitude, timeZone
    dim fajrTwilight, ishaTwilight
    dim fajrTime, sunRiseTime, zuhrTime, asrTime, maghribTime, ishaTime
    dim d, l, m, lambda, obliquity, alfa, st, dec, durinal_Arc, noon, Ut_Noon
    dim Asr_Alt, Asr_Arc, Esha_Arc, Fajr_Arc
    dim prayTime$(5)
    dim hours, minutes ,h$, m$, a, n, dst, methode, p$, ville$, pays$
    dim NbPays : NbPays = 8 : ' 8 c'est le nombre des pays proposés dans le programme
    dim Fuseau(8), H_Ete(8)
    
    day = date_day : month = date_month : year = date_year : ' La date courante
    
END_SUB
rem ============================================================================
SUB GUI()
    dim_local i,t$
    t$ = " Calculateur des heures de prière par Papydall "
    color 0,240,255,255
    width 0,1100 : height 0,800 : top 0,(screen_y - height(0)) / 2
    left 0,(screen_x - width(0))/2
    shape 5 : top 5,5 : left 5,450 : width 5,600 : height 5,50
    shape_rectangle_rounded 5 : color 5,25,100,50
    shape 6 : top 6,5 : left 6,20 : width 6,420 : height 6,50
    shape_rectangle_rounded 6 : color 6,25,100,50
    alpha 10 : top 10,20 : left 10,40 : font_color 10,250,100,50
       font_bold 10      : font_name 10,"tahoma" : font_size 10,12
       caption 10,t$     : caption 0,t$ : application_title t$
    alpha 20 : top 20,80 : left 20,010  : caption 20,"Latitude : "
    edit  21 : top 21,80 : left 21,070  : width 21,60 : font_bold 21 : text 21,"35.6333"
       hint 21,"En degrés décimaux (± 90°) positive au Nord" : on_change 21,change
    alpha 30 : top 30,80 : left 30,140  : caption 30,"Longitude : "
    edit  31 : top 31,80 : left 31,210  : width 31,60 : font_bold 31 : text 31,"10.9"
       hint 31,"En degrés décimaux (± 180°) positive à l'est" : on_change 31,change
    alpha 40 : top 40,80 : left 40,285  : caption 40,"Fuseau :"
    spin 41  : top 41,80 : left 41,335  : width 41,60 : min 41,-12 : max 41,12 : font_bold 41
       hint 41,"ZoneTime, décalage heure : Valeurs possibles ± 12" : position 41,1
       on_change 41,change
    alpha 45 : top 45,80 : left 45,420  : caption 45,"DST :" : font_bold 45 : font_name 45,"tahoma"
    combo 46 : top 46,80 : left 46,450  : width 46,50 : hint 46,"Heure d'été"
    on_change 46,change
    alpha 50 : top 50,80 : left 50,520  : caption 50,"Méthode :"  
    combo 51 : top 51,80 : left 51,580  : width 51,480 : font_bold 51  : height 51,40
    font_name 51,"tahoma" : on_change 51,change
    hint 51,"convention de calcul utilisé"
    button 60 : top 60,20 : left 60,950 : caption 60,"Quitter"
    on_click 60,clic
    button 70 : top 70,20 : left 70,470  : caption 70,"Calculer"
    on_click 70,clic
    
    button 80 : top 80,120 : left 80,500 : font_bold 80 : font_name 80,"wingdings 2"
    font_size 80,30 : caption 80,"D" : hint 80,"Mois précédent" : on_click 80,clic
    button 90 : top 90,120 : left 90,760 : font_bold 90 : font_name 90,"wingdings 2"
    font_size 90,30 : caption 90,"E" : hint 90,"Mois suivant" : on_click 90,clic
    alpha 100: top 100,130 : left 100,630 : font_bold 100 : font_name 100,"arial"
    font_size 100,12 : caption 100,Month_Name$(month)  + "  " + str$(year)
    item_add 46,0 : item_add 46,1 : item_select 46,1  
    for i = 1 to 17 : read t$ : item_add 51,t$ : next i
    item_select 51,14          
    for i = 20 to 70 step 10 : font_bold i : font_name i,"tahoma" : next i  

    alpha 110 : top 110,150 : left 110,10 : font_bold 110 : font_size 110,12
    font_name 110,"tahoma" : font_color 110, 255,0,0 : caption 110,"Pays : Tunise"
    alpha 120 : top 120,150 : left 120,200 : font_bold 120 : font_size 120,12
    font_name 120,"tahoma" : font_color 120, 255,0,0 : caption 120,"Ville : Moknine"
        
    alpha 130 : top 130,200 : left 130,10 : font_bold 130 : font_name 130,"tahoma"
    font_size 130,12 : font_color 130,0,0,255 : caption 130,"Choix Pays / Villes"
    
    alpha 140 : top 140,240 : left 140,60 : font_bold 140 : font_name 140,"Wingdings"
    font_size 140,30 : caption 140,"ê"
    
    button 150 : top 150,20 : left 150,600 : font_bold 150 : caption 150,"Aide" : on_click 150,clic
    button 160 : top 160,20 : left 160,740 : font_bold 160 : width 160,150
    caption 160,"Pour votre culture" : on_click 160,clic
    container_option 200 : top 200,300 : left 200,10 : width 200,130 : height 200,35*NbPays +10
    color 200,255,255,0
        
    for i = 1 to NbPays
        option 200+i  : parent 200+i,200 : top 200+i,30*i : left 200+i,10
        font_bold 200+i : font_name 200+i,"tahoma" : on_click 200+i,clic      
        read p$ : caption 200+i,p$
        read fuseau(i) : read H_Ete(i)      
    next i
 
    combo 300 : top 300,300 : left 300,160
    font_bold 300 : width 300,300 : hide 300 : on_change 300,change
        
END_SUB
rem ============================================================================
' Tracer une grille en fonction du nombre des jours dans le mois en cours
SUB Grille(n)
    grid 1 : top 1,180 : left 1,500 : width 1,342 : height 1,n*18-8 : grid_row 1,n+1    
    grid_row_fixed 1,1 : grid_row_height 1,16
    grid_column 1,7    : grid_column_fixed 1,1 : grid_column_width 1,50 : font_bold 1
    grid_fixed_color 1,255,255,0 : grid_one_column_width 1,1,30    
    color 1,0,255,255    
    grid_write 1,1,1,"Jour"
    grid_write 1,1,2," Farjr"
    grid_write 1,1,3,"Sunrise"
    grid_write 1,1,4," Dhuhr"
    grid_write 1,1,5,"  Asr"
    grid_write 1,1,6,"Maghrib"
    grid_write 1,1,7,"  Isha"
END_SUB
rem ============================================================================
SUB Run()
    dim_local nb
    nb = NbJours(month,year)  
    for n = 1 to Nb : Go(n) : Affiche(n) : next n
END_SUB
rem ============================================================================
Change:  
    active 70
    select number_change
        case 21  : if text$(21) = "" then text 21,0
        case 31  : if text$(31) = "" then text 31,0
        case 41  : if text$(41) = "" then text 41,0
                  if abs(val(text$(41))) > 12 then text 41,0
        case 46  : if (text$(46) <> "0") or (text$(46) <> "1") then text 46,0
        case 300 : New_Coord()              
    end_select  
return
rem ============================================================================
' Gestion des clics de l'utilisateur
Clic:
    if number_click > 200 then caption 140,"ê î"        
    select number_click
        case 060 : if message_confirmation_yes_no("Vous voulez vraiment quitter ?") = 1 then terminate
        case 070 : for n = 1 to NbJours(month,year)
                       Go(n) : Affiche(n)  : ' Calculer
                   next n
        case 080 : Mois_Precedant()
        case 090 : Mois_Suivant()
        case 150 : Aide()
        case 160 : Culture()      
        case 201 : restore_label 1 : pays$ = "Algérie"  : List_Ville(number_click-200)
        case 202 : restore_label 2 : pays$ = "Belgique" : List_Ville(number_click-200)
        case 203 : restore_label 3 : pays$ = "Egypt"    : List_Ville(number_click-200)
        case 204 : restore_label 4 : pays$ = "France"   : List_Ville(number_click-200)
        case 205 : restore_label 5 : pays$ = "Lybie"    : List_Ville(number_click-200)
        case 206 : restore_label 6 : pays$ = "Maroc"    : List_Ville(number_click-200)
        case 207 : restore_label 7 : pays$ = "Arabie"   : List_Ville(number_click-200)
        case 208 : restore_label 8 : pays$ = "Tunisie"  : List_Ville(number_click-200)
    end_select
    
return
rem ============================================================================
SUB Go(day)
    calcPrayerTimes(day,month,year,fajrTwilight,ishaTwilight)
    NumberToHrMin(fajrTime)    : prayTime$(0) = h$ + ":" + m$
    NumberToHrMin(SunRiseTime) : prayTime$(1) = h$ + ":" + m$
    NumberToHrMin(zuhrTime)    : prayTime$(2) = h$ + ":" + m$
    NumberToHrMin(AsrTime)     : prayTime$(3) = h$ + ":" + m$
    NumberToHrMin(MaghribTime) : prayTime$(4) = h$ + ":" + m$    
    if (item_index(51) = 15) or (item_index(51) = 16)
       NumberToHrMin(MaghribTime + 1.5)
       prayTime$(5) = h$ + ":" + m$
    else    
       NumberToHrMin(IshaTime)    : prayTime$(5) = h$ + ":" + m$
    end_if    
END_SUB
rem ============================================================================
SUB New_Coord()
    dim_local t$,t1$,p
    t$ = item_read$(300,item_index(300))
    p = instr(t$,":")
    ville$ = left$(t$,p-1)
    t$ = mid$(t$,p+1,20)
    p = instr(t$,"/")
    t1$ = mid$(t$,p+1,20)
    t$ = left$(t$,p-1)
    text 21,t$ : text 31,t1$  
    caption 110,"Pays : " + pays$
    caption 120,"Ville : " + ville$
    grid_clear 1,NbJours(month,year)+1 ,7
END_SUB
rem ============================================================================
SUB List_Ville(p)
    clear 300
    position 41,fuseau(p)
    item_select 46,H_Ete(p) + 1
    read ville$
    while ville$ <> "FIN"
        ville$ = ville$ + " : "
        read latitude : read longitude
        item_add 300,ville$  + str$(latitude) + " / " + str$(longitude)
        read ville$
    end_while
    item_select 300,1  
    sort_on 300 : show 300  
    inactive 70      
END_SUB
rem ============================================================================
' convertir Degree en Radian
FNC degToRad(degree)
    result ((pi / 180) * degree)
END_FNC
rem ============================================================================
' convertir Radian en Degree
FNC radToDeg(radian)
    result (radian * (180/pi))
END_FNC
rem ============================================================================
' Ramener la valeur de value entre 0 et 360
FNC moreLess360(value)
    while (value > 360) or (value < 0)
        if value > 360
           value = value - 360
        else
           if value < 0
              value = value + 360
           end_if
        end_if
    end_while
    result value              
END_FNC
rem ============================================================================
' Ramener la valeur de value entre 0 et 24
FNC moreLess24(value)
    while (value > 24) or (value < 0)
        if value > 24
           value = value - 24
        else
           if value < 0
              value = value + 24
           end_if
        end_if
    end_while
    result value
END_FNC
rem ============================================================================
' convertir le nombre  number en heurs et Minutes
SUB NumberToHrMin(number)
    if number = -1 then h$ = "--" : m$ = "--" : exit_sub
    hours   = int(moreLess24(number))    
    minutes = int(moreLess24(number - hours) * 60)
    h$ = str$(hours) : m$ = str$(minutes)
    if len(h$) < 2 then h$ = "0" + h$
    if len(m$) < 2 then m$ = "0" + m$    
END_SUB
rem ============================================================================
FNC Month_Name$(mois)
    dim_local m$
    select mois
        case 01 : m$ = "Janvier"
        case 02 : m$ = "Février"
        case 03 : m$ = "Mars"
        case 04 : m$ = "Avril"
        case 05 : m$ = "Mai"
        case 06 : m$ = "Juin"
        case 07 : m$ = "Juillet"
        case 08 : m$ = "Août"
        case 09 : m$ = "Septembre"
        case 10 : m$ = "Octobre"
        case 11 : m$ = "Novembre"
        case 12 : m$ = "Décembre"
    end_select
    result m$
END_FNC
rem ============================================================================
' Fonction qui retourne 1 si l'argument (annee) représente une année bisextile
' 0 sinon
FNC Bisextile(annee)
    if (mod(annee,4) = 0) and ((mod(annee,100) <> 0) or (mod(annee,400) = 0))
       result 1
    else
       result 0
    end_if
END_FNC
rem ============================================================================
' Déterminer le nombre de jours dans un mois (mois) pour une année (annee)
FNC NbJours(mois,annee)
    dim_local n
    select mois
        case 01 : n = 31
        case 02 : n = 28 : if bisextile(annee) > 0 then n = n + 1
        case 03 : n = 31
        case 04 : n = 30
        case 05 : n = 31
        case 06 : n = 30
        case 07 : n = 31
        case 08 : n = 31
        case 09 : n = 30
        case 10 : n = 31
        case 11 : n = 30
        case 12 : n = 31        
    end_select
    result n
END_FNC
rem ============================================================================
SUB Mois_Precedant()
    dim_local n,nb
    month = month-1
    if month < 1 then month = 12 : year = year - 1
    caption 100,Month_Name$(month)  + "  " + str$(year)
    nb = NbJours(month,year)
    delete 1 : Grille(nb)
    Run()    
END_SUB
rem ============================================================================
SUB Mois_Suivant()
    dim_local n,nb
    month = month+1
    if month > 12 then month = 1 : year = year + 1
    caption 100,Month_Name$(month)  + "  " + str$(year)
    nb = NbJours(month,year)
    delete 1 : Grille(nb+1)
    Run()
END_SUB
rem ============================================================================
SUB Affiche(n)
    dim_local i
    grid_write 1,1,1,"Jour"
    grid_write 1,1,2," Farjr"
    grid_write 1,1,3,"Sunrise"
    grid_write 1,1,4," Dhuhr"
    grid_write 1,1,5,"  Asr"
    grid_write 1,1,6,"Maghrib"
    grid_write 1,1,7,"  Isha"
    for i = 1 to n : grid_write 1,i+1,1,str$(i) : next i    
    for i = 0 to 5 : grid_write 1,n+1,i+2,prayTime$(i) : next i        
END_SUB
rem ============================================================================
' Méthodes du calcul selon différentes Ecoles
data "Algerian Minister of Religious Affairs and Wakfs : Fajr: 18.0° - Isha'a: 17.0°"
data "Egyptian General Authority                       : Fajr: 19.5° - Isha'a: 17.5°"
data "Egyptian General Authority (Bis)                 : Fajr: 20.0° - Isha'a: 18.0°"
data "France UOIF - Angle 12°                          : Fajr: 12.0° - Isha'a: 12.0°"
data "France - Angle 15°                               : Fajr: 15.0° - Isha'a: 15.0°"
data "France - Angle 18°                               : Fajr: 18.0° - Isha'a: 18.0°"
data "Islamic University, Karachi                      : Fajr: 18.0° - Isha'a: 18.0°"
data "JAKIM (Jabatan Kemajuan Islam Malaysia)          : Fajr: 20.0° - Isha'a: 18.0°"
data "MUIS (Majlis Ugama Islam Singapura               : Fajr: 20.0° - Isha'a: 18.0°"
data "Muslim World League (MWL)                        : Fajr: 18.0° - Isha'a: 17.0°"
data "North America (ISNA)                             : Fajr: 15.0° - Isha'a: 15.0°"
data "Shia Ithna Ashari (Jafari)                       : Fajr: 16.0° - Isha'a: 14.0°"
data "SIHAT/KEMENAG (Kementerian Agama RI)             : Fajr: 20.0° - Isha'a: 18.0°"
data "Tunisian Ministry of Religious Affairs           : Fajr: 18.0° - Isha'a: 18.0°"
data "General Authority of Islamic Affairs And Endowments : Fajr: 19.5° - Isha'a: 90 min"
data "Umm Al-Qura, Makkah                              : Fajr: 18.5° - Isha'a: 90 min"
data "University of Tehran                             : Fajr: 17.7° - Isha'a: 15.0°"
rem ============================================================================
' C'est la procédure qui fait tous les calculs
SUB CalcPrayerTimes(day,month,year,fajrTwilight,ishaTwilight)  
    latitude = val(text$(21)) : longitude = val(text$(31)) : TimeZone = val(text$(41))
    dst = val(text$(46))
    select item_index(51)
        case 01 : FajrTwilight = -18.0 : ishaTwilight = -17.0  : ' Algerian Minister of Religious Affairs and Wakfs
        case 02 : FajrTwilight = -19.5 : ishaTwilight = -17.5  : ' Egyptian General Authority
        case 03 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' Egyptian General Authority (Bis)
        case 04 : FajrTwilight = -12.0 : ishaTwilight = -12.0  : ' France UOIF - Angle 12°      
        case 05 : FajrTwilight = -15.0 : ishaTwilight = -15.0  : ' France - Angle 15°
        case 06 : FajrTwilight = -18.0 : ishaTwilight = -18.0  : ' France - Angle 18°        
        case 07 : FajrTwilight = -18.0 : ishaTwilight = -18.0  : ' Islamic University, Karachi
        case 08 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' JAKIM (Jabatan Kemajuan Islam Malaysia)
        case 09 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' MUIS (Majlis Ugama Islam Singapura
        case 10 : FajrTwilight = -18.0 : ishaTwilight = -17.0  : ' Muslim World League (MWL)
        case 11 : FajrTwilight = -15.0 : ishaTwilight = -15.0  : ' North America (ISNA)
        case 12 : FajrTwilight = -16.0 : ishaTwilight = -14.0  : ' Shia Ithna Ashari (Jafari)
        case 13 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' SIHAT/KEMENAG (Kementerian Agama RI)
        case 14 : FajrTwilight = -18.0 : ishaTwilight = -18.0  : ' Tunisian Ministry of Religious Affairs  
        case 15 : FajrTwilight = -19.5 : ' Isha'a: 90 min      : ' UAE General Authority of Islamic Affairs And Endowments
        case 16 : FajrTwilight = -18.5 : ' Isha'a: 90 min      : ' Umm Al-Qura, Makkah
        case 17 : FajrTwilight = -17.7 : ishaTwilight = -15.0  : ' University of Tehran
    end_select
    D = (367 * year) - ((year + int((month + 9) / 12)) * 7 / 4) + ((int(275 * month / 9)) + day - 730531.5)
    L = 280.461 + 0.9856474 * D : L = moreLess360(L)
    M = 357.528 + (0.9856003) * D : M = moreLess360(M)
    Lambda = L + 1.915 * sin(degToRad(M)) + 0.02 * sin(degToRad(2 * M))
    Lambda = moreLess360(Lambda)    
    Obliquity = 23.439 - 0.0000004 * D    
    Alfa = radToDeg(atn((cos(degToRad(Obliquity)) * tan(degToRad(Lambda)))))
    Alfa = moreLess360(Alfa)
    Alfa = Alfa - (360 * (int(Alfa / 360)))
    Alfa = Alfa + 90 * (int(Lambda / 90) - int(Alfa / 90))    
    ST = 100.46 + 0.985647352 * D
    Dec = radToDeg(asin(sin(degToRad(Obliquity)) * sin(degToRad(Lambda))))
    a = (sin(degToRad(-0.8333)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))
    if abs(a) > 1  : ' le soleil ne se couche pas
       FajrTime = -1 : sunRiseTime = -1
       asrTime  = -1 : maghribTime = -1 : ishaTime = -1
       exit_sub
    end_if    
    Durinal_Arc = radToDeg(acos((sin(degToRad(-0.8333)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))))  
    Noon = Alfa - ST
    Noon = moreLess360(Noon)    
    UT_Noon = Noon - longitude
' ------------------------------------------------------------------------------    
' Calculating Prayer Times Arcs & Times
' ------------------------------------------------------------------------------    
' Zuhr Time (Local noon)
    zuhrTime = UT_Noon / 15 + timeZone + dst
' Asr Hanafi
'    Asr_Alt = radToDeg(atn(2 + tan(degToRad(abs(latitude - Dec)))))
' Asr Standard (Shafii, Maliki, Hanbali)
    Asr_Alt = radToDeg(atn(1 + tan(degToRad(abs(latitude - Dec)))))
    a = (sin(degToRad(90 - Asr_Alt)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))
    if abs(a) > 1  
       FajrTime = -1 : sunRiseTime = -1
       asrTime  = -1 : maghribTime = -1 : ishaTime = -1
       exit_sub
    end_if  
    Asr_Arc = radToDeg(acos((sin(degToRad(90 - Asr_Alt)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))))
    Asr_Arc = Asr_Arc / 15
'  Asr Time
    asrTime = zuhrTime + Asr_Arc
' Shorouq Time        
    sunRiseTime = zuhrTime - (Durinal_Arc / 15)
' Maghrib Time
    maghribTime = zuhrTime + (Durinal_Arc / 15)
    a = (sin(degToRad(ishaTwilight)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))    
    if abs(a) > 1  : ' le soleil ne se lève pas
       FajrTime = -1 : sunRiseTime = -1
       asrTime  = -1 : maghribTime = -1 : ishaTime = -1
       exit_sub
    end_if
    Esha_Arc = radToDeg(acos((sin(degToRad(ishaTwilight)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))))      
' Isha Time
    ishaTime = zuhrTime + (Esha_Arc / 15)
' Fajr Time
    a = (sin(degToRad(fajrTwilight)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))
    if abs(a) > 1  
       FajrTime = -1 : sunRiseTime = -1
       asrTime  = -1 : maghribTime = -1 : ishaTime = -1
       exit_sub
    end_if
    Fajr_Arc = radToDeg(acos((sin(degToRad(fajrTwilight)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))))
    fajrTime = zuhrTime - (Fajr_Arc / 15)
                        
END_SUB
rem ============================================================================
SUB Aide()
    dim_local t$
    t$ = "Aide sur le programme" + chr$(13)
    t$ = t$ + "Au lancement du programme, il affiche les résultat du calcul pour la ville de Moknine (Tunisie) pour le mois en cours" + chr$(13)
    t$ = t$ + "et propose comme méthode de calcul (dans le COMBO Méthode) celle appliquée en Tunisie (Tunisian Ministry of Religious)" + chr$(13)
    t$ = t$ + "Pour les autres pays, vous pouvez opter pour l'une des métodes proposées dans le COMBO, surtout si votre ville se situe aux" + chr$(13)
    t$ = t$ + "altitudes supérieures à 45°"+chr$(13)
    t$ = t$ + "Il propose un choix parmi 8 pays qui vous permettent d'en choisir une ville parmi celles qui sont proposées." + chr$(13)
    t$ = t$ + "Si votre ville ne s'y trouve pas, vous avez la possibilité d'entrer manuellement ses coordonnées (Latitude, Longitude, Fuseau, DST)" + chr$(13)
    t$ = t$ + "Vous pouvez aussi l'ajouter dans le code dans les lignes DATA." + chr$(13)
    t$ = t$ + "En optant pour l'un des pays proposé, vous activez un COMBO vous permettant de choisir une ville." + chr$(13)
    t$ = t$ + "Le COMBO DST c'est pour le choix de l'heure d'été (valeurs possibles : 0 pas de passage; 1 passage à l'heure d'été." + chr$(13)
    t$ = t$ + "Les boutons 'main' indiquant la gauche c'est pour le mois précédent, tandis que celle qui indique la droite c'est pour le mois suivant." + chr$(13)
    t$ = t$ + chr$(13)    
    t$ = t$ + "Après chaque modification et pour lancer un nouveau calcul,cliquez sur le bouton 'Calculer' (La Palice ne peut pas dire mieux !)" + chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "Note :" + chr$(13)
    t$ = t$ + "L’horaire de la prière de Ichaa correspond à la disparition du crépuscule (12° à 18°) après le coucher du Soleil." + chr$(13)
    t$ = t$ + "L'Arabie Séoudite, par exemple ajoute 90 mn à l'heure du Maghrib pour obtenir celle du Icha"+ chr$(13)
    t$ = t$ + " et ajoute 120 mn pour le mois de Ramadan."+ chr$(13)
    t$ = t$ + chr$(13) + chr$(13)
    t$ = t$ + "Le programme est fourni comme tel sans aucune garantie des résultats."+chr$(13)
    t$ = t$ + "En aucun cas je ne serais responsable de dommages résultants de l'utilisation de cette application."
    
    message t$
END_SUB
rem ============================================================================
SUB Culture()
    dim_local t$
    t$ = "Méthode de calcul des horaires de prières" + chr$(13)
    t$ = t$ + "Les prières (pour les Musulmans) sont au nombre de cinq par journée." + chr$(13)
    t$ = t$ + "Les horaires de ces cinq prières varient d'un endroit (ville) à l'autre et d'un jour à l'autre." + chr$(13)
    t$ = t$ + "Le calcul fait intervenir les heures du crépuscule, mais lequel ?" + chr$(13)
    t$ = t$ + "Il existe trois types de crépuscules : " + chr$(13)
    t$ = t$ + "Le crépuscule astronomique : il intervient lorsque le soleil se situe "
    t$ = t$ + "en dessous de l’horizon à une hauteur de 18°, et il correspond au moment" + chr$(13)
    t$ = t$ + "où l’obscurité totale s’installe au niveau de cet horizon." + chr$(13)
    t$ = t$ + "Le crépuscule nautique : il intervient lorsque le soleil se situe en dessous de l’horizon à une hauteur de 12°." + chr$(13)
    t$ = t$ + "Le crépuscule civil : il intervient lorsque le soleil se situe en dessous de l’horizon à une hauteur de 06°." + chr$(13)
    t$ = t$ + "Or, il s’est avéré que le fait de se baser sur le crépuscule astronomique (18°) pour le calcul des heures de prière "
    t$ = t$ + "pose des difficultés pour les pays d’Europe." + chr$(13)
    t$ = t$ + "Il est impossible de calculer les horaires de la prière du Fajr à partir du 18° et ce à partir de la mi-mai jusqu’à la mi-juin environ."+chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "L’écart entre le Fajr et celui du lever du soleil (Chourouk) se creuse pour atteindre un record de 3h40 min en période d’été." + chr$(13)
    t$ = t$ + "L’écart entre la prière de Ichaa et celle du Fajr se réduit durant des semaines en période d’été." + chr$(13)
    t$ = t$ + "A titre d’exemple : le 28 mai à Paris en se basant sur le 18°, la prière de Ichaa est à 00h18 et la prière du Fajr est à 02h59 !" + chr$(13)
    t$ = t$ + "Soit un écart de 2h41mn."+chr$(13)
    t$ = t$ + "Par contre, retenir le critère du 12° (le crépuscule nautique) permet de surmonter ces difficultés." + chr$(13)
    t$ = t$ + "D’une part, l’écart entre la prière du Fajr et celle du lever du soleil (Chourouk) n’excède jamais 02 heures durant toute l’année."+chr$(13)
    t$ = t$ + "D’autre part, l’écart entre la prière du Ichaa et celle du Fajr reste constamment importante."+chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "Le fait d'opter pour ce critère du 12° permet d’alléger la contrainte sur les musulmans vivant en Europe pour cette pratique cultuelle " + chr$(13)
    t$ = t$ + "et surtout durant le mois de Ramadan et spécialement en période d’été." + chr$(13)
    t$ = t$ + "L’avantage de ce choix réside dans la possibilité de l’utiliser durant toute l’année, à l’inverse de celui du 18°." + chr$(13)
    t$ = t$ + "Certains pays ajoutent 5 minutes en plus par précaution pour les horaires de Dhohr et du Maghrib" + chr$(13)
    t$ = t$ + "L’horaire du Asr est calculé selon la règle islamique où l’ombre de chaque objet devient égale à celui-ci." + chr$(13)
    t$ = t$ + "Mais certains pays utilisent d'autres critères, ce qui ne facilite pas la tâche !" + chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "En résumé : " + chr$(13)
    t$ = t$ + "* Prière de l'aube (matin) (Fajr) : Le début coïncide avec la fin du délai de d'Isha, soit lorsque le soleil remonte à 19 ° sous l'horizon." + chr$(13)
    t$ = t$ + "  La fin est atteinte au lever du soleil avec le limbe supérieur du soleil tangent à l'horizon soit h = - 0,267°"+ chr$(13)
    t$ = t$ + "* Prière de la mi-journée (midi) (Dhur) : la durée permise commence quand le soleil a traversé le méridien (soit quand l'ombre d'un objet a commencé à "
    t$ = t$ + "  augmenter) et se termine lorsque l'ombre d'un gnomon s'est allongée d'un quart de sa hauteur par rapport à son ombre à midi." + chr$(13)
    t$ = t$ + "* Prière de l'après-midi ('Asr) : l'intervalle commence lorsque l'augmentation de l'ombre est égale à la longueur du gnomon et se termine quand l'ombre en a atteint le double." + chr$(13)
    t$ = t$ + "* Prière du coucher de soleil (Maghrib) : Le début coïncide avec la disparition totale du soleil sous l'horizon , soit pour h = -0.267°."+chr$(13)
    t$ = t$ + "  La fin du délai est atteinte à la dernière lueur du crépuscule, soit le soleil à 18° sous l'horizon."+chr$(13)
    t$ = t$ + "  Attention, cette condition peut être irréalisable à certaines dates pour certaines latitudes." + chr$(13)
    t$ = t$ + "* Prière de la nuit ('Isha) : Le début coïncide avec la fin du délai de Maghrib, soit le soleil à 17° sous l'horizon." + chr$(13)
    t$ = t$ + "  La fin du délai est atteinte avec l'apparition de l'aube lorsque le soleil remonte à 19° sous l'horizon." + chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "Note :" + chr$(13)
    t$ = t$ + "Les opinions divergent sur les angles à utiliser pour le calcul de Fajr et Isha." +chr$(13)
    t$ = t$ + "La mosquée de Paris retient 15° pour Fajr et 18° pour Isha." + chr$(13) + chr$(13)  
    t$ = t$ + chr$(13)
    t$ = t$ + "Pour des plus amples informations sur le calcul des horaires de prière, référez-vous à : " + chr$(13)
    t$ = t$ + "http://www.averroes-aveyron.fr/medias/files/methodes-de-calcul.pdf" + chr$(13)    
    message t$
END_SUB
rem ============================================================================
' Liste des pays : nom du pays, fuseau horaire du pays et flag pour heure d'été (1 oui, 0 non)
data "Algérie" ,1,0 , "Belgique",1,1 ,"Egypt",2,0 , "France",1,1, "Lybie",2,0
data "Maroc",0 , 0, "Arabie Séoudite",3,0 ,"Tunise",1,0
' ------------------------------------------------------------------------------
data "Algérie"  : ' UTC + 1 ; DST 0
' -----------
1:
'     Ville             Latitude   Longitude
data "Adrar" ,          27.850,    -0.317  
data "Alger" ,          36.833,     3.000
data "Annaba" ,         36.917,     7.783  
data "Batna" ,          35.567,     6.167    
data "Bechar" ,         31.583,    -2.283
data "Bejaia" ,         36.817,     5.050  
data "Biskra" ,         34.833,     5.683  
data "Blida" ,          36.500,     2.833  
data "Boussaada" ,      35.167,     4.150  
data "Constantine" ,    36.367,     6.667  
data "El Asnam" ,       36.183,     1.350    
data "El Djelfa" ,      34.717,     3.233  
data "Ghardaia" ,       32.333,     3.667
data "Laghouat" ,       33.817,     2.917
data "Mostaganem" ,     35.900,     0.083  
data "M'Sila" ,         35.667,     4.517
data "Oran" ,           35.750,    -0.633
data "Ouargla" ,        32.000,     5.267
data "Setif" ,          36.183,     5.400  
data "Sidi-bel-Abbes" , 35.250,    -0.650
data "Skikda" ,         36.883,     6.900  
data "Tamanrasset" ,    22.833,     5.467
data "Tebessa" ,        35.350,     8.100  
data "Tiaret" ,         35.333,     1.333
data "Tilimsen" ,       34.883,    -1.350      
data "Tizi-Ouzou" ,     36.733,     4.083  
data "FIN"  
' ------------------------------------------------------------------------------
data "Belgique" : ' UTC + 1  UTC + 2 Heure d'été
' -----------
2:
'     Ville             Latitude   Longitude
data "Antwerp" ,        51.217,   4.417  
data "Brussels" ,       50.850,   4.350  
data "Charleroi" ,      50.417,   4.450
data "Gent" ,           51.033,   3.700
data "Liege" ,          50.633,   5.583  
data "Ostende" ,        51.217,   2.917    
data "Mons" ,           50.467,   3.967      
data "Namur" ,          50.467,   4.867
data "FIN"
' ------------------------------------------------------------------------------
data "Egypt"  : ' UTC + 2
' -------------------------------------
3:
'     Ville             Latitude   Longitude
data "Abou Simbel" ,    22.317,   31.633  
data "Alexandria" ,     31.217,   29.917
data "Aswan" ,          24.083,   32.933
data "Asyut" ,          27.233,   31.117
data "Beni-Souef" ,     29.083,   31.083  
data "Cairo" ,          30.050,   31.250
data "Damanhur" ,       31.050,   30.467
data "Dumyat" ,         31.433,   31.800
data "El Alamein" ,     30.833,   28.950
data "Helwan" ,         29.850,   31.333
data "Isma'ilia" ,      30.600,   32.250  
data "Karnak" ,         25.683,   32.667  
data "Port Said" ,      31.283,   32.300    
data "Sohag" ,          26.550,   31.700
data "Suez" ,           29.983,   32.550
data "Tanta" ,          30.800,   31.000  
data "Zagazig" ,        30.583,   31.500  
data "FIN"
' -------------------------------------------------------------------------------
data "France" : ' UTC + 1  UTC + 2 Heure d'été
' ----------
4:
'     Ville             Latitude   Longitude
data "Brest" ,          48.383,   -4.500  
data "Quimper" ,        48.000,   -4.100  
data "Lorient" ,        47.750,   -3.350  
data "St-Brieuc" ,      48.517,   -2.750  
data "Vannes" ,         47.667,   -2.733    
data "St Nazaire" ,     47.283,   -2.200  
data "Rennes" ,         48.100,   -1.667  
data "Cherbourg" ,      49.633,   -1.617  
data "Nantes" ,         47.233,   -1.583  
data "La-Roche-sur-Yon" , 46.633, -1.500
data "Bayonne" ,        43.500,   -1.467
data "La Rochelle" ,    46.167,   -1.167  
data "St-Lo" ,          49.117,   -1.083  
data "Laval" ,          48.067,   -0.750    
data "Bordeaux" ,       44.833,   -0.567  
data "Angers" ,         47.483,   -0.533  
data "Mont-de-Marsan" , 43.900,   -0.500  
data "Niort" ,          46.317,   -0.450  
data "Pau" ,            43.300,   -0.367  
data "Caen" ,           49.183,   -0.367
data "Alençon" ,        48.417,    0.083  
data "Tarbes" ,         43.233,    0.083  
data "Le Havre" ,       49.500,    0.100  
data "Angouleme" ,      45.667,    0.167  
data "Le Mans" ,        48.000,    0.200    
data "Poitiers" ,       46.583,    0.333  
data "Cahors" ,         44.467,    0.433  
data "Auch" ,           43.500,    0.600  
data "Agen" ,           44.200,    0.633  
data "Tours" ,          47.383,    0.700  
data "Perigueux" ,      45.200,    0.733    
data "Dieppe" ,         49.917,    1.083    
data "Rouen" ,          49.433,    1.083  
data "Evreux" ,         49.050,    1.183    
data "Limoges" ,        45.833,    1.250    
data "Montauban" ,      44.017,    1.333  
data "Blois" ,          47.600,    1.333  
data "Toulouse" ,       43.617,    1.450    
data "Chartres" ,       48.450,    1.500    
data "Foix" ,           42.950,    1.583  
data "Chateauroux" ,    46.817,    1.683    
data "Tulle" ,          45.267,    1.767    
data "Abbeville" ,      50.100,    1.850    
data "Gueret" ,         46.167,    1.866  
data "Orleans" ,        47.900,    1.900  
data "Vierzon" ,        47.233,    2.050  
data "Pontoise" ,       49.050,    2.083  
data "Beauvais" ,       49.433,    2.083  
data "Versailles" ,     48.800,    2.133  
data "Albi" ,           43.933,    2.144    
data "Nanterre" ,       48.883,    2.217    
data "Amiens" ,         49.900,    2.300  
data "Paris" ,          48.833,    2.333    
data "Bourges" ,        47.083,    2.383    
data "Carcassonne" ,    43.217,    2.350  
data "Dunkerque" ,      51.033,    2.383  
data "Aurillac" ,       44.933,    2.433    
data "Bobigny" ,        48.917,    2.450  
data "Créteil" ,        48.783,    2.467    
data "Melun" ,          48.533,    2.557
data "Evry" ,           48.633,    2.567    
data "Rodez" ,          44.350,    2.567  
data "Montlucon" ,      46.333,    2.600    
data "Arras" ,          50.283,    2.767    
data "Lens" ,           50.433,    2.833  
data "Perpignan" ,      42.700,    2.900  
data "Lille" ,          50.650,    3.083  
data "Clermont-Ferrand",45.783,    3.083      
data "Nevers" ,         47.000,    3.150    
data "Moulins" ,        46.567,    3.333  
data "Mende" ,          44.533,    3.500    
data "Auxerre" ,        47.800,    3.583    
data "Laon" ,           49.567,    3.617    
data "Montpellier" ,    43.600,    3.883      
data "Le Puy" ,         45.050,    3.883    
data "Avallon" ,        47.500,    3.900  
data "Reims" ,          49.250,    4.033  
data "Troyes" ,         48.300,    4.083    
data "Roanne" ,         46.033,    4.083    
data "Nimes" ,          43.500,    4.350    
data "Chalons-S-Marne", 48.967,    4.367    
data "St-Etienne" ,     45.433,    4.383    
data "Privas" ,         44.733,    4.600    
data "Mezières" ,       49.767,    4.733    
data "Avignon" ,        43.933,    4.800    
data "Lyon" ,           45.767,    4.833      
data "Macon" ,          45.300,    4.833    
data "Valence" ,        44.933,    4.900    
data "Dijon" ,          47.333,    5.033    
data "Chaumont" ,       48.117,    5.133    
data "Bar-le-Duc" ,     48.767,    5.167    
data "Bourg" ,          46.200,    5.217
data "Observatoire SIRENE" , 44.000, 5.333  
data "Marseille " ,     43.300,    5.367  
data "Lons-le-Saunier", 46.683,    5.550  
data "Grenoble" ,       45.183,    5.717    
data "Toulon" ,         43.117,    5.917  
data "Chambéry" ,       45.567,    5.917    
data "Besancon" ,       47.250,    5.983    
data "Gap" ,            44.550,    6.083  
data "Annecy" ,         45.900,    6.117  
data "Metz" ,           49.117,    6.183  
data "Vesoul" ,         47.633,    6.150    
data "Nancy" ,          48.700,    6.200  
data "Digne" ,          44.083,    6.233  
data "Epinal" ,         48.167,    6.467  
data "Belfort" ,        47.633,    6.867    
data "Cannes" ,         43.550,    7.000    
data "Nice" ,           43.700,    7.267    
data "Colmar" ,         48.083,    7.350  
data "Mulhouse" ,       47.750,    7.350    
data "Strasbourg" ,     48.583,    7.750  
data "Ajaccio" ,        41.917,    8.717    
data "Bastia" ,         42.683,    9.433
data "FIN"
' ------------------------------------------------------------------------------
data "Libye"  :' UTC + 2
' ---------
5:
'     Ville             Latitude   Longitude
data "Sabratah" ,       32.833,    12.400  
data "Tripoli" ,        32.967,    13.200  
data "Al Khums" ,       32.650,    14.250  
data "Sabhah" ,         27.050,    14.433    
data "Benghazi" ,       32.117,    20.083  
data "Ajdabiyah" ,      30.800,    20.250    
data "Al Marj" ,        32.500,    20.833                
data "Darnah" ,         32.767,    22.650    
data "Tubruq" ,         32.100,    23.933  
data "FIN"
' ------------------------------------------------------------------------------

data "Moroc" : ' UTC + 0
' ---------
6:
'     Ville             Latitude   Longitude
data "Agadir" ,         30.500,   -9.667    
data "Safi" ,           32.300,   -9.333    
data "El Jadida" ,      33.183,   -8.283    
data "Marrakech" ,      31.817,   -8.000  
data "Settat" ,         33.067,   -7.617    
data "Casablanca" ,     33.650,   -7.583    
data "Mohammedia" ,     33.717,   -7.333    
data "Khouribga" ,      32.900,   -6.950  
data "Sale" ,           34.067,   -6.833    
data "Kenitra" ,        34.333,   -6.567    
data "Beni Mellal" ,    32.367,   -6.483  
data "Khemisset" ,      33.833,   -6.050    
data "Ksar el Kebir" ,  35.067,   -5.933    
data "Tanger" ,         35.800,   -5.833    
data "Meknes" ,         33.883,   -5.617    
data "Tetouan" ,        35.567,   -5.367    
data "Ceuta" ,          35.883,   -5.317    
data "Fes" ,            34.083,   -5.000    
data "Taza" ,           34.267,   -4.017    
data "Nador" ,          35.167,   -3.000    
data "Oujda" ,          34.683,   -1.750  
data "FIN"
' ------------------------------------------------------------------------------
rem ============================================================================
data "Arabie Séoudite" : ' UTC + 3
' ----------------
7:
'     Ville             Latitude   Longitude
data "Riyadh" ,         24.650,    46.767  
data "Al Wajh" ,        26.267,    36.467    
data "Tabuk" ,          28.367,    36.533    
data "Yanbu'Al Bahr" ,  24.117,    38.067  
data "Tayma" ,          27.617,    38.500  
data "Jiddah" ,         21.500,    39.167    
data "Khaybar" ,        25.800,    39.200    
data "Medina" ,         24.500,    39.583  
data "Mecca" ,          21.433,    39.817  
data "Al Jawf" ,        29.783,    39.867    
data "Al Lith" ,        20.167,    40.267  
data "At Ta'if" ,       21.250,    40.350    
data "Badanah" ,        31.000,    41.083    
data "Al Qunfidhah" ,   19.150,    41.117    
data "Turabah" ,        21.250,    41.567  
data "Ha'il" ,          27.517,    41.750  
data "bha" ,            18.233,    42.517  
data "Jizan" ,          16.933,    42.550    
data "Buraydah" ,       26.333,    43.983    
data "Najran" ,         17.517,    44.317    
data "Shaqra" ,         25.300,    45.250    
data "Al Artawiyak" ,   26.517,    45.350    
data "Ad Dilam" ,       23.983,    47.100    
data "Haradh" ,         24.200,    49.117    
data "Al Hufuf" ,       25.333,    49.567    
data "Ad Dammam" ,      26.417,    50.100    
data "Al Khurmah" ,     21.917,    42.033
data "FIN"  
' ------------------------------------------------------------------------------
Data "Tunisie" : ' UTC + 1
' -----------
8:
'     Ville             Latitude   Longitude
data "Gafsa" ,          34.467,     8.717  
data "Beja" ,           36.717,     9.217  
data "Bizerte" ,        37.300,     9.867    
data "Kairouan" ,       35.700,     10.017  
data "Gabes" ,          33.867,     10.100  
data "Tunis" ,          36.833,     10.217  
data "Sousse" ,         35.833,     10.633    
data "Sfax" ,           34.750,     10.717  
data "Nabeul" ,         36.500,     10.733
data "Moknine" ,        35.633,     10.833
data "Monastir",        35.777,     10.826
data "Mahdia" ,         35.502,     11.045
data "Jendouba" ,       35.501,     08.783
data "Le Kef" ,         36.179,     08.714
data "Siliana" ,        35.990,     09.278
data "Ariana" ,         36.862,     10.195
data "Ben Arous" ,      36.743,     10.232
data "Kasserine" ,      35.171,     08.828
data "Kebili" ,         33.124,     08.836
data "La Manouba" ,     36.807,     10.101
data "Medenine" ,       33.348,     10.494
data "Sidi Bouzid" ,    35.033,     09.5
data "Tataouine" ,      32.921,     10.450
data "Zaghouan" ,       36.399,     10.147
data "La Soukra" ,      36.883,     10.25
data "La Marsa" ,       36.876,     10.325

data "FIN"  
rem ============================================================================
rem &&&&&&&&&&&&&&&&&&&&&&  FIN DU CODE  &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
rem ============================================================================

Je pense avoir suffisamment blindé mon code contre M. Bourrin, mais sait-on jamais ?
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyLun 29 Avr 2019 - 6:59

Bonjour Papydall,

Je viens de tester ton programme. Bravo pour cette réalisation. Wink

Je suis surpris du nombre de 'méthodes' que tu as relevé.
Il est vrai qu'entre les calculs à 12, 15 ou 18 degrés cela laisse des possibilités de calculs différents !
Et cela en plus en fonction de chaque prières...

Un grand merci pour ce code que je vais prendre le temps de décoder.
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyLun 29 Avr 2019 - 18:55

Salut Tout le monde.
Merci Minibug pour ton intérêt à mon programme.
Comme tu as du le constater, les choses ne sont pas si simples avec toutes ces divergences et points de vue sur le calcul des horaires du Salat.
Il y a aussi un autre sujet (l’heure du ASR) qui divise les écoles islamiques en deux positions dogmatiques.
En effet les trois écoles juridiques Malikite,  Hambalite et Shafiite   soutiennent que le Asr commence lorsque la taille d’un objet vertical est la taille de son ombre. Cette méthode est celle adoptée généralement dans les communautés du Maghreb (d’obédience Malikite).
La quatrième école Hanafite  estime que le Asr commence lorsque l’ombre d’un objet vertical est le double de la taille de cet objet. Cette nette différence dogmatique entraîne des écarts dans les horaires de salat sur les calendriers correspondant à un même endroit.

J’ai apporté les modifications nécessaires au code pour tenir compte (selon le choix de l’utilisateur) de ces  doctrines religieuses (Madh-hab : Shafii, Maliki, Hanbali ou Hanafi).


Code:

rem ============================================================================
rem                        CalcPrayerTimes.bas
rem                Calculateur des heures de prière par Papydall
rem                  Dernière modification : 30 Avril 2019
rem ============================================================================

Init()
Gui()
Grille(NbJours(month,year))
Run()

end
rem ============================================================================
SUB Init()
    label clic, change
    label 1, 2, 3, 4, 5, 6, 7, 8 : ' pour restore_label
    dim year, month, day
    dim longitude, latitude, timeZone
    dim fajrTwilight, ishaTwilight
    dim fajrTime, sunRiseTime, zuhrTime, asrTime, maghribTime, ishaTime
    dim d, l, m, lambda, obliquity, alfa, st, dec, durinal_Arc, noon, Ut_Noon
    dim Asr_Alt, Asr_Arc, Esha_Arc, Fajr_Arc
    dim prayTime$(5)
    dim hours, minutes ,h$, m$, a, n, dst, methode, p$, ville$, pays$
    dim NbPays : NbPays = 8 : ' 8 c'est le nombre des pays proposés dans le programme
    dim Fuseau(8), H_Ete(8)
    dim standard
    dim nc
    standard = 1 : ' Pour le calcul du Asr : 1 ---> (Shafii, Maliki, Hanbali)
                                          ' 0 ---> Hanafi 
   
    day = date_day : month = date_month : year = date_year : ' La date courante
   
END_SUB
rem ============================================================================
SUB GUI()
    dim_local i,t$
    t$ = " Calculateur des heures de prière par Papydall "
    color 0,240,255,255
    width 0,1100 : height 0,800 : top 0,(screen_y - height(0)) / 2
    left 0,(screen_x - width(0))/2
    shape 5 : top 5,5 : left 5,450 : width 5,600 : height 5,50
    shape_rectangle_rounded 5 : color 5,25,100,50
    shape 6 : top 6,5 : left 6,20 : width 6,420 : height 6,50
    shape_rectangle_rounded 6 : color 6,25,100,50
    alpha 10 : top 10,20 : left 10,40 : font_color 10,250,100,50
      font_bold 10      : font_name 10,"tahoma" : font_size 10,12
      caption 10,t$    : caption 0,t$ : application_title t$
    alpha 20 : top 20,80 : left 20,010  : caption 20,"Latitude : "
    edit  21 : top 21,80 : left 21,070  : width 21,60 : font_bold 21 : text 21,"35.6333"
      hint 21,"En degrés décimaux (± 90°) positive au Nord" : on_change 21,change
    alpha 30 : top 30,80 : left 30,140  : caption 30,"Longitude : "
    edit  31 : top 31,80 : left 31,210  : width 31,60 : font_bold 31 : text 31,"10.9"
      hint 31,"En degrés décimaux (± 180°) positive à l'est" : on_change 31,change
    alpha 40 : top 40,80 : left 40,285  : caption 40,"Fuseau :"
    spin 41  : top 41,80 : left 41,335  : width 41,60 : min 41,-12 : max 41,12 : font_bold 41
      hint 41,"ZoneTime, décalage heure : Valeurs possibles ± 12" : position 41,1
      on_change 41,change
    alpha 45 : top 45,80 : left 45,420  : caption 45,"DST :" : font_bold 45 : font_name 45,"tahoma"
    combo 46 : top 46,80 : left 46,450  : width 46,50 : hint 46,"Heure d'été"
    on_change 46,change
    alpha 50 : top 50,80 : left 50,520  : caption 50,"Méthode :" 
    combo 51 : top 51,80 : left 51,580  : width 51,480 : font_bold 51  : height 51,40
    font_name 51,"tahoma" : on_change 51,change
    hint 51,"convention de calcul utilisé"   
    alpha 55 :  top 55,130 : left 55,10 : font_bold 55 : font_name 55,"tahoma"
    caption 55,"Calcul Asr :"
    combo 56 : top 56,130 : left 56,80 : font_bold 56 : font_name 56,"tahoma"
    width 56,220 : hint 56,"Doctrines religieuses" :  on_change 56,change
    item_add 56,"Standard (Shafii, Maliki, Hanbali)"
    item_add 56,"Hanafi" : item_select 56,1   
    button 60 : top 60,20 : left 60,950 : caption 60,"Quitter"
    on_click 60,clic
    button 70 : top 70,20 : left 70,470  : caption 70,"Calculer"
    on_click 70,clic   
    button 80 : top 80,120 : left 80,500 : font_bold 80 : font_name 80,"wingdings 2"
    font_size 80,30 : caption 80,"D" : hint 80,"Mois précédent" : on_click 80,clic
    button 90 : top 90,120 : left 90,760 : font_bold 90 : font_name 90,"wingdings 2"
    font_size 90,30 : caption 90,"E" : hint 90,"Mois suivant" : on_click 90,clic
    alpha 100: top 100,130 : left 100,630 : font_bold 100 : font_name 100,"arial"
    font_size 100,12 : caption 100,Month_Name$(month)  + "  " + str$(year)
    item_add 46,0 : item_add 46,1 : item_select 46,1 
    for i = 1 to 17 : read t$ : item_add 51,t$ : next i
    item_select 51,14         
    for i = 20 to 70 step 10 : font_bold i : font_name i,"tahoma" : next i 
    alpha 110 : top 110,180 : left 110,10 : font_bold 110 : font_size 110,12
    font_name 110,"tahoma" : font_color 110, 255,0,0 : caption 110,"Pays : Tunisie"
    alpha 120 : top 120,180 : left 120,200 : font_bold 120 : font_size 120,12
    font_name 120,"tahoma" : font_color 120, 255,0,0 : caption 120,"Ville : Moknine"       
    alpha 130 : top 130,230 : left 130,10 : font_bold 130 : font_name 130,"tahoma"
    font_size 130,12 : font_color 130,0,0,255 : caption 130,"Choix Pays / Villes"   
    alpha 140 : top 140,260 : left 140,60 : font_bold 140 : font_name 140,"Wingdings"
    font_size 140,30 : caption 140,"ê"   
    button 150 : top 150,20 : left 150,600 : font_bold 150 : caption 150,"Aide" : on_click 150,clic
    button 160 : top 160,20 : left 160,740 : font_bold 160 : width 160,150
    caption 160,"Pour votre culture" : on_click 160,clic
    container_option 200 : top 200,300 : left 200,10 : width 200,130 : height 200,35*NbPays +10
    color 200,255,255,0       
    for i = 1 to NbPays
        option 200+i  : parent 200+i,200 : top 200+i,30*i : left 200+i,10
        font_bold 200+i : font_name 200+i,"tahoma" : on_click 200+i,clic     
        read p$ : caption 200+i,p$
        read fuseau(i) : read H_Ete(i)     
    next i 
    combo 300 : top 300,300 : left 300,160
    font_bold 300 : width 300,300 : hide 300 : on_change 300,change       
END_SUB
rem ============================================================================
' Tracer une grille en fonction du nombre des jours dans le mois en cours
SUB Grille(n)
    grid 1 : top 1,180 : left 1,500 : width 1,342 : height 1,n*18-8 : grid_row 1,n+1   
    grid_row_fixed 1,1 : grid_row_height 1,16
    grid_column 1,7    : grid_column_fixed 1,1 : grid_column_width 1,50 : font_bold 1
    grid_fixed_color 1,255,255,0 : grid_one_column_width 1,1,30   
    color 1,0,255,255   
    grid_write 1,1,1,"Jour"
    grid_write 1,1,2," Farjr"
    grid_write 1,1,3,"Sunrise"
    grid_write 1,1,4," Dhuhr"
    grid_write 1,1,5,"  Asr"
    grid_write 1,1,6,"Maghrib"
    grid_write 1,1,7,"  Isha"
END_SUB
rem ============================================================================
SUB Run()
    dim_local nb
    nb = NbJours(month,year) 
    for n = 1 to Nb : Go(n) : Affiche(n) : next n
END_SUB
rem ============================================================================
Change: 
    active 70
    for nc = 21 to 41 step 10 : off_change nc : next nc
    for nc = 46 to 56 step 10 : off_change nc : next nc
    off_change 300
    select number_change
        case 21  : if text$(21) = "" then text 21,0
        case 31  : if text$(31) = "" then text 31,0
        case 41  : if text$(41) = "" then text 41,0
                  if abs(val(text$(41))) > 12 then text 41,0
        case 46  : if (text$(46) <> "0") or (text$(46) <> "1") then text 46,0
        case 56  : if item_index(56) = 1 then standard = 1 : else : standard = 0
                  for n = 1 to NbJours(month,year)
                      Go(n) : Affiche(n)  : ' Calculer
                  next n
             
        case 300 : New_Coord()             
    end_select
    for nc = 21 to 41 step 10 : on_change nc,change : next nc
    for nc = 46 to 56 step 10 : on_change nc,change : next nc
    on_change 300,change
return
rem ============================================================================
' Gestion des clics de l'utilisateur
Clic:
    for nc = 60 to 90 step 10 : off_click nc : next nc
    for nc = 150 to 160 step 10 : off_click nc : next nc
    for nc = 201 to 208 : off_click nc : next nc
    if number_click > 200 then caption 140,"ê î"       
    select number_click
        case 060 : if message_confirmation_yes_no("Vous voulez vraiment quitter ?") = 1 then terminate
        case 070 : for n = 1 to NbJours(month,year)
                      Go(n) : Affiche(n)  : ' Calculer
                  next n
        case 080 : Mois_Precedant()
        case 090 : Mois_Suivant()
        case 150 : Aide()
        case 160 : Culture()     
        case 201 : restore_label 1 : pays$ = "Algérie"  : List_Ville(number_click-200)
        case 202 : restore_label 2 : pays$ = "Belgique" : List_Ville(number_click-200)
        case 203 : restore_label 3 : pays$ = "Egypte"    : List_Ville(number_click-200)
        case 204 : restore_label 4 : pays$ = "France"  : List_Ville(number_click-200)
        case 205 : restore_label 5 : pays$ = "Lybie"    : List_Ville(number_click-200)
        case 206 : restore_label 6 : pays$ = "Maroc"    : List_Ville(number_click-200)
        case 207 : restore_label 7 : pays$ = "Arabie"  : List_Ville(number_click-200)
        case 208 : restore_label 8 : pays$ = "Tunisie"  : List_Ville(number_click-200)
    end_select
    for nc = 60 to 90 step 10 : on_click nc,clic : next nc
    for nc = 150 to 160 step 10 : on_click nc,clic : next nc
    for nc = 201 to 208 : on_click nc,clic : next nc   
return
rem ============================================================================
SUB Go(day)
    calcPrayerTimes(day,month,year,fajrTwilight,ishaTwilight)
    NumberToHrMin(fajrTime)    : prayTime$(0) = h$ + ":" + m$
    NumberToHrMin(SunRiseTime) : prayTime$(1) = h$ + ":" + m$
    NumberToHrMin(zuhrTime)    : prayTime$(2) = h$ + ":" + m$
    NumberToHrMin(AsrTime)    : prayTime$(3) = h$ + ":" + m$
    NumberToHrMin(MaghribTime) : prayTime$(4) = h$ + ":" + m$   
    if (item_index(51) = 15) or (item_index(51) = 16)
      NumberToHrMin(MaghribTime + 1.5)
      prayTime$(5) = h$ + ":" + m$
    else   
      NumberToHrMin(IshaTime)    : prayTime$(5) = h$ + ":" + m$
    end_if   
END_SUB
rem ============================================================================
SUB New_Coord()
    dim_local t$,t1$,p
    t$ = item_read$(300,item_index(300))
    p = instr(t$,":")
    ville$ = left$(t$,p-1)
    t$ = mid$(t$,p+1,20)
    p = instr(t$,"/")
    t1$ = mid$(t$,p+1,20)
    t$ = left$(t$,p-1)
    text 21,t$ : text 31,t1$ 
    caption 110,"Pays : " + pays$
    caption 120,"Ville : " + ville$
    grid_clear 1,NbJours(month,year)+1 ,7
END_SUB
rem ============================================================================
SUB List_Ville(p)
    clear 300
    position 41,fuseau(p)
    item_select 46,H_Ete(p) + 1
    read ville$
    while ville$ <> "FIN"
        ville$ = ville$ + " : "
        read latitude : read longitude
        item_add 300,ville$  + str$(latitude) + " / " + str$(longitude)
        read ville$
    end_while
    item_select 300,1 
    sort_on 300 : show 300 
    inactive 70     
END_SUB
rem ============================================================================
' convertir Degree en Radian
FNC degToRad(degree)
    result ((pi / 180) * degree)
END_FNC
rem ============================================================================
' convertir Radian en Degree
FNC radToDeg(radian)
    result (radian * (180/pi))
END_FNC
rem ============================================================================
' Ramener la valeur de value entre 0 et 360
FNC moreLess360(value)
    while (value > 360) or (value < 0)
        if value > 360
          value = value - 360
        else
          if value < 0
              value = value + 360
          end_if
        end_if
    end_while
    result value             
END_FNC
rem ============================================================================
' Ramener la valeur de value entre 0 et 24
FNC moreLess24(value)
    while (value > 24) or (value < 0)
        if value > 24
          value = value - 24
        else
          if value < 0
              value = value + 24
          end_if
        end_if
    end_while
    result value
END_FNC
rem ============================================================================
' convertir le nombre  number en heurs et Minutes
SUB NumberToHrMin(number)
    if number = -1 then h$ = "--" : m$ = "--" : exit_sub
    hours  = int(moreLess24(number))   
    minutes = int(moreLess24(number - hours) * 60)
    h$ = str$(hours) : m$ = str$(minutes)
    if len(h$) < 2 then h$ = "0" + h$
    if len(m$) < 2 then m$ = "0" + m$   
END_SUB
rem ============================================================================
FNC Month_Name$(mois)
    dim_local m$
    select mois
        case 01 : m$ = "Janvier"
        case 02 : m$ = "Février"
        case 03 : m$ = "Mars"
        case 04 : m$ = "Avril"
        case 05 : m$ = "Mai"
        case 06 : m$ = "Juin"
        case 07 : m$ = "Juillet"
        case 08 : m$ = "Août"
        case 09 : m$ = "Septembre"
        case 10 : m$ = "Octobre"
        case 11 : m$ = "Novembre"
        case 12 : m$ = "Décembre"
    end_select
    result m$
END_FNC
rem ============================================================================
' Fonction qui retourne 1 si l'argument (annee) représente une année bisextile
' 0 sinon
FNC Bisextile(annee)
    if (mod(annee,4) = 0) and ((mod(annee,100) <> 0) or (mod(annee,400) = 0))
      result 1
    else
      result 0
    end_if
END_FNC
rem ============================================================================
' Déterminer le nombre de jours dans un mois (mois) pour une année (annee)
FNC NbJours(mois,annee)
    dim_local n
    select mois
        case 01 : n = 31
        case 02 : n = 28 : if bisextile(annee) > 0 then n = n + 1
        case 03 : n = 31
        case 04 : n = 30
        case 05 : n = 31
        case 06 : n = 30
        case 07 : n = 31
        case 08 : n = 31
        case 09 : n = 30
        case 10 : n = 31
        case 11 : n = 30
        case 12 : n = 31       
    end_select
    result n
END_FNC
rem ============================================================================
SUB Mois_Precedant()
    dim_local n,nb
    month = month-1
    if month < 1 then month = 12 : year = year - 1
    caption 100,Month_Name$(month)  + "  " + str$(year)
    nb = NbJours(month,year)
    delete 1 : Grille(nb)
    Run()   
END_SUB
rem ============================================================================
SUB Mois_Suivant()
    dim_local n,nb
    month = month+1
    if month > 12 then month = 1 : year = year + 1
    caption 100,Month_Name$(month)  + "  " + str$(year)
    nb = NbJours(month,year)
    delete 1 : Grille(nb)
    Run()
END_SUB
rem ============================================================================
SUB Affiche(n)
    dim_local i
    grid_write 1,1,1,"Jour"
    grid_write 1,1,2," Farjr"
    grid_write 1,1,3,"Sunrise"
    grid_write 1,1,4," Dhuhr"
    grid_write 1,1,5,"  Asr"
    grid_write 1,1,6,"Maghrib"
    grid_write 1,1,7,"  Isha"
    for i = 1 to n : grid_write 1,i+1,1,str$(i) : next i   
    for i = 0 to 5 : grid_write 1,n+1,i+2,prayTime$(i) : next i       
END_SUB
rem ============================================================================
' Méthodes du calcul selon différentes Ecoles
data "Algerian Minister of Religious Affairs and Wakfs : Fajr: 18.0° - Isha'a: 17.0°"
data "Egyptian General Authority                      : Fajr: 19.5° - Isha'a: 17.5°"
data "Egyptian General Authority (Bis)                : Fajr: 20.0° - Isha'a: 18.0°"
data "France UOIF - Angle 12°                          : Fajr: 12.0° - Isha'a: 12.0°"
data "France - Angle 15°                              : Fajr: 15.0° - Isha'a: 15.0°"
data "France - Angle 18°                              : Fajr: 18.0° - Isha'a: 18.0°"
data "Islamic University, Karachi                      : Fajr: 18.0° - Isha'a: 18.0°"
data "JAKIM (Jabatan Kemajuan Islam Malaysia)          : Fajr: 20.0° - Isha'a: 18.0°"
data "MUIS (Majlis Ugama Islam Singapura              : Fajr: 20.0° - Isha'a: 18.0°"
data "Muslim World League (MWL)                        : Fajr: 18.0° - Isha'a: 17.0°"
data "North America (ISNA)                            : Fajr: 15.0° - Isha'a: 15.0°"
data "Shia Ithna Ashari (Jafari)                      : Fajr: 16.0° - Isha'a: 14.0°"
data "SIHAT/KEMENAG (Kementerian Agama RI)            : Fajr: 20.0° - Isha'a: 18.0°"
data "Tunisian Ministry of Religious Affairs          : Fajr: 18.0° - Isha'a: 18.0°"
data "General Authority of Islamic Affairs And Endowments : Fajr: 19.5° - Isha'a: 90 min"
data "Umm Al-Qura, Makkah                              : Fajr: 18.5° - Isha'a: 90 min"
data "University of Tehran                            : Fajr: 17.7° - Isha'a: 15.0°"
rem ============================================================================
' C'est la procédure qui fait tous les calculs
SUB CalcPrayerTimes(day,month,year,fajrTwilight,ishaTwilight) 
    latitude = val(text$(21)) : longitude = val(text$(31)) : TimeZone = val(text$(41))
    dst = val(text$(46))
    select item_index(51)
        case 01 : FajrTwilight = -18.0 : ishaTwilight = -17.0  : ' Algerian Minister of Religious Affairs and Wakfs
        case 02 : FajrTwilight = -19.5 : ishaTwilight = -17.5  : ' Egyptian General Authority
        case 03 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' Egyptian General Authority (Bis)
        case 04 : FajrTwilight = -12.0 : ishaTwilight = -12.0  : ' France UOIF - Angle 12°     
        case 05 : FajrTwilight = -15.0 : ishaTwilight = -15.0  : ' France - Angle 15°
        case 06 : FajrTwilight = -18.0 : ishaTwilight = -18.0  : ' France - Angle 18°       
        case 07 : FajrTwilight = -18.0 : ishaTwilight = -18.0  : ' Islamic University, Karachi
        case 08 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' JAKIM (Jabatan Kemajuan Islam Malaysia)
        case 09 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' MUIS (Majlis Ugama Islam Singapura
        case 10 : FajrTwilight = -18.0 : ishaTwilight = -17.0  : ' Muslim World League (MWL)
        case 11 : FajrTwilight = -15.0 : ishaTwilight = -15.0  : ' North America (ISNA)
        case 12 : FajrTwilight = -16.0 : ishaTwilight = -14.0  : ' Shia Ithna Ashari (Jafari)
        case 13 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' SIHAT/KEMENAG (Kementerian Agama RI)
        case 14 : FajrTwilight = -18.0 : ishaTwilight = -18.0  : ' Tunisian Ministry of Religious Affairs 
        case 15 : FajrTwilight = -19.5 : ' Isha'a: 90 min      : ' UAE General Authority of Islamic Affairs And Endowments
        case 16 : FajrTwilight = -18.5 : ' Isha'a: 90 min      : ' Umm Al-Qura, Makkah
        case 17 : FajrTwilight = -17.7 : ishaTwilight = -15.0  : ' University of Tehran
    end_select
    D = (367 * year) - ((year + int((month + 9) / 12)) * 7 / 4) + ((int(275 * month / 9)) + day - 730531.5)
    L = 280.461 + 0.9856474 * D : L = moreLess360(L)
    M = 357.528 + (0.9856003) * D : M = moreLess360(M)
    Lambda = L + 1.915 * sin(degToRad(M)) + 0.02 * sin(degToRad(2 * M))
    Lambda = moreLess360(Lambda)   
    Obliquity = 23.439 - 0.0000004 * D   
    Alfa = radToDeg(atn((cos(degToRad(Obliquity)) * tan(degToRad(Lambda)))))
    Alfa = moreLess360(Alfa)
    Alfa = Alfa - (360 * (int(Alfa / 360)))
    Alfa = Alfa + 90 * (int(Lambda / 90) - int(Alfa / 90))   
    ST = 100.46 + 0.985647352 * D
    Dec = radToDeg(asin(sin(degToRad(Obliquity)) * sin(degToRad(Lambda))))
    a = (sin(degToRad(-0.8333)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))
    if abs(a) > 1  : ' le soleil ne se couche pas
      FajrTime = -1 : sunRiseTime = -1
      asrTime  = -1 : maghribTime = -1 : ishaTime = -1
      exit_sub
    end_if   
    Durinal_Arc = radToDeg(acos((sin(degToRad(-0.8333)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude))))) 
    Noon = Alfa - ST
    Noon = moreLess360(Noon)   
    UT_Noon = Noon - longitude
' ------------------------------------------------------------------------------   
' Calculating Prayer Times Arcs & Times
' ------------------------------------------------------------------------------   
' Zuhr Time (Local noon)
    zuhrTime = UT_Noon / 15 + timeZone + dst   
    if standard = 1 : ' Asr Standard (Shafii, Maliki, Hanbali)
      Asr_Alt = radToDeg(atn(1 + tan(degToRad(abs(latitude - Dec)))))
    else            : ' Asr Hanafi     
      Asr_Alt = radToDeg(atn(2 + tan(degToRad(abs(latitude - Dec)))))
    end_if
    a = (sin(degToRad(90 - Asr_Alt)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))
    if abs(a) > 1 
      FajrTime = -1 : sunRiseTime = -1
      asrTime  = -1 : maghribTime = -1 : ishaTime = -1
      exit_sub
    end_if 
    Asr_Arc = radToDeg(acos((sin(degToRad(90 - Asr_Alt)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))))
    Asr_Arc = Asr_Arc / 15
'  Asr Time
    asrTime = zuhrTime + Asr_Arc
' Shorouq Time       
    sunRiseTime = zuhrTime - (Durinal_Arc / 15)
' Maghrib Time
    maghribTime = zuhrTime + (Durinal_Arc / 15)
    a = (sin(degToRad(ishaTwilight)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))   
    if abs(a) > 1  : ' le soleil ne se lève pas
      FajrTime = -1 : sunRiseTime = -1
      asrTime  = -1 : maghribTime = -1 : ishaTime = -1
      exit_sub
    end_if
    Esha_Arc = radToDeg(acos((sin(degToRad(ishaTwilight)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))))     
' Isha Time
    ishaTime = zuhrTime + (Esha_Arc / 15)
' Fajr Time
    a = (sin(degToRad(fajrTwilight)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))
    if abs(a) > 1 
      FajrTime = -1 : sunRiseTime = -1
      asrTime  = -1 : maghribTime = -1 : ishaTime = -1
      exit_sub
    end_if
    Fajr_Arc = radToDeg(acos((sin(degToRad(fajrTwilight)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))))
    fajrTime = zuhrTime - (Fajr_Arc / 15)
                       
END_SUB
rem ============================================================================
SUB Aide()
    dim_local t$
    t$ = "Aide sur le programme" + chr$(13)
    t$ = t$ + "Au lancement du programme, il affiche les résultats du calcul pour la ville de Moknine (Tunisie) pour le mois en cours" + chr$(13)
    t$ = t$ + "et propose comme méthode de calcul (dans le COMBO Méthode) celle appliquée en Tunisie (Tunisian Ministry of Religious)" + chr$(13)
    t$ = t$ + "Pour les autres pays, vous pouvez opter pour l'une des métodes proposées dans le COMBO, surtout si votre ville se situe aux" + chr$(13)
    t$ = t$ + "altitudes supérieures à 45°"+chr$(13)
    t$ = t$ + "Il propose un choix parmi 8 pays qui vous permettent d'en choisir une ville parmi celles qui sont proposées." + chr$(13)
    t$ = t$ + "Si votre ville ne s'y trouve pas, vous avez la possibilité d'entrer manuellement ses coordonnées (Latitude, Longitude, Fuseau, DST)" + chr$(13)
    t$ = t$ + "Vous pouvez aussi l'ajouter dans le code dans les lignes DATA." + chr$(13)
    t$ = t$ + "En optant pour l'un des pays proposé, vous activez un COMBO vous permettant de choisir une ville." + chr$(13)
    t$ = t$ + "Le COMBO DST c'est pour le choix de l'heure d'été (valeurs possibles : 0 pas de passage; 1 passage à l'heure d'été." + chr$(13)
    t$ = t$ + "Les boutons 'main' indiquant la gauche c'est pour le mois précédent, tandis que celle qui indique la droite c'est pour le mois suivant." + chr$(13)
    t$ = t$ + chr$(13)   
    t$ = t$ + "Après chaque modification et pour lancer un nouveau calcul,cliquez sur le bouton 'Calculer' (La Palice ne peut pas dire mieux !)" + chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "Note :" + chr$(13)
    t$ = t$ + "L’horaire de la prière de Ichaa correspond à la disparition du crépuscule (12° à 18°) après le coucher du Soleil." + chr$(13)
    t$ = t$ + "L'Arabie Saoudite, par exemple ajoute 90 mn à l'heure du Maghrib pour obtenir celle du Icha"+ chr$(13)
    t$ = t$ + " et ajoute 120 mn pour le mois de Ramadan."+ chr$(13)
    t$ = t$ + chr$(13) + chr$(13)   
    t$ = t$ + "Pour information :" + chr$(13)
    t$ = t$ + "******************" + chr$(13)
    t$ = t$ + "La définition de l'heure du salat Asr divise les écoles islamiques en deux positions dogmatiques." + chr$(13)
    t$ = t$ + "Les trois écoles juridiques Malikite, Hambalite et Shafite soutiennent que le Asr commence lorsque la taille d'un objet vertical est la taille de son ombre." + chr$(13)
    t$ = t$ + "Cette méthode est celle adoptée généralement dans les communautés du Maghreb (d'obédience Malikite)." + chr$(13)
    t$ = t$ + "La quatrième école Hanafite estime que le Asr commence lorsque l'ombre d'un objet vertical est le double de la taille de cet objet."+chr$(13)
    t$ = t$ + "Cette nette différence dogmatique entraîne des écarts dans les horaires de salat sur les calendriers correspondant à un même endroit." + chr$(13)
    t$ = t$ + "Le programme vous permet de choisir votre doctrine réligieuse (Madh-hab) dans le COMBO 'Calcul Asr'. " + chr$(13)
    t$ = t$ + chr$(13) + chr$(13)
    t$ = t$ + "Le programme est fourni comme tel sans aucune garantie des résultats."+chr$(13)
    t$ = t$ + "En aucun cas je ne serais responsable de dommages résultants de l'utilisation de cette application."   
    message t$
END_SUB
rem ============================================================================
SUB Culture()
    dim_local t$
    t$ = "Méthode de calcul des horaires de prières" + chr$(13)
    t$ = t$ + "Les prières (pour les Musulmans) sont au nombre de cinq par journée." + chr$(13)
    t$ = t$ + "Les horaires de ces cinq prières varient d'un endroit (ville) à l'autre et d'un jour à l'autre." + chr$(13)
    t$ = t$ + "Le calcul fait intervenir les heures du crépuscule, mais lequel ?" + chr$(13)
    t$ = t$ + "Il existe trois types de crépuscules : " + chr$(13)
    t$ = t$ + "Le crépuscule astronomique : il intervient lorsque le soleil se situe "
    t$ = t$ + "en dessous de l’horizon à une hauteur de 18°, et il correspond au moment" + chr$(13)
    t$ = t$ + "où l’obscurité totale s’installe au niveau de cet horizon." + chr$(13)
    t$ = t$ + "Le crépuscule nautique : il intervient lorsque le soleil se situe en dessous de l’horizon à une hauteur de 12°." + chr$(13)
    t$ = t$ + "Le crépuscule civil : il intervient lorsque le soleil se situe en dessous de l’horizon à une hauteur de 06°." + chr$(13)
    t$ = t$ + "Or, il s’est avéré que le fait de se baser sur le crépuscule astronomique (18°) pour le calcul des heures de prière "
    t$ = t$ + "pose des difficultés pour les pays d’Europe." + chr$(13)
    t$ = t$ + "Il est impossible de calculer les horaires de la prière du Fajr à partir du 18° et ce à partir de la mi-mai jusqu’à la mi-juin environ."+chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "L’écart entre le Fajr et celui du lever du soleil (Chourouk) se creuse pour atteindre un record de 3h40 min en période d’été." + chr$(13)
    t$ = t$ + "L’écart entre la prière de Ichaa et celle du Fajr se réduit durant des semaines en période d’été." + chr$(13)
    t$ = t$ + "A titre d’exemple : le 28 mai à Paris en se basant sur le 18°, la prière de Ichaa est à 00h18 et la prière du Fajr est à 02h59 !" + chr$(13)
    t$ = t$ + "Soit un écart de 2h41mn."+chr$(13)
    t$ = t$ + "Par contre, retenir le critère du 12° (le crépuscule nautique) permet de surmonter ces difficultés." + chr$(13)
    t$ = t$ + "D’une part, l’écart entre la prière du Fajr et celle du lever du soleil (Chourouk) n’excède jamais 02 heures durant toute l’année."+chr$(13)
    t$ = t$ + "D’autre part, l’écart entre la prière du Ichaa et celle du Fajr reste constamment importante."+chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "Le fait d'opter pour ce critère du 12° permet d’alléger la contrainte sur les musulmans vivant en Europe pour cette pratique cultuelle " + chr$(13)
    t$ = t$ + "et surtout durant le mois de Ramadan et spécialement en période d’été." + chr$(13)
    t$ = t$ + "L’avantage de ce choix réside dans la possibilité de l’utiliser durant toute l’année, à l’inverse de celui du 18°." + chr$(13)
    t$ = t$ + "Certains pays ajoutent 5 minutes en plus par précaution pour les horaires de Dhohr et du Maghrib" + chr$(13)
    t$ = t$ + "L’horaire du Asr est calculé selon la règle islamique où l’ombre de chaque objet devient égale à celui-ci." + chr$(13)
    t$ = t$ + "Mais certains pays utilisent d'autres critères, ce qui ne facilite pas la tâche !" + chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "En résumé : " + chr$(13)
    t$ = t$ + "* Prière de l'aube (matin) (Fajr) : Le début coïncide avec la fin du délai de d'Isha, soit lorsque le soleil remonte à 19 ° sous l'horizon." + chr$(13)
    t$ = t$ + "  La fin est atteinte au lever du soleil avec le limbe supérieur du soleil tangent à l'horizon soit h = - 0,267°"+ chr$(13)
    t$ = t$ + "* Prière de la mi-journée (midi) (Dhur) : la durée permise commence quand le soleil a traversé le méridien (soit quand l'ombre d'un objet a commencé à "
    t$ = t$ + "  augmenter) et se termine lorsque l'ombre d'un gnomon s'est allongée d'un quart de sa hauteur par rapport à son ombre à midi." + chr$(13)
    t$ = t$ + "* Prière de l'après-midi ('Asr) : l'intervalle commence lorsque l'augmentation de l'ombre est égale à la longueur du gnomon et se termine quand l'ombre en a atteint le double." + chr$(13)
    t$ = t$ + "* Prière du coucher de soleil (Maghrib) : Le début coïncide avec la disparition totale du soleil sous l'horizon , soit pour h = -0.267°."+chr$(13)
    t$ = t$ + "  La fin du délai est atteinte à la dernière lueur du crépuscule, soit le soleil à 18° sous l'horizon."+chr$(13)
    t$ = t$ + "  Attention, cette condition peut être irréalisable à certaines dates pour certaines latitudes." + chr$(13)
    t$ = t$ + "* Prière de la nuit ('Isha) : Le début coïncide avec la fin du délai de Maghrib, soit le soleil à 17° sous l'horizon." + chr$(13)
    t$ = t$ + "  La fin du délai est atteinte avec l'apparition de l'aube lorsque le soleil remonte à 19° sous l'horizon." + chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "Note :" + chr$(13)
    t$ = t$ + "Les opinions divergent sur les angles à utiliser pour le calcul de Fajr et Isha." +chr$(13)
    t$ = t$ + "La mosquée de Paris retient 15° pour Fajr et 18° pour Isha." + chr$(13) + chr$(13) 
    t$ = t$ + chr$(13)
    t$ = t$ + "Pour des plus amples informations sur le calcul des horaires de prière, référez-vous à : " + chr$(13)
    t$ = t$ + "http://www.averroes-aveyron.fr/medias/files/methodes-de-calcul.pdf" + chr$(13)   
    message t$
END_SUB
rem ============================================================================
' Liste des pays : nom du pays, fuseau horaire du pays et flag pour heure d'été (1 oui, 0 non)
data "Algérie" ,1,0 , "Belgique",1,1 ,"Egypte",2,0 , "France",1,1, "Lybie",2,0
data "Maroc",0 , 0, "Arabie Saoudite",3,0 ,"Tunisie",1,0
' ------------------------------------------------------------------------------
data "Algérie"  : ' UTC + 1 ; DST 0
' -----------
1:
'    Ville            Latitude  Longitude
data "Adrar" ,          27.850,    -0.317 
data "Alger" ,          36.833,    3.000
data "Annaba" ,        36.917,    7.783 
data "Batna" ,          35.567,    6.167   
data "Bechar" ,        31.583,    -2.283
data "Bejaia" ,        36.817,    5.050 
data "Biskra" ,        34.833,    5.683 
data "Blida" ,          36.500,    2.833 
data "Boussaada" ,      35.167,    4.150 
data "Constantine" ,    36.367,    6.667 
data "El Asnam" ,      36.183,    1.350   
data "El Djelfa" ,      34.717,    3.233 
data "Ghardaia" ,      32.333,    3.667
data "Laghouat" ,      33.817,    2.917
data "Mostaganem" ,    35.900,    0.083 
data "M'Sila" ,        35.667,    4.517
data "Oran" ,          35.750,    -0.633
data "Ouargla" ,        32.000,    5.267
data "Setif" ,          36.183,    5.400 
data "Sidi-bel-Abbes" , 35.250,    -0.650
data "Skikda" ,        36.883,    6.900 
data "Tamanrasset" ,    22.833,    5.467
data "Tebessa" ,        35.350,    8.100 
data "Tiaret" ,        35.333,    1.333
data "Tilimsen" ,      34.883,    -1.350     
data "Tizi-Ouzou" ,    36.733,    4.083 
data "FIN" 
' ------------------------------------------------------------------------------
data "Belgique" : ' UTC + 1  UTC + 2 Heure d'été
' -----------
2:
'    Ville            Latitude  Longitude
data "Antwerp" ,        51.217,  4.417 
data "Brussels" ,      50.850,  4.350 
data "Charleroi" ,      50.417,  4.450
data "Gent" ,          51.033,  3.700
data "Liege" ,          50.633,  5.583 
data "Ostende" ,        51.217,  2.917   
data "Mons" ,          50.467,  3.967     
data "Namur" ,          50.467,  4.867
data "FIN"
' ------------------------------------------------------------------------------
data "Egypte"  : ' UTC + 2
' -------------------------------------
3:
'    Ville            Latitude  Longitude
data "Abou Simbel" ,    22.317,  31.633 
data "Alexandria" ,    31.217,  29.917
data "Aswan" ,          24.083,  32.933
data "Asyut" ,          27.233,  31.117
data "Beni-Souef" ,    29.083,  31.083 
data "Cairo" ,          30.050,  31.250
data "Damanhur" ,      31.050,  30.467
data "Dumyat" ,        31.433,  31.800
data "El Alamein" ,    30.833,  28.950
data "Helwan" ,        29.850,  31.333
data "Isma'ilia" ,      30.600,  32.250 
data "Karnak" ,        25.683,  32.667 
data "Port Said" ,      31.283,  32.300   
data "Sohag" ,          26.550,  31.700
data "Suez" ,          29.983,  32.550
data "Tanta" ,          30.800,  31.000 
data "Zagazig" ,        30.583,  31.500 
data "FIN"
' -------------------------------------------------------------------------------
data "France" : ' UTC + 1  UTC + 2 Heure d'été
' ----------
4:
'    Ville            Latitude  Longitude
data "Brest" ,          48.383,  -4.500 
data "Quimper" ,        48.000,  -4.100 
data "Lorient" ,        47.750,  -3.350 
data "St-Brieuc" ,      48.517,  -2.750 
data "Vannes" ,        47.667,  -2.733   
data "St Nazaire" ,    47.283,  -2.200 
data "Rennes" ,        48.100,  -1.667 
data "Cherbourg" ,      49.633,  -1.617 
data "Nantes" ,        47.233,  -1.583 
data "La-Roche-sur-Yon" , 46.633, -1.500
data "Bayonne" ,        43.500,  -1.467
data "La Rochelle" ,    46.167,  -1.167 
data "St-Lo" ,          49.117,  -1.083 
data "Laval" ,          48.067,  -0.750   
data "Bordeaux" ,      44.833,  -0.567 
data "Angers" ,        47.483,  -0.533 
data "Mont-de-Marsan" , 43.900,  -0.500 
data "Niort" ,          46.317,  -0.450 
data "Pau" ,            43.300,  -0.367 
data "Caen" ,          49.183,  -0.367
data "Alençon" ,        48.417,    0.083 
data "Tarbes" ,        43.233,    0.083 
data "Le Havre" ,      49.500,    0.100 
data "Angouleme" ,      45.667,    0.167 
data "Le Mans" ,        48.000,    0.200   
data "Poitiers" ,      46.583,    0.333 
data "Cahors" ,        44.467,    0.433 
data "Auch" ,          43.500,    0.600 
data "Agen" ,          44.200,    0.633 
data "Tours" ,          47.383,    0.700 
data "Perigueux" ,      45.200,    0.733   
data "Dieppe" ,        49.917,    1.083   
data "Rouen" ,          49.433,    1.083 
data "Evreux" ,        49.050,    1.183   
data "Limoges" ,        45.833,    1.250   
data "Montauban" ,      44.017,    1.333 
data "Blois" ,          47.600,    1.333 
data "Toulouse" ,      43.617,    1.450   
data "Chartres" ,      48.450,    1.500   
data "Foix" ,          42.950,    1.583 
data "Chateauroux" ,    46.817,    1.683   
data "Tulle" ,          45.267,    1.767   
data "Abbeville" ,      50.100,    1.850   
data "Gueret" ,        46.167,    1.866 
data "Orleans" ,        47.900,    1.900 
data "Vierzon" ,        47.233,    2.050 
data "Pontoise" ,      49.050,    2.083 
data "Beauvais" ,      49.433,    2.083 
data "Versailles" ,    48.800,    2.133 
data "Albi" ,          43.933,    2.144   
data "Nanterre" ,      48.883,    2.217   
data "Amiens" ,        49.900,    2.300 
data "Paris" ,          48.833,    2.333   
data "Bourges" ,        47.083,    2.383   
data "Carcassonne" ,    43.217,    2.350 
data "Dunkerque" ,      51.033,    2.383 
data "Aurillac" ,      44.933,    2.433   
data "Bobigny" ,        48.917,    2.450 
data "Créteil" ,        48.783,    2.467   
data "Melun" ,          48.533,    2.557
data "Evry" ,          48.633,    2.567   
data "Rodez" ,          44.350,    2.567 
data "Montlucon" ,      46.333,    2.600   
data "Arras" ,          50.283,    2.767   
data "Lens" ,          50.433,    2.833 
data "Perpignan" ,      42.700,    2.900 
data "Lille" ,          50.650,    3.083 
data "Clermont-Ferrand",45.783,    3.083     
data "Nevers" ,        47.000,    3.150   
data "Moulins" ,        46.567,    3.333 
data "Mende" ,          44.533,    3.500   
data "Auxerre" ,        47.800,    3.583   
data "Laon" ,          49.567,    3.617   
data "Montpellier" ,    43.600,    3.883     
data "Le Puy" ,        45.050,    3.883   
data "Avallon" ,        47.500,    3.900 
data "Reims" ,          49.250,    4.033 
data "Troyes" ,        48.300,    4.083   
data "Roanne" ,        46.033,    4.083   
data "Nimes" ,          43.500,    4.350   
data "Chalons-S-Marne", 48.967,    4.367   
data "St-Etienne" ,    45.433,    4.383   
data "Privas" ,        44.733,    4.600   
data "Mezières" ,      49.767,    4.733   
data "Avignon" ,        43.933,    4.800   
data "Lyon" ,          45.767,    4.833     
data "Macon" ,          45.300,    4.833   
data "Valence" ,        44.933,    4.900   
data "Dijon" ,          47.333,    5.033   
data "Chaumont" ,      48.117,    5.133   
data "Bar-le-Duc" ,    48.767,    5.167   
data "Bourg" ,          46.200,    5.217
data "Observatoire SIRENE" , 44.000, 5.333 
data "Marseille " ,    43.300,    5.367 
data "Lons-le-Saunier", 46.683,    5.550 
data "Grenoble" ,      45.183,    5.717   
data "Toulon" ,        43.117,    5.917 
data "Chambéry" ,      45.567,    5.917   
data "Besancon" ,      47.250,    5.983   
data "Gap" ,            44.550,    6.083 
data "Annecy" ,        45.900,    6.117 
data "Metz" ,          49.117,    6.183 
data "Vesoul" ,        47.633,    6.150   
data "Nancy" ,          48.700,    6.200 
data "Digne" ,          44.083,    6.233 
data "Epinal" ,        48.167,    6.467 
data "Belfort" ,        47.633,    6.867   
data "Cannes" ,        43.550,    7.000   
data "Nice" ,          43.700,    7.267   
data "Colmar" ,        48.083,    7.350 
data "Mulhouse" ,      47.750,    7.350   
data "Strasbourg" ,    48.583,    7.750 
data "Ajaccio" ,        41.917,    8.717   
data "Bastia" ,        42.683,    9.433
data "FIN"
' ------------------------------------------------------------------------------
data "Libye"  :' UTC + 2
' ---------
5:
'    Ville            Latitude  Longitude
data "Sabratah" ,      32.833,    12.400 
data "Tripoli" ,        32.967,    13.200 
data "Al Khums" ,      32.650,    14.250 
data "Sabhah" ,        27.050,    14.433   
data "Benghazi" ,      32.117,    20.083 
data "Ajdabiyah" ,      30.800,    20.250   
data "Al Marj" ,        32.500,    20.833               
data "Darnah" ,        32.767,    22.650   
data "Tubruq" ,        32.100,    23.933 
data "FIN"
' ------------------------------------------------------------------------------

data "Moroc" : ' UTC + 0
' ---------
6:
'    Ville            Latitude  Longitude
data "Agadir" ,        30.500,  -9.667   
data "Safi" ,          32.300,  -9.333   
data "El Jadida" ,      33.183,  -8.283   
data "Marrakech" ,      31.817,  -8.000 
data "Settat" ,        33.067,  -7.617   
data "Casablanca" ,    33.650,  -7.583   
data "Mohammedia" ,    33.717,  -7.333   
data "Khouribga" ,      32.900,  -6.950 
data "Sale" ,          34.067,  -6.833   
data "Kenitra" ,        34.333,  -6.567   
data "Beni Mellal" ,    32.367,  -6.483 
data "Khemisset" ,      33.833,  -6.050   
data "Ksar el Kebir" ,  35.067,  -5.933   
data "Tanger" ,        35.800,  -5.833   
data "Meknes" ,        33.883,  -5.617   
data "Tetouan" ,        35.567,  -5.367   
data "Ceuta" ,          35.883,  -5.317   
data "Fes" ,            34.083,  -5.000   
data "Taza" ,          34.267,  -4.017   
data "Nador" ,          35.167,  -3.000   
data "Oujda" ,          34.683,  -1.750 
data "FIN"
' ------------------------------------------------------------------------------
rem ============================================================================
data "Arabie Saoudite" : ' UTC + 3
' ----------------
7:
'    Ville            Latitude  Longitude
data "Riyadh" ,        24.650,    46.767 
data "Al Wajh" ,        26.267,    36.467   
data "Tabuk" ,          28.367,    36.533   
data "Yanbu'Al Bahr" ,  24.117,    38.067 
data "Tayma" ,          27.617,    38.500 
data "Jiddah" ,        21.500,    39.167   
data "Khaybar" ,        25.800,    39.200   
data "Medina" ,        24.500,    39.583 
data "Mecca" ,          21.433,    39.817 
data "Al Jawf" ,        29.783,    39.867   
data "Al Lith" ,        20.167,    40.267 
data "At Ta'if" ,      21.250,    40.350   
data "Badanah" ,        31.000,    41.083   
data "Al Qunfidhah" ,  19.150,    41.117   
data "Turabah" ,        21.250,    41.567 
data "Ha'il" ,          27.517,    41.750 
data "bha" ,            18.233,    42.517 
data "Jizan" ,          16.933,    42.550   
data "Buraydah" ,      26.333,    43.983   
data "Najran" ,        17.517,    44.317   
data "Shaqra" ,        25.300,    45.250   
data "Al Artawiyak" ,  26.517,    45.350   
data "Ad Dilam" ,      23.983,    47.100   
data "Haradh" ,        24.200,    49.117   
data "Al Hufuf" ,      25.333,    49.567   
data "Ad Dammam" ,      26.417,    50.100   
data "Al Khurmah" ,    21.917,    42.033
data "FIN" 
' ------------------------------------------------------------------------------
Data "Tunisie" : ' UTC + 1
' -----------
8:
'    Ville            Latitude  Longitude
data "Gafsa" ,          34.467,    8.717 
data "Beja" ,          36.717,    9.217 
data "Bizerte" ,        37.300,    9.867   
data "Kairouan" ,      35.700,    10.017 
data "Gabes" ,          33.867,    10.100 
data "Tunis" ,          36.833,    10.217 
data "Sousse" ,        35.833,    10.633   
data "Sfax" ,          34.750,    10.717 
data "Nabeul" ,        36.500,    10.733
data "Moknine" ,        35.633,    10.833
data "Monastir",        35.777,    10.826
data "Mahdia" ,        35.502,    11.045
data "Jendouba" ,      35.501,    08.783
data "Le Kef" ,        36.179,    08.714
data "Siliana" ,        35.990,    09.278
data "Ariana" ,        36.862,    10.195
data "Ben Arous" ,      36.743,    10.232
data "Kasserine" ,      35.171,    08.828
data "Kebili" ,        33.124,    08.836
data "La Manouba" ,    36.807,    10.101
data "Medenine" ,      33.348,    10.494
data "Sidi Bouzid" ,    35.033,    09.5
data "Tataouine" ,      32.921,    10.450
data "Zaghouan" ,      36.399,    10.147
data "La Soukra" ,      36.883,    10.25
data "La Marsa" ,      36.876,    10.325

data "FIN" 
rem ============================================================================
rem &&&&&&&&&&&&&&&&&&&&&&  FIN DU CODE  &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
rem ============================================================================


Dernière édition par papydall le Mar 30 Avr 2019 - 14:40, édité 2 fois (Raison : Edité pour corriger certaines erreurs détectées par Marc)
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyLun 29 Avr 2019 - 22:56

Bonsoir Papydall  cheers

Pour ma part, j'ai réalisé un programme d'appel a la prière il y a 3 ou 4 ans.
Mais j'utilise un fichier qui contient les horaires des 5 prières que j’intègre chaque année au 1er janvier.

Calculateur des heures de prière. Sans_t44


mon fichier semblerai correspondre aux horaires France 12° de ton programme.

J'ai donc comparé mon fichier et tes horaires France 12° .
J'ai constaté une petite différence :
- 4-5 minutes + tard pour Fajr avec ton programme.
- 4-5 minutes + tôt  pour Dohr, Magreb et Isha avec ton programme.
- Pas de différence pour Asr.

En fait la différence est entre 4 et 5 minutes et cela sur toute l'année 2018.
Je n'ai pas contrôlé chaque jour, mais juste pris quelques points de repères... Janvier, Mars, Mai, Juin, etc.

Je reprendrai cela dans les prochains jours...

Si tu m'autorise, je reprendrai bien le code pour l'intégrer à mon programme.
Et tenter de le rendre entièrement automatique.
Plus besoin de m'embêter avec un fichier que je met à jour chaque année...

Bravo pour ton programme et encore merci pour le partage. Wink


Dernière édition par Minibug le Mar 30 Avr 2019 - 6:59, édité 2 fois
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Marc

Marc


Nombre de messages : 2466
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyLun 29 Avr 2019 - 23:32

Excellent ! Bravo Papydall !

Quel travail !


C'est beau !  Même les années bissextiles sont prises en compte !

Je me coucherai moins bête ce soir !

Pardonne-moi ces quelques remarques sans grande importance, je chipote :
Je vois que nous n'avons pas la même manière d'écrire certains pays :
Tunise : Tunisie
Egypt : Egypte
Arabie Séoudite : Arabie Saoudite

Lors de la navigation de mois en mois (main gauche, main droite) , dans le sens décroissant, le nombre de lignes correspond au nombre de jours. Dans le sens croissant, il y a une ligne en trop en bas du tableau.

Si on clique trop vitre sur les mains, c'est à dire avant que le tableau ait fini de s'afficher, le programme plante.

Spoiler:

Dans l'aide, il manque un "s" à la fin du mot "résultat" (2ème ligne)

Encore pardon pour ces critiques.
"La critique est aisée, mais l'art est difficile." D'autant plus que j'aurais été incapable de faire un tel programme.

Merci pour tes partages !
Revenir en haut Aller en bas
Yannick




Nombre de messages : 8635
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

Calculateur des heures de prière. Empty
MessageSujet: re   Calculateur des heures de prière. EmptyMar 30 Avr 2019 - 1:47

Deux petites suggestions  Laughing

- Ajouter un fichier son qui démarre à l' heure de l' appel.
- Récupérer la localisation de l'utlilisateur depuis son ordinateur en paramètre par défaut.

C'est bon, je sors... Laughing
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyMar 30 Avr 2019 - 6:34

Merci à tous ceux qui ont pris la peine de tester mon programme

Minibug a écrit:
En fait la différence est entre 4 et 5 minutes et cela sur toute l'année 2018.

La convention de l’UIOF (Union des Orgnaisations Islamiques de France)   est : un angle de 12° pour Fajr et Icha et une déduction de 5 minutes par mesure de précaution.

Minibug a écrit:
Si tu m'autorise, je reprendrai bien le code pour l'intégrer à mon programme.

Tu as tous les droits de reprendre le code et de l’utiliser ou le  modifier ou l’intégrer dans un autre programme.


Marc a écrit:
Pardonne-moi ces quelques remarques sans grande importance, je chipote :

Bien au contraire ! Tu participes ainsi pour l’amélioration du programme et je te suis reconnaissant !
Les erreurs (horreurs comme disait Yannick) sont corrigées; j'ai édité mon post précedent pour apporter les corrections utiles au programme.

Marc a écrit:
il y a une ligne en trop en bas du tableau.

C’est corrigé.

Marc a écrit:
Si on clique trop vitre sur les mains, c'est à dire avant que le tableau ait fini de s'afficher, le programme plante.

J’ai blindé mon code et maintenant tu peux cliquer aussi vite que ton ombre : le programme ne plante plus.

Yannick a écrit:
Ajouter un fichier son qui démarre à l' heure de l' appel.

C’est réalisable pourquoi pas !

Yannick a écrit:
Récupérer la localisation de l'utlilisateur depuis son ordinateur en paramètre par défaut.

Je ne sais pas comment faire Embarassed


Dernière édition par papydall le Mar 30 Avr 2019 - 7:00, édité 1 fois
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyMar 30 Avr 2019 - 6:57

Merci pour ces réponses Papydall.

Pour répondre à Yannick, mon programme inclus l'Adhan (Appel à la prière) pour l'appel de chaque prière.
Et comme Papydall me donne carte blanche, je vais pouvoir tenté l'intégration de la formule de calcul
en lieu et place de mon fichier. Je vais regarder cela durant les prochains jours.  drunken

Pour l'histoire de la localisation on pourrai peut être envoyer l'utilisateur vers un site
ou il tape ensuite le nom de sa ville et peut récupérer les coordonnées (Longitude et latitude).

Comme sur google map : https://www.google.fr/maps

Vous tapez le lieu en haut à gauche et vous avez le résultat dans l'adresse après le CP et la ville.
Comme sur la ligne ci-dessous :

google.fr/maps/place/86000+Poitiers/@46.5846126,0.3014298,12z/data=!3m1!4b1!4m5!3m4!1s0x47fdbe724...


Sur ce je vous souhaite une très bonne journée à tous ! sunny
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Yannick




Nombre de messages : 8635
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

Calculateur des heures de prière. Empty
MessageSujet: re   Calculateur des heures de prière. EmptyMar 30 Avr 2019 - 12:40

Salut tout le monde !

En fait j'ai pensé à la récup de la localisation pour une version android.
Se promener avec sa tour toute la journée...pas très pratique...non ?
lol!
Revenir en haut Aller en bas
Marc

Marc


Nombre de messages : 2466
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyMar 30 Avr 2019 - 13:51

Bonjour à tous !

@Papydall

Il reste deux lignes rebelles :

ligne 87 pour la Tunisie :
Spoiler:

et ligne 486 :  t$ = t$ + "L'Arabie Séoudite, par exemple ajoute 90 mn à l'heure du Maghrib pour obtenir celle du Icha"+ chr$(13)

Encore bravo pour cette réalisation !
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyMar 30 Avr 2019 - 14:46

Merci Marc.
J'ai apporté les corrections nécessaires dans le code ci-haut.
Je devrai peut-être penser à changer mes lunettes   Cool  ou (mieux encore) disposer de plus d'une seule et unique paire d'yeux ! pirat
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyJeu 2 Mai 2019 - 3:34

Nouvelle version de CalcPrayerTimes

Ajout d’une fonction pour déterminer la direction de la Kibla à partir du lieu de la prière.
Ajout d’une fonction pour calculer la distance orthodromique entre le lieu de la prière et la Mecque où se trouve la Kaaba.
Plusieurs orthographes sont permises : Qiblah, Qibla, Kibla
Kibla : Point du ciel indiquant la direction de La Mecque, et vers lequel se tournent les musulmans pour prier.
Il s’agit de l'orthodromie qui joint le lieu de prière à la Kaaba (en arabe: الكعبة ), dans la cité de La Mecque.
L'orthodromie désigne la géodésique, le chemin le plus court, entre deux points d'une sphère. C'est donc l'arc de grand cercle passant par ces deux points.

Code:

rem ============================================================================
rem                         CalcPrayerTimes.bas
rem              Calculateur des heures de prière par Papydall
rem                             Version 2.0
rem                    Dernière modification : 02 Mai 2019
rem ============================================================================

Init()
Gui()
Afficher_Kibla()
Grille(NbJours(month,year))
Run()

end
rem ============================================================================
SUB Init()
    label clic, change
    label 1, 2, 3, 4, 5, 6, 7, 8 : ' pour restore_label
    dim year, month, day
    dim longitude, latitude, timeZone
    dim fajrTwilight, ishaTwilight
    dim fajrTime, sunRiseTime, zuhrTime, asrTime, maghribTime, ishaTime
    dim d, l, m, lambda, obliquity, alfa, st, dec, durinal_Arc, noon, Ut_Noon
    dim Asr_Alt, Asr_Arc, Esha_Arc, Fajr_Arc
    dim prayTime$(5)
    dim hours, minutes ,h$, m$, a, n, dst, methode, p$, ville$, pays$
    dim NbPays : NbPays = 8 : ' 8 c'est le nombre des pays proposés dans le programme
    dim Fuseau(8), H_Ete(8)
    dim standard
    dim nc
    standard = 1 : ' Pour le calcul du Asr : 1 ---> (Shafii, Maliki, Hanbali)
                                           ' 0 ---> Hanafi  
    
    day = date_day : month = date_month : year = date_year : ' La date courante
    
END_SUB
rem ============================================================================
SUB GUI()
    dim_local i,t$
    t$ = " Calculateur des heures de prière par Papydall "
    color 0,240,255,255
    width 0,1100 : height 0,800 : top 0,(screen_y - height(0)) / 2
    left 0,(screen_x - width(0))/2
    shape 5 : top 5,5 : left 5,450 : width 5,600 : height 5,50
    shape_rectangle_rounded 5 : color 5,25,100,50
    shape 6 : top 6,5 : left 6,20 : width 6,420 : height 6,50
    shape_rectangle_rounded 6 : color 6,25,100,50
    alpha 10 : top 10,20 : left 10,40 : font_color 10,250,100,50
       font_bold 10      : font_name 10,"tahoma" : font_size 10,12
       caption 10,t$     : caption 0,t$ : application_title t$
    alpha 20 : top 20,80 : left 20,010  : caption 20,"Latitude : "
    edit  21 : top 21,80 : left 21,070  : width 21,60 : font_bold 21 : text 21,"35.633"
       hint 21,"En degrés décimaux (± 90°) positive au Nord" : on_change 21,change
    alpha 30 : top 30,80 : left 30,140  : caption 30,"Longitude : "
    edit  31 : top 31,80 : left 31,210  : width 31,60 : font_bold 31 : text 31,"10.833"
       hint 31,"En degrés décimaux (± 180°) positive à l'est" : on_change 31,change
    alpha 40 : top 40,80 : left 40,285  : caption 40,"Fuseau :"
    spin 41  : top 41,80 : left 41,335  : width 41,60 : min 41,-12 : max 41,12 : font_bold 41
       hint 41,"ZoneTime, décalage heure : Valeurs possibles ± 12" : position 41,1
       on_change 41,change
    alpha 45 : top 45,80 : left 45,420  : caption 45,"DST :" : font_bold 45 : font_name 45,"tahoma"
    combo 46 : top 46,80 : left 46,450  : width 46,50 : hint 46,"Heure d'été"
    on_change 46,change
    alpha 50 : top 50,80 : left 50,520  : caption 50,"Méthode :"  
    combo 51 : top 51,80 : left 51,580  : width 51,480 : font_bold 51  : height 51,40
    font_name 51,"tahoma" : on_change 51,change
    hint 51,"convention de calcul utilisé"    
    alpha 55 :  top 55,130 : left 55,10 : font_bold 55 : font_name 55,"tahoma"
    caption 55,"Calcul Asr :"
    combo 56 : top 56,130 : left 56,80 : font_bold 56 : font_name 56,"tahoma"
    width 56,220 : hint 56,"Doctrines religieuses" :  on_change 56,change
    item_add 56,"Standard (Shafii, Maliki, Hanbali)"
    item_add 56,"Hanafi" : item_select 56,1    
    button 60 : top 60,20 : left 60,950 : caption 60,"Quitter"
    on_click 60,clic
    button 70 : top 70,20 : left 70,470  : caption 70,"Calculer"
    on_click 70,clic : inactive 70  
    button 80 : top 80,120 : left 80,500 : font_bold 80 : font_name 80,"wingdings 2"
    font_size 80,30 : caption 80,"D" : hint 80,"Mois précédent" : on_click 80,clic
    button 90 : top 90,120 : left 90,760 : font_bold 90 : font_name 90,"wingdings 2"
    font_size 90,30 : caption 90,"E" : hint 90,"Mois suivant" : on_click 90,clic
    alpha 100: top 100,130 : left 100,630 : font_bold 100 : font_name 100,"arial"
    font_size 100,12 : caption 100,Month_Name$(month)  + "  " + str$(year)
    item_add 46,0 : item_add 46,1 : item_select 46,1  
    for i = 1 to 17 : read t$ : item_add 51,t$ : next i
    item_select 51,14          
    for i = 20 to 70 step 10 : font_bold i : font_name i,"tahoma" : next i  
    alpha 110 : top 110,180 : left 110,10 : font_bold 110 : font_size 110,12
    font_name 110,"tahoma" : font_color 110, 255,0,0 : caption 110,"Pays : Tunisie"
    alpha 120 : top 120,180 : left 120,220 : font_bold 120 : font_size 120,12
    font_name 120,"tahoma" : font_color 120, 255,0,0 : caption 120,"Ville : Moknine"        
    alpha 130 : top 130,230 : left 130,10 : font_bold 130 : font_name 130,"tahoma"
    font_size 130,12 : font_color 130,0,0,255 : caption 130,"Choix Pays / Villes"    
    alpha 140 : top 140,260 : left 140,60 : font_bold 140 : font_name 140,"Wingdings"
    font_size 140,30 : caption 140,"ê"    
    button 150 : top 150,20 : left 150,600 : font_bold 150 : caption 150,"Aide" : on_click 150,clic
    button 160 : top 160,20 : left 160,740 : font_bold 160 : width 160,150
    caption 160,"Pour votre culture" : on_click 160,clic
    container_option 200 : top 200,300 : left 200,10 : width 200,130 : height 200,35*NbPays +10
    color 200,255,255,0        
    for i = 1 to NbPays
        option 200+i  : parent 200+i,200 : top 200+i,30*i : left 200+i,10
        font_bold 200+i : font_name 200+i,"tahoma" : on_click 200+i,clic      
        read p$ : caption 200+i,p$
        read fuseau(i) : read H_Ete(i)      
    next i  
    combo 300 : top 300,300 : left 300,160
    font_bold 300 : width 300,300 : hide 300 : on_change 300,change
    
    picture 400 : top 400,450 : left 400,170 : width 400,300 : height 400,300
    2d_target_is 400 : print_target_is 400
     alpha 410 : top 410,600 : left 410,10 : font_bold 410 : font_name 410,"tahoma"
    font_size 410,10 : font_color 410,255,0,0
    t$ = "Direction de la Kibla" + chr$(13) + "depuis Moknine" + chr$(13) + "Tunisie : "
    caption 410,t$
    hint 410,"Angle en ° à partir du Nord" +chr$(13)+"indiquant la direction de la Kibla"
      
    alpha 420 : top 420,630 : left 420,130 : font_bold 420 : font_name 420,"tahoma'
    font_size 420,12 : font_color 420,0,0,0  
    
    alpha 430 : top 430, 680 : left 430,1 : font_bold 430 : font_name 430,"tahoma"
    font_size 430,10 : font_color 430,0,0,255
    hint 430,"Distance de la Mecque"  
END_SUB
rem ============================================================================
' Formule donnant la distance orthdromique entre deux points du globle exprimés
' par leurs coordonnées (latitude et longitude)
' La formule est donnée en assimilant la Terre à une sphère de 40 000 km de circonférence.
' 1.852 : c'est la valeur en km de un mille marin
' 60 : ce nombre provient du fait que le mille marin (1 852 m) correspond à une
' minute d'arc sur un grand cercle de la surface terrestre, et donc 60 milles
' marins correspondent à un degré.
FNC Distance_Orthodromique(lat1,lon1)
    dim_local lat2,lon2,km,d
    lat2 = 21.433  : lon2 = 39.817  : ' Coordonnées de la Mecque
    degrees
    km = 60*1.852
    d = km*acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon2-lon1))
    d = int(d)
    result d
END_FNC
rem ============================================================================
' Fonction de calcul de la Kibla
' Elle retourne l'angle partant de la direction du nord et compté dans le sens
' rétrograde (sens des aiguilles d'une montre)
FNC Kibla(latitude,longitude)
    dim_local Lat_Meq : ' Latitude de la Mecque
    dim_local Lon_Meq : ' Longitude de la Mecque
    dim_local a,b,c,q,n,d
    Lat_Meq = 21.433
    Lon_Meq = 39.817
    a = Lon_Meq - longitude  
    b = latitude
    c = Lat_Meq
    degrees
    n = sin(a)
    d = cos(b) * tan(c) - sin(b) * cos(a)  
    if d = 0 then result 0 : exit_fnc
    q = atn(n/d)
    if sgn(n) <> sgn(q) then q = q + 180
    if (sgn(n) < 0) and (sgn(q) < 0) then q = q + 360
    result int(q)
END_FNC
rem ============================================================================
SUB Afficher_Kibla()
    dim_local la,lo,xc,yc,r,x,y,a,a1,c$,d
    degrees
    la = val(text$(21)) : lo = val(text$(31))
    xc = width(400)/2 : yc = height(400) / 2 : r = xc-20
    color 400,20,100,20 : font_color 400,255,255,0 : font_bold 400 : font_size 400,10
    2d_fill_color 200,100,020 : 2d_circle xc,yc,r
    2d_pen_width 2
    for a = 0 to 360 step 10
        2d_line xc,yc,xc+r*cos(a),yc+r*sin(a)
    next a    
    2d_fill_color 255,255,255 : 2d_circle xc,yc,r-10
    2d_fill_color 0,0,0 :  2d_circle xc,yc,5
    a = Kibla(la,lo) : r = r-15
    x = xc+r*cos(a-90) : y = yc+r*sin(a-90)
    2d_pen_width 2 : 2d_line xc,yc,x,y
    r = r-15    
    for a1 = a-80 to a-100 step -1
        2d_poly_to xc+r*cos(a1),yc+r*sin(a1)
    next a1  
 
    2d_poly_to x,y
    2d_fill_color 20,100,20
    print_locate xc-4,2        : print "N"
    print_locate 2*xc-15,yc-10 : print "E"
    print_locate xc-4,2*yc-20  : print "S"
    print_locate 5,yc-10       : print "W"
    d = Distance_Orthodromique(la,lo)
    caption 420, str$(a) + "°"
    caption 430, "Distance orthodromique :" + chr$(13) + str$(d) + " km"
END_SUB
rem ============================================================================
' Tracer une grille en fonction du nombre des jours dans le mois en cours
SUB Grille(n)
    grid 1 : top 1,180 : left 1,500 : width 1,342 : height 1,n*18-8 : grid_row 1,n+1    
    grid_row_fixed 1,1 : grid_row_height 1,16
    grid_column 1,7    : grid_column_fixed 1,1 : grid_column_width 1,50 : font_bold 1
    grid_fixed_color 1,255,255,0 : grid_one_column_width 1,1,30    
    color 1,0,255,255    
    grid_write 1,1,1,"Jour"
    grid_write 1,1,2," Farjr"
    grid_write 1,1,3,"Sunrise"
    grid_write 1,1,4," Dhuhr"
    grid_write 1,1,5,"  Asr"
    grid_write 1,1,6,"Maghrib"
    grid_write 1,1,7,"  Isha"
END_SUB
rem ============================================================================
SUB Run()
    dim_local nb
    nb = NbJours(month,year)  
    for n = 1 to Nb : Go(n) : Affiche(n) : next n
END_SUB
rem ============================================================================
Change:  
    active 70 : caption 420,""
    for nc = 21 to 41 step 10 : off_change nc : next nc
    for nc = 46 to 56 step 10 : off_change nc : next nc
    off_change 300
    if item_index(56) = 1 then standard = 1 : else : standard = 0
    select number_change
        case 21  : if text$(21) = "" then text 21,0
        case 31  : if text$(31) = "" then text 31,0
        case 41  : if text$(41) = "" then text 41,0
                   if abs(val(text$(41))) > 12 then text 41,0
        case 46  : if (text$(46) <> "0") or (text$(46) <> "1") then text 46,0                  
        case 51  : for n = 1 to NbJours(month,year)
                       Go(n) : Affiche(n)  : ' Calculer
                   next n
                   Afficher_Kibla()
        case 56  : for n = 1 to NbJours(month,year)
                       Go(n) : Affiche(n)  : ' Calculer
                   next n
                   Afficher_Kibla()
        case 300 : New_Coord()              
    end_select
    for nc = 21 to 41 step 10 : on_change nc,change : next nc
    for nc = 46 to 56 step 10 : on_change nc,change : next nc
    on_change 300,change
return
rem ============================================================================
' Gestion des clics de l'utilisateur
Clic:
    for nc = 60 to 90 step 10 : off_click nc : next nc
    for nc = 150 to 160 step 10 : off_click nc : next nc
    for nc = 201 to 208 : off_click nc : next nc
    if number_click > 200 then caption 140,"ê î"        
    select number_click
        case 060 : if message_confirmation_yes_no("Vous voulez vraiment quitter ?") = 1 then terminate
        case 070 : for n = 1 to NbJours(month,year)
                       Go(n) : Affiche(n)  : ' Calculer
                   next n
                   Afficher_Kibla() : inactive 70
        case 080 : Mois_Precedant()
        case 090 : Mois_Suivant()
        case 150 : Aide()
        case 160 : Culture()      
        case 201 : restore_label 1 : pays$ = "Algérie"  : List_Ville(number_click-200)
        case 202 : restore_label 2 : pays$ = "Belgique" : List_Ville(number_click-200)
        case 203 : restore_label 3 : pays$ = "Egypte"   : List_Ville(number_click-200)
        case 204 : restore_label 4 : pays$ = "France"   : List_Ville(number_click-200)
        case 205 : restore_label 5 : pays$ = "Lybie"    : List_Ville(number_click-200)
        case 206 : restore_label 6 : pays$ = "Maroc"    : List_Ville(number_click-200)
        case 207 : restore_label 7 : pays$ = "Arabie Saoudite": List_Ville(number_click-200)
        case 208 : restore_label 8 : pays$ = "Tunisie"  : List_Ville(number_click-200)
    end_select
    for nc = 60 to 90 step 10 : on_click nc,clic : next nc
    for nc = 150 to 160 step 10 : on_click nc,clic : next nc
    for nc = 201 to 208 : on_click nc,clic : next nc    
return
rem ============================================================================
SUB Go(day)
    calcPrayerTimes(day,month,year,fajrTwilight,ishaTwilight)
    NumberToHrMin(fajrTime)    : prayTime$(0) = h$ + ":" + m$
    NumberToHrMin(SunRiseTime) : prayTime$(1) = h$ + ":" + m$
    NumberToHrMin(zuhrTime)    : prayTime$(2) = h$ + ":" + m$
    NumberToHrMin(AsrTime)     : prayTime$(3) = h$ + ":" + m$
    NumberToHrMin(MaghribTime) : prayTime$(4) = h$ + ":" + m$    
    if (item_index(51) = 15) or (item_index(51) = 16)
       NumberToHrMin(MaghribTime + 1.5)
       prayTime$(5) = h$ + ":" + m$
    else    
       NumberToHrMin(IshaTime)    : prayTime$(5) = h$ + ":" + m$
    end_if    
END_SUB
rem ============================================================================
SUB New_Coord()
    dim_local t$,t1$,p
    t$ = item_read$(300,item_index(300))
    p = instr(t$,":")
    ville$ = left$(t$,p-1)
    t$ = mid$(t$,p+1,20)
    p = instr(t$,"/")
    t1$ = mid$(t$,p+1,20)
    t$ = left$(t$,p-1)
    text 21,t$ : text 31,t1$  
    caption 110,"Pays : " + pays$
    caption 120,"Ville : " + ville$
    t$ = "Direction de la Qibla" + chr$(13) + "depuis "
    t1$ = ville$ + chr$(13) + pays$ + " : "
    caption 410,t$ + t1$
    grid_clear 1,NbJours(month,year)+1 ,7
END_SUB
rem ============================================================================
SUB List_Ville(p)
    clear 300
    position 41,fuseau(p)
    item_select 46,H_Ete(p) + 1
    read ville$
    while ville$ <> "FIN"
        ville$ = ville$ + " : "
        read latitude : read longitude
        item_add 300,ville$  + str$(latitude) + " / " + str$(longitude)
        read ville$
    end_while
    item_select 300,1  
    sort_on 300 : show 300  
    inactive 70      
END_SUB
rem ============================================================================
' convertir Degree en Radian
FNC degToRad(degree)
    result ((pi / 180) * degree)
END_FNC
rem ============================================================================
' convertir Radian en Degree
FNC radToDeg(radian)
    result (radian * (180/pi))
END_FNC
rem ============================================================================
' Ramener la valeur de value entre 0 et 360
FNC moreLess360(value)
    while (value > 360) or (value < 0)
        if value > 360
           value = value - 360
        else
           if value < 0
              value = value + 360
           end_if
        end_if
    end_while
    result value              
END_FNC
rem ============================================================================
' Ramener la valeur de value entre 0 et 24
FNC moreLess24(value)
    while (value > 24) or (value < 0)
        if value > 24
           value = value - 24
        else
           if value < 0
              value = value + 24
           end_if
        end_if
    end_while
    result value
END_FNC
rem ============================================================================
' convertir le nombre  number en heurs et Minutes
SUB NumberToHrMin(number)
    if number = -1 then h$ = "--" : m$ = "--" : exit_sub
    hours   = int(moreLess24(number))    
    minutes = int(moreLess24(number - hours) * 60)
    h$ = str$(hours) : m$ = str$(minutes)
    if len(h$) < 2 then h$ = "0" + h$
    if len(m$) < 2 then m$ = "0" + m$    
END_SUB
rem ============================================================================
FNC Month_Name$(mois)
    dim_local m$
    select mois
        case 01 : m$ = "Janvier"
        case 02 : m$ = "Février"
        case 03 : m$ = "Mars"
        case 04 : m$ = "Avril"
        case 05 : m$ = "Mai"
        case 06 : m$ = "Juin"
        case 07 : m$ = "Juillet"
        case 08 : m$ = "Août"
        case 09 : m$ = "Septembre"
        case 10 : m$ = "Octobre"
        case 11 : m$ = "Novembre"
        case 12 : m$ = "Décembre"
    end_select
    result m$
END_FNC
rem ============================================================================
' Fonction qui retourne 1 si l'argument (annee) représente une année bisextile
' 0 sinon
FNC Bisextile(annee)
    if (mod(annee,4) = 0) and ((mod(annee,100) <> 0) or (mod(annee,400) = 0))
       result 1
    else
       result 0
    end_if
END_FNC
rem ============================================================================
' Déterminer le nombre de jours dans un mois (mois) pour une année (annee)
FNC NbJours(mois,annee)
    dim_local n
    select mois
        case 01 : n = 31
        case 02 : n = 28 : if bisextile(annee) > 0 then n = n + 1
        case 03 : n = 31
        case 04 : n = 30
        case 05 : n = 31
        case 06 : n = 30
        case 07 : n = 31
        case 08 : n = 31
        case 09 : n = 30
        case 10 : n = 31
        case 11 : n = 30
        case 12 : n = 31        
    end_select
    result n
END_FNC
rem ============================================================================
SUB Mois_Precedant()
    dim_local n,nb
    month = month-1
    if month < 1 then month = 12 : year = year - 1
    caption 100,Month_Name$(month)  + "  " + str$(year)
    nb = NbJours(month,year)
    delete 1 : Grille(nb)
    Run()    
END_SUB
rem ============================================================================
SUB Mois_Suivant()
    dim_local n,nb
    month = month+1
    if month > 12 then month = 1 : year = year + 1
    caption 100,Month_Name$(month)  + "  " + str$(year)
    nb = NbJours(month,year)
    delete 1 : Grille(nb)
    Run()
END_SUB
rem ============================================================================
SUB Affiche(n)
    dim_local i
    grid_write 1,1,1,"Jour"
    grid_write 1,1,2," Farjr"
    grid_write 1,1,3,"Sunrise"
    grid_write 1,1,4," Dhuhr"
    grid_write 1,1,5,"  Asr"
    grid_write 1,1,6,"Maghrib"
    grid_write 1,1,7,"  Isha"
    for i = 1 to n : grid_write 1,i+1,1,str$(i) : next i    
    for i = 0 to 5 : grid_write 1,n+1,i+2,prayTime$(i) : next i  
    inactive 70      
END_SUB
rem ============================================================================
' Méthodes du calcul selon différentes Ecoles
data "Algerian Minister of Religious Affairs and Wakfs : Fajr: 18.0° - Isha'a: 17.0°"
data "Egyptian General Authority                       : Fajr: 19.5° - Isha'a: 17.5°"
data "Egyptian General Authority (Bis)                 : Fajr: 20.0° - Isha'a: 18.0°"
data "France UOIF - Angle 12°                          : Fajr: 12.0° - Isha'a: 12.0°"
data "France - Angle 15°                               : Fajr: 15.0° - Isha'a: 15.0°"
data "France - Angle 18°                               : Fajr: 18.0° - Isha'a: 18.0°"
data "Islamic University, Karachi                      : Fajr: 18.0° - Isha'a: 18.0°"
data "JAKIM (Jabatan Kemajuan Islam Malaysia)          : Fajr: 20.0° - Isha'a: 18.0°"
data "MUIS (Majlis Ugama Islam Singapura               : Fajr: 20.0° - Isha'a: 18.0°"
data "Muslim World League (MWL)                        : Fajr: 18.0° - Isha'a: 17.0°"
data "North America (ISNA)                             : Fajr: 15.0° - Isha'a: 15.0°"
data "Shia Ithna Ashari (Jafari)                       : Fajr: 16.0° - Isha'a: 14.0°"
data "SIHAT/KEMENAG (Kementerian Agama RI)             : Fajr: 20.0° - Isha'a: 18.0°"
data "Tunisian Ministry of Religious Affairs           : Fajr: 18.0° - Isha'a: 18.0°"
data "General Authority of Islamic Affairs And Endowments : Fajr: 19.5° - Isha'a: 90 min"
data "Umm Al-Qura, Makkah                              : Fajr: 18.5° - Isha'a: 90 min"
data "University of Tehran                             : Fajr: 17.7° - Isha'a: 15.0°"
rem ============================================================================
' C'est la procédure qui fait tous les calculs
SUB CalcPrayerTimes(day,month,year,fajrTwilight,ishaTwilight)  
    latitude = val(text$(21)) : longitude = val(text$(31)) : TimeZone = val(text$(41)) : radians
    dst = val(text$(46))
    select item_index(51)
        case 01 : FajrTwilight = -18.0 : ishaTwilight = -17.0  : ' Algerian Minister of Religious Affairs and Wakfs
        case 02 : FajrTwilight = -19.5 : ishaTwilight = -17.5  : ' Egyptian General Authority
        case 03 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' Egyptian General Authority (Bis)
        case 04 : FajrTwilight = -12.0 : ishaTwilight = -12.0  : ' France UOIF - Angle 12°      
        case 05 : FajrTwilight = -15.0 : ishaTwilight = -15.0  : ' France - Angle 15°
        case 06 : FajrTwilight = -18.0 : ishaTwilight = -18.0  : ' France - Angle 18°        
        case 07 : FajrTwilight = -18.0 : ishaTwilight = -18.0  : ' Islamic University, Karachi
        case 08 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' JAKIM (Jabatan Kemajuan Islam Malaysia)
        case 09 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' MUIS (Majlis Ugama Islam Singapura
        case 10 : FajrTwilight = -18.0 : ishaTwilight = -17.0  : ' Muslim World League (MWL)
        case 11 : FajrTwilight = -15.0 : ishaTwilight = -15.0  : ' North America (ISNA)
        case 12 : FajrTwilight = -16.0 : ishaTwilight = -14.0  : ' Shia Ithna Ashari (Jafari)
        case 13 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' SIHAT/KEMENAG (Kementerian Agama RI)
        case 14 : FajrTwilight = -18.0 : ishaTwilight = -18.0  : ' Tunisian Ministry of Religious Affairs  
        case 15 : FajrTwilight = -19.5 : ' Isha'a: 90 min      : ' UAE General Authority of Islamic Affairs And Endowments
        case 16 : FajrTwilight = -18.5 : ' Isha'a: 90 min      : ' Umm Al-Qura, Makkah
        case 17 : FajrTwilight = -17.7 : ishaTwilight = -15.0  : ' University of Tehran
    end_select
    D = (367 * year) - ((year + int((month + 9) / 12)) * 7 / 4) + ((int(275 * month / 9)) + day - 730531.5)
    L = 280.461 + 0.9856474 * D : L = moreLess360(L)
    M = 357.528 + (0.9856003) * D : M = moreLess360(M)
    Lambda = L + 1.915 * sin(degToRad(M)) + 0.02 * sin(degToRad(2 * M))
    Lambda = moreLess360(Lambda)    
    Obliquity = 23.439 - 0.0000004 * D    
    Alfa = radToDeg(atn((cos(degToRad(Obliquity)) * tan(degToRad(Lambda)))))
    Alfa = moreLess360(Alfa)
    Alfa = Alfa - (360 * (int(Alfa / 360)))
    Alfa = Alfa + 90 * (int(Lambda / 90) - int(Alfa / 90))    
    ST = 100.46 + 0.985647352 * D
    Dec = radToDeg(asin(sin(degToRad(Obliquity)) * sin(degToRad(Lambda))))
    a = (sin(degToRad(-0.8333)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))
    if abs(a) > 1  : ' le soleil ne se couche pas
       FajrTime = -1 : sunRiseTime = -1
       asrTime  = -1 : maghribTime = -1 : ishaTime = -1
       exit_sub
    end_if    
    Durinal_Arc = radToDeg(acos((sin(degToRad(-0.8333)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))))  
    Noon = Alfa - ST
    Noon = moreLess360(Noon)    
    UT_Noon = Noon - longitude
' ------------------------------------------------------------------------------    
' Calculating Prayer Times Arcs & Times
' ------------------------------------------------------------------------------    
' Zuhr Time (Local noon)
    zuhrTime = UT_Noon / 15 + timeZone + dst    
    if standard = 1 : ' Asr Standard (Shafii, Maliki, Hanbali)
       Asr_Alt = radToDeg(atn(1 + tan(degToRad(abs(latitude - Dec)))))
    else            : ' Asr Hanafi      
       Asr_Alt = radToDeg(atn(2 + tan(degToRad(abs(latitude - Dec)))))
    end_if
    a = (sin(degToRad(90 - Asr_Alt)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))
    if abs(a) > 1  
       FajrTime = -1 : sunRiseTime = -1
       asrTime  = -1 : maghribTime = -1 : ishaTime = -1
       exit_sub
    end_if  
    Asr_Arc = radToDeg(acos((sin(degToRad(90 - Asr_Alt)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))))
    Asr_Arc = Asr_Arc / 15
'  Asr Time
    asrTime = zuhrTime + Asr_Arc
' Shorouq Time        
    sunRiseTime = zuhrTime - (Durinal_Arc / 15)
' Maghrib Time
    maghribTime = zuhrTime + (Durinal_Arc / 15)
    a = (sin(degToRad(ishaTwilight)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))    
    if abs(a) > 1  : ' le soleil ne se lève pas
       FajrTime = -1 : sunRiseTime = -1
       asrTime  = -1 : maghribTime = -1 : ishaTime = -1
       exit_sub
    end_if
    Esha_Arc = radToDeg(acos((sin(degToRad(ishaTwilight)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))))      
' Isha Time
    ishaTime = zuhrTime + (Esha_Arc / 15)
' Fajr Time
    a = (sin(degToRad(fajrTwilight)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))
    if abs(a) > 1  
       FajrTime = -1 : sunRiseTime = -1
       asrTime  = -1 : maghribTime = -1 : ishaTime = -1
       exit_sub
    end_if
    Fajr_Arc = radToDeg(acos((sin(degToRad(fajrTwilight)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))))
    fajrTime = zuhrTime - (Fajr_Arc / 15)
                        
END_SUB
rem ============================================================================
SUB Aide()
    dim_local t$
    t$ = "Aide sur le programme" + chr$(13)
    t$ = t$ + "Au lancement du programme, il affiche les résultats du calcul pour la ville de Moknine (Tunisie) pour le mois en cours" + chr$(13)
    t$ = t$ + "et propose comme méthode de calcul (dans le COMBO Méthode) celle appliquée en Tunisie (Tunisian Ministry of Religious)" + chr$(13)
    t$ = t$ + "Pour les autres pays, vous pouvez opter pour l'une des métodes proposées dans le COMBO, surtout si votre ville se situe aux" + chr$(13)
    t$ = t$ + "altitudes supérieures à 45°"+chr$(13)
    t$ = t$ + "Il propose un choix parmi 8 pays qui vous permettent d'en choisir une ville parmi celles qui sont proposées." + chr$(13)
    t$ = t$ + "Si votre ville ne s'y trouve pas, vous avez la possibilité d'entrer manuellement ses coordonnées (Latitude, Longitude, Fuseau, DST)" + chr$(13)
    t$ = t$ + "Vous pouvez aussi l'ajouter dans le code dans les lignes DATA." + chr$(13)
    t$ = t$ + "En optant pour l'un des pays proposé, vous activez un COMBO vous permettant de choisir une ville." + chr$(13)
    t$ = t$ + "Le COMBO DST c'est pour le choix de l'heure d'été (valeurs possibles : 0 pas de passage; 1 passage à l'heure d'été." + chr$(13)
    t$ = t$ + "Les boutons 'main' indiquant la gauche c'est pour le mois précédent, tandis que celle qui indique la droite c'est pour le mois suivant." + chr$(13)
    t$ = t$ + chr$(13)    
    t$ = t$ + "Après chaque modification et pour lancer un nouveau calcul,cliquez sur le bouton 'Calculer' (La Palice ne peut pas dire mieux !)" + chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "Note :" + chr$(13)
    t$ = t$ + "L’horaire de la prière de Ichaa correspond à la disparition du crépuscule (12° à 18°) après le coucher du Soleil." + chr$(13)
    t$ = t$ + "L'Arabie Saoudite, par exemple ajoute 90 mn à l'heure du Maghrib pour obtenir celle du Icha"+ chr$(13)
    t$ = t$ + " et ajoute 120 mn pour le mois de Ramadan."+ chr$(13)
    t$ = t$ + chr$(13) + chr$(13)    
    t$ = t$ + "Pour information :" + chr$(13)
    t$ = t$ + "******************" + chr$(13)
    t$ = t$ + "La définition de l'heure du salat Asr divise les écoles islamiques en deux positions dogmatiques." + chr$(13)
    t$ = t$ + "Les trois écoles juridiques Malikite, Hambalite et Shafite soutiennent que le Asr commence lorsque la taille d'un objet vertical est la taille de son ombre." + chr$(13)
    t$ = t$ + "Cette méthode est celle adoptée généralement dans les communautés du Maghreb (d'obédience Malikite)." + chr$(13)
    t$ = t$ + "La quatrième école Hanafite estime que le Asr commence lorsque l'ombre d'un objet vertical est le double de la taille de cet objet."+chr$(13)
    t$ = t$ + "Cette nette différence dogmatique entraîne des écarts dans les horaires de salat sur les calendriers correspondant à un même endroit." + chr$(13)
    t$ = t$ + "Le programme vous permet de choisir votre doctrine réligieuse (Madh-hab) dans le COMBO 'Calcul Asr'. " + chr$(13)
    t$ = t$ + chr$(13) + chr$(13)
    t$ = t$ + "Le programme est fourni comme tel sans aucune garantie des résultats."+chr$(13)
    t$ = t$ + "En aucun cas je ne serais responsable de dommages résultants de l'utilisation de cette application."    
    message t$
END_SUB
rem ============================================================================
SUB Culture()
    dim_local t$
    t$ = "Méthode de calcul des horaires de prières" + chr$(13)
    t$ = t$ + "Les prières (pour les Musulmans) sont au nombre de cinq par journée." + chr$(13)
    t$ = t$ + "Les horaires de ces cinq prières varient d'un endroit (ville) à l'autre et d'un jour à l'autre." + chr$(13)
    t$ = t$ + "Le calcul fait intervenir les heures du crépuscule, mais lequel ?" + chr$(13)
    t$ = t$ + "Il existe trois types de crépuscules : " + chr$(13)
    t$ = t$ + "Le crépuscule astronomique : il intervient lorsque le soleil se situe "
    t$ = t$ + "en dessous de l’horizon à une hauteur de 18°, et il correspond au moment" + chr$(13)
    t$ = t$ + "où l’obscurité totale s’installe au niveau de cet horizon." + chr$(13)
    t$ = t$ + "Le crépuscule nautique : il intervient lorsque le soleil se situe en dessous de l’horizon à une hauteur de 12°." + chr$(13)
    t$ = t$ + "Le crépuscule civil : il intervient lorsque le soleil se situe en dessous de l’horizon à une hauteur de 06°." + chr$(13)
    t$ = t$ + "Or, il s’est avéré que le fait de se baser sur le crépuscule astronomique (18°) pour le calcul des heures de prière "
    t$ = t$ + "pose des difficultés pour les pays d’Europe." + chr$(13)
    t$ = t$ + "Il est impossible de calculer les horaires de la prière du Fajr à partir du 18° et ce à partir de la mi-mai jusqu’à la mi-juin environ."+chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "L’écart entre le Fajr et celui du lever du soleil (Chourouk) se creuse pour atteindre un record de 3h40 min en période d’été." + chr$(13)
    t$ = t$ + "L’écart entre la prière de Ichaa et celle du Fajr se réduit durant des semaines en période d’été." + chr$(13)
    t$ = t$ + "A titre d’exemple : le 28 mai à Paris en se basant sur le 18°, la prière de Ichaa est à 00h18 et la prière du Fajr est à 02h59 !" + chr$(13)
    t$ = t$ + "Soit un écart de 2h41mn."+chr$(13)
    t$ = t$ + "Par contre, retenir le critère du 12° (le crépuscule nautique) permet de surmonter ces difficultés." + chr$(13)
    t$ = t$ + "D’une part, l’écart entre la prière du Fajr et celle du lever du soleil (Chourouk) n’excède jamais 02 heures durant toute l’année."+chr$(13)
    t$ = t$ + "D’autre part, l’écart entre la prière du Ichaa et celle du Fajr reste constamment importante."+chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "Le fait d'opter pour ce critère du 12° permet d’alléger la contrainte sur les musulmans vivant en Europe pour cette pratique cultuelle " + chr$(13)
    t$ = t$ + "et surtout durant le mois de Ramadan et spécialement en période d’été." + chr$(13)
    t$ = t$ + "L’avantage de ce choix réside dans la possibilité de l’utiliser durant toute l’année, à l’inverse de celui du 18°." + chr$(13)
    t$ = t$ + "Certains pays ajoutent 5 minutes en plus par précaution pour les horaires de Dhohr et du Maghrib" + chr$(13)
    t$ = t$ + "L’horaire du Asr est calculé selon la règle islamique où l’ombre de chaque objet devient égale à celui-ci." + chr$(13)
    t$ = t$ + "Mais certains pays utilisent d'autres critères, ce qui ne facilite pas la tâche !" + chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "En résumé : " + chr$(13)
    t$ = t$ + "* Prière de l'aube (matin) (Fajr) : Le début coïncide avec la fin du délai de d'Isha, soit lorsque le soleil remonte à 19 ° sous l'horizon." + chr$(13)
    t$ = t$ + "  La fin est atteinte au lever du soleil avec le limbe supérieur du soleil tangent à l'horizon soit h = - 0,267°"+ chr$(13)
    t$ = t$ + "* Prière de la mi-journée (midi) (Dhur) : la durée permise commence quand le soleil a traversé le méridien (soit quand l'ombre d'un objet a commencé à "
    t$ = t$ + "  augmenter) et se termine lorsque l'ombre d'un gnomon s'est allongée d'un quart de sa hauteur par rapport à son ombre à midi." + chr$(13)
    t$ = t$ + "* Prière de l'après-midi ('Asr) : l'intervalle commence lorsque l'augmentation de l'ombre est égale à la longueur du gnomon et se termine quand l'ombre en a atteint le double." + chr$(13)
    t$ = t$ + "* Prière du coucher de soleil (Maghrib) : Le début coïncide avec la disparition totale du soleil sous l'horizon , soit pour h = -0.267°."+chr$(13)
    t$ = t$ + "  La fin du délai est atteinte à la dernière lueur du crépuscule, soit le soleil à 18° sous l'horizon."+chr$(13)
    t$ = t$ + "  Attention, cette condition peut être irréalisable à certaines dates pour certaines latitudes." + chr$(13)
    t$ = t$ + "* Prière de la nuit ('Isha) : Le début coïncide avec la fin du délai de Maghrib, soit le soleil à 17° sous l'horizon." + chr$(13)
    t$ = t$ + "  La fin du délai est atteinte avec l'apparition de l'aube lorsque le soleil remonte à 19° sous l'horizon." + chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "Note :" + chr$(13)
    t$ = t$ + "Les opinions divergent sur les angles à utiliser pour le calcul de Fajr et Isha." +chr$(13)
    t$ = t$ + "La mosquée de Paris retient 15° pour Fajr et 18° pour Isha." + chr$(13) + chr$(13)  
    t$ = t$ + chr$(13)
    t$ = t$ + "Pour des plus amples informations sur le calcul des horaires de prière, référez-vous à : " + chr$(13)
    t$ = t$ + "http://www.averroes-aveyron.fr/medias/files/methodes-de-calcul.pdf" + chr$(13)    
    message t$
END_SUB
rem ============================================================================
' Liste des pays : nom du pays, fuseau horaire du pays et flag pour heure d'été (1 oui, 0 non)
data "Algérie" ,1,0 , "Belgique",1,1 ,"Egypte",2,0 , "France",1,1, "Lybie",2,0
data "Maroc",0 , 0, "Arabie Saoudite",3,0 ,"Tunisie",1,0
' ------------------------------------------------------------------------------
data "Algérie"  : ' UTC + 1 ; DST 0
' -----------
1:
'     Ville             Latitude   Longitude
data "Adrar" ,          27.850,    -0.317  
data "Alger" ,          36.833,     3.000
data "Annaba" ,         36.917,     7.783  
data "Batna" ,          35.567,     6.167    
data "Bechar" ,         31.583,    -2.283
data "Bejaia" ,         36.817,     5.050  
data "Biskra" ,         34.833,     5.683  
data "Blida" ,          36.500,     2.833  
data "Boussaada" ,      35.167,     4.150  
data "Constantine" ,    36.367,     6.667  
data "El Asnam" ,       36.183,     1.350    
data "El Djelfa" ,      34.717,     3.233  
data "Ghardaia" ,       32.333,     3.667
data "Laghouat" ,       33.817,     2.917
data "Mostaganem" ,     35.900,     0.083  
data "M'Sila" ,         35.667,     4.517
data "Oran" ,           35.750,    -0.633
data "Ouargla" ,        32.000,     5.267
data "Setif" ,          36.183,     5.400  
data "Sidi-bel-Abbes" , 35.250,    -0.650
data "Skikda" ,         36.883,     6.900  
data "Tamanrasset" ,    22.833,     5.467
data "Tebessa" ,        35.350,     8.100  
data "Tiaret" ,         35.333,     1.333
data "Tilimsen" ,       34.883,    -1.350      
data "Tizi-Ouzou" ,     36.733,     4.083  
data "FIN"  
' ------------------------------------------------------------------------------
data "Belgique" : ' UTC + 1  UTC + 2 Heure d'été
' -----------
2:
'     Ville             Latitude   Longitude
data "Antwerp" ,        51.217,   4.417  
data "Brussels" ,       50.850,   4.350  
data "Charleroi" ,      50.417,   4.450
data "Gent" ,           51.033,   3.700
data "Liege" ,          50.633,   5.583  
data "Ostende" ,        51.217,   2.917    
data "Mons" ,           50.467,   3.967      
data "Namur" ,          50.467,   4.867
data "FIN"
' ------------------------------------------------------------------------------
data "Egypte"  : ' UTC + 2
' -------------------------------------
3:
'     Ville             Latitude   Longitude
data "Abou Simbel" ,    22.317,   31.633  
data "Alexandria" ,     31.217,   29.917
data "Aswan" ,          24.083,   32.933
data "Asyut" ,          27.233,   31.117
data "Beni-Souef" ,     29.083,   31.083  
data "Cairo" ,          30.050,   31.250
data "Damanhur" ,       31.050,   30.467
data "Dumyat" ,         31.433,   31.800
data "El Alamein" ,     30.833,   28.950
data "Helwan" ,         29.850,   31.333
data "Isma'ilia" ,      30.600,   32.250  
data "Karnak" ,         25.683,   32.667  
data "Port Said" ,      31.283,   32.300    
data "Sohag" ,          26.550,   31.700
data "Suez" ,           29.983,   32.550
data "Tanta" ,          30.800,   31.000  
data "Zagazig" ,        30.583,   31.500  
data "FIN"
' -------------------------------------------------------------------------------
data "France" : ' UTC + 1  UTC + 2 Heure d'été
' ----------
4:
'     Ville             Latitude   Longitude
data "Brest" ,          48.383,   -4.500  
data "Quimper" ,        48.000,   -4.100  
data "Lorient" ,        47.750,   -3.350  
data "St-Brieuc" ,      48.517,   -2.750  
data "Vannes" ,         47.667,   -2.733    
data "St Nazaire" ,     47.283,   -2.200  
data "Rennes" ,         48.100,   -1.667  
data "Cherbourg" ,      49.633,   -1.617  
data "Nantes" ,         47.233,   -1.583  
data "La-Roche-sur-Yon" , 46.633, -1.500
data "Bayonne" ,        43.500,   -1.467
data "La Rochelle" ,    46.167,   -1.167  
data "St-Lo" ,          49.117,   -1.083  
data "Laval" ,          48.067,   -0.750    
data "Bordeaux" ,       44.833,   -0.567  
data "Angers" ,         47.483,   -0.533  
data "Mont-de-Marsan" , 43.900,   -0.500  
data "Niort" ,          46.317,   -0.450  
data "Pau" ,            43.300,   -0.367  
data "Caen" ,           49.183,   -0.367
data "Alençon" ,        48.417,    0.083  
data "Tarbes" ,         43.233,    0.083  
data "Le Havre" ,       49.500,    0.100  
data "Angouleme" ,      45.667,    0.167  
data "Le Mans" ,        48.000,    0.200    
data "Poitiers" ,       46.583,    0.333  
data "Cahors" ,         44.467,    0.433  
data "Auch" ,           43.500,    0.600  
data "Agen" ,           44.200,    0.633  
data "Tours" ,          47.383,    0.700  
data "Perigueux" ,      45.200,    0.733    
data "Dieppe" ,         49.917,    1.083    
data "Rouen" ,          49.433,    1.083  
data "Evreux" ,         49.050,    1.183    
data "Limoges" ,        45.833,    1.250    
data "Montauban" ,      44.017,    1.333  
data "Blois" ,          47.600,    1.333  
data "Toulouse" ,       43.617,    1.450    
data "Chartres" ,       48.450,    1.500    
data "Foix" ,           42.950,    1.583  
data "Chateauroux" ,    46.817,    1.683    
data "Tulle" ,          45.267,    1.767    
data "Abbeville" ,      50.100,    1.850    
data "Gueret" ,         46.167,    1.866  
data "Orleans" ,        47.900,    1.900  
data "Vierzon" ,        47.233,    2.050  
data "Pontoise" ,       49.050,    2.083  
data "Beauvais" ,       49.433,    2.083  
data "Versailles" ,     48.800,    2.133  
data "Albi" ,           43.933,    2.144    
data "Nanterre" ,       48.883,    2.217    
data "Amiens" ,         49.900,    2.300  
data "Paris" ,          48.833,    2.333    
data "Bourges" ,        47.083,    2.383    
data "Carcassonne" ,    43.217,    2.350  
data "Dunkerque" ,      51.033,    2.383  
data "Aurillac" ,       44.933,    2.433    
data "Bobigny" ,        48.917,    2.450  
data "Créteil" ,        48.783,    2.467    
data "Melun" ,          48.533,    2.557
data "Evry" ,           48.633,    2.567    
data "Rodez" ,          44.350,    2.567  
data "Montlucon" ,      46.333,    2.600    
data "Arras" ,          50.283,    2.767    
data "Lens" ,           50.433,    2.833  
data "Perpignan" ,      42.700,    2.900  
data "Lille" ,          50.650,    3.083  
data "Clermont-Ferrand",45.783,    3.083      
data "Nevers" ,         47.000,    3.150    
data "Moulins" ,        46.567,    3.333  
data "Mende" ,          44.533,    3.500    
data "Auxerre" ,        47.800,    3.583    
data "Laon" ,           49.567,    3.617    
data "Montpellier" ,    43.600,    3.883      
data "Le Puy" ,         45.050,    3.883    
data "Avallon" ,        47.500,    3.900  
data "Reims" ,          49.250,    4.033  
data "Troyes" ,         48.300,    4.083    
data "Roanne" ,         46.033,    4.083    
data "Nimes" ,          43.500,    4.350    
data "Chalons-S-Marne", 48.967,    4.367    
data "St-Etienne" ,     45.433,    4.383    
data "Privas" ,         44.733,    4.600    
data "Mezières" ,       49.767,    4.733    
data "Avignon" ,        43.933,    4.800    
data "Lyon" ,           45.767,    4.833      
data "Macon" ,          45.300,    4.833    
data "Valence" ,        44.933,    4.900    
data "Dijon" ,          47.333,    5.033    
data "Chaumont" ,       48.117,    5.133    
data "Bar-le-Duc" ,     48.767,    5.167    
data "Bourg" ,          46.200,    5.217
data "Observatoire SIRENE" , 44.000, 5.333  
data "Marseille " ,     43.300,    5.367  
data "Lons-le-Saunier", 46.683,    5.550  
data "Grenoble" ,       45.183,    5.717    
data "Toulon" ,         43.117,    5.917  
data "Chambéry" ,       45.567,    5.917    
data "Besancon" ,       47.250,    5.983    
data "Gap" ,            44.550,    6.083  
data "Annecy" ,         45.900,    6.117  
data "Metz" ,           49.117,    6.183  
data "Vesoul" ,         47.633,    6.150    
data "Nancy" ,          48.700,    6.200  
data "Digne" ,          44.083,    6.233  
data "Epinal" ,         48.167,    6.467  
data "Belfort" ,        47.633,    6.867    
data "Cannes" ,         43.550,    7.000    
data "Nice" ,           43.700,    7.267    
data "Colmar" ,         48.083,    7.350  
data "Mulhouse" ,       47.750,    7.350    
data "Strasbourg" ,     48.583,    7.750  
data "Ajaccio" ,        41.917,    8.717    
data "Bastia" ,         42.683,    9.433
data "FIN"
' ------------------------------------------------------------------------------
data "Libye"  :' UTC + 2
' ---------
5:
'     Ville             Latitude   Longitude
data "Sabratah" ,       32.833,    12.400  
data "Tripoli" ,        32.967,    13.200  
data "Al Khums" ,       32.650,    14.250  
data "Sabhah" ,         27.050,    14.433    
data "Benghazi" ,       32.117,    20.083  
data "Ajdabiyah" ,      30.800,    20.250    
data "Al Marj" ,        32.500,    20.833                
data "Darnah" ,         32.767,    22.650    
data "Tubruq" ,         32.100,    23.933  
data "FIN"
' ------------------------------------------------------------------------------

data "Moroc" : ' UTC + 0
' ---------
6:
'     Ville             Latitude   Longitude
data "Agadir" ,         30.500,   -9.667    
data "Safi" ,           32.300,   -9.333    
data "El Jadida" ,      33.183,   -8.283    
data "Marrakech" ,      31.817,   -8.000  
data "Settat" ,         33.067,   -7.617    
data "Casablanca" ,     33.650,   -7.583    
data "Mohammedia" ,     33.717,   -7.333    
data "Khouribga" ,      32.900,   -6.950  
data "Sale" ,           34.067,   -6.833    
data "Kenitra" ,        34.333,   -6.567    
data "Beni Mellal" ,    32.367,   -6.483  
data "Khemisset" ,      33.833,   -6.050    
data "Ksar el Kebir" ,  35.067,   -5.933    
data "Tanger" ,         35.800,   -5.833    
data "Meknes" ,         33.883,   -5.617    
data "Tetouan" ,        35.567,   -5.367    
data "Ceuta" ,          35.883,   -5.317    
data "Fes" ,            34.083,   -5.000    
data "Taza" ,           34.267,   -4.017    
data "Nador" ,          35.167,   -3.000    
data "Oujda" ,          34.683,   -1.750  
data "FIN"
' ------------------------------------------------------------------------------
rem ============================================================================
data "Arabie Saoudite" : ' UTC + 3
' ----------------
7:
'     Ville             Latitude   Longitude
data "Riyadh" ,         24.650,    46.767  
data "Al Wajh" ,        26.267,    36.467    
data "Tabuk" ,          28.367,    36.533    
data "Yanbu'Al Bahr" ,  24.117,    38.067  
data "Tayma" ,          27.617,    38.500  
data "Jiddah" ,         21.500,    39.167    
data "Khaybar" ,        25.800,    39.200    
data "Medina" ,         24.500,    39.583  
data "Mecca" ,          21.433,    39.817  
data "Al Jawf" ,        29.783,    39.867    
data "Al Lith" ,        20.167,    40.267  
data "At Ta'if" ,       21.250,    40.350    
data "Badanah" ,        31.000,    41.083    
data "Al Qunfidhah" ,   19.150,    41.117    
data "Turabah" ,        21.250,    41.567  
data "Ha'il" ,          27.517,    41.750  
data "bha" ,            18.233,    42.517  
data "Jizan" ,          16.933,    42.550    
data "Buraydah" ,       26.333,    43.983    
data "Najran" ,         17.517,    44.317    
data "Shaqra" ,         25.300,    45.250    
data "Al Artawiyak" ,   26.517,    45.350    
data "Ad Dilam" ,       23.983,    47.100    
data "Haradh" ,         24.200,    49.117    
data "Al Hufuf" ,       25.333,    49.567    
data "Ad Dammam" ,      26.417,    50.100    
data "Al Khurmah" ,     21.917,    42.033
data "FIN"  
' ------------------------------------------------------------------------------
Data "Tunisie" : ' UTC + 1
' -----------
8:
'     Ville             Latitude   Longitude
data "Gafsa" ,          34.467,     8.717  
data "Beja" ,           36.717,     9.217  
data "Bizerte" ,        37.300,     9.867    
data "Kairouan" ,       35.700,     10.017  
data "Gabes" ,          33.867,     10.100  
data "Tunis" ,          36.833,     10.217  
data "Sousse" ,         35.833,     10.633    
data "Sfax" ,           34.750,     10.717  
data "Nabeul" ,         36.500,     10.733
data "Moknine" ,        35.633,     10.833
data "Monastir",        35.777,     10.826
data "Mahdia" ,         35.502,     11.045
data "Jendouba" ,       35.501,     08.783
data "Le Kef" ,         36.179,     08.714
data "Siliana" ,        35.990,     09.278
data "Ariana" ,         36.862,     10.195
data "Ben Arous" ,      36.743,     10.232
data "Kasserine" ,      35.171,     08.828
data "Kebili" ,         33.124,     08.836
data "La Manouba" ,     36.807,     10.101
data "Medenine" ,       33.348,     10.494
data "Sidi Bouzid" ,    35.033,     09.5
data "Tataouine" ,      32.921,     10.450
data "Zaghouan" ,       36.399,     10.147
data "La Soukra" ,      36.883,     10.25
data "La Marsa" ,       36.876,     10.325

data "FIN"  
rem ============================================================================
rem &&&&&&&&&&&&&&&&&&&&&&  FIN DU CODE  &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
rem ============================================================================


Dernière édition par papydall le Jeu 2 Mai 2019 - 20:57, édité 1 fois
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyJeu 2 Mai 2019 - 6:52

Bonjour papydall !

Je viens de télécharger la nouvelle version. C'est une bonne idée !

Par contre il y a un problème sur les horaires des prières...
En choisissant Poitiers (France), puis UOIF 12°, plus rien ne correspond.

Je ne sais pas si ça touche les autres méthodes de calculs.
Bon courage pour cette correction... scratch drunken


Dernière édition par Minibug le Jeu 2 Mai 2019 - 6:56, édité 1 fois
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyJeu 2 Mai 2019 - 6:55

erreur de post ! Wink
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyJeu 2 Mai 2019 - 20:50

Salut tout le monde
Merci Minibug pour le test et surtout pour la découverte d’ un mini-maxibug dû à mon étourderie.
En effet dans le calcul de la Kibla, j’utilise des degrés pour le calcul des fonctions trigonométriques tandis que dans CalcPrayerTimes(day,month,year,fajrTwilight,ishaTwilight)   les calculs se font en radian.
Comme cette unité est prise par défaut par Panoramic, je n’ai pas pensé à la déclarer, or elle a été modifiée en degré dans le calcul de la Kibla.
Bref, il suffit d’ajouter la commande radians dans la sub mentionnée ci-haut.

Code:

rem ============================================================================
' C'est la procédure qui fait tous les calculs
SUB CalcPrayerTimes(day,month,year,fajrTwilight,ishaTwilight)  
    latitude = val(text$(21)) : longitude = val(text$(31)) : TimeZone = val(text$(41))
    dst = val(text$(46)) : radians
    select item_index(51)
....
...

Une fois de plus, merci à tous ceux qui ont testé.
REMARQUE
Je n’arrive plus à poster mon code :
La longueur de votre message dépasse la limite autorisée. Sad
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyJeu 2 Mai 2019 - 20:56

Je viens de remarquer que Panoramic dispose déjà des fonctions RADIAN_TO_DEGREE(A) et DEGREE_TO_RADIAN(A)
Dans mon programme j’ai défini radToDeg() et degToRad() qui font la même chose.

Voici le nouveau code modifié.



Code:

rem ============================================================================
rem                         CalcPrayerTimes.bas
rem              Calculateur des heures de prière par Papydall
rem                             Version 3.0
rem                    Dernière modification : 02 Mai 2019
rem ============================================================================
Init()
Gui()
Afficher_Kibla()
Grille(NbJours(month,year))
Run()
end
rem ============================================================================
SUB Init()
    label clic, change
    label 1, 2, 3, 4, 5, 6, 7, 8 : ' pour restore_label
    dim year, month, day
    dim longitude, latitude, timeZone,fajrTwilight, ishaTwilight
    dim fajrTime, sunRiseTime, zuhrTime, asrTime, maghribTime, ishaTime
    dim d, l, m, lambda, obliquity, alfa, st, dec, durinal_Arc, noon, Ut_Noon
    dim Asr_Alt, Asr_Arc, Esha_Arc, Fajr_Arc
    dim prayTime$(5), standard,nc,Fuseau(8), H_Ete(8)
    dim hours, minutes ,h$, m$, a, n, dst, methode, p$, ville$, pays$
    dim NbPays : NbPays = 8 : ' 8 c'est le nombre des pays proposés dans le programme
    standard = 1 : ' Pour le calcul du Asr : 1 ---> (Shafii, Maliki, Hanbali)                                           ' 0 ---> Hanafi      
    day = date_day : month = date_month : year = date_year : ' La date courante    
END_SUB
rem ============================================================================
SUB GUI()
    dim_local i,t$
    t$ = " Calculateur des heures de prière par Papydall "
    color 0,240,255,255
    width 0,1100 : height 0,800 : top 0,(screen_y - height(0)) / 2
    left 0,(screen_x - width(0))/2
    shape 5 : top 5,5 : left 5,450 : width 5,600 : height 5,50
    shape_rectangle_rounded 5 : color 5,25,100,50
    shape 6 : top 6,5 : left 6,20 : width 6,420 : height 6,50
    shape_rectangle_rounded 6 : color 6,25,100,50
    alpha 10 : top 10,20 : left 10,40 : font_color 10,250,100,50
       font_bold 10      : font_name 10,"tahoma" : font_size 10,12
       caption 10,t$     : caption 0,t$ : application_title t$
    alpha 20 : top 20,80 : left 20,010  : caption 20,"Latitude : "
    edit  21 : top 21,80 : left 21,070  : width 21,60 : font_bold 21 : text 21,"35.633"
       hint 21,"En degrés décimaux (± 90°) positive au Nord" : on_change 21,change
    alpha 30 : top 30,80 : left 30,140  : caption 30,"Longitude : "
    edit  31 : top 31,80 : left 31,210  : width 31,60 : font_bold 31 : text 31,"10.833"
       hint 31,"En degrés décimaux (± 180°) positive à l'est" : on_change 31,change
    alpha 40 : top 40,80 : left 40,285  : caption 40,"Fuseau :"
    spin 41  : top 41,80 : left 41,335  : width 41,60 : min 41,-12 : max 41,12 : font_bold 41
       hint 41,"ZoneTime, décalage heure : Valeurs possibles ± 12" : position 41,1
       on_change 41,change
    alpha 45 : top 45,80 : left 45,420  : caption 45,"DST :" : font_bold 45 : font_name 45,"tahoma"
    combo 46 : top 46,80 : left 46,450  : width 46,50 : hint 46,"Heure d'été"
    on_change 46,change
    alpha 50 : top 50,80 : left 50,520  : caption 50,"Méthode :"  
    combo 51 : top 51,80 : left 51,580  : width 51,480 : font_bold 51  : height 51,40
    font_name 51,"tahoma" : on_change 51,change
    hint 51,"convention de calcul utilisé"    
    alpha 55 :  top 55,130 : left 55,10 : font_bold 55 : font_name 55,"tahoma"
    caption 55,"Calcul Asr :"
    combo 56 : top 56,130 : left 56,80 : font_bold 56 : font_name 56,"tahoma"
    width 56,220 : hint 56,"Doctrines religieuses" :  on_change 56,change
    item_add 56,"Standard (Shafii, Maliki, Hanbali)"
    item_add 56,"Hanafi" : item_select 56,1    
    button 60 : top 60,20 : left 60,950 : caption 60,"Quitter"
    on_click 60,clic
    button 70 : top 70,20 : left 70,470  : caption 70,"Calculer"
    on_click 70,clic : inactive 70  
    button 80 : top 80,120 : left 80,500 : font_bold 80 : font_name 80,"wingdings 2"
    font_size 80,30 : caption 80,"D" : hint 80,"Mois précédent" : on_click 80,clic
    button 90 : top 90,120 : left 90,760 : font_bold 90 : font_name 90,"wingdings 2"
    font_size 90,30 : caption 90,"E" : hint 90,"Mois suivant" : on_click 90,clic
    alpha 100: top 100,130 : left 100,630 : font_bold 100 : font_name 100,"arial"
    font_size 100,12 : caption 100,Month_Name$(month)  + "  " + str$(year)
    item_add 46,0 : item_add 46,1 : item_select 46,1  
    for i = 1 to 17 : read t$ : item_add 51,t$ : next i
    item_select 51,14          
    for i = 20 to 70 step 10 : font_bold i : font_name i,"tahoma" : next i  
    alpha 110 : top 110,180 : left 110,10 : font_bold 110 : font_size 110,12
    font_name 110,"tahoma" : font_color 110, 255,0,0 : caption 110,"Pays : Tunisie"
    alpha 120 : top 120,180 : left 120,220 : font_bold 120 : font_size 120,12
    font_name 120,"tahoma" : font_color 120, 255,0,0 : caption 120,"Ville : Moknine"        
    alpha 130 : top 130,230 : left 130,10 : font_bold 130 : font_name 130,"tahoma"
    font_size 130,12 : font_color 130,0,0,255 : caption 130,"Choix Pays / Villes"    
    alpha 140 : top 140,260 : left 140,60 : font_bold 140 : font_name 140,"Wingdings"
    font_size 140,30 : caption 140,"ê"    
    button 150 : top 150,20 : left 150,600 : font_bold 150 : caption 150,"Aide" : on_click 150,clic
    button 160 : top 160,20 : left 160,740 : font_bold 160 : width 160,150
    caption 160,"Pour votre culture" : on_click 160,clic
    container_option 200 : top 200,300 : left 200,10 : width 200,130 : height 200,35*NbPays +10
    color 200,255,255,0        
    for i = 1 to NbPays
        option 200+i  : parent 200+i,200 : top 200+i,30*i : left 200+i,10
        font_bold 200+i : font_name 200+i,"tahoma" : on_click 200+i,clic      
        read p$ : caption 200+i,p$
        read fuseau(i) : read H_Ete(i)      
    next i  
    combo 300 : top 300,300 : left 300,160
    font_bold 300 : width 300,300 : hide 300 : on_change 300,change    
    picture 400 : top 400,450 : left 400,170 : width 400,300 : height 400,300
    2d_target_is 400 : print_target_is 400
     alpha 410 : top 410,600 : left 410,10 : font_bold 410 : font_name 410,"tahoma"
    font_size 410,10 : font_color 410,255,0,0
    t$ = "Direction de la Kibla" + chr$(13) + "depuis Moknine" + chr$(13) + "Tunisie : "
    caption 410,t$
    hint 410,"Angle en ° à partir du Nord" +chr$(13)+"indiquant la direction de la Kibla"      
    alpha 420 : top 420,630 : left 420,130 : font_bold 420 : font_name 420,"tahoma'
    font_size 420,12 : font_color 420,0,0,0      
    alpha 430 : top 430, 680 : left 430,1 : font_bold 430 : font_name 430,"tahoma"
    font_size 430,10 : font_color 430,0,0,255
    hint 430,"Distance de la Mecque"  
END_SUB
rem ============================================================================
' Formule donnant la distance orthdromique entre deux points du globle exprimés
' par leurs coordonnées (latitude et longitude)
' La formule est donnée en assimilant la Terre à une sphère de 40 000 km de circonférence.
' 1.852 : c'est la valeur en km de un mille marin
' 60 : ce nombre provient du fait que le mille marin (1 852 m) correspond à une
' minute d'arc sur un grand cercle de la surface terrestre, et donc 60 milles
' marins correspondent à un degré.
FNC Distance_Orthodromique(lat1,lon1)
    dim_local lat2,lon2,km,d
    lat2 = 21.433  : lon2 = 39.817  : ' Coordonnées de la Mecque
    degrees
    km = 60*1.852
    d = km*acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon2-lon1))
    d = int(d)
    result d
END_FNC
rem ============================================================================
' Fonction de calcul de la Kibla
' Elle retourne l'angle partant de la direction du nord et compté dans le sens
' rétrograde (sens des aiguilles d'une montre)
FNC Kibla(latitude,longitude)
    dim_local Lat_Meq : ' Latitude de la Mecque
    dim_local Lon_Meq : ' Longitude de la Mecque
    dim_local a,b,c,q,n,d
    Lat_Meq = 21.433 : Lon_Meq = 39.817
    a = Lon_Meq - longitude  : b = latitude :c = Lat_Meq
    degrees
    n = sin(a) :d = cos(b) * tan(c) - sin(b) * cos(a)  
    if d = 0 then result 0 : exit_fnc
    q = atn(n/d)
    if sgn(n) <> sgn(q) then q = q + 180
    if (sgn(n) < 0) and (sgn(q) < 0) then q = q + 360
    result int(q)
END_FNC
rem ============================================================================
SUB Afficher_Kibla()
    dim_local la,lo,xc,yc,r,x,y,a,a1,c$,d
    degrees
    la = val(text$(21)) : lo = val(text$(31))
    xc = width(400)/2 : yc = height(400) / 2 : r = xc-20
    color 400,20,100,20 : font_color 400,255,255,0 : font_bold 400 : font_size 400,10
    2d_fill_color 200,100,020 : 2d_circle xc,yc,r
    2d_pen_width 2
    for a = 0 to 360 step 10 : 2d_line xc,yc,xc+r*cos(a),yc+r*sin(a) : next a    
    2d_fill_color 255,255,255 : 2d_circle xc,yc,r-10
    2d_fill_color 0,0,0 :  2d_circle xc,yc,5
    a = Kibla(la,lo) : r = r-15 : x = xc+r*cos(a-90) : y = yc+r*sin(a-90)
    2d_pen_width 2 : 2d_line xc,yc,x,y
    r = r-15    
    for a1 = a-80 to a-100 step -1 : 2d_poly_to xc+r*cos(a1),yc+r*sin(a1) : next a1  
    2d_poly_to x,y : 2d_fill_color 20,100,20
    print_locate xc-4,2        : print "N"
    print_locate 2*xc-15,yc-10 : print "E"
    print_locate xc-4,2*yc-20  : print "S"
    print_locate 5,yc-10       : print "W"
    d = Distance_Orthodromique(la,lo)
    caption 420, str$(a) + "°"
    caption 430, "Distance orthodromique :" + chr$(13) + str$(d) + " km"
END_SUB
rem ============================================================================
' Tracer une grille en fonction du nombre des jours dans le mois en cours
SUB Grille(n)
    grid 1 : top 1,180 : left 1,500 : width 1,342 : height 1,n*18-8 : grid_row 1,n+1    
    grid_row_fixed 1,1 : grid_row_height 1,16
    grid_column 1,7    : grid_column_fixed 1,1 : grid_column_width 1,50 : font_bold 1
    grid_fixed_color 1,255,255,0 : grid_one_column_width 1,1,30    
    color 1,0,255,255    
    grid_write 1,1,1,"Jour"
    grid_write 1,1,2," Farjr"
    grid_write 1,1,3,"Sunrise"
    grid_write 1,1,4," Dhuhr"
    grid_write 1,1,5,"  Asr"
    grid_write 1,1,6,"Maghrib"
    grid_write 1,1,7,"  Isha"
END_SUB
rem ============================================================================
SUB Run()
    dim_local nb
    nb = NbJours(month,year)  
    for n = 1 to Nb : Go(n) : Affiche(n) : next n
END_SUB
rem ============================================================================
Change:  
    active 70 : caption 420,"": off_change 300
    for nc = 21 to 41 step 10 : off_change nc : next nc
    for nc = 46 to 56 step 10 : off_change nc : next nc    
    if item_index(56) = 1 then standard = 1 : else : standard = 0
    select number_change
        case 21  : if text$(21) = "" then text 21,0
        case 31  : if text$(31) = "" then text 31,0
        case 41  : if text$(41) = "" then text 41,0
                   if abs(val(text$(41))) > 12 then text 41,0
        case 46  : if (text$(46) <> "0") or (text$(46) <> "1") then text 46,0                  
        case 51  : for n = 1 to NbJours(month,year)
                       Go(n) : Affiche(n)  : ' Calculer
                   next n
                   Afficher_Kibla()
        case 56  : for n = 1 to NbJours(month,year)
                       Go(n) : Affiche(n)  : ' Calculer
                   next n
                   Afficher_Kibla()
        case 300 : New_Coord()              
    end_select
    for nc = 21 to 41 step 10 : on_change nc,change : next nc
    for nc = 46 to 56 step 10 : on_change nc,change : next nc
    on_change 300,change
return
rem ============================================================================
' Gestion des clics de l'utilisateur
Clic:
    for nc = 60 to 90 step 10 : off_click nc : next nc
    for nc = 150 to 160 step 10 : off_click nc : next nc
    for nc = 201 to 208 : off_click nc : next nc
    if number_click > 200 then caption 140,"ê î"        
    select number_click
        case 060 : if message_confirmation_yes_no("Vous voulez vraiment quitter ?") = 1 then terminate
        case 070 : for n = 1 to NbJours(month,year)
                       Go(n) : Affiche(n)  : ' Calculer
                   next n
                   Afficher_Kibla() : inactive 70
        case 080 : Mois_Precedant()
        case 090 : Mois_Suivant()
        case 150 : Aide()
        case 160 : Culture()      
        case 201 : restore_label 1 : pays$ = "Algérie"  : List_Ville(number_click-200)
        case 202 : restore_label 2 : pays$ = "Belgique" : List_Ville(number_click-200)
        case 203 : restore_label 3 : pays$ = "Egypte"   : List_Ville(number_click-200)
        case 204 : restore_label 4 : pays$ = "France"   : List_Ville(number_click-200)
        case 205 : restore_label 5 : pays$ = "Lybie"    : List_Ville(number_click-200)
        case 206 : restore_label 6 : pays$ = "Maroc"    : List_Ville(number_click-200)
        case 207 : restore_label 7 : pays$ = "Arabie Saoudite": List_Ville(number_click-200)
        case 208 : restore_label 8 : pays$ = "Tunisie"  : List_Ville(number_click-200)
    end_select
    for nc = 60 to 90 step 10 : on_click nc,clic : next nc
    for nc = 150 to 160 step 10 : on_click nc,clic : next nc
    for nc = 201 to 208 : on_click nc,clic : next nc    
return
rem ============================================================================
SUB Go(day)
    calcPrayerTimes(day,month,year,fajrTwilight,ishaTwilight)
    NumberToHrMin(fajrTime)    : prayTime$(0) = h$ + ":" + m$
    NumberToHrMin(SunRiseTime) : prayTime$(1) = h$ + ":" + m$
    NumberToHrMin(zuhrTime)    : prayTime$(2) = h$ + ":" + m$
    NumberToHrMin(AsrTime)     : prayTime$(3) = h$ + ":" + m$
    NumberToHrMin(MaghribTime) : prayTime$(4) = h$ + ":" + m$    
    if (item_index(51) = 15) or (item_index(51) = 16)
       NumberToHrMin(MaghribTime + 1.5)
       prayTime$(5) = h$ + ":" + m$
    else    
       NumberToHrMin(IshaTime)    : prayTime$(5) = h$ + ":" + m$
    end_if    
END_SUB
rem ============================================================================
SUB New_Coord()
    dim_local t$,t1$,p
    t$ = item_read$(300,item_index(300))
    p = instr(t$,":") : ville$ = left$(t$,p-1) : t$ = mid$(t$,p+1,20)
    p = instr(t$,"/") : t1$ = mid$(t$,p+1,20) : t$ = left$(t$,p-1)
    text 21,t$ : text 31,t1$  
    caption 110,"Pays : " + pays$ : caption 120,"Ville : " + ville$
    t$ = "Direction de la Qibla" + chr$(13) + "depuis "
    t1$ = ville$ + chr$(13) + pays$ + " : "
    caption 410,t$ + t1$
    grid_clear 1,NbJours(month,year)+1 ,7
END_SUB
rem ============================================================================
SUB List_Ville(p)
    clear 300
    position 41,fuseau(p)
    item_select 46,H_Ete(p) + 1
    read ville$
    while ville$ <> "FIN"
        ville$ = ville$ + " : "
        read latitude : read longitude
        item_add 300,ville$  + str$(latitude) + " / " + str$(longitude)
        read ville$
    end_while
    item_select 300,1  : sort_on 300 : show 300  : inactive 70      
END_SUB
rem ============================================================================
' Ramener la valeur de value entre 0 et 360
FNC moreLess360(value)
    while (value > 360) or (value < 0)
        if value > 360
           value = value - 360
        else
           if value < 0
              value = value + 360
           end_if
        end_if
    end_while
    result value              
END_FNC
rem ============================================================================
' Ramener la valeur de value entre 0 et 24
FNC moreLess24(value)
    while (value > 24) or (value < 0)
        if value > 24
           value = value - 24
        else
           if value < 0
              value = value + 24
           end_if
        end_if
    end_while
    result value
END_FNC
rem ============================================================================
' convertir le nombre  number en heurs et Minutes
SUB NumberToHrMin(number)
    if number = -1 then h$ = "--" : m$ = "--" : exit_sub
    hours   = int(moreLess24(number))    
    minutes = int(moreLess24(number - hours) * 60)
    h$ = str$(hours) : m$ = str$(minutes)
    if len(h$) < 2 then h$ = "0" + h$
    if len(m$) < 2 then m$ = "0" + m$    
END_SUB
rem ============================================================================
FNC Month_Name$(mois)
    dim_local m$
    select mois
        case 01 : m$ = "Janvier"
        case 02 : m$ = "Février"
        case 03 : m$ = "Mars"
        case 04 : m$ = "Avril"
        case 05 : m$ = "Mai"
        case 06 : m$ = "Juin"
        case 07 : m$ = "Juillet"
        case 08 : m$ = "Août"
        case 09 : m$ = "Septembre"
        case 10 : m$ = "Octobre"
        case 11 : m$ = "Novembre"
        case 12 : m$ = "Décembre"
    end_select
    result m$
END_FNC
rem ============================================================================
' Fonction qui retourne 1 si l'argument (annee) représente une année bisextile
' 0 sinon
FNC Bisextile(annee)
    if (mod(annee,4) = 0) and ((mod(annee,100) <> 0) or (mod(annee,400) = 0))
       result 1
    else
       result 0
    end_if
END_FNC
rem ============================================================================
' Déterminer le nombre de jours dans un mois (mois) pour une année (annee)
FNC NbJours(mois,annee)
    dim_local n
    select mois
        case 01 : n = 31
        case 02 : n = 28 : if bisextile(annee) > 0 then n = n + 1
        case 03 : n = 31
        case 04 : n = 30
        case 05 : n = 31
        case 06 : n = 30
        case 07 : n = 31
        case 08 : n = 31
        case 09 : n = 30
        case 10 : n = 31
        case 11 : n = 30
        case 12 : n = 31        
    end_select
    result n
END_FNC
rem ============================================================================
SUB Mois_Precedant()
    dim_local n,nb
    month = month-1
    if month < 1 then month = 12 : year = year - 1
    caption 100,Month_Name$(month)  + "  " + str$(year)
    nb = NbJours(month,year)
    delete 1 : Grille(nb)
    Run()    
END_SUB
rem ============================================================================
SUB Mois_Suivant()
    dim_local n,nb
    month = month+1
    if month > 12 then month = 1 : year = year + 1
    caption 100,Month_Name$(month)  + "  " + str$(year)
    nb = NbJours(month,year)
    delete 1 : Grille(nb)
    Run()
END_SUB
rem ============================================================================
SUB Affiche(n)
    dim_local i
    grid_write 1,1,1,"Jour"
    grid_write 1,1,2," Farjr"
    grid_write 1,1,3,"Sunrise"
    grid_write 1,1,4," Dhuhr"
    grid_write 1,1,5,"  Asr"
    grid_write 1,1,6,"Maghrib"
    grid_write 1,1,7,"  Isha"
    for i = 1 to n : grid_write 1,i+1,1,str$(i) : next i    
    for i = 0 to 5 : grid_write 1,n+1,i+2,prayTime$(i) : next i  
    inactive 70      
END_SUB
rem ============================================================================
' Méthodes du calcul selon différentes Ecoles
data "Algerian Minister of Religious Affairs and Wakfs : Fajr: 18.0° - Isha'a: 17.0°"
data "Egyptian General Authority                       : Fajr: 19.5° - Isha'a: 17.5°"
data "Egyptian General Authority (Bis)                 : Fajr: 20.0° - Isha'a: 18.0°"
data "France UOIF - Angle 12°                          : Fajr: 12.0° - Isha'a: 12.0°"
data "France - Angle 15°                               : Fajr: 15.0° - Isha'a: 15.0°"
data "France - Angle 18°                               : Fajr: 18.0° - Isha'a: 18.0°"
data "Islamic University, Karachi                      : Fajr: 18.0° - Isha'a: 18.0°"
data "JAKIM (Jabatan Kemajuan Islam Malaysia)          : Fajr: 20.0° - Isha'a: 18.0°"
data "MUIS (Majlis Ugama Islam Singapura               : Fajr: 20.0° - Isha'a: 18.0°"
data "Muslim World League (MWL)                        : Fajr: 18.0° - Isha'a: 17.0°"
data "North America (ISNA)                             : Fajr: 15.0° - Isha'a: 15.0°"
data "Shia Ithna Ashari (Jafari)                       : Fajr: 16.0° - Isha'a: 14.0°"
data "SIHAT/KEMENAG (Kementerian Agama RI)             : Fajr: 20.0° - Isha'a: 18.0°"
data "Tunisian Ministry of Religious Affairs           : Fajr: 18.0° - Isha'a: 18.0°"
data "General Authority of Islamic Affairs And Endowments : Fajr: 19.5° - Isha'a: 90 min"
data "Umm Al-Qura, Makkah                              : Fajr: 18.5° - Isha'a: 90 min"
data "University of Tehran                             : Fajr: 17.7° - Isha'a: 15.0°"
rem ============================================================================
' C'est la procédure qui fait tous les calculs
SUB CalcPrayerTimes(day,month,year,fajrTwilight,ishaTwilight)  
    latitude = val(text$(21)) : longitude = val(text$(31)) : TimeZone = val(text$(41))
    dst = val(text$(46))
    radians
    select item_index(51)
        case 01 : FajrTwilight = -18.0 : ishaTwilight = -17.0  : ' Algerian Minister of Religious Affairs and Wakfs
        case 02 : FajrTwilight = -19.5 : ishaTwilight = -17.5  : ' Egyptian General Authority
        case 03 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' Egyptian General Authority (Bis)
        case 04 : FajrTwilight = -12.0 : ishaTwilight = -12.0  : ' France UOIF - Angle 12°      
        case 05 : FajrTwilight = -15.0 : ishaTwilight = -15.0  : ' France - Angle 15°
        case 06 : FajrTwilight = -18.0 : ishaTwilight = -18.0  : ' France - Angle 18°        
        case 07 : FajrTwilight = -18.0 : ishaTwilight = -18.0  : ' Islamic University, Karachi
        case 08 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' JAKIM (Jabatan Kemajuan Islam Malaysia)
        case 09 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' MUIS (Majlis Ugama Islam Singapura
        case 10 : FajrTwilight = -18.0 : ishaTwilight = -17.0  : ' Muslim World League (MWL)
        case 11 : FajrTwilight = -15.0 : ishaTwilight = -15.0  : ' North America (ISNA)
        case 12 : FajrTwilight = -16.0 : ishaTwilight = -14.0  : ' Shia Ithna Ashari (Jafari)
        case 13 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' SIHAT/KEMENAG (Kementerian Agama RI)
        case 14 : FajrTwilight = -18.0 : ishaTwilight = -18.0  : ' Tunisian Ministry of Religious Affairs  
        case 15 : FajrTwilight = -19.5 : ' Isha'a: 90 min      : ' UAE General Authority of Islamic Affairs And Endowments
        case 16 : FajrTwilight = -18.5 : ' Isha'a: 90 min      : ' Umm Al-Qura, Makkah
        case 17 : FajrTwilight = -17.7 : ishaTwilight = -15.0  : ' University of Tehran
    end_select
    D = (367 * year) - ((year + int((month + 9) / 12)) * 7 / 4) + ((int(275 * month / 9)) + day - 730531.5)
    L = 280.461 + 0.9856474 * D : L = moreLess360(L)
    M = 357.528 + (0.9856003) * D : M = moreLess360(M)
    Lambda = L + 1.915 * sin(degree_To_Radian(M)) + 0.02 * sin(degree_To_Radian(2 * M))
    Lambda = moreLess360(Lambda)    
    Obliquity = 23.439 - 0.0000004 * D    
    Alfa = radian_to_degree(atn((cos(degree_to_radian(Obliquity)) * tan(degree_To_Radian(Lambda)))))
    Alfa = moreLess360(Alfa)
    Alfa = Alfa - (360 * (int(Alfa / 360)))
    Alfa = Alfa + 90 * (int(Lambda / 90) - int(Alfa / 90))    
    ST = 100.46 + 0.985647352 * D
    Dec = radian_To_Degree(asin(sin(degree_To_Radian(Obliquity)) * sin(degree_To_Radian(Lambda))))
    a = (sin(degree_To_Radian(-0.8333)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))
    if abs(a) > 1  : ' le soleil ne se couche pas
       FajrTime = -1 : sunRiseTime = -1
       asrTime  = -1 : maghribTime = -1 : ishaTime = -1
       exit_sub
    end_if    
    Durinal_Arc = radian_To_Degree(acos((sin(degree_To_Radian(-0.8333)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))))  
    Noon = Alfa - ST
    Noon = moreLess360(Noon)    
    UT_Noon = Noon - longitude
' ------------------------------------------------------------------------------    
' Calculating Prayer Times Arcs & Times
' ------------------------------------------------------------------------------    
' Zuhr Time (Local noon)
    zuhrTime = UT_Noon / 15 + timeZone + dst    
    if standard = 1 : ' Asr Standard (Shafii, Maliki, Hanbali)
       Asr_Alt = radian_To_Degree(atn(1 + tan(degree_To_Radian(abs(latitude - Dec)))))
    else            : ' Asr Hanafi      
       Asr_Alt = radian_To_Degree(atn(2 + tan(degree_To_Radian(abs(latitude - Dec)))))
    end_if
    a = (sin(degree_To_Radian(90 - Asr_Alt)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))
    if abs(a) > 1  
       FajrTime = -1 : sunRiseTime = -1
       asrTime  = -1 : maghribTime = -1 : ishaTime = -1
       exit_sub
    end_if  
    Asr_Arc = radian_To_Degree(acos((sin(degree_To_Radian(90 - Asr_Alt)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))))
    Asr_Arc = Asr_Arc / 15
'  Asr Time
    asrTime = zuhrTime + Asr_Arc
' Shorouq Time        
    sunRiseTime = zuhrTime - (Durinal_Arc / 15)
' Maghrib Time
    maghribTime = zuhrTime + (Durinal_Arc / 15)
    a = (sin(degree_To_Radian(ishaTwilight)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))    
    if abs(a) > 1  : ' le soleil ne se lève pas
       FajrTime = -1 : sunRiseTime = -1
       asrTime  = -1 : maghribTime = -1 : ishaTime = -1
       exit_sub
    end_if
    Esha_Arc = radian_To_Degree(acos((sin(degree_To_Radian(ishaTwilight)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))))      
' Isha Time
    ishaTime = zuhrTime + (Esha_Arc / 15)
' Fajr Time
    a = (sin(degree_To_Radian(fajrTwilight)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))
    if abs(a) > 1  
       FajrTime = -1 : sunRiseTime = -1
       asrTime  = -1 : maghribTime = -1 : ishaTime = -1
       exit_sub
    end_if
    Fajr_Arc = radian_To_Degree(acos((sin(degree_To_Radian(fajrTwilight)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))))
    fajrTime = zuhrTime - (Fajr_Arc / 15)
                        
END_SUB
rem ============================================================================
SUB Aide()
    dim_local t$
    t$ = "Aide sur le programme" + chr$(13)
    t$ = t$ + "Au lancement du programme, il affiche les résultats du calcul pour la ville de Moknine (Tunisie) pour le mois en cours" + chr$(13)
    t$ = t$ + "et propose comme méthode de calcul (dans le COMBO Méthode) celle appliquée en Tunisie (Tunisian Ministry of Religious)" + chr$(13)
    t$ = t$ + "Pour les autres pays, vous pouvez opter pour l'une des métodes proposées dans le COMBO, surtout si votre ville se situe aux" + chr$(13)
    t$ = t$ + "altitudes supérieures à 45°"+chr$(13)
    t$ = t$ + "Il propose un choix parmi 8 pays qui vous permettent d'en choisir une ville parmi celles qui sont proposées." + chr$(13)
    t$ = t$ + "Si votre ville ne s'y trouve pas, vous avez la possibilité d'entrer manuellement ses coordonnées (Latitude, Longitude, Fuseau, DST)" + chr$(13)
    t$ = t$ + "Vous pouvez aussi l'ajouter dans le code dans les lignes DATA." + chr$(13)
    t$ = t$ + "En optant pour l'un des pays proposé, vous activez un COMBO vous permettant de choisir une ville." + chr$(13)
    t$ = t$ + "Le COMBO DST c'est pour le choix de l'heure d'été (valeurs possibles : 0 pas de passage; 1 passage à l'heure d'été." + chr$(13)
    t$ = t$ + "Les boutons 'main' indiquant la gauche c'est pour le mois précédent, tandis que celle qui indique la droite c'est pour le mois suivant." + chr$(13)
    t$ = t$ + chr$(13)    
    t$ = t$ + "Après chaque modification et pour lancer un nouveau calcul,cliquez sur le bouton 'Calculer' (La Palice ne peut pas dire mieux !)" + chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "Note :" + chr$(13)
    t$ = t$ + "L’horaire de la prière de Ichaa correspond à la disparition du crépuscule (12° à 18°) après le coucher du Soleil." + chr$(13)
    t$ = t$ + "L'Arabie Saoudite, par exemple ajoute 90 mn à l'heure du Maghrib pour obtenir celle du Icha"+ chr$(13)
    t$ = t$ + " et ajoute 120 mn pour le mois de Ramadan."+ chr$(13)
    t$ = t$ + chr$(13) + chr$(13)    
    t$ = t$ + "Pour information :" + chr$(13)
    t$ = t$ + "******************" + chr$(13)
    t$ = t$ + "La définition de l'heure du salat Asr divise les écoles islamiques en deux positions dogmatiques." + chr$(13)
    t$ = t$ + "Les trois écoles juridiques Malikite, Hambalite et Shafite soutiennent que le Asr commence lorsque la taille d'un objet vertical est la taille de son ombre." + chr$(13)
    t$ = t$ + "Cette méthode est celle adoptée généralement dans les communautés du Maghreb (d'obédience Malikite)." + chr$(13)
    t$ = t$ + "La quatrième école Hanafite estime que le Asr commence lorsque l'ombre d'un objet vertical est le double de la taille de cet objet."+chr$(13)
    t$ = t$ + "Cette nette différence dogmatique entraîne des écarts dans les horaires de salat sur les calendriers correspondant à un même endroit." + chr$(13)
    t$ = t$ + "Le programme vous permet de choisir votre doctrine réligieuse (Madh-hab) dans le COMBO 'Calcul Asr'. " + chr$(13)
    t$ = t$ + chr$(13) + chr$(13)
    t$ = t$ + "Le programme est fourni comme tel sans aucune garantie des résultats."+chr$(13)
    t$ = t$ + "En aucun cas je ne serais responsable de dommages résultants de l'utilisation de cette application."    
    message t$
END_SUB
rem ============================================================================
SUB Culture()
    dim_local t$
    t$ = "Méthode de calcul des horaires de prières" + chr$(13)
    t$ = t$ + "Les prières (pour les Musulmans) sont au nombre de cinq par journée." + chr$(13)
    t$ = t$ + "Les horaires de ces cinq prières varient d'un endroit (ville) à l'autre et d'un jour à l'autre." + chr$(13)
    t$ = t$ + "Le calcul fait intervenir les heures du crépuscule, mais lequel ?" + chr$(13)
    t$ = t$ + "Il existe trois types de crépuscules : " + chr$(13)
    t$ = t$ + "Le crépuscule astronomique : il intervient lorsque le soleil se situe "
    t$ = t$ + "en dessous de l’horizon à une hauteur de 18°, et il correspond au moment" + chr$(13)
    t$ = t$ + "où l’obscurité totale s’installe au niveau de cet horizon." + chr$(13)
    t$ = t$ + "Le crépuscule nautique : il intervient lorsque le soleil se situe en dessous de l’horizon à une hauteur de 12°." + chr$(13)
    t$ = t$ + "Le crépuscule civil : il intervient lorsque le soleil se situe en dessous de l’horizon à une hauteur de 06°." + chr$(13)
    t$ = t$ + "Or, il s’est avéré que le fait de se baser sur le crépuscule astronomique (18°) pour le calcul des heures de prière "
    t$ = t$ + "pose des difficultés pour les pays d’Europe." + chr$(13)
    t$ = t$ + "Il est impossible de calculer les horaires de la prière du Fajr à partir du 18° et ce à partir de la mi-mai jusqu’à la mi-juin environ."+chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "L’écart entre le Fajr et celui du lever du soleil (Chourouk) se creuse pour atteindre un record de 3h40 min en période d’été." + chr$(13)
    t$ = t$ + "L’écart entre la prière de Ichaa et celle du Fajr se réduit durant des semaines en période d’été." + chr$(13)
    t$ = t$ + "A titre d’exemple : le 28 mai à Paris en se basant sur le 18°, la prière de Ichaa est à 00h18 et la prière du Fajr est à 02h59 !" + chr$(13)
    t$ = t$ + "Soit un écart de 2h41mn."+chr$(13)
    t$ = t$ + "Par contre, retenir le critère du 12° (le crépuscule nautique) permet de surmonter ces difficultés." + chr$(13)
    t$ = t$ + "D’une part, l’écart entre la prière du Fajr et celle du lever du soleil (Chourouk) n’excède jamais 02 heures durant toute l’année."+chr$(13)
    t$ = t$ + "D’autre part, l’écart entre la prière du Ichaa et celle du Fajr reste constamment importante."+chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "Le fait d'opter pour ce critère du 12° permet d’alléger la contrainte sur les musulmans vivant en Europe pour cette pratique cultuelle " + chr$(13)
    t$ = t$ + "et surtout durant le mois de Ramadan et spécialement en période d’été." + chr$(13)
    t$ = t$ + "L’avantage de ce choix réside dans la possibilité de l’utiliser durant toute l’année, à l’inverse de celui du 18°." + chr$(13)
    t$ = t$ + "Certains pays ajoutent 5 minutes en plus par précaution pour les horaires de Dhohr et du Maghrib" + chr$(13)
    t$ = t$ + "L’horaire du Asr est calculé selon la règle islamique où l’ombre de chaque objet devient égale à celui-ci." + chr$(13)
    t$ = t$ + "Mais certains pays utilisent d'autres critères, ce qui ne facilite pas la tâche !" + chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "En résumé : " + chr$(13)
    t$ = t$ + "* Prière de l'aube (matin) (Fajr) : Le début coïncide avec la fin du délai de d'Isha, soit lorsque le soleil remonte à 19 ° sous l'horizon." + chr$(13)
    t$ = t$ + "  La fin est atteinte au lever du soleil avec le limbe supérieur du soleil tangent à l'horizon soit h = - 0,267°"+ chr$(13)
    t$ = t$ + "* Prière de la mi-journée (midi) (Dhur) : la durée permise commence quand le soleil a traversé le méridien (soit quand l'ombre d'un objet a commencé à "
    t$ = t$ + "  augmenter) et se termine lorsque l'ombre d'un gnomon s'est allongée d'un quart de sa hauteur par rapport à son ombre à midi." + chr$(13)
    t$ = t$ + "* Prière de l'après-midi ('Asr) : l'intervalle commence lorsque l'augmentation de l'ombre est égale à la longueur du gnomon et se termine quand l'ombre en a atteint le double." + chr$(13)
    t$ = t$ + "* Prière du coucher de soleil (Maghrib) : Le début coïncide avec la disparition totale du soleil sous l'horizon , soit pour h = -0.267°."+chr$(13)
    t$ = t$ + "  La fin du délai est atteinte à la dernière lueur du crépuscule, soit le soleil à 18° sous l'horizon."+chr$(13)
    t$ = t$ + "  Attention, cette condition peut être irréalisable à certaines dates pour certaines latitudes." + chr$(13)
    t$ = t$ + "* Prière de la nuit ('Isha) : Le début coïncide avec la fin du délai de Maghrib, soit le soleil à 17° sous l'horizon." + chr$(13)
    t$ = t$ + "  La fin du délai est atteinte avec l'apparition de l'aube lorsque le soleil remonte à 19° sous l'horizon." + chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "Note :" + chr$(13)
    t$ = t$ + "Les opinions divergent sur les angles à utiliser pour le calcul de Fajr et Isha." +chr$(13)
    t$ = t$ + "La mosquée de Paris retient 15° pour Fajr et 18° pour Isha." + chr$(13) + chr$(13)  
    t$ = t$ + chr$(13)
    t$ = t$ + "Pour des plus amples informations sur le calcul des horaires de prière, référez-vous à : " + chr$(13)
    t$ = t$ + "http://www.averroes-aveyron.fr/medias/files/methodes-de-calcul.pdf" + chr$(13)    
    message t$
END_SUB
rem ============================================================================
' Liste des pays : nom du pays, fuseau horaire du pays et flag pour heure d'été (1 oui, 0 non)
data "Algérie" ,1,0 , "Belgique",1,1 ,"Egypte",2,0 , "France",1,1, "Lybie",2,0
data "Maroc",0 , 0, "Arabie Saoudite",3,0 ,"Tunisie",1,0
' ------------------------------------------------------------------------------
data "Algérie"  : ' UTC + 1 ; DST 0
' -----------
1:
'     Ville             Latitude   Longitude
data "Adrar" ,          27.850,    -0.317  
data "Alger" ,          36.833,     3.000
data "Annaba" ,         36.917,     7.783  
data "Batna" ,          35.567,     6.167    
data "Bechar" ,         31.583,    -2.283
data "Bejaia" ,         36.817,     5.050  
data "Biskra" ,         34.833,     5.683  
data "Blida" ,          36.500,     2.833  
data "Boussaada" ,      35.167,     4.150  
data "Constantine" ,    36.367,     6.667  
data "El Asnam" ,       36.183,     1.350    
data "El Djelfa" ,      34.717,     3.233  
data "Ghardaia" ,       32.333,     3.667
data "Laghouat" ,       33.817,     2.917
data "Mostaganem" ,     35.900,     0.083  
data "M'Sila" ,         35.667,     4.517
data "Oran" ,           35.750,    -0.633
data "Ouargla" ,        32.000,     5.267
data "Setif" ,          36.183,     5.400  
data "Sidi-bel-Abbes" , 35.250,    -0.650
data "Skikda" ,         36.883,     6.900  
data "Tamanrasset" ,    22.833,     5.467
data "Tebessa" ,        35.350,     8.100  
data "Tiaret" ,         35.333,     1.333
data "Tilimsen" ,       34.883,    -1.350      
data "Tizi-Ouzou" ,     36.733,     4.083  
data "FIN"  
' ------------------------------------------------------------------------------
data "Belgique" : ' UTC + 1  UTC + 2 Heure d'été
' -----------
2:
'     Ville             Latitude   Longitude
data "Antwerp" ,        51.217,   4.417  
data "Brussels" ,       50.850,   4.350  
data "Charleroi" ,      50.417,   4.450
data "Gent" ,           51.033,   3.700
data "Liege" ,          50.633,   5.583  
data "Ostende" ,        51.217,   2.917    
data "Mons" ,           50.467,   3.967      
data "Namur" ,          50.467,   4.867
data "FIN"
' ------------------------------------------------------------------------------
data "Egypte"  : ' UTC + 2
' -------------------------------------
3:
'     Ville             Latitude   Longitude
data "Abou Simbel" ,    22.317,   31.633  
data "Alexandria" ,     31.217,   29.917
data "Aswan" ,          24.083,   32.933
data "Asyut" ,          27.233,   31.117
data "Beni-Souef" ,     29.083,   31.083  
data "Cairo" ,          30.050,   31.250
data "Damanhur" ,       31.050,   30.467
data "Dumyat" ,         31.433,   31.800
data "El Alamein" ,     30.833,   28.950
data "Helwan" ,         29.850,   31.333
data "Isma'ilia" ,      30.600,   32.250  
data "Karnak" ,         25.683,   32.667  
data "Port Said" ,      31.283,   32.300    
data "Sohag" ,          26.550,   31.700
data "Suez" ,           29.983,   32.550
data "Tanta" ,          30.800,   31.000  
data "Zagazig" ,        30.583,   31.500  
data "FIN"
' -------------------------------------------------------------------------------
data "France" : ' UTC + 1  UTC + 2 Heure d'été
' ----------
4:
'     Ville             Latitude   Longitude
data "Brest" ,          48.383,   -4.500  
data "Quimper" ,        48.000,   -4.100  
data "Lorient" ,        47.750,   -3.350  
data "St-Brieuc" ,      48.517,   -2.750  
data "Vannes" ,         47.667,   -2.733    
data "St Nazaire" ,     47.283,   -2.200  
data "Rennes" ,         48.100,   -1.667  
data "Cherbourg" ,      49.633,   -1.617  
data "Nantes" ,         47.233,   -1.583  
data "La-Roche-sur-Yon" , 46.633, -1.500
data "Bayonne" ,        43.500,   -1.467
data "La Rochelle" ,    46.167,   -1.167  
data "St-Lo" ,          49.117,   -1.083  
data "Laval" ,          48.067,   -0.750    
data "Bordeaux" ,       44.833,   -0.567  
data "Angers" ,         47.483,   -0.533  
data "Mont-de-Marsan" , 43.900,   -0.500  
data "Niort" ,          46.317,   -0.450  
data "Pau" ,            43.300,   -0.367  
data "Caen" ,           49.183,   -0.367
data "Alençon" ,        48.417,    0.083  
data "Tarbes" ,         43.233,    0.083  
data "Le Havre" ,       49.500,    0.100  
data "Angouleme" ,      45.667,    0.167  
data "Le Mans" ,        48.000,    0.200    
data "Poitiers" ,       46.583,    0.333  
data "Cahors" ,         44.467,    0.433  
data "Auch" ,           43.500,    0.600  
data "Agen" ,           44.200,    0.633  
data "Tours" ,          47.383,    0.700  
data "Perigueux" ,      45.200,    0.733    
data "Dieppe" ,         49.917,    1.083    
data "Rouen" ,          49.433,    1.083  
data "Evreux" ,         49.050,    1.183    
data "Limoges" ,        45.833,    1.250    
data "Montauban" ,      44.017,    1.333  
data "Blois" ,          47.600,    1.333  
data "Toulouse" ,       43.617,    1.450    
data "Chartres" ,       48.450,    1.500    
data "Foix" ,           42.950,    1.583  
data "Chateauroux" ,    46.817,    1.683    
data "Tulle" ,          45.267,    1.767    
data "Abbeville" ,      50.100,    1.850    
data "Gueret" ,         46.167,    1.866  
data "Orleans" ,        47.900,    1.900  
data "Vierzon" ,        47.233,    2.050  
data "Pontoise" ,       49.050,    2.083  
data "Beauvais" ,       49.433,    2.083  
data "Versailles" ,     48.800,    2.133  
data "Albi" ,           43.933,    2.144    
data "Nanterre" ,       48.883,    2.217    
data "Amiens" ,         49.900,    2.300  
data "Paris" ,          48.833,    2.333    
data "Bourges" ,        47.083,    2.383    
data "Carcassonne" ,    43.217,    2.350  
data "Dunkerque" ,      51.033,    2.383  
data "Aurillac" ,       44.933,    2.433    
data "Bobigny" ,        48.917,    2.450  
data "Créteil" ,        48.783,    2.467    
data "Melun" ,          48.533,    2.557
data "Evry" ,           48.633,    2.567    
data "Rodez" ,          44.350,    2.567  
data "Montlucon" ,      46.333,    2.600    
data "Arras" ,          50.283,    2.767    
data "Lens" ,           50.433,    2.833  
data "Perpignan" ,      42.700,    2.900  
data "Lille" ,          50.650,    3.083  
data "Clermont-Ferrand",45.783,    3.083      
data "Nevers" ,         47.000,    3.150    
data "Moulins" ,        46.567,    3.333  
data "Mende" ,          44.533,    3.500    
data "Auxerre" ,        47.800,    3.583    
data "Laon" ,           49.567,    3.617    
data "Montpellier" ,    43.600,    3.883      
data "Le Puy" ,         45.050,    3.883    
data "Avallon" ,        47.500,    3.900  
data "Reims" ,          49.250,    4.033  
data "Troyes" ,         48.300,    4.083    
data "Roanne" ,         46.033,    4.083    
data "Nimes" ,          43.500,    4.350    
data "Chalons-S-Marne", 48.967,    4.367    
data "St-Etienne" ,     45.433,    4.383    
data "Privas" ,         44.733,    4.600    
data "Mezières" ,       49.767,    4.733    
data "Avignon" ,        43.933,    4.800    
data "Lyon" ,           45.767,    4.833      
data "Macon" ,          45.300,    4.833    
data "Valence" ,        44.933,    4.900    
data "Dijon" ,          47.333,    5.033    
data "Chaumont" ,       48.117,    5.133    
data "Bar-le-Duc" ,     48.767,    5.167    
data "Bourg" ,          46.200,    5.217
data "Observatoire SIRENE" , 44.000, 5.333  
data "Marseille " ,     43.300,    5.367  
data "Lons-le-Saunier", 46.683,    5.550  
data "Grenoble" ,       45.183,    5.717    
data "Toulon" ,         43.117,    5.917  
data "Chambéry" ,       45.567,    5.917    
data "Besancon" ,       47.250,    5.983    
data "Gap" ,            44.550,    6.083  
data "Annecy" ,         45.900,    6.117  
data "Metz" ,           49.117,    6.183  
data "Vesoul" ,         47.633,    6.150    
data "Nancy" ,          48.700,    6.200  
data "Digne" ,          44.083,    6.233  
data "Epinal" ,         48.167,    6.467  
data "Belfort" ,        47.633,    6.867    
data "Cannes" ,         43.550,    7.000    
data "Nice" ,           43.700,    7.267    
data "Colmar" ,         48.083,    7.350  
data "Mulhouse" ,       47.750,    7.350    
data "Strasbourg" ,     48.583,    7.750  
data "Ajaccio" ,        41.917,    8.717    
data "Bastia" ,         42.683,    9.433
data "FIN"
' ------------------------------------------------------------------------------
data "Libye"  :' UTC + 2
' ---------
5:
'     Ville             Latitude   Longitude
data "Sabratah" ,       32.833,    12.400  
data "Tripoli" ,        32.967,    13.200  
data "Al Khums" ,       32.650,    14.250  
data "Sabhah" ,         27.050,    14.433    
data "Benghazi" ,       32.117,    20.083  
data "Ajdabiyah" ,      30.800,    20.250    
data "Al Marj" ,        32.500,    20.833                
data "Darnah" ,         32.767,    22.650    
data "Tubruq" ,         32.100,    23.933  
data "FIN"
' ------------------------------------------------------------------------------

data "Moroc" : ' UTC + 0
' ---------
6:
'     Ville             Latitude   Longitude
data "Agadir" ,         30.500,   -9.667    
data "Safi" ,           32.300,   -9.333    
data "El Jadida" ,      33.183,   -8.283    
data "Marrakech" ,      31.817,   -8.000  
data "Settat" ,         33.067,   -7.617    
data "Casablanca" ,     33.650,   -7.583    
data "Mohammedia" ,     33.717,   -7.333    
data "Khouribga" ,      32.900,   -6.950  
data "Sale" ,           34.067,   -6.833    
data "Kenitra" ,        34.333,   -6.567    
data "Beni Mellal" ,    32.367,   -6.483  
data "Khemisset" ,      33.833,   -6.050    
data "Ksar el Kebir" ,  35.067,   -5.933    
data "Tanger" ,         35.800,   -5.833    
data "Meknes" ,         33.883,   -5.617    
data "Tetouan" ,        35.567,   -5.367    
data "Ceuta" ,          35.883,   -5.317    
data "Fes" ,            34.083,   -5.000    
data "Taza" ,           34.267,   -4.017    
data "Nador" ,          35.167,   -3.000    
data "Oujda" ,          34.683,   -1.750  
data "FIN"
' ------------------------------------------------------------------------------
rem ============================================================================
data "Arabie Saoudite" : ' UTC + 3
' ----------------
7:
'     Ville             Latitude   Longitude
data "Riyadh" ,         24.650,    46.767  
data "Al Wajh" ,        26.267,    36.467    
data "Tabuk" ,          28.367,    36.533    
data "Yanbu'Al Bahr" ,  24.117,    38.067  
data "Tayma" ,          27.617,    38.500  
data "Jiddah" ,         21.500,    39.167    
data "Khaybar" ,        25.800,    39.200    
data "Medina" ,         24.500,    39.583  
data "Mecca" ,          21.433,    39.817  
data "Al Jawf" ,        29.783,    39.867    
data "Al Lith" ,        20.167,    40.267  
data "At Ta'if" ,       21.250,    40.350    
data "Badanah" ,        31.000,    41.083    
data "Al Qunfidhah" ,   19.150,    41.117    
data "Turabah" ,        21.250,    41.567  
data "Ha'il" ,          27.517,    41.750  
data "bha" ,            18.233,    42.517  
data "Jizan" ,          16.933,    42.550    
data "Buraydah" ,       26.333,    43.983    
data "Najran" ,         17.517,    44.317    
data "Shaqra" ,         25.300,    45.250    
data "Al Artawiyak" ,   26.517,    45.350    
data "Ad Dilam" ,       23.983,    47.100    
data "Haradh" ,         24.200,    49.117    
data "Al Hufuf" ,       25.333,    49.567    
data "Ad Dammam" ,      26.417,    50.100    
data "Al Khurmah" ,     21.917,    42.033
data "FIN"  
' ------------------------------------------------------------------------------
Data "Tunisie" : ' UTC + 1
' -----------
8:
'     Ville             Latitude   Longitude
data "Gafsa" ,          34.467,     8.717  
data "Beja" ,           36.717,     9.217  
data "Bizerte" ,        37.300,     9.867    
data "Kairouan" ,       35.700,     10.017  
data "Gabes" ,          33.867,     10.100  
data "Tunis" ,          36.833,     10.217  
data "Sousse" ,         35.833,     10.633    
data "Sfax" ,           34.750,     10.717  
data "Nabeul" ,         36.500,     10.733
data "Moknine" ,        35.633,     10.833
data "Monastir",        35.777,     10.826
data "Mahdia" ,         35.502,     11.045
data "Jendouba" ,       35.501,     08.783
data "Le Kef" ,         36.179,     08.714
data "Siliana" ,        35.990,     09.278
data "Ariana" ,         36.862,     10.195
data "Ben Arous" ,      36.743,     10.232
data "Kasserine" ,      35.171,     08.828
data "Kebili" ,         33.124,     08.836
data "La Manouba" ,     36.807,     10.101
data "Medenine" ,       33.348,     10.494
data "Sidi Bouzid" ,    35.033,     09.5
data "Tataouine" ,      32.921,     10.450
data "Zaghouan" ,       36.399,     10.147
data "La Soukra" ,      36.883,     10.25
data "La Marsa" ,       36.876,     10.325

data "FIN"  
rem ============================================================================
rem &&&&&&&&&&&&&&&&&&&&&&  FIN DU CODE  &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
rem ============================================================================

Spoiler:
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Marc

Marc


Nombre de messages : 2466
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyVen 3 Mai 2019 - 0:04

Bravo Papydall !

Calculateur des heures de prière. 172

Juste une petite mise à jour à faire : le Maroc a abandonné le système de changement d'heure été/hiver.
Le royaume reste définitivement en UTC+1.

Ton code-source est riche d'astuces. Merci de ton partage !
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyVen 3 Mai 2019 - 1:28

Merci Marc pour la re-marc sur le Maroc.

Code remis à jour pour tenir compte de cette remarque et ajout de deux marques pour marquer le jour courant.

Code:

rem ============================================================================
rem                         CalcPrayerTimes.bas
rem              Calculateur des heures de prière par Papydall
rem                             Version 3.2
rem                    Dernière modification : 03 Mai 2019
rem ============================================================================
Init()
Gui()
Afficher_Kibla()
Grille(NbJours(month,year))
Run()
end
rem ============================================================================
SUB Init()
    label clic, change
    label 1, 2, 3, 4, 5, 6, 7, 8 : ' pour restore_label
    dim year, month, day
    dim longitude, latitude, timeZone,fajrTwilight, ishaTwilight
    dim fajrTime, sunRiseTime, zuhrTime, asrTime, maghribTime, ishaTime
    dim d, l, m, lambda, obliquity, alfa, st, dec, durinal_Arc, noon, Ut_Noon
    dim Asr_Alt, Asr_Arc, Esha_Arc, Fajr_Arc
    dim prayTime$(5), standard,nc,Fuseau(8), H_Ete(8)
    dim hours, minutes ,h$, m$, a, n, dst, methode, p$, ville$, pays$
    dim NbPays : NbPays = 8 : ' 8 c'est le nombre des pays proposés dans le programme
    standard = 1 : ' Pour le calcul du Asr : 1 ---> (Shafii, Maliki, Hanbali)                                           ' 0 ---> Hanafi      
    day = date_day : month = date_month : year = date_year : ' La date courante
      
END_SUB
rem ============================================================================
SUB GUI()
    dim_local i,t$
    t$ = " Calculateur des heures de prière par Papydall "
    color 0,240,255,255
    width 0,1100 : height 0,800 : top 0,(screen_y - height(0)) / 2
    left 0,(screen_x - width(0))/2
    shape 5 : top 5,5 : left 5,450 : width 5,600 : height 5,50
    shape_rectangle_rounded 5 : color 5,25,100,50
    shape 6 : top 6,5 : left 6,20 : width 6,420 : height 6,50
    shape_rectangle_rounded 6 : color 6,25,100,50
    alpha 10 : top 10,20 : left 10,40 : font_color 10,250,100,50
       font_bold 10      : font_name 10,"tahoma" : font_size 10,12
       caption 10,t$     : caption 0,t$ : application_title t$
    alpha 20 : top 20,80 : left 20,010  : caption 20,"Latitude : "
    edit  21 : top 21,80 : left 21,070  : width 21,60 : font_bold 21 : text 21,"35.633"
       hint 21,"En degrés décimaux (± 90°) positive au Nord" : on_change 21,change
    alpha 30 : top 30,80 : left 30,140  : caption 30,"Longitude : "
    edit  31 : top 31,80 : left 31,210  : width 31,60 : font_bold 31 : text 31,"10.833"
       hint 31,"En degrés décimaux (± 180°) positive à l'est" : on_change 31,change
    alpha 40 : top 40,80 : left 40,285  : caption 40,"Fuseau :"
    spin 41  : top 41,80 : left 41,335  : width 41,60 : min 41,-12 : max 41,12 : font_bold 41
       hint 41,"ZoneTime, décalage heure : Valeurs possibles ± 12" : position 41,1
       on_change 41,change
    alpha 45 : top 45,80 : left 45,420  : caption 45,"DST :" : font_bold 45 : font_name 45,"tahoma"
    combo 46 : top 46,80 : left 46,450  : width 46,50 : hint 46,"Heure d'été"
    on_change 46,change
    alpha 50 : top 50,80 : left 50,520  : caption 50,"Méthode :"  
    combo 51 : top 51,80 : left 51,580  : width 51,480 : font_bold 51  : height 51,40
    font_name 51,"tahoma" : on_change 51,change
    hint 51,"convention de calcul utilisé"    
    alpha 55 :  top 55,130 : left 55,10 : font_bold 55 : font_name 55,"tahoma"
    caption 55,"Calcul Asr :"
    combo 56 : top 56,130 : left 56,80 : font_bold 56 : font_name 56,"tahoma"
    width 56,220 : hint 56,"Doctrines religieuses" :  on_change 56,change
    item_add 56,"Standard (Shafii, Maliki, Hanbali)"
    item_add 56,"Hanafi" : item_select 56,1    
    button 60 : top 60,20 : left 60,950 : caption 60,"Quitter"
    on_click 60,clic
    button 70 : top 70,20 : left 70,470  : caption 70,"Calculer"
    on_click 70,clic : inactive 70  
    button 80 : top 80,120 : left 80,500 : font_bold 80 : font_name 80,"wingdings 2"
    font_size 80,30 : caption 80,"D" : hint 80,"Mois précédent" : on_click 80,clic
    button 90 : top 90,120 : left 90,760 : font_bold 90 : font_name 90,"wingdings 2"
    font_size 90,30 : caption 90,"E" : hint 90,"Mois suivant" : on_click 90,clic
    alpha 100: top 100,130 : left 100,630 : font_bold 100 : font_name 100,"arial"
    font_size 100,12 : caption 100,Month_Name$(month)  + "  " + str$(year)
    item_add 46,0 : item_add 46,1 : item_select 46,1  
    for i = 1 to 17 : read t$ : item_add 51,t$ : next i
    item_select 51,14          
    for i = 20 to 70 step 10 : font_bold i : font_name i,"tahoma" : next i  
    alpha 110 : top 110,180 : left 110,10 : font_bold 110 : font_size 110,12
    font_name 110,"tahoma" : font_color 110, 255,0,0 : caption 110,"Pays : Tunisie"
    alpha 120 : top 120,180 : left 120,220 : font_bold 120 : font_size 120,12
    font_name 120,"tahoma" : font_color 120, 255,0,0 : caption 120,"Ville : Moknine"        
    alpha 130 : top 130,230 : left 130,10 : font_bold 130 : font_name 130,"tahoma"
    font_size 130,12 : font_color 130,0,0,255 : caption 130,"Choix Pays / Villes"    
    alpha 140 : top 140,260 : left 140,60 : font_bold 140 : font_name 140,"Wingdings"
    font_size 140,30 : caption 140,"ê"    
    button 150 : top 150,20 : left 150,600 : font_bold 150 : caption 150,"Aide" : on_click 150,clic
    button 160 : top 160,20 : left 160,740 : font_bold 160 : width 160,150
    caption 160,"Pour votre culture" : on_click 160,clic
    container_option 200 : top 200,300 : left 200,10 : width 200,130 : height 200,35*NbPays +10
    color 200,255,255,0        
    for i = 1 to NbPays
        option 200+i  : parent 200+i,200 : top 200+i,30*i : left 200+i,10
        font_bold 200+i : font_name 200+i,"tahoma" : on_click 200+i,clic      
        read p$ : caption 200+i,p$
        read fuseau(i) : read H_Ete(i)      
    next i  
    combo 300 : top 300,300 : left 300,160
    font_bold 300 : width 300,300 : hide 300 : on_change 300,change    
    picture 400 : top 400,450 : left 400,170 : width 400,300 : height 400,300
    2d_target_is 400 : print_target_is 400
     alpha 410 : top 410,600 : left 410,10 : font_bold 410 : font_name 410,"tahoma"
    font_size 410,10 : font_color 410,255,0,0
    t$ = "Direction de la Kibla" + chr$(13) + "depuis Moknine" + chr$(13) + "Tunisie : "
    caption 410,t$
    hint 410,"Angle en ° à partir du Nord" +chr$(13)+"indiquant la direction de la Kibla"      
    alpha 420 : top 420,630 : left 420,130 : font_bold 420 : font_name 420,"tahoma'
    font_size 420,12 : font_color 420,0,0,0      
    alpha 430 : top 430, 680 : left 430,1 : font_bold 430 : font_name 430,"tahoma"
    font_size 430,10 : font_color 430,0,0,255
    hint 430,"Distance de la Mecque"
    
    alpha 500 : top 500,180+17*date_day : left 500,470 : font_name 500,"Wingdings"
    font_bold 500 : font_size 500,20 : font_color 500,255,0,0 : caption 500,"F"
    alpha 510 : top 510,180+17*date_day : left 510,840 : font_name 510,"Wingdings"
    font_bold 510 : font_size 510,20 : font_color 510,255,0,0 : caption 510,"E"
    hint 500,"Jour courant" : hint 510,"Jour courant"
END_SUB
rem ============================================================================
' Formule donnant la distance orthdromique entre deux points du globle exprimés
' par leurs coordonnées (latitude et longitude)
' La formule est donnée en assimilant la Terre à une sphère de 40 000 km de circonférence.
' 1.852 : c'est la valeur en km de un mille marin
' 60 : ce nombre provient du fait que le mille marin (1 852 m) correspond à une
' minute d'arc sur un grand cercle de la surface terrestre, et donc 60 milles
' marins correspondent à un degré.
FNC Distance_Orthodromique(lat1,lon1)
    dim_local lat2,lon2,km,d
    lat2 = 21.433  : lon2 = 39.817  : ' Coordonnées de la Mecque
    degrees
    km = 60*1.852
    d = km*acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon2-lon1))
    d = int(d)
    result d
END_FNC
rem ============================================================================
' Fonction de calcul de la Kibla
' Elle retourne l'angle partant de la direction du nord et compté dans le sens
' rétrograde (sens des aiguilles d'une montre)
FNC Kibla(latitude,longitude)
    dim_local Lat_Meq : ' Latitude de la Mecque
    dim_local Lon_Meq : ' Longitude de la Mecque
    dim_local a,b,c,q,n,d
    Lat_Meq = 21.433 : Lon_Meq = 39.817
    a = Lon_Meq - longitude  : b = latitude :c = Lat_Meq
    degrees
    n = sin(a) :d = cos(b) * tan(c) - sin(b) * cos(a)  
    if d = 0 then result 0 : exit_fnc
    q = atn(n/d)
    if sgn(n) <> sgn(q) then q = q + 180
    if (sgn(n) < 0) and (sgn(q) < 0) then q = q + 360
    result int(q)
END_FNC
rem ============================================================================
SUB Afficher_Kibla()
    dim_local la,lo,xc,yc,r,x,y,a,a1,c$,d
    degrees
    la = val(text$(21)) : lo = val(text$(31))
    xc = width(400)/2 : yc = height(400) / 2 : r = xc-20
    color 400,20,100,20 : font_color 400,255,255,0 : font_bold 400 : font_size 400,10
    2d_fill_color 200,100,020 : 2d_circle xc,yc,r
    2d_pen_width 2
    for a = 0 to 360 step 10 : 2d_line xc,yc,xc+r*cos(a),yc+r*sin(a) : next a    
    2d_fill_color 255,255,255 : 2d_circle xc,yc,r-10
    2d_fill_color 0,0,0 :  2d_circle xc,yc,5
    a = Kibla(la,lo) : r = r-15 : x = xc+r*cos(a-90) : y = yc+r*sin(a-90)
    2d_pen_width 2 : 2d_line xc,yc,x,y
    r = r-15    
    for a1 = a-80 to a-100 step -1 : 2d_poly_to xc+r*cos(a1),yc+r*sin(a1) : next a1  
    2d_poly_to x,y : 2d_fill_color 20,100,20
    print_locate xc-4,2        : print "N"
    print_locate 2*xc-15,yc-10 : print "E"
    print_locate xc-4,2*yc-20  : print "S"
    print_locate 5,yc-10       : print "W"
    d = Distance_Orthodromique(la,lo)
    caption 420, str$(a) + "°"
    caption 430, "Distance orthodromique :" + chr$(13) + str$(d) + " km"
END_SUB
rem ============================================================================
' Tracer une grille en fonction du nombre des jours dans le mois en cours
SUB Grille(n)
    grid 1 : top 1,180 : left 1,500 : width 1,342 : height 1,n*18-8 : grid_row 1,n+1    
    grid_row_fixed 1,1 : grid_row_height 1,16
    grid_column 1,7    : grid_column_fixed 1,1 : grid_column_width 1,50 : font_bold 1
    grid_fixed_color 1,255,255,0 : grid_one_column_width 1,1,30    
    color 1,0,255,255    
    grid_write 1,1,1,"Jour"
    grid_write 1,1,2," Farjr"
    grid_write 1,1,3,"Sunrise"
    grid_write 1,1,4," Dhuhr"
    grid_write 1,1,5,"  Asr"
    grid_write 1,1,6,"Maghrib"
    grid_write 1,1,7,"  Isha"
  
END_SUB
rem ============================================================================
SUB Run()
    dim_local nb
    nb = NbJours(month,year)  
    for n = 1 to Nb : Go(n) : Affiche(n) : next n
END_SUB
rem ============================================================================
Change:  
    active 70 : caption 420,"": off_change 300
    for nc = 21 to 41 step 10 : off_change nc : next nc
    for nc = 46 to 56 step 10 : off_change nc : next nc    
    if item_index(56) = 1 then standard = 1 : else : standard = 0
    select number_change
        case 21  : if text$(21) = "" then text 21,0
        case 31  : if text$(31) = "" then text 31,0
        case 41  : if text$(41) = "" then text 41,0
                   if abs(val(text$(41))) > 12 then text 41,0
        case 46  : if (text$(46) <> "0") or (text$(46) <> "1") then text 46,0                  
        case 51  : for n = 1 to NbJours(month,year)
                       Go(n) : Affiche(n)  : ' Calculer
                   next n
                   Afficher_Kibla()
        case 56  : for n = 1 to NbJours(month,year)
                       Go(n) : Affiche(n)  : ' Calculer
                   next n
                   Afficher_Kibla()
        case 300 : New_Coord()              
    end_select
    for nc = 21 to 41 step 10 : on_change nc,change : next nc
    for nc = 46 to 56 step 10 : on_change nc,change : next nc
    on_change 300,change
return
rem ============================================================================
' Gestion des clics de l'utilisateur
Clic:
    for nc = 60 to 90 step 10 : off_click nc : next nc
    for nc = 150 to 160 step 10 : off_click nc : next nc
    for nc = 201 to 208 : off_click nc : next nc
    if number_click > 200 then caption 140,"ê î"        
    select number_click
        case 060 : if message_confirmation_yes_no("Vous voulez vraiment quitter ?") = 1 then terminate
        case 070 : for n = 1 to NbJours(month,year)
                       Go(n) : Affiche(n)  : ' Calculer
                   next n
                   Afficher_Kibla() : inactive 70
        case 080 : Mois_Precedant()
        case 090 : Mois_Suivant()
        case 150 : Aide()
        case 160 : Culture()      
        case 201 : restore_label 1 : pays$ = "Algérie"  : List_Ville(number_click-200)
        case 202 : restore_label 2 : pays$ = "Belgique" : List_Ville(number_click-200)
        case 203 : restore_label 3 : pays$ = "Egypte"   : List_Ville(number_click-200)
        case 204 : restore_label 4 : pays$ = "France"   : List_Ville(number_click-200)
        case 205 : restore_label 5 : pays$ = "Lybie"    : List_Ville(number_click-200)
        case 206 : restore_label 6 : pays$ = "Maroc"    : List_Ville(number_click-200)
        case 207 : restore_label 7 : pays$ = "Arabie Saoudite": List_Ville(number_click-200)
        case 208 : restore_label 8 : pays$ = "Tunisie"  : List_Ville(number_click-200)
    end_select
    for nc = 60 to 90 step 10 : on_click nc,clic : next nc
    for nc = 150 to 160 step 10 : on_click nc,clic : next nc
    for nc = 201 to 208 : on_click nc,clic : next nc    
return
rem ============================================================================
SUB Go(day)
    calcPrayerTimes(day,month,year,fajrTwilight,ishaTwilight)
    NumberToHrMin(fajrTime)    : prayTime$(0) = h$ + ":" + m$
    NumberToHrMin(SunRiseTime) : prayTime$(1) = h$ + ":" + m$
    NumberToHrMin(zuhrTime)    : prayTime$(2) = h$ + ":" + m$
    NumberToHrMin(AsrTime)     : prayTime$(3) = h$ + ":" + m$
    NumberToHrMin(MaghribTime) : prayTime$(4) = h$ + ":" + m$    
    if (item_index(51) = 15) or (item_index(51) = 16)
       NumberToHrMin(MaghribTime + 1.5)
       prayTime$(5) = h$ + ":" + m$
    else    
       NumberToHrMin(IshaTime)    : prayTime$(5) = h$ + ":" + m$
    end_if    
END_SUB
rem ============================================================================
SUB New_Coord()
    dim_local t$,t1$,p
    t$ = item_read$(300,item_index(300))
    p = instr(t$,":") : ville$ = left$(t$,p-1) : t$ = mid$(t$,p+1,20)
    p = instr(t$,"/") : t1$ = mid$(t$,p+1,20) : t$ = left$(t$,p-1)
    text 21,t$ : text 31,t1$  
    caption 110,"Pays : " + pays$ : caption 120,"Ville : " + ville$
    t$ = "Direction de la Qibla" + chr$(13) + "depuis "
    t1$ = ville$ + chr$(13) + pays$ + " : "
    caption 410,t$ + t1$
    grid_clear 1,NbJours(month,year)+1 ,7
END_SUB
rem ============================================================================
SUB List_Ville(p)
    clear 300
    position 41,fuseau(p)
    item_select 46,H_Ete(p) + 1
    read ville$
    while ville$ <> "FIN"
        ville$ = ville$ + " : "
        read latitude : read longitude
        item_add 300,ville$  + str$(latitude) + " / " + str$(longitude)
        read ville$
    end_while
    item_select 300,1  : sort_on 300 : show 300  : inactive 70      
END_SUB
rem ============================================================================
' Ramener la valeur de value entre 0 et 360
FNC moreLess360(value)
    while (value > 360) or (value < 0)
        if value > 360
           value = value - 360
        else
           if value < 0
              value = value + 360
           end_if
        end_if
    end_while
    result value              
END_FNC
rem ============================================================================
' Ramener la valeur de value entre 0 et 24
FNC moreLess24(value)
    while (value > 24) or (value < 0)
        if value > 24
           value = value - 24
        else
           if value < 0
              value = value + 24
           end_if
        end_if
    end_while
    result value
END_FNC
rem ============================================================================
' convertir le nombre  number en heurs et Minutes
SUB NumberToHrMin(number)
    if number = -1 then h$ = "--" : m$ = "--" : exit_sub
    hours   = int(moreLess24(number))    
    minutes = int(moreLess24(number - hours) * 60)
    h$ = str$(hours) : m$ = str$(minutes)
    if len(h$) < 2 then h$ = "0" + h$
    if len(m$) < 2 then m$ = "0" + m$    
END_SUB
rem ============================================================================
FNC Month_Name$(mois)
    dim_local m$
    select mois
        case 01 : m$ = "Janvier"
        case 02 : m$ = "Février"
        case 03 : m$ = "Mars"
        case 04 : m$ = "Avril"
        case 05 : m$ = "Mai"
        case 06 : m$ = "Juin"
        case 07 : m$ = "Juillet"
        case 08 : m$ = "Août"
        case 09 : m$ = "Septembre"
        case 10 : m$ = "Octobre"
        case 11 : m$ = "Novembre"
        case 12 : m$ = "Décembre"
    end_select
    result m$
END_FNC
rem ============================================================================
' Fonction qui retourne 1 si l'argument (annee) représente une année bisextile
' 0 sinon
FNC Bisextile(annee)
    if (mod(annee,4) = 0) and ((mod(annee,100) <> 0) or (mod(annee,400) = 0))
       result 1
    else
       result 0
    end_if
END_FNC
rem ============================================================================
' Déterminer le nombre de jours dans un mois (mois) pour une année (annee)
FNC NbJours(mois,annee)
    dim_local n
    select mois
        case 01 : n = 31
        case 02 : n = 28 : if bisextile(annee) > 0 then n = n + 1
        case 03 : n = 31
        case 04 : n = 30
        case 05 : n = 31
        case 06 : n = 30
        case 07 : n = 31
        case 08 : n = 31
        case 09 : n = 30
        case 10 : n = 31
        case 11 : n = 30
        case 12 : n = 31        
    end_select
    result n
END_FNC
rem ============================================================================
SUB Mois_Precedant()
    dim_local n,nb
    month = month-1
    if month < 1 then month = 12 : year = year - 1
    caption 100,Month_Name$(month)  + "  " + str$(year)
    nb = NbJours(month,year)
    delete 1 : Grille(nb)
    Run()    
END_SUB
rem ============================================================================
SUB Mois_Suivant()
    dim_local n,nb
    month = month+1
    if month > 12 then month = 1 : year = year + 1
    caption 100,Month_Name$(month)  + "  " + str$(year)
    nb = NbJours(month,year)
    delete 1 : Grille(nb)
    Run()
END_SUB
rem ============================================================================
SUB Affiche(n)
    dim_local i
    grid_write 1,1,1,"Jour"
    grid_write 1,1,2," Farjr"
    grid_write 1,1,3,"Sunrise"
    grid_write 1,1,4," Dhuhr"
    grid_write 1,1,5,"  Asr"
    grid_write 1,1,6,"Maghrib"
    grid_write 1,1,7,"  Isha"
    for i = 1 to n : grid_write 1,i+1,1,str$(i) : next i    
    for i = 0 to 5 : grid_write 1,n+1,i+2,prayTime$(i) : next i  
    inactive 70  
    
END_SUB
rem ============================================================================
' Méthodes du calcul selon différentes Ecoles
data "Algerian Minister of Religious Affairs and Wakfs : Fajr: 18.0° - Isha'a: 17.0°"
data "Egyptian General Authority                       : Fajr: 19.5° - Isha'a: 17.5°"
data "Egyptian General Authority (Bis)                 : Fajr: 20.0° - Isha'a: 18.0°"
data "France UOIF - Angle 12°                          : Fajr: 12.0° - Isha'a: 12.0°"
data "France - Angle 15°                               : Fajr: 15.0° - Isha'a: 15.0°"
data "France - Angle 18°                               : Fajr: 18.0° - Isha'a: 18.0°"
data "Islamic University, Karachi                      : Fajr: 18.0° - Isha'a: 18.0°"
data "JAKIM (Jabatan Kemajuan Islam Malaysia)          : Fajr: 20.0° - Isha'a: 18.0°"
data "MUIS (Majlis Ugama Islam Singapura               : Fajr: 20.0° - Isha'a: 18.0°"
data "Muslim World League (MWL)                        : Fajr: 18.0° - Isha'a: 17.0°"
data "North America (ISNA)                             : Fajr: 15.0° - Isha'a: 15.0°"
data "Shia Ithna Ashari (Jafari)                       : Fajr: 16.0° - Isha'a: 14.0°"
data "SIHAT/KEMENAG (Kementerian Agama RI)             : Fajr: 20.0° - Isha'a: 18.0°"
data "Tunisian Ministry of Religious Affairs           : Fajr: 18.0° - Isha'a: 18.0°"
data "General Authority of Islamic Affairs And Endowments : Fajr: 19.5° - Isha'a: 90 min"
data "Umm Al-Qura, Makkah                              : Fajr: 18.5° - Isha'a: 90 min"
data "University of Tehran                             : Fajr: 17.7° - Isha'a: 15.0°"
rem ============================================================================
' C'est la procédure qui fait tous les calculs
SUB CalcPrayerTimes(day,month,year,fajrTwilight,ishaTwilight)  
    latitude = val(text$(21)) : longitude = val(text$(31)) : TimeZone = val(text$(41))
    dst = val(text$(46))
    radians
    select item_index(51)
        case 01 : FajrTwilight = -18.0 : ishaTwilight = -17.0  : ' Algerian Minister of Religious Affairs and Wakfs
        case 02 : FajrTwilight = -19.5 : ishaTwilight = -17.5  : ' Egyptian General Authority
        case 03 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' Egyptian General Authority (Bis)
        case 04 : FajrTwilight = -12.0 : ishaTwilight = -12.0  : ' France UOIF - Angle 12°      
        case 05 : FajrTwilight = -15.0 : ishaTwilight = -15.0  : ' France - Angle 15°
        case 06 : FajrTwilight = -18.0 : ishaTwilight = -18.0  : ' France - Angle 18°        
        case 07 : FajrTwilight = -18.0 : ishaTwilight = -18.0  : ' Islamic University, Karachi
        case 08 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' JAKIM (Jabatan Kemajuan Islam Malaysia)
        case 09 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' MUIS (Majlis Ugama Islam Singapura
        case 10 : FajrTwilight = -18.0 : ishaTwilight = -17.0  : ' Muslim World League (MWL)
        case 11 : FajrTwilight = -15.0 : ishaTwilight = -15.0  : ' North America (ISNA)
        case 12 : FajrTwilight = -16.0 : ishaTwilight = -14.0  : ' Shia Ithna Ashari (Jafari)
        case 13 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' SIHAT/KEMENAG (Kementerian Agama RI)
        case 14 : FajrTwilight = -18.0 : ishaTwilight = -18.0  : ' Tunisian Ministry of Religious Affairs  
        case 15 : FajrTwilight = -19.5 : ' Isha'a: 90 min      : ' UAE General Authority of Islamic Affairs And Endowments
        case 16 : FajrTwilight = -18.5 : ' Isha'a: 90 min      : ' Umm Al-Qura, Makkah
        case 17 : FajrTwilight = -17.7 : ishaTwilight = -15.0  : ' University of Tehran
    end_select
    D = (367 * year) - ((year + int((month + 9) / 12)) * 7 / 4) + ((int(275 * month / 9)) + day - 730531.5)
    L = 280.461 + 0.9856474 * D : L = moreLess360(L)
    M = 357.528 + (0.9856003) * D : M = moreLess360(M)
    Lambda = L + 1.915 * sin(degree_To_Radian(M)) + 0.02 * sin(degree_To_Radian(2 * M))
    Lambda = moreLess360(Lambda)    
    Obliquity = 23.439 - 0.0000004 * D    
    Alfa = radian_to_degree(atn((cos(degree_to_radian(Obliquity)) * tan(degree_To_Radian(Lambda)))))
    Alfa = moreLess360(Alfa)
    Alfa = Alfa - (360 * (int(Alfa / 360)))
    Alfa = Alfa + 90 * (int(Lambda / 90) - int(Alfa / 90))    
    ST = 100.46 + 0.985647352 * D
    Dec = radian_To_Degree(asin(sin(degree_To_Radian(Obliquity)) * sin(degree_To_Radian(Lambda))))
    a = (sin(degree_To_Radian(-0.8333)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))
    if abs(a) > 1  : ' le soleil ne se couche pas
       FajrTime = -1 : sunRiseTime = -1
       asrTime  = -1 : maghribTime = -1 : ishaTime = -1
       exit_sub
    end_if    
    Durinal_Arc = radian_To_Degree(acos((sin(degree_To_Radian(-0.8333)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))))  
    Noon = Alfa - ST
    Noon = moreLess360(Noon)    
    UT_Noon = Noon - longitude
' ------------------------------------------------------------------------------    
' Calculating Prayer Times Arcs & Times
' ------------------------------------------------------------------------------    
' Zuhr Time (Local noon)
    zuhrTime = UT_Noon / 15 + timeZone + dst    
    if standard = 1 : ' Asr Standard (Shafii, Maliki, Hanbali)
       Asr_Alt = radian_To_Degree(atn(1 + tan(degree_To_Radian(abs(latitude - Dec)))))
    else            : ' Asr Hanafi      
       Asr_Alt = radian_To_Degree(atn(2 + tan(degree_To_Radian(abs(latitude - Dec)))))
    end_if
    a = (sin(degree_To_Radian(90 - Asr_Alt)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))
    if abs(a) > 1  
       FajrTime = -1 : sunRiseTime = -1
       asrTime  = -1 : maghribTime = -1 : ishaTime = -1
       exit_sub
    end_if  
    Asr_Arc = radian_To_Degree(acos((sin(degree_To_Radian(90 - Asr_Alt)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))))
    Asr_Arc = Asr_Arc / 15
'  Asr Time
    asrTime = zuhrTime + Asr_Arc
' Shorouq Time        
    sunRiseTime = zuhrTime - (Durinal_Arc / 15)
' Maghrib Time
    maghribTime = zuhrTime + (Durinal_Arc / 15)
    a = (sin(degree_To_Radian(ishaTwilight)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))    
    if abs(a) > 1  : ' le soleil ne se lève pas
       FajrTime = -1 : sunRiseTime = -1
       asrTime  = -1 : maghribTime = -1 : ishaTime = -1
       exit_sub
    end_if
    Esha_Arc = radian_To_Degree(acos((sin(degree_To_Radian(ishaTwilight)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))))      
' Isha Time
    ishaTime = zuhrTime + (Esha_Arc / 15)
' Fajr Time
    a = (sin(degree_To_Radian(fajrTwilight)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))
    if abs(a) > 1  
       FajrTime = -1 : sunRiseTime = -1
       asrTime  = -1 : maghribTime = -1 : ishaTime = -1
       exit_sub
    end_if
    Fajr_Arc = radian_To_Degree(acos((sin(degree_To_Radian(fajrTwilight)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))))
    fajrTime = zuhrTime - (Fajr_Arc / 15)
                        
END_SUB
rem ============================================================================
SUB Aide()
    dim_local t$
    t$ = "Aide sur le programme" + chr$(13)
    t$ = t$ + "Au lancement du programme, il affiche les résultats du calcul pour la ville de Moknine (Tunisie) pour le mois en cours" + chr$(13)
    t$ = t$ + "et propose comme méthode de calcul (dans le COMBO Méthode) celle appliquée en Tunisie (Tunisian Ministry of Religious)" + chr$(13)
    t$ = t$ + "Pour les autres pays, vous pouvez opter pour l'une des métodes proposées dans le COMBO, surtout si votre ville se situe aux" + chr$(13)
    t$ = t$ + "altitudes supérieures à 45°"+chr$(13)
    t$ = t$ + "Il propose un choix parmi 8 pays qui vous permettent d'en choisir une ville parmi celles qui sont proposées." + chr$(13)
    t$ = t$ + "Si votre ville ne s'y trouve pas, vous avez la possibilité d'entrer manuellement ses coordonnées (Latitude, Longitude, Fuseau, DST)" + chr$(13)
    t$ = t$ + "Vous pouvez aussi l'ajouter dans le code dans les lignes DATA." + chr$(13)
    t$ = t$ + "En optant pour l'un des pays proposé, vous activez un COMBO vous permettant de choisir une ville." + chr$(13)
    t$ = t$ + "Le COMBO DST c'est pour le choix de l'heure d'été (valeurs possibles : 0 pas de passage; 1 passage à l'heure d'été." + chr$(13)
    t$ = t$ + "Les boutons 'main' indiquant la gauche c'est pour le mois précédent, tandis que celle qui indique la droite c'est pour le mois suivant." + chr$(13)
    t$ = t$ + chr$(13)    
    t$ = t$ + "Après chaque modification et pour lancer un nouveau calcul,cliquez sur le bouton 'Calculer' (La Palice ne peut pas dire mieux !)" + chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "Note :" + chr$(13)
    t$ = t$ + "L’horaire de la prière de Ichaa correspond à la disparition du crépuscule (12° à 18°) après le coucher du Soleil." + chr$(13)
    t$ = t$ + "L'Arabie Saoudite, par exemple ajoute 90 mn à l'heure du Maghrib pour obtenir celle du Icha"+ chr$(13)
    t$ = t$ + " et ajoute 120 mn pour le mois de Ramadan."+ chr$(13)
    t$ = t$ + chr$(13) + chr$(13)    
    t$ = t$ + "Pour information :" + chr$(13)
    t$ = t$ + "******************" + chr$(13)
    t$ = t$ + "La définition de l'heure du salat Asr divise les écoles islamiques en deux positions dogmatiques." + chr$(13)
    t$ = t$ + "Les trois écoles juridiques Malikite, Hambalite et Shafite soutiennent que le Asr commence lorsque la taille d'un objet vertical est la taille de son ombre." + chr$(13)
    t$ = t$ + "Cette méthode est celle adoptée généralement dans les communautés du Maghreb (d'obédience Malikite)." + chr$(13)
    t$ = t$ + "La quatrième école Hanafite estime que le Asr commence lorsque l'ombre d'un objet vertical est le double de la taille de cet objet."+chr$(13)
    t$ = t$ + "Cette nette différence dogmatique entraîne des écarts dans les horaires de salat sur les calendriers correspondant à un même endroit." + chr$(13)
    t$ = t$ + "Le programme vous permet de choisir votre doctrine réligieuse (Madh-hab) dans le COMBO 'Calcul Asr'. " + chr$(13)
    t$ = t$ + chr$(13) + chr$(13)
    t$ = t$ + "Le programme est fourni comme tel sans aucune garantie des résultats."+chr$(13)
    t$ = t$ + "En aucun cas je ne serais responsable de dommages résultants de l'utilisation de cette application."    
    message t$
END_SUB
rem ============================================================================
SUB Culture()
    dim_local t$
    t$ = "Méthode de calcul des horaires de prières" + chr$(13)
    t$ = t$ + "Les prières (pour les Musulmans) sont au nombre de cinq par journée." + chr$(13)
    t$ = t$ + "Les horaires de ces cinq prières varient d'un endroit (ville) à l'autre et d'un jour à l'autre." + chr$(13)
    t$ = t$ + "Le calcul fait intervenir les heures du crépuscule, mais lequel ?" + chr$(13)
    t$ = t$ + "Il existe trois types de crépuscules : " + chr$(13)
    t$ = t$ + "Le crépuscule astronomique : il intervient lorsque le soleil se situe "
    t$ = t$ + "en dessous de l’horizon à une hauteur de 18°, et il correspond au moment" + chr$(13)
    t$ = t$ + "où l’obscurité totale s’installe au niveau de cet horizon." + chr$(13)
    t$ = t$ + "Le crépuscule nautique : il intervient lorsque le soleil se situe en dessous de l’horizon à une hauteur de 12°." + chr$(13)
    t$ = t$ + "Le crépuscule civil : il intervient lorsque le soleil se situe en dessous de l’horizon à une hauteur de 06°." + chr$(13)
    t$ = t$ + "Or, il s’est avéré que le fait de se baser sur le crépuscule astronomique (18°) pour le calcul des heures de prière "
    t$ = t$ + "pose des difficultés pour les pays d’Europe." + chr$(13)
    t$ = t$ + "Il est impossible de calculer les horaires de la prière du Fajr à partir du 18° et ce à partir de la mi-mai jusqu’à la mi-juin environ."+chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "L’écart entre le Fajr et celui du lever du soleil (Chourouk) se creuse pour atteindre un record de 3h40 min en période d’été." + chr$(13)
    t$ = t$ + "L’écart entre la prière de Ichaa et celle du Fajr se réduit durant des semaines en période d’été." + chr$(13)
    t$ = t$ + "A titre d’exemple : le 28 mai à Paris en se basant sur le 18°, la prière de Ichaa est à 00h18 et la prière du Fajr est à 02h59 !" + chr$(13)
    t$ = t$ + "Soit un écart de 2h41mn."+chr$(13)
    t$ = t$ + "Par contre, retenir le critère du 12° (le crépuscule nautique) permet de surmonter ces difficultés." + chr$(13)
    t$ = t$ + "D’une part, l’écart entre la prière du Fajr et celle du lever du soleil (Chourouk) n’excède jamais 02 heures durant toute l’année."+chr$(13)
    t$ = t$ + "D’autre part, l’écart entre la prière du Ichaa et celle du Fajr reste constamment importante."+chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "Le fait d'opter pour ce critère du 12° permet d’alléger la contrainte sur les musulmans vivant en Europe pour cette pratique cultuelle " + chr$(13)
    t$ = t$ + "et surtout durant le mois de Ramadan et spécialement en période d’été." + chr$(13)
    t$ = t$ + "L’avantage de ce choix réside dans la possibilité de l’utiliser durant toute l’année, à l’inverse de celui du 18°." + chr$(13)
    t$ = t$ + "Certains pays ajoutent 5 minutes en plus par précaution pour les horaires de Dhohr et du Maghrib" + chr$(13)
    t$ = t$ + "L’horaire du Asr est calculé selon la règle islamique où l’ombre de chaque objet devient égale à celui-ci." + chr$(13)
    t$ = t$ + "Mais certains pays utilisent d'autres critères, ce qui ne facilite pas la tâche !" + chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "En résumé : " + chr$(13)
    t$ = t$ + "* Prière de l'aube (matin) (Fajr) : Le début coïncide avec la fin du délai de d'Isha, soit lorsque le soleil remonte à 19 ° sous l'horizon." + chr$(13)
    t$ = t$ + "  La fin est atteinte au lever du soleil avec le limbe supérieur du soleil tangent à l'horizon soit h = - 0,267°"+ chr$(13)
    t$ = t$ + "* Prière de la mi-journée (midi) (Dhur) : la durée permise commence quand le soleil a traversé le méridien (soit quand l'ombre d'un objet a commencé à "
    t$ = t$ + "  augmenter) et se termine lorsque l'ombre d'un gnomon s'est allongée d'un quart de sa hauteur par rapport à son ombre à midi." + chr$(13)
    t$ = t$ + "* Prière de l'après-midi ('Asr) : l'intervalle commence lorsque l'augmentation de l'ombre est égale à la longueur du gnomon et se termine quand l'ombre en a atteint le double." + chr$(13)
    t$ = t$ + "* Prière du coucher de soleil (Maghrib) : Le début coïncide avec la disparition totale du soleil sous l'horizon , soit pour h = -0.267°."+chr$(13)
    t$ = t$ + "  La fin du délai est atteinte à la dernière lueur du crépuscule, soit le soleil à 18° sous l'horizon."+chr$(13)
    t$ = t$ + "  Attention, cette condition peut être irréalisable à certaines dates pour certaines latitudes." + chr$(13)
    t$ = t$ + "* Prière de la nuit ('Isha) : Le début coïncide avec la fin du délai de Maghrib, soit le soleil à 17° sous l'horizon." + chr$(13)
    t$ = t$ + "  La fin du délai est atteinte avec l'apparition de l'aube lorsque le soleil remonte à 19° sous l'horizon." + chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "Note :" + chr$(13)
    t$ = t$ + "Les opinions divergent sur les angles à utiliser pour le calcul de Fajr et Isha." +chr$(13)
    t$ = t$ + "La mosquée de Paris retient 15° pour Fajr et 18° pour Isha." + chr$(13) + chr$(13)  
    t$ = t$ + chr$(13)
    t$ = t$ + "Pour des plus amples informations sur le calcul des horaires de prière, référez-vous à : " + chr$(13)
    t$ = t$ + "http://www.averroes-aveyron.fr/medias/files/methodes-de-calcul.pdf" + chr$(13)    
    message t$
END_SUB
rem ============================================================================
' Liste des pays : nom du pays, fuseau horaire du pays et flag pour heure d'été (1 oui, 0 non)
data "Algérie" ,1,0 , "Belgique",1,1 ,"Egypte",2,0 , "France",1,1, "Lybie",2,0
data "Maroc",1 , 0, "Arabie Saoudite",3,0 ,"Tunisie",1,0
' ------------------------------------------------------------------------------
data "Algérie"  : ' UTC + 1 ; DST 0
' -----------
1:
'     Ville             Latitude   Longitude
data "Adrar" ,          27.850,    -0.317  
data "Alger" ,          36.833,     3.000
data "Annaba" ,         36.917,     7.783  
data "Batna" ,          35.567,     6.167    
data "Bechar" ,         31.583,    -2.283
data "Bejaia" ,         36.817,     5.050  
data "Biskra" ,         34.833,     5.683  
data "Blida" ,          36.500,     2.833  
data "Boussaada" ,      35.167,     4.150  
data "Constantine" ,    36.367,     6.667  
data "El Asnam" ,       36.183,     1.350    
data "El Djelfa" ,      34.717,     3.233  
data "Ghardaia" ,       32.333,     3.667
data "Laghouat" ,       33.817,     2.917
data "Mostaganem" ,     35.900,     0.083  
data "M'Sila" ,         35.667,     4.517
data "Oran" ,           35.750,    -0.633
data "Ouargla" ,        32.000,     5.267
data "Setif" ,          36.183,     5.400  
data "Sidi-bel-Abbes" , 35.250,    -0.650
data "Skikda" ,         36.883,     6.900  
data "Tamanrasset" ,    22.833,     5.467
data "Tebessa" ,        35.350,     8.100  
data "Tiaret" ,         35.333,     1.333
data "Tilimsen" ,       34.883,    -1.350      
data "Tizi-Ouzou" ,     36.733,     4.083  
data "FIN"  
' ------------------------------------------------------------------------------
data "Belgique" : ' UTC + 1  UTC + 2 Heure d'été
' -----------
2:
'     Ville             Latitude   Longitude
data "Antwerp" ,        51.217,   4.417  
data "Brussels" ,       50.850,   4.350  
data "Charleroi" ,      50.417,   4.450
data "Gent" ,           51.033,   3.700
data "Liege" ,          50.633,   5.583  
data "Ostende" ,        51.217,   2.917    
data "Mons" ,           50.467,   3.967      
data "Namur" ,          50.467,   4.867
data "FIN"
' ------------------------------------------------------------------------------
data "Egypte"  : ' UTC + 2
' -------------------------------------
3:
'     Ville             Latitude   Longitude
data "Abou Simbel" ,    22.317,   31.633  
data "Alexandria" ,     31.217,   29.917
data "Aswan" ,          24.083,   32.933
data "Asyut" ,          27.233,   31.117
data "Beni-Souef" ,     29.083,   31.083  
data "Cairo" ,          30.050,   31.250
data "Damanhur" ,       31.050,   30.467
data "Dumyat" ,         31.433,   31.800
data "El Alamein" ,     30.833,   28.950
data "Helwan" ,         29.850,   31.333
data "Isma'ilia" ,      30.600,   32.250  
data "Karnak" ,         25.683,   32.667  
data "Port Said" ,      31.283,   32.300    
data "Sohag" ,          26.550,   31.700
data "Suez" ,           29.983,   32.550
data "Tanta" ,          30.800,   31.000  
data "Zagazig" ,        30.583,   31.500  
data "FIN"
' -------------------------------------------------------------------------------
data "France" : ' UTC + 1  UTC + 2 Heure d'été
' ----------
4:
'     Ville             Latitude   Longitude
data "Brest" ,          48.383,   -4.500  
data "Quimper" ,        48.000,   -4.100  
data "Lorient" ,        47.750,   -3.350  
data "St-Brieuc" ,      48.517,   -2.750  
data "Vannes" ,         47.667,   -2.733    
data "St Nazaire" ,     47.283,   -2.200  
data "Rennes" ,         48.100,   -1.667  
data "Cherbourg" ,      49.633,   -1.617  
data "Nantes" ,         47.233,   -1.583  
data "La-Roche-sur-Yon" , 46.633, -1.500
data "Bayonne" ,        43.500,   -1.467
data "La Rochelle" ,    46.167,   -1.167  
data "St-Lo" ,          49.117,   -1.083  
data "Laval" ,          48.067,   -0.750    
data "Bordeaux" ,       44.833,   -0.567  
data "Angers" ,         47.483,   -0.533  
data "Mont-de-Marsan" , 43.900,   -0.500  
data "Niort" ,          46.317,   -0.450  
data "Pau" ,            43.300,   -0.367  
data "Caen" ,           49.183,   -0.367
data "Alençon" ,        48.417,    0.083  
data "Tarbes" ,         43.233,    0.083  
data "Le Havre" ,       49.500,    0.100  
data "Angouleme" ,      45.667,    0.167  
data "Le Mans" ,        48.000,    0.200    
data "Poitiers" ,       46.583,    0.333  
data "Cahors" ,         44.467,    0.433  
data "Auch" ,           43.500,    0.600  
data "Agen" ,           44.200,    0.633  
data "Tours" ,          47.383,    0.700  
data "Perigueux" ,      45.200,    0.733    
data "Dieppe" ,         49.917,    1.083    
data "Rouen" ,          49.433,    1.083  
data "Evreux" ,         49.050,    1.183    
data "Limoges" ,        45.833,    1.250    
data "Montauban" ,      44.017,    1.333  
data "Blois" ,          47.600,    1.333  
data "Toulouse" ,       43.617,    1.450    
data "Chartres" ,       48.450,    1.500    
data "Foix" ,           42.950,    1.583  
data "Chateauroux" ,    46.817,    1.683    
data "Tulle" ,          45.267,    1.767    
data "Abbeville" ,      50.100,    1.850    
data "Gueret" ,         46.167,    1.866  
data "Orleans" ,        47.900,    1.900  
data "Vierzon" ,        47.233,    2.050  
data "Pontoise" ,       49.050,    2.083  
data "Beauvais" ,       49.433,    2.083  
data "Versailles" ,     48.800,    2.133  
data "Albi" ,           43.933,    2.144    
data "Nanterre" ,       48.883,    2.217    
data "Amiens" ,         49.900,    2.300  
data "Paris" ,          48.833,    2.333    
data "Bourges" ,        47.083,    2.383    
data "Carcassonne" ,    43.217,    2.350  
data "Dunkerque" ,      51.033,    2.383  
data "Aurillac" ,       44.933,    2.433    
data "Bobigny" ,        48.917,    2.450  
data "Créteil" ,        48.783,    2.467    
data "Melun" ,          48.533,    2.557
data "Evry" ,           48.633,    2.567    
data "Rodez" ,          44.350,    2.567  
data "Montlucon" ,      46.333,    2.600    
data "Arras" ,          50.283,    2.767    
data "Lens" ,           50.433,    2.833  
data "Perpignan" ,      42.700,    2.900  
data "Lille" ,          50.650,    3.083  
data "Clermont-Ferrand",45.783,    3.083      
data "Nevers" ,         47.000,    3.150    
data "Moulins" ,        46.567,    3.333  
data "Mende" ,          44.533,    3.500    
data "Auxerre" ,        47.800,    3.583    
data "Laon" ,           49.567,    3.617    
data "Montpellier" ,    43.600,    3.883      
data "Le Puy" ,         45.050,    3.883    
data "Avallon" ,        47.500,    3.900  
data "Reims" ,          49.250,    4.033  
data "Troyes" ,         48.300,    4.083    
data "Roanne" ,         46.033,    4.083    
data "Nimes" ,          43.500,    4.350    
data "Chalons-S-Marne", 48.967,    4.367    
data "St-Etienne" ,     45.433,    4.383    
data "Privas" ,         44.733,    4.600    
data "Mezières" ,       49.767,    4.733    
data "Avignon" ,        43.933,    4.800    
data "Lyon" ,           45.767,    4.833      
data "Macon" ,          45.300,    4.833    
data "Valence" ,        44.933,    4.900    
data "Dijon" ,          47.333,    5.033    
data "Chaumont" ,       48.117,    5.133    
data "Bar-le-Duc" ,     48.767,    5.167    
data "Bourg" ,          46.200,    5.217
data "Observatoire SIRENE" , 44.000, 5.333  
data "Marseille " ,     43.300,    5.367  
data "Lons-le-Saunier", 46.683,    5.550  
data "Grenoble" ,       45.183,    5.717    
data "Toulon" ,         43.117,    5.917  
data "Chambéry" ,       45.567,    5.917    
data "Besancon" ,       47.250,    5.983    
data "Gap" ,            44.550,    6.083  
data "Annecy" ,         45.900,    6.117  
data "Metz" ,           49.117,    6.183  
data "Vesoul" ,         47.633,    6.150    
data "Nancy" ,          48.700,    6.200  
data "Digne" ,          44.083,    6.233  
data "Epinal" ,         48.167,    6.467  
data "Belfort" ,        47.633,    6.867    
data "Cannes" ,         43.550,    7.000    
data "Nice" ,           43.700,    7.267    
data "Colmar" ,         48.083,    7.350  
data "Mulhouse" ,       47.750,    7.350    
data "Strasbourg" ,     48.583,    7.750  
data "Ajaccio" ,        41.917,    8.717    
data "Bastia" ,         42.683,    9.433
data "FIN"
' ------------------------------------------------------------------------------
data "Libye"  :' UTC + 2
' ---------
5:
'     Ville             Latitude   Longitude
data "Sabratah" ,       32.833,    12.400  
data "Tripoli" ,        32.967,    13.200  
data "Al Khums" ,       32.650,    14.250  
data "Sabhah" ,         27.050,    14.433    
data "Benghazi" ,       32.117,    20.083  
data "Ajdabiyah" ,      30.800,    20.250    
data "Al Marj" ,        32.500,    20.833                
data "Darnah" ,         32.767,    22.650    
data "Tubruq" ,         32.100,    23.933  
data "FIN"
' ------------------------------------------------------------------------------

data "Moroc" : ' UTC + 1
' ---------
6:
'     Ville             Latitude   Longitude
data "Agadir" ,         30.500,   -9.667    
data "Safi" ,           32.300,   -9.333    
data "El Jadida" ,      33.183,   -8.283    
data "Marrakech" ,      31.817,   -8.000  
data "Settat" ,         33.067,   -7.617    
data "Casablanca" ,     33.650,   -7.583    
data "Mohammedia" ,     33.717,   -7.333    
data "Khouribga" ,      32.900,   -6.950  
data "Sale" ,           34.067,   -6.833    
data "Kenitra" ,        34.333,   -6.567    
data "Beni Mellal" ,    32.367,   -6.483  
data "Khemisset" ,      33.833,   -6.050    
data "Ksar el Kebir" ,  35.067,   -5.933    
data "Tanger" ,         35.800,   -5.833    
data "Meknes" ,         33.883,   -5.617    
data "Tetouan" ,        35.567,   -5.367    
data "Ceuta" ,          35.883,   -5.317    
data "Fes" ,            34.083,   -5.000    
data "Taza" ,           34.267,   -4.017    
data "Nador" ,          35.167,   -3.000    
data "Oujda" ,          34.683,   -1.750  
data "FIN"
' ------------------------------------------------------------------------------
rem ============================================================================
data "Arabie Saoudite" : ' UTC + 3
' ----------------
7:
'     Ville             Latitude   Longitude
data "Riyadh" ,         24.650,    46.767  
data "Al Wajh" ,        26.267,    36.467    
data "Tabuk" ,          28.367,    36.533    
data "Yanbu'Al Bahr" ,  24.117,    38.067  
data "Tayma" ,          27.617,    38.500  
data "Jiddah" ,         21.500,    39.167    
data "Khaybar" ,        25.800,    39.200    
data "Medina" ,         24.500,    39.583  
data "Mecca" ,          21.433,    39.817  
data "Al Jawf" ,        29.783,    39.867    
data "Al Lith" ,        20.167,    40.267  
data "At Ta'if" ,       21.250,    40.350    
data "Badanah" ,        31.000,    41.083    
data "Al Qunfidhah" ,   19.150,    41.117    
data "Turabah" ,        21.250,    41.567  
data "Ha'il" ,          27.517,    41.750  
data "bha" ,            18.233,    42.517  
data "Jizan" ,          16.933,    42.550    
data "Buraydah" ,       26.333,    43.983    
data "Najran" ,         17.517,    44.317    
data "Shaqra" ,         25.300,    45.250    
data "Al Artawiyak" ,   26.517,    45.350    
data "Ad Dilam" ,       23.983,    47.100    
data "Haradh" ,         24.200,    49.117    
data "Al Hufuf" ,       25.333,    49.567    
data "Ad Dammam" ,      26.417,    50.100    
data "Al Khurmah" ,     21.917,    42.033
data "FIN"  
' ------------------------------------------------------------------------------
Data "Tunisie" : ' UTC + 1
' -----------
8:
'     Ville             Latitude   Longitude
data "Gafsa" ,          34.467,     8.717  
data "Beja" ,           36.717,     9.217  
data "Bizerte" ,        37.300,     9.867    
data "Kairouan" ,       35.700,     10.017  
data "Gabes" ,          33.867,     10.100  
data "Tunis" ,          36.833,     10.217  
data "Sousse" ,         35.833,     10.633    
data "Sfax" ,           34.750,     10.717  
data "Nabeul" ,         36.500,     10.733
data "Moknine" ,        35.633,     10.833
data "Monastir",        35.777,     10.826
data "Mahdia" ,         35.502,     11.045
data "Jendouba" ,       35.501,     08.783
data "Le Kef" ,         36.179,     08.714
data "Siliana" ,        35.990,     09.278
data "Ariana" ,         36.862,     10.195
data "Ben Arous" ,      36.743,     10.232
data "Kasserine" ,      35.171,     08.828
data "Kebili" ,         33.124,     08.836
data "La Manouba" ,     36.807,     10.101
data "Medenine" ,       33.348,     10.494
data "Sidi Bouzid" ,    35.033,     09.5
data "Tataouine" ,      32.921,     10.450
data "Zaghouan" ,       36.399,     10.147
data "La Soukra" ,      36.883,     10.25
data "La Marsa" ,       36.876,     10.325

data "FIN"  
rem ============================================================================
rem &&&&&&&&&&&&&&&&&&&&&&  FIN DU CODE  &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
rem ============================================================================
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Marc

Marc


Nombre de messages : 2466
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyVen 3 Mai 2019 - 10:24

Bonjour Papydall !

Sauf erreur de ma part, je pense que la fonction moreLess360 peut être remplacée par la fonction Panoramic  WRAP_VALUE().  Question
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyVen 3 Mai 2019 - 23:51

C’est tout à fait exact, Marc.
Nouvelle version :
Remplacement de moreLess360() par WRAP_VALUE() et ajout d’un gadget pour afficher la date (prononcée par Virginie si vous avez déjà  installé la voix française. )

Code:

rem ============================================================================
rem                        CalcPrayerTimes.bas
rem              Calculateur des heures de prière par Papydall
rem                            Version 3.3
rem                    Dernière modification : 04 Mai 2019
rem ============================================================================
Demarrer()
end
rem ============================================================================
SUB Demarrer()
    Init()
    Gui()
    Afficher_Kibla()
    Grille(NbJours(month,year))
    Run()
    on_timer 720,Afficher_Horloge
    Parler()
END_SUB
rem ============================================================================
SUB Init()
    label clic, change, Afficher_Horloge
    label 1, 2, 3, 4, 5, 6, 7, 8 : ' pour restore_label
    dim year, month, day
    dim longitude, latitude, timeZone,fajrTwilight, ishaTwilight
    dim fajrTime, sunRiseTime, zuhrTime, asrTime, maghribTime, ishaTime
    dim d, l, m, lambda, obliquity, alfa, st, dec, durinal_Arc, noon, Ut_Noon
    dim Asr_Alt, Asr_Arc, Esha_Arc, Fajr_Arc
    dim prayTime$(5), standard,nc
    dim hours, minutes ,h$, m$, a, n, dst, methode, p$, ville$, pays$
    dim NbPays : NbPays = 8 : ' 8 c'est le nombre des pays proposés dans le programme
    dim Fuseau(NbPays), H_Ete(NbPays)
    standard = 1 : ' Pour le calcul du Asr : 1 ---> (Shafii, Maliki, Hanbali)                                          ' 0 ---> Hanafi     
    day = date_day : month = date_month : year = date_year : ' La date courante
     
END_SUB
rem ============================================================================
SUB GUI()
    dim_local i,t$
    t$ = " Calculateur des heures de prière par Papydall "
    color 0,240,255,255
    width 0,1100 : height 0,800 : top 0,(screen_y - height(0)) / 2
    left 0,(screen_x - width(0))/2
    shape 5 : top 5,5 : left 5,450 : width 5,600 : height 5,50
    shape_rectangle_rounded 5 : color 5,25,100,50
    shape 6 : top 6,5 : left 6,20 : width 6,420 : height 6,50
    shape_rectangle_rounded 6 : color 6,25,100,50
    alpha 10 : top 10,20 : left 10,40 : font_color 10,250,100,50
      font_bold 10      : font_name 10,"tahoma" : font_size 10,12
      caption 10,t$    : caption 0,t$ : application_title t$
    alpha 20 : top 20,80 : left 20,010  : caption 20,"Latitude : "
    edit  21 : top 21,80 : left 21,070  : width 21,60 : font_bold 21 : text 21,"35.633"
      hint 21,"En degrés décimaux (± 90°) positive au Nord" : on_change 21,change
    alpha 30 : top 30,80 : left 30,140  : caption 30,"Longitude : "
    edit  31 : top 31,80 : left 31,210  : width 31,60 : font_bold 31 : text 31,"10.833"
      hint 31,"En degrés décimaux (± 180°) positive à l'est" : on_change 31,change
    alpha 40 : top 40,80 : left 40,285  : caption 40,"Fuseau :"
    spin 41  : top 41,80 : left 41,335  : width 41,60 : min 41,-12 : max 41,12 : font_bold 41
      hint 41,"ZoneTime, décalage heure : Valeurs possibles ± 12" : position 41,1
      on_change 41,change
    alpha 45 : top 45,80 : left 45,420  : caption 45,"DST :" : font_bold 45 : font_name 45,"tahoma"
    combo 46 : top 46,80 : left 46,450  : width 46,50 : hint 46,"Heure d'été"
    on_change 46,change
    alpha 50 : top 50,80 : left 50,520  : caption 50,"Méthode :" 
    combo 51 : top 51,80 : left 51,580  : width 51,480 : font_bold 51  : height 51,40
    font_name 51,"tahoma" : on_change 51,change
    hint 51,"convention de calcul utilisé"   
    alpha 55 :  top 55,130 : left 55,10 : font_bold 55 : font_name 55,"tahoma"
    caption 55,"Calcul Asr :"
    combo 56 : top 56,130 : left 56,80 : font_bold 56 : font_name 56,"tahoma"
    width 56,220 : hint 56,"Doctrines religieuses" :  on_change 56,change
    item_add 56,"Standard (Shafii, Maliki, Hanbali)"
    item_add 56,"Hanafi" : item_select 56,1   
    button 60 : top 60,20 : left 60,950 : caption 60,"Quitter"
    on_click 60,clic
    button 70 : top 70,20 : left 70,470  : caption 70,"Calculer"
    on_click 70,clic : inactive 70 
    button 80 : top 80,120 : left 80,500 : font_bold 80 : font_name 80,"wingdings 2"
    font_size 80,30 : caption 80,"D" : hint 80,"Mois précédent" : on_click 80,clic
    button 90 : top 90,120 : left 90,760 : font_bold 90 : font_name 90,"wingdings 2"
    font_size 90,30 : caption 90,"E" : hint 90,"Mois suivant" : on_click 90,clic
    alpha 100: top 100,130 : left 100,630 : font_bold 100 : font_name 100,"arial"
    font_size 100,12 : caption 100,Month_Name$(month)  + "  " + str$(year)
    item_add 46,0 : item_add 46,1 : item_select 46,1 
    for i = 1 to 17 : read t$ : item_add 51,t$ : next i
    item_select 51,14         
    for i = 20 to 70 step 10 : font_bold i : font_name i,"tahoma" : next i 
    alpha 110 : top 110,180 : left 110,10 : font_bold 110 : font_size 110,12
    font_name 110,"tahoma" : font_color 110, 255,0,0 : caption 110,"Pays : Tunisie"
    alpha 120 : top 120,180 : left 120,220 : font_bold 120 : font_size 120,12
    font_name 120,"tahoma" : font_color 120, 255,0,0 : caption 120,"Ville : Moknine"       
    alpha 130 : top 130,230 : left 130,10 : font_bold 130 : font_name 130,"tahoma"
    font_size 130,12 : font_color 130,0,0,255 : caption 130,"Choix Pays / Villes"   
    alpha 140 : top 140,260 : left 140,60 : font_bold 140 : font_name 140,"Wingdings"
    font_size 140,30 : caption 140,"ê"   
    button 150 : top 150,20 : left 150,600 : font_bold 150 : caption 150,"Aide" : on_click 150,clic
    button 160 : top 160,20 : left 160,740 : font_bold 160 : width 160,150
    caption 160,"Pour votre culture" : on_click 160,clic
    container_option 200 : top 200,300 : left 200,10 : width 200,130 : height 200,35*NbPays +10
    color 200,255,255,0       
    for i = 1 to NbPays
        option 200+i  : parent 200+i,200 : top 200+i,30*i : left 200+i,10
        font_bold 200+i : font_name 200+i,"tahoma" : on_click 200+i,clic     
        read p$ : caption 200+i,p$
        read fuseau(i) : read H_Ete(i)     
    next i 
    combo 300 : top 300,300 : left 300,160
    font_bold 300 : width 300,300 : hide 300 : on_change 300,change   
    picture 400 : top 400,450 : left 400,170 : width 400,300 : height 400,300
    2d_target_is 400 : print_target_is 400
    alpha 410 : top 410,600 : left 410,10 : font_bold 410 : font_name 410,"tahoma"
    font_size 410,10 : font_color 410,255,0,0
    t$ = "Direction de la Kibla" + chr$(13) + "depuis Moknine" + chr$(13) + "Tunisie : "
    caption 410,t$
    hint 410,"Angle en ° à partir du Nord" +chr$(13)+"indiquant la direction de la Kibla"     
    alpha 420 : top 420,630 : left 420,130 : font_bold 420 : font_name 420,"tahoma'
    font_size 420,12 : font_color 420,0,0,0     
    alpha 430 : top 430, 680 : left 430,1 : font_bold 430 : font_name 430,"tahoma"
    font_size 430,10 : font_color 430,0,0,255
    hint 430,"Distance de la Mecque"
   
    alpha 500 : top 500,180+17*date_day : left 500,470 : font_name 500,"Wingdings"
    font_bold 500 : font_size 500,20 : font_color 500,255,0,0 : caption 500,"F"
    alpha 510 : top 510,180+17*date_day : left 510,840 : font_name 510,"Wingdings"
    font_bold 510 : font_size 510,20 : font_color 510,255,0,0 : caption 510,"E"
    hint 500,"Jour courant" : hint 510,"Jour courant"
   
    shape 599 : top 599,280 : left 599,870 : width 599,210 : height 599,250
    shape_rectangle_rounded 599 : color 599,0,0,0
   
    alpha 600 : top 600,310 : left 600,880 : font_color 600,255,255,0
    font_italic 600 : color 600,20,100,20  : font_bold 600 : font_size 600,12
    caption 600," NOUS SOMMES LE : "
    alpha 610 : top 610,340 : left 610,910 : font_color 610,255,0,0
    font_italic 610 : color 610,255,255,0  : font_bold 610 : font_size 610,18
   
    alpha 700 : top 700,430 : left 700, 940 :  font_color 700,255,255,0
    font_italic 700 : color 700,20,100,20  : font_bold 700 : font_size 700,12   
    caption 700,"IL EST :"
   
    alpha 710 : top 710,460 : left 710,930 : font_color 710,255,0,0
    font_italic 710 : color 710,255,255,0  : font_bold 710 : font_size 710,18
    caption 610,date$ : caption 710,time$   
    timer 720
   
END_SUB
rem ============================================================================
Afficher_Horloge: 
  caption 610,date$ : caption 710,time$
return
rem ============================================================================
SUB Parler() 
    timer_off 720
    file_open_write 9999,"parler.vbs"
    file_writeln 9999,"Dim speaks, speech"
    file_writeln 9999,"speaks="+chr$(34)+ "Bonjour ! cher utilisateur. Nous sommes, le " + chr$(34)  + "& date()"
    file_writeln 9999,"Set speech=CreateObject("+chr$(34)+"sapi.spvoice"+chr$(34)+")"
    file_writeln 9999,"speech.Speak speaks"
    file_writeln 9999,"speaks="+chr$(34)+"Il est,"+chr$(34)+"& time()"
    file_writeln 9999,"speech.Speak speaks"
    file_close 9999
    execute_wait "parler.vbs"
    file_delete "parler.vbs"
    timer_on 720 
END_SUB
rem ============================================================================
' Formule donnant la distance orthdromique entre deux points du globle exprimés
' par leurs coordonnées (latitude et longitude)
' La formule est donnée en assimilant la Terre à une sphère de 40 000 km de circonférence.
' 1.852 : c'est la valeur en km de un mille marin
' 60 : ce nombre provient du fait que le mille marin (1 852 m) correspond à une
' minute d'arc sur un grand cercle de la surface terrestre, et donc 60 milles
' marins correspondent à un degré.
FNC Distance_Orthodromique(lat1,lon1)
    dim_local lat2,lon2,km,d
    lat2 = 21.433  : lon2 = 39.817  : ' Coordonnées de la Mecque
    degrees
    km = 60*1.852
    d = km*acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon2-lon1))
    d = int(d)
    result d
END_FNC
rem ============================================================================
' Fonction de calcul de la Kibla
' Elle retourne l'angle partant de la direction du nord et compté dans le sens
' rétrograde (sens des aiguilles d'une montre)
FNC Kibla(latitude,longitude)
    dim_local Lat_Meq : ' Latitude de la Mecque
    dim_local Lon_Meq : ' Longitude de la Mecque
    dim_local a,b,c,q,n,d
    Lat_Meq = 21.433 : Lon_Meq = 39.817
    a = Lon_Meq - longitude  : b = latitude :c = Lat_Meq
    degrees
    n = sin(a) :d = cos(b) * tan(c) - sin(b) * cos(a) 
    if d = 0 then result 0 : exit_fnc
    q = atn(n/d)
    if sgn(n) <> sgn(q) then q = q + 180
    if (sgn(n) < 0) and (sgn(q) < 0) then q = q + 360
    result int(q)
END_FNC
rem ============================================================================
SUB Afficher_Kibla()
    dim_local la,lo,xc,yc,r,x,y,a,a1,c$,d
    degrees
    la = val(text$(21)) : lo = val(text$(31))
    xc = width(400)/2 : yc = height(400) / 2 : r = xc-20
    color 400,20,100,20 : font_color 400,255,255,0 : font_bold 400 : font_size 400,10
    2d_fill_color 200,100,020 : 2d_circle xc,yc,r
    2d_pen_width 2
    for a = 0 to 360 step 10 : 2d_line xc,yc,xc+r*cos(a),yc+r*sin(a) : next a   
    2d_fill_color 255,255,255 : 2d_circle xc,yc,r-10
    2d_fill_color 0,0,0 :  2d_circle xc,yc,5
    a = Kibla(la,lo) : r = r-15 : x = xc+r*cos(a-90) : y = yc+r*sin(a-90)
    2d_pen_width 2 : 2d_line xc,yc,x,y
    r = r-15   
    for a1 = a-80 to a-100 step -1 : 2d_poly_to xc+r*cos(a1),yc+r*sin(a1) : next a1 
    2d_poly_to x,y : 2d_fill_color 20,100,20
    print_locate xc-4,2        : print "N"
    print_locate 2*xc-15,yc-10 : print "E"
    print_locate xc-4,2*yc-20  : print "S"
    print_locate 5,yc-10      : print "W"
    d = Distance_Orthodromique(la,lo)
    caption 420, str$(a) + "°"
    caption 430, "Distance orthodromique :" + chr$(13) + str$(d) + " km"
END_SUB
rem ============================================================================
' Tracer une grille en fonction du nombre des jours dans le mois en cours
SUB Grille(n)
    grid 1 : top 1,180 : left 1,500 : width 1,342 : height 1,n*18-8 : grid_row 1,n+1   
    grid_row_fixed 1,1 : grid_row_height 1,16
    grid_column 1,7    : grid_column_fixed 1,1 : grid_column_width 1,50 : font_bold 1
    grid_fixed_color 1,255,255,0 : grid_one_column_width 1,1,30   
    color 1,0,255,255   
    grid_write 1,1,1,"Jour"
    grid_write 1,1,2," Farjr"
    grid_write 1,1,3,"Sunrise"
    grid_write 1,1,4," Dhuhr"
    grid_write 1,1,5,"  Asr"
    grid_write 1,1,6,"Maghrib"
    grid_write 1,1,7,"  Isha"
 
END_SUB
rem ============================================================================
SUB Run()
    dim_local nb
    nb = NbJours(month,year) 
    for n = 1 to Nb : Go(n) : Affiche(n) : next n
END_SUB
rem ============================================================================
Change: 
    timer_off 720
    active 70 : caption 420,"": off_change 300
    for nc = 21 to 41 step 10 : off_change nc : next nc
    for nc = 46 to 56 step 10 : off_change nc : next nc   
    if item_index(56) = 1 then standard = 1 : else : standard = 0
    select number_change
        case 21  : if text$(21) = "" then text 21,0
        case 31  : if text$(31) = "" then text 31,0
        case 41  : if text$(41) = "" then text 41,0
                  if abs(val(text$(41))) > 12 then text 41,0
        case 46  : if (text$(46) <> "0") or (text$(46) <> "1") then text 46,0                 
        case 51  : for n = 1 to NbJours(month,year)
                      Go(n) : Affiche(n)  : ' Calculer
                  next n
                  Afficher_Kibla()
        case 56  : for n = 1 to NbJours(month,year)
                      Go(n) : Affiche(n)  : ' Calculer
                  next n
                  Afficher_Kibla()
        case 300 : New_Coord()             
    end_select
    for nc = 21 to 41 step 10 : on_change nc,change : next nc
    for nc = 46 to 56 step 10 : on_change nc,change : next nc
    on_change 300,change : timer_on 720
return
rem ============================================================================
' Gestion des clics de l'utilisateur
Clic:
    timer_off 720
    for nc = 60 to 90 step 10 : off_click nc : next nc
    for nc = 150 to 160 step 10 : off_click nc : next nc
    for nc = 201 to 208 : off_click nc : next nc
    if number_click > 200 then caption 140,"ê î"       
    select number_click
        case 060 : if message_confirmation_yes_no("Vous voulez vraiment quitter ?") = 1 then terminate
        case 070 : for n = 1 to NbJours(month,year)
                      Go(n) : Affiche(n)  : ' Calculer
                  next n
                  Afficher_Kibla() : inactive 70
        case 080 : Mois_Precedant()
        case 090 : Mois_Suivant()
        case 150 : Aide()
        case 160 : Culture()     
        case 201 : restore_label 1 : pays$ = "Algérie"  : List_Ville(number_click-200)
        case 202 : restore_label 2 : pays$ = "Belgique" : List_Ville(number_click-200)
        case 203 : restore_label 3 : pays$ = "Egypte"  : List_Ville(number_click-200)
        case 204 : restore_label 4 : pays$ = "France"  : List_Ville(number_click-200)
        case 205 : restore_label 5 : pays$ = "Lybie"    : List_Ville(number_click-200)
        case 206 : restore_label 6 : pays$ = "Maroc"    : List_Ville(number_click-200)
        case 207 : restore_label 7 : pays$ = "Arabie Saoudite": List_Ville(number_click-200)
        case 208 : restore_label 8 : pays$ = "Tunisie"  : List_Ville(number_click-200)
     
    end_select
    for nc = 60 to 90 step 10 : on_click nc,clic : next nc
    for nc = 150 to 160 step 10 : on_click nc,clic : next nc
    for nc = 201 to 208 : on_click nc,clic : next nc 
    timer_on 720 
return
rem ============================================================================
SUB Go(day)
    calcPrayerTimes(day,month,year,fajrTwilight,ishaTwilight)
    NumberToHrMin(fajrTime)    : prayTime$(0) = h$ + ":" + m$
    NumberToHrMin(SunRiseTime) : prayTime$(1) = h$ + ":" + m$
    NumberToHrMin(zuhrTime)    : prayTime$(2) = h$ + ":" + m$
    NumberToHrMin(AsrTime)    : prayTime$(3) = h$ + ":" + m$
    NumberToHrMin(MaghribTime) : prayTime$(4) = h$ + ":" + m$   
    if (item_index(51) = 15) or (item_index(51) = 16)
      NumberToHrMin(MaghribTime + 1.5)
      prayTime$(5) = h$ + ":" + m$
    else   
      NumberToHrMin(IshaTime)    : prayTime$(5) = h$ + ":" + m$
    end_if   
END_SUB
rem ============================================================================
SUB New_Coord()
    dim_local t$,t1$,p
    t$ = item_read$(300,item_index(300))
    p = instr(t$,":") : ville$ = left$(t$,p-1) : t$ = mid$(t$,p+1,20)
    p = instr(t$,"/") : t1$ = mid$(t$,p+1,20) : t$ = left$(t$,p-1)
    text 21,t$ : text 31,t1$ 
    caption 110,"Pays : " + pays$ : caption 120,"Ville : " + ville$
    t$ = "Direction de la Qibla" + chr$(13) + "depuis "
    t1$ = ville$ + chr$(13) + pays$ + " : "
    caption 410,t$ + t1$
    grid_clear 1,NbJours(month,year)+1 ,7
END_SUB
rem ============================================================================
SUB List_Ville(p)
    clear 300
    position 41,fuseau(p)
    item_select 46,H_Ete(p) + 1
    read ville$
    while ville$ <> "FIN"
        ville$ = ville$ + " : "
        read latitude : read longitude
        item_add 300,ville$  + str$(latitude) + " / " + str$(longitude)
        read ville$
    end_while
    item_select 300,1  : sort_on 300 : show 300  : inactive 70     
END_SUB
rem ============================================================================
' Ramener la valeur de value entre 0 et 24
FNC moreLess24(value)
    while (value > 24) or (value < 0)
        if value > 24
          value = value - 24
        else
          if value < 0
              value = value + 24
          end_if
        end_if
    end_while
    result value
END_FNC
rem ============================================================================
' convertir le nombre  number en heurs et Minutes
SUB NumberToHrMin(number)
    if number = -1 then h$ = "--" : m$ = "--" : exit_sub
    hours  = int(moreLess24(number))   
    minutes = int(moreLess24(number - hours) * 60)
    h$ = str$(hours) : m$ = str$(minutes)
    if len(h$) < 2 then h$ = "0" + h$
    if len(m$) < 2 then m$ = "0" + m$   
END_SUB
rem ============================================================================
FNC Month_Name$(mois)
    dim_local m$
    select mois
        case 01 : m$ = "Janvier"
        case 02 : m$ = "Février"
        case 03 : m$ = "Mars"
        case 04 : m$ = "Avril"
        case 05 : m$ = "Mai"
        case 06 : m$ = "Juin"
        case 07 : m$ = "Juillet"
        case 08 : m$ = "Août"
        case 09 : m$ = "Septembre"
        case 10 : m$ = "Octobre"
        case 11 : m$ = "Novembre"
        case 12 : m$ = "Décembre"
    end_select
    result m$
END_FNC
rem ============================================================================
' Fonction qui retourne 1 si l'argument (annee) représente une année bisextile
' 0 sinon
FNC Bisextile(annee)
    if (mod(annee,4) = 0) and ((mod(annee,100) <> 0) or (mod(annee,400) = 0))
      result 1
    else
      result 0
    end_if
END_FNC
rem ============================================================================
' Déterminer le nombre de jours dans un mois (mois) pour une année (annee)
FNC NbJours(mois,annee)
    dim_local n
    select mois
        case 01 : n = 31
        case 02 : n = 28 : if bisextile(annee) > 0 then n = n + 1
        case 03 : n = 31
        case 04 : n = 30
        case 05 : n = 31
        case 06 : n = 30
        case 07 : n = 31
        case 08 : n = 31
        case 09 : n = 30
        case 10 : n = 31
        case 11 : n = 30
        case 12 : n = 31       
    end_select
    result n
END_FNC
rem ============================================================================
SUB Mois_Precedant()
    dim_local n,nb
    month = month-1
    if month < 1 then month = 12 : year = year - 1
    caption 100,Month_Name$(month)  + "  " + str$(year)
    nb = NbJours(month,year)
    delete 1 : Grille(nb)
    Run()   
END_SUB
rem ============================================================================
SUB Mois_Suivant()
    dim_local n,nb
    month = month+1
    if month > 12 then month = 1 : year = year + 1
    caption 100,Month_Name$(month)  + "  " + str$(year)
    nb = NbJours(month,year)
    delete 1 : Grille(nb)
    Run()
END_SUB
rem ============================================================================
SUB Affiche(n)
    dim_local i
    grid_write 1,1,1,"Jour"
    grid_write 1,1,2," Farjr"
    grid_write 1,1,3,"Sunrise"
    grid_write 1,1,4," Dhuhr"
    grid_write 1,1,5,"  Asr"
    grid_write 1,1,6,"Maghrib"
    grid_write 1,1,7,"  Isha"
    for i = 1 to n : grid_write 1,i+1,1,str$(i) : next i   
    for i = 0 to 5 : grid_write 1,n+1,i+2,prayTime$(i) : next i 
    inactive 70 
   
END_SUB
rem ============================================================================
' Méthodes du calcul selon différentes Ecoles
data "Algerian Minister of Religious Affairs and Wakfs : Fajr: 18.0° - Isha'a: 17.0°"
data "Egyptian General Authority                      : Fajr: 19.5° - Isha'a: 17.5°"
data "Egyptian General Authority (Bis)                : Fajr: 20.0° - Isha'a: 18.0°"
data "France UOIF - Angle 12°                          : Fajr: 12.0° - Isha'a: 12.0°"
data "France - Angle 15°                              : Fajr: 15.0° - Isha'a: 15.0°"
data "France - Angle 18°                              : Fajr: 18.0° - Isha'a: 18.0°"
data "Islamic University, Karachi                      : Fajr: 18.0° - Isha'a: 18.0°"
data "JAKIM (Jabatan Kemajuan Islam Malaysia)          : Fajr: 20.0° - Isha'a: 18.0°"
data "MUIS (Majlis Ugama Islam Singapura              : Fajr: 20.0° - Isha'a: 18.0°"
data "Muslim World League (MWL)                        : Fajr: 18.0° - Isha'a: 17.0°"
data "North America (ISNA)                            : Fajr: 15.0° - Isha'a: 15.0°"
data "Shia Ithna Ashari (Jafari)                      : Fajr: 16.0° - Isha'a: 14.0°"
data "SIHAT/KEMENAG (Kementerian Agama RI)            : Fajr: 20.0° - Isha'a: 18.0°"
data "Tunisian Ministry of Religious Affairs          : Fajr: 18.0° - Isha'a: 18.0°"
data "General Authority of Islamic Affairs And Endowments : Fajr: 19.5° - Isha'a: 90 min"
data "Umm Al-Qura, Makkah                              : Fajr: 18.5° - Isha'a: 90 min"
data "University of Tehran                            : Fajr: 17.7° - Isha'a: 15.0°"
rem ============================================================================
' C'est la procédure qui fait tous les calculs
SUB CalcPrayerTimes(day,month,year,fajrTwilight,ishaTwilight) 
    latitude = val(text$(21)) : longitude = val(text$(31)) : TimeZone = val(text$(41))
    dst = val(text$(46))
    radians
    select item_index(51)
        case 01 : FajrTwilight = -18.0 : ishaTwilight = -17.0  : ' Algerian Minister of Religious Affairs and Wakfs
        case 02 : FajrTwilight = -19.5 : ishaTwilight = -17.5  : ' Egyptian General Authority
        case 03 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' Egyptian General Authority (Bis)
        case 04 : FajrTwilight = -12.0 : ishaTwilight = -12.0  : ' France UOIF - Angle 12°     
        case 05 : FajrTwilight = -15.0 : ishaTwilight = -15.0  : ' France - Angle 15°
        case 06 : FajrTwilight = -18.0 : ishaTwilight = -18.0  : ' France - Angle 18°       
        case 07 : FajrTwilight = -18.0 : ishaTwilight = -18.0  : ' Islamic University, Karachi
        case 08 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' JAKIM (Jabatan Kemajuan Islam Malaysia)
        case 09 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' MUIS (Majlis Ugama Islam Singapura
        case 10 : FajrTwilight = -18.0 : ishaTwilight = -17.0  : ' Muslim World League (MWL)
        case 11 : FajrTwilight = -15.0 : ishaTwilight = -15.0  : ' North America (ISNA)
        case 12 : FajrTwilight = -16.0 : ishaTwilight = -14.0  : ' Shia Ithna Ashari (Jafari)
        case 13 : FajrTwilight = -20.0 : ishaTwilight = -18.0  : ' SIHAT/KEMENAG (Kementerian Agama RI)
        case 14 : FajrTwilight = -18.0 : ishaTwilight = -18.0  : ' Tunisian Ministry of Religious Affairs 
        case 15 : FajrTwilight = -19.5 : ' Isha'a: 90 min      : ' UAE General Authority of Islamic Affairs And Endowments
        case 16 : FajrTwilight = -18.5 : ' Isha'a: 90 min      : ' Umm Al-Qura, Makkah
        case 17 : FajrTwilight = -17.7 : ishaTwilight = -15.0  : ' University of Tehran
    end_select
    D = (367 * year) - ((year + int((month + 9) / 12)) * 7 / 4) + ((int(275 * month / 9)) + day - 730531.5)
    L = 280.461 + 0.9856474 * D : L = wrap_value(L)
    M = 357.528 + (0.9856003) * D : M = wrap_value(M)
    Lambda = L + 1.915 * sin(degree_To_Radian(M)) + 0.02 * sin(degree_To_Radian(2 * M))
    Lambda = wrap_value(Lambda)   
    Obliquity = 23.439 - 0.0000004 * D   
    Alfa = radian_to_degree(atn((cos(degree_to_radian(Obliquity)) * tan(degree_To_Radian(Lambda)))))
    Alfa = wrap_value(Alfa)
    Alfa = Alfa - (360 * (int(Alfa / 360)))
    Alfa = Alfa + 90 * (int(Lambda / 90) - int(Alfa / 90))   
    ST = 100.46 + 0.985647352 * D
    Dec = radian_To_Degree(asin(sin(degree_To_Radian(Obliquity)) * sin(degree_To_Radian(Lambda))))
    a = (sin(degree_To_Radian(-0.8333)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))
    if abs(a) > 1  : ' le soleil ne se couche pas
      FajrTime = -1 : sunRiseTime = -1
      asrTime  = -1 : maghribTime = -1 : ishaTime = -1
      exit_sub
    end_if   
    Durinal_Arc = radian_To_Degree(acos((sin(degree_To_Radian(-0.8333)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude))))) 
    Noon = Alfa - ST
    Noon = wrap_value(Noon)   
    UT_Noon = Noon - longitude
' ------------------------------------------------------------------------------   
' Calculating Prayer Times Arcs & Times
' ------------------------------------------------------------------------------   
' Zuhr Time (Local noon)
    zuhrTime = UT_Noon / 15 + timeZone + dst   
    if standard = 1 : ' Asr Standard (Shafii, Maliki, Hanbali)
      Asr_Alt = radian_To_Degree(atn(1 + tan(degree_To_Radian(abs(latitude - Dec)))))
    else            : ' Asr Hanafi     
      Asr_Alt = radian_To_Degree(atn(2 + tan(degree_To_Radian(abs(latitude - Dec)))))
    end_if
    a = (sin(degree_To_Radian(90 - Asr_Alt)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))
    if abs(a) > 1 
      FajrTime = -1 : sunRiseTime = -1
      asrTime  = -1 : maghribTime = -1 : ishaTime = -1
      exit_sub
    end_if 
    Asr_Arc = radian_To_Degree(acos((sin(degree_To_Radian(90 - Asr_Alt)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))))
    Asr_Arc = Asr_Arc / 15
'  Asr Time
    asrTime = zuhrTime + Asr_Arc
' Shorouq Time       
    sunRiseTime = zuhrTime - (Durinal_Arc / 15)
' Maghrib Time
    maghribTime = zuhrTime + (Durinal_Arc / 15)
    a = (sin(degree_To_Radian(ishaTwilight)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))   
    if abs(a) > 1  : ' le soleil ne se lève pas
      FajrTime = -1 : sunRiseTime = -1
      asrTime  = -1 : maghribTime = -1 : ishaTime = -1
      exit_sub
    end_if
    Esha_Arc = radian_To_Degree(acos((sin(degree_To_Radian(ishaTwilight)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))))     
' Isha Time
    ishaTime = zuhrTime + (Esha_Arc / 15)
' Fajr Time
    a = (sin(degree_To_Radian(fajrTwilight)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))
    if abs(a) > 1 
      FajrTime = -1 : sunRiseTime = -1
      asrTime  = -1 : maghribTime = -1 : ishaTime = -1
      exit_sub
    end_if
    Fajr_Arc = radian_To_Degree(acos((sin(degree_To_Radian(fajrTwilight)) - sin(degree_To_Radian(Dec)) * sin(degree_To_Radian(latitude))) / (cos(degree_To_Radian(Dec)) * cos(degree_To_Radian(latitude)))))
    fajrTime = zuhrTime - (Fajr_Arc / 15)
                       
END_SUB
rem ============================================================================
SUB Aide()
    dim_local t$
    t$ = "Aide sur le programme" + chr$(13)
    t$ = t$ + "Au lancement du programme, il affiche les résultats du calcul pour la ville de Moknine (Tunisie) pour le mois en cours" + chr$(13)
    t$ = t$ + "et propose comme méthode de calcul (dans le COMBO Méthode) celle appliquée en Tunisie (Tunisian Ministry of Religious)" + chr$(13)
    t$ = t$ + "Pour les autres pays, vous pouvez opter pour l'une des métodes proposées dans le COMBO, surtout si votre ville se situe aux" + chr$(13)
    t$ = t$ + "altitudes supérieures à 45°"+chr$(13)
    t$ = t$ + "Il propose un choix parmi 8 pays qui vous permettent d'en choisir une ville parmi celles qui sont proposées." + chr$(13)
    t$ = t$ + "Si votre ville ne s'y trouve pas, vous avez la possibilité d'entrer manuellement ses coordonnées (Latitude, Longitude, Fuseau, DST)" + chr$(13)
    t$ = t$ + "Vous pouvez aussi l'ajouter dans le code dans les lignes DATA." + chr$(13)
    t$ = t$ + "En optant pour l'un des pays proposé, vous activez un COMBO vous permettant de choisir une ville." + chr$(13)
    t$ = t$ + "Le COMBO DST c'est pour le choix de l'heure d'été (valeurs possibles : 0 pas de passage; 1 passage à l'heure d'été." + chr$(13)
    t$ = t$ + "Les boutons 'main' indiquant la gauche c'est pour le mois précédent, tandis que celle qui indique la droite c'est pour le mois suivant." + chr$(13)
    t$ = t$ + chr$(13)   
    t$ = t$ + "Après chaque modification et pour lancer un nouveau calcul,cliquez sur le bouton 'Calculer' (La Palice ne peut pas dire mieux !)" + chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "Note :" + chr$(13)
    t$ = t$ + "L’horaire de la prière de Ichaa correspond à la disparition du crépuscule (12° à 18°) après le coucher du Soleil." + chr$(13)
    t$ = t$ + "L'Arabie Saoudite, par exemple ajoute 90 mn à l'heure du Maghrib pour obtenir celle du Icha"+ chr$(13)
    t$ = t$ + " et ajoute 120 mn pour le mois de Ramadan."+ chr$(13)
    t$ = t$ + chr$(13) + chr$(13)   
    t$ = t$ + "Pour information :" + chr$(13)
    t$ = t$ + "******************" + chr$(13)
    t$ = t$ + "La définition de l'heure du salat Asr divise les écoles islamiques en deux positions dogmatiques." + chr$(13)
    t$ = t$ + "Les trois écoles juridiques Malikite, Hambalite et Shafite soutiennent que le Asr commence lorsque la taille d'un objet vertical est la taille de son ombre." + chr$(13)
    t$ = t$ + "Cette méthode est celle adoptée généralement dans les communautés du Maghreb (d'obédience Malikite)." + chr$(13)
    t$ = t$ + "La quatrième école Hanafite estime que le Asr commence lorsque l'ombre d'un objet vertical est le double de la taille de cet objet."+chr$(13)
    t$ = t$ + "Cette nette différence dogmatique entraîne des écarts dans les horaires de salat sur les calendriers correspondant à un même endroit." + chr$(13)
    t$ = t$ + "Le programme vous permet de choisir votre doctrine réligieuse (Madh-hab) dans le COMBO 'Calcul Asr'. " + chr$(13)
    t$ = t$ + chr$(13) + chr$(13)
    t$ = t$ + "Le programme est fourni comme tel sans aucune garantie des résultats."+chr$(13)
    t$ = t$ + "En aucun cas je ne serais responsable de dommages résultants de l'utilisation de cette application."   
    message t$
END_SUB
rem ============================================================================
SUB Culture()
    dim_local t$
    t$ = "Méthode de calcul des horaires de prières" + chr$(13)
    t$ = t$ + "Les prières (pour les Musulmans) sont au nombre de cinq par journée." + chr$(13)
    t$ = t$ + "Les horaires de ces cinq prières varient d'un endroit (ville) à l'autre et d'un jour à l'autre." + chr$(13)
    t$ = t$ + "Le calcul fait intervenir les heures du crépuscule, mais lequel ?" + chr$(13)
    t$ = t$ + "Il existe trois types de crépuscules : " + chr$(13)
    t$ = t$ + "Le crépuscule astronomique : il intervient lorsque le soleil se situe "
    t$ = t$ + "en dessous de l’horizon à une hauteur de 18°, et il correspond au moment" + chr$(13)
    t$ = t$ + "où l’obscurité totale s’installe au niveau de cet horizon." + chr$(13)
    t$ = t$ + "Le crépuscule nautique : il intervient lorsque le soleil se situe en dessous de l’horizon à une hauteur de 12°." + chr$(13)
    t$ = t$ + "Le crépuscule civil : il intervient lorsque le soleil se situe en dessous de l’horizon à une hauteur de 06°." + chr$(13)
    t$ = t$ + "Or, il s’est avéré que le fait de se baser sur le crépuscule astronomique (18°) pour le calcul des heures de prière "
    t$ = t$ + "pose des difficultés pour les pays d’Europe." + chr$(13)
    t$ = t$ + "Il est impossible de calculer les horaires de la prière du Fajr à partir du 18° et ce à partir de la mi-mai jusqu’à la mi-juin environ."+chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "L’écart entre le Fajr et celui du lever du soleil (Chourouk) se creuse pour atteindre un record de 3h40 min en période d’été." + chr$(13)
    t$ = t$ + "L’écart entre la prière de Ichaa et celle du Fajr se réduit durant des semaines en période d’été." + chr$(13)
    t$ = t$ + "A titre d’exemple : le 28 mai à Paris en se basant sur le 18°, la prière de Ichaa est à 00h18 et la prière du Fajr est à 02h59 !" + chr$(13)
    t$ = t$ + "Soit un écart de 2h41mn."+chr$(13)
    t$ = t$ + "Par contre, retenir le critère du 12° (le crépuscule nautique) permet de surmonter ces difficultés." + chr$(13)
    t$ = t$ + "D’une part, l’écart entre la prière du Fajr et celle du lever du soleil (Chourouk) n’excède jamais 02 heures durant toute l’année."+chr$(13)
    t$ = t$ + "D’autre part, l’écart entre la prière du Ichaa et celle du Fajr reste constamment importante."+chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "Le fait d'opter pour ce critère du 12° permet d’alléger la contrainte sur les musulmans vivant en Europe pour cette pratique cultuelle " + chr$(13)
    t$ = t$ + "et surtout durant le mois de Ramadan et spécialement en période d’été." + chr$(13)
    t$ = t$ + "L’avantage de ce choix réside dans la possibilité de l’utiliser durant toute l’année, à l’inverse de celui du 18°." + chr$(13)
    t$ = t$ + "Certains pays ajoutent 5 minutes en plus par précaution pour les horaires de Dhohr et du Maghrib" + chr$(13)
    t$ = t$ + "L’horaire du Asr est calculé selon la règle islamique où l’ombre de chaque objet devient égale à celui-ci." + chr$(13)
    t$ = t$ + "Mais certains pays utilisent d'autres critères, ce qui ne facilite pas la tâche !" + chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "En résumé : " + chr$(13)
    t$ = t$ + "* Prière de l'aube (matin) (Fajr) : Le début coïncide avec la fin du délai de d'Isha, soit lorsque le soleil remonte à 19 ° sous l'horizon." + chr$(13)
    t$ = t$ + "  La fin est atteinte au lever du soleil avec le limbe supérieur du soleil tangent à l'horizon soit h = - 0,267°"+ chr$(13)
    t$ = t$ + "* Prière de la mi-journée (midi) (Dhur) : la durée permise commence quand le soleil a traversé le méridien (soit quand l'ombre d'un objet a commencé à "
    t$ = t$ + "  augmenter) et se termine lorsque l'ombre d'un gnomon s'est allongée d'un quart de sa hauteur par rapport à son ombre à midi." + chr$(13)
    t$ = t$ + "* Prière de l'après-midi ('Asr) : l'intervalle commence lorsque l'augmentation de l'ombre est égale à la longueur du gnomon et se termine quand l'ombre en a atteint le double." + chr$(13)
    t$ = t$ + "* Prière du coucher de soleil (Maghrib) : Le début coïncide avec la disparition totale du soleil sous l'horizon , soit pour h = -0.267°."+chr$(13)
    t$ = t$ + "  La fin du délai est atteinte à la dernière lueur du crépuscule, soit le soleil à 18° sous l'horizon."+chr$(13)
    t$ = t$ + "  Attention, cette condition peut être irréalisable à certaines dates pour certaines latitudes." + chr$(13)
    t$ = t$ + "* Prière de la nuit ('Isha) : Le début coïncide avec la fin du délai de Maghrib, soit le soleil à 17° sous l'horizon." + chr$(13)
    t$ = t$ + "  La fin du délai est atteinte avec l'apparition de l'aube lorsque le soleil remonte à 19° sous l'horizon." + chr$(13)
    t$ = t$ + chr$(13)
    t$ = t$ + "Note :" + chr$(13)
    t$ = t$ + "Les opinions divergent sur les angles à utiliser pour le calcul de Fajr et Isha." +chr$(13)
    t$ = t$ + "La mosquée de Paris retient 15° pour Fajr et 18° pour Isha." + chr$(13) + chr$(13) 
    t$ = t$ + chr$(13)
    t$ = t$ + "Pour des plus amples informations sur le calcul des horaires de prière, référez-vous à : " + chr$(13)
    t$ = t$ + "http://www.averroes-aveyron.fr/medias/files/methodes-de-calcul.pdf" + chr$(13)   
    message t$
END_SUB
rem ============================================================================
' Liste des pays : nom du pays, fuseau horaire du pays et flag pour heure d'été (1 oui, 0 non)
data "Algérie" ,1,0 , "Belgique",1,1 ,"Egypte",2,0 , "France",1,1, "Lybie",2,0
data "Maroc",1 , 0, "Arabie Saoudite",3,0 ,"Tunisie",1,0
' ------------------------------------------------------------------------------
data "Algérie"  : ' UTC + 1 ; DST 0
' -----------
1:
'    Ville            Latitude  Longitude
data "Adrar" ,          27.850,    -0.317 
data "Alger" ,          36.833,    3.000
data "Annaba" ,        36.917,    7.783 
data "Batna" ,          35.567,    6.167   
data "Bechar" ,        31.583,    -2.283
data "Bejaia" ,        36.817,    5.050 
data "Biskra" ,        34.833,    5.683 
data "Blida" ,          36.500,    2.833 
data "Boussaada" ,      35.167,    4.150 
data "Constantine" ,    36.367,    6.667 
data "El Asnam" ,      36.183,    1.350   
data "El Djelfa" ,      34.717,    3.233 
data "Ghardaia" ,      32.333,    3.667
data "Laghouat" ,      33.817,    2.917
data "Mostaganem" ,    35.900,    0.083 
data "M'Sila" ,        35.667,    4.517
data "Oran" ,          35.750,    -0.633
data "Ouargla" ,        32.000,    5.267
data "Setif" ,          36.183,    5.400 
data "Sidi-bel-Abbes" , 35.250,    -0.650
data "Skikda" ,        36.883,    6.900 
data "Tamanrasset" ,    22.833,    5.467
data "Tebessa" ,        35.350,    8.100 
data "Tiaret" ,        35.333,    1.333
data "Tilimsen" ,      34.883,    -1.350     
data "Tizi-Ouzou" ,    36.733,    4.083 
data "FIN" 
' ------------------------------------------------------------------------------
data "Belgique" : ' UTC + 1  UTC + 2 Heure d'été
' -----------
2:
'    Ville            Latitude  Longitude
data "Antwerp" ,        51.217,  4.417 
data "Brussels" ,      50.850,  4.350 
data "Charleroi" ,      50.417,  4.450
data "Gent" ,          51.033,  3.700
data "Liege" ,          50.633,  5.583 
data "Ostende" ,        51.217,  2.917   
data "Mons" ,          50.467,  3.967     
data "Namur" ,          50.467,  4.867
data "FIN"
' ------------------------------------------------------------------------------
data "Egypte"  : ' UTC + 2
' -------------------------------------
3:
'    Ville            Latitude  Longitude
data "Abou Simbel" ,    22.317,  31.633 
data "Alexandria" ,    31.217,  29.917
data "Aswan" ,          24.083,  32.933
data "Asyut" ,          27.233,  31.117
data "Beni-Souef" ,    29.083,  31.083 
data "Cairo" ,          30.050,  31.250
data "Damanhur" ,      31.050,  30.467
data "Dumyat" ,        31.433,  31.800
data "El Alamein" ,    30.833,  28.950
data "Helwan" ,        29.850,  31.333
data "Isma'ilia" ,      30.600,  32.250 
data "Karnak" ,        25.683,  32.667 
data "Port Said" ,      31.283,  32.300   
data "Sohag" ,          26.550,  31.700
data "Suez" ,          29.983,  32.550
data "Tanta" ,          30.800,  31.000 
data "Zagazig" ,        30.583,  31.500 
data "FIN"
' -------------------------------------------------------------------------------
data "France" : ' UTC + 1  UTC + 2 Heure d'été
' ----------
4:
'    Ville            Latitude  Longitude
data "Brest" ,          48.383,  -4.500 
data "Quimper" ,        48.000,  -4.100 
data "Lorient" ,        47.750,  -3.350 
data "St-Brieuc" ,      48.517,  -2.750 
data "Vannes" ,        47.667,  -2.733   
data "St Nazaire" ,    47.283,  -2.200 
data "Rennes" ,        48.100,  -1.667 
data "Cherbourg" ,      49.633,  -1.617 
data "Nantes" ,        47.233,  -1.583 
data "La-Roche-sur-Yon" , 46.633, -1.500
data "Bayonne" ,        43.500,  -1.467
data "La Rochelle" ,    46.167,  -1.167 
data "St-Lo" ,          49.117,  -1.083 
data "Laval" ,          48.067,  -0.750   
data "Bordeaux" ,      44.833,  -0.567 
data "Angers" ,        47.483,  -0.533 
data "Mont-de-Marsan" , 43.900,  -0.500 
data "Niort" ,          46.317,  -0.450 
data "Pau" ,            43.300,  -0.367 
data "Caen" ,          49.183,  -0.367
data "Alençon" ,        48.417,    0.083 
data "Tarbes" ,        43.233,    0.083 
data "Le Havre" ,      49.500,    0.100 
data "Angouleme" ,      45.667,    0.167 
data "Le Mans" ,        48.000,    0.200   
data "Poitiers" ,      46.583,    0.333 
data "Cahors" ,        44.467,    0.433 
data "Auch" ,          43.500,    0.600 
data "Agen" ,          44.200,    0.633 
data "Tours" ,          47.383,    0.700 
data "Perigueux" ,      45.200,    0.733   
data "Dieppe" ,        49.917,    1.083   
data "Rouen" ,          49.433,    1.083 
data "Evreux" ,        49.050,    1.183   
data "Limoges" ,        45.833,    1.250   
data "Montauban" ,      44.017,    1.333 
data "Blois" ,          47.600,    1.333 
data "Toulouse" ,      43.617,    1.450   
data "Chartres" ,      48.450,    1.500   
data "Foix" ,          42.950,    1.583 
data "Chateauroux" ,    46.817,    1.683   
data "Tulle" ,          45.267,    1.767   
data "Abbeville" ,      50.100,    1.850   
data "Gueret" ,        46.167,    1.866 
data "Orleans" ,        47.900,    1.900 
data "Vierzon" ,        47.233,    2.050 
data "Pontoise" ,      49.050,    2.083 
data "Beauvais" ,      49.433,    2.083 
data "Versailles" ,    48.800,    2.133 
data "Albi" ,          43.933,    2.144   
data "Nanterre" ,      48.883,    2.217   
data "Amiens" ,        49.900,    2.300 
data "Paris" ,          48.833,    2.333   
data "Bourges" ,        47.083,    2.383   
data "Carcassonne" ,    43.217,    2.350 
data "Dunkerque" ,      51.033,    2.383 
data "Aurillac" ,      44.933,    2.433   
data "Bobigny" ,        48.917,    2.450 
data "Créteil" ,        48.783,    2.467   
data "Melun" ,          48.533,    2.557
data "Evry" ,          48.633,    2.567   
data "Rodez" ,          44.350,    2.567 
data "Montlucon" ,      46.333,    2.600   
data "Arras" ,          50.283,    2.767   
data "Lens" ,          50.433,    2.833 
data "Perpignan" ,      42.700,    2.900 
data "Lille" ,          50.650,    3.083 
data "Clermont-Ferrand",45.783,    3.083     
data "Nevers" ,        47.000,    3.150   
data "Moulins" ,        46.567,    3.333 
data "Mende" ,          44.533,    3.500   
data "Auxerre" ,        47.800,    3.583   
data "Laon" ,          49.567,    3.617   
data "Montpellier" ,    43.600,    3.883     
data "Le Puy" ,        45.050,    3.883   
data "Avallon" ,        47.500,    3.900 
data "Reims" ,          49.250,    4.033 
data "Troyes" ,        48.300,    4.083   
data "Roanne" ,        46.033,    4.083   
data "Nimes" ,          43.500,    4.350   
data "Chalons-S-Marne", 48.967,    4.367   
data "St-Etienne" ,    45.433,    4.383   
data "Privas" ,        44.733,    4.600   
data "Mezières" ,      49.767,    4.733   
data "Avignon" ,        43.933,    4.800   
data "Lyon" ,          45.767,    4.833     
data "Macon" ,          45.300,    4.833   
data "Valence" ,        44.933,    4.900   
data "Dijon" ,          47.333,    5.033   
data "Chaumont" ,      48.117,    5.133   
data "Bar-le-Duc" ,    48.767,    5.167   
data "Bourg" ,          46.200,    5.217
data "Observatoire SIRENE" , 44.000, 5.333 
data "Marseille " ,    43.300,    5.367 
data "Lons-le-Saunier", 46.683,    5.550 
data "Grenoble" ,      45.183,    5.717   
data "Toulon" ,        43.117,    5.917 
data "Chambéry" ,      45.567,    5.917   
data "Besancon" ,      47.250,    5.983   
data "Gap" ,            44.550,    6.083 
data "Annecy" ,        45.900,    6.117 
data "Metz" ,          49.117,    6.183 
data "Vesoul" ,        47.633,    6.150   
data "Nancy" ,          48.700,    6.200 
data "Digne" ,          44.083,    6.233 
data "Epinal" ,        48.167,    6.467 
data "Belfort" ,        47.633,    6.867   
data "Cannes" ,        43.550,    7.000   
data "Nice" ,          43.700,    7.267   
data "Colmar" ,        48.083,    7.350 
data "Mulhouse" ,      47.750,    7.350   
data "Strasbourg" ,    48.583,    7.750 
data "Ajaccio" ,        41.917,    8.717   
data "Bastia" ,        42.683,    9.433
data "FIN"
' ------------------------------------------------------------------------------
data "Libye"  :' UTC + 2
' ---------
5:
'    Ville            Latitude  Longitude
data "Sabratah" ,      32.833,    12.400 
data "Tripoli" ,        32.967,    13.200 
data "Al Khums" ,      32.650,    14.250 
data "Sabhah" ,        27.050,    14.433   
data "Benghazi" ,      32.117,    20.083 
data "Ajdabiyah" ,      30.800,    20.250   
data "Al Marj" ,        32.500,    20.833               
data "Darnah" ,        32.767,    22.650   
data "Tubruq" ,        32.100,    23.933 
data "FIN"
' ------------------------------------------------------------------------------

data "Moroc" : ' UTC + 1
' ---------
6:
'    Ville            Latitude  Longitude
data "Agadir" ,        30.500,  -9.667   
data "Safi" ,          32.300,  -9.333   
data "El Jadida" ,      33.183,  -8.283   
data "Marrakech" ,      31.817,  -8.000 
data "Settat" ,        33.067,  -7.617   
data "Casablanca" ,    33.650,  -7.583   
data "Mohammedia" ,    33.717,  -7.333   
data "Khouribga" ,      32.900,  -6.950 
data "Sale" ,          34.067,  -6.833   
data "Kenitra" ,        34.333,  -6.567   
data "Beni Mellal" ,    32.367,  -6.483 
data "Khemisset" ,      33.833,  -6.050   
data "Ksar el Kebir" ,  35.067,  -5.933   
data "Tanger" ,        35.800,  -5.833   
data "Meknes" ,        33.883,  -5.617   
data "Tetouan" ,        35.567,  -5.367   
data "Ceuta" ,          35.883,  -5.317   
data "Fes" ,            34.083,  -5.000   
data "Taza" ,          34.267,  -4.017   
data "Nador" ,          35.167,  -3.000   
data "Oujda" ,          34.683,  -1.750 
data "FIN"
' ------------------------------------------------------------------------------
rem ============================================================================
data "Arabie Saoudite" : ' UTC + 3
' ----------------
7:
'    Ville            Latitude  Longitude
data "Riyadh" ,        24.650,    46.767 
data "Al Wajh" ,        26.267,    36.467   
data "Tabuk" ,          28.367,    36.533   
data "Yanbu'Al Bahr" ,  24.117,    38.067 
data "Tayma" ,          27.617,    38.500 
data "Jiddah" ,        21.500,    39.167   
data "Khaybar" ,        25.800,    39.200   
data "Medina" ,        24.500,    39.583 
data "Mecca" ,          21.433,    39.817 
data "Al Jawf" ,        29.783,    39.867   
data "Al Lith" ,        20.167,    40.267 
data "At Ta'if" ,      21.250,    40.350   
data "Badanah" ,        31.000,    41.083   
data "Al Qunfidhah" ,  19.150,    41.117   
data "Turabah" ,        21.250,    41.567 
data "Ha'il" ,          27.517,    41.750 
data "bha" ,            18.233,    42.517 
data "Jizan" ,          16.933,    42.550   
data "Buraydah" ,      26.333,    43.983   
data "Najran" ,        17.517,    44.317   
data "Shaqra" ,        25.300,    45.250   
data "Al Artawiyak" ,  26.517,    45.350   
data "Ad Dilam" ,      23.983,    47.100   
data "Haradh" ,        24.200,    49.117   
data "Al Hufuf" ,      25.333,    49.567   
data "Ad Dammam" ,      26.417,    50.100   
data "Al Khurmah" ,    21.917,    42.033
data "FIN" 
' ------------------------------------------------------------------------------
Data "Tunisie" : ' UTC + 1
' -----------
8:
'    Ville            Latitude  Longitude
data "Gafsa" ,          34.467,    8.717 
data "Beja" ,          36.717,    9.217 
data "Bizerte" ,        37.300,    9.867   
data "Kairouan" ,      35.700,    10.017 
data "Gabes" ,          33.867,    10.100 
data "Tunis" ,          36.833,    10.217 
data "Sousse" ,        35.833,    10.633   
data "Sfax" ,          34.750,    10.717 
data "Nabeul" ,        36.500,    10.733
data "Moknine" ,        35.633,    10.833
data "Monastir",        35.777,    10.826
data "Mahdia" ,        35.502,    11.045
data "Jendouba" ,      35.501,    08.783
data "Le Kef" ,        36.179,    08.714
data "Siliana" ,        35.990,    09.278
data "Ariana" ,        36.862,    10.195
data "Ben Arous" ,      36.743,    10.232
data "Kasserine" ,      35.171,    08.828
data "Kebili" ,        33.124,    08.836
data "La Manouba" ,    36.807,    10.101
data "Medenine" ,      33.348,    10.494
data "Sidi Bouzid" ,    35.033,    09.5
data "Tataouine" ,      32.921,    10.450
data "Zaghouan" ,      36.399,    10.147
data "La Soukra" ,      36.883,    10.25
data "La Marsa" ,      36.876,    10.325
data "FIN"
rem ============================================================================
rem &&&&&&&&&&&&&&&&&&&&&&  FIN DU CODE  &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
rem ============================================================================
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Marc

Marc


Nombre de messages : 2466
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyDim 5 Mai 2019 - 12:54

Salut à tous !

Papydall a écrit:
Code remis à jour pour tenir compte de cette remarque et ajout de deux marques pour marquer le jour courant.

Suggestion : Supprimer les deux marques quand le mois affiché ne correspond pas à celui en cours.

Calculateur des heures de prière. 176

Autre suggestion pour l'énoncé vocal de l'heure : scinder l'heure en morceau pour intercaler au bon endroit les mots "heure, minute et seconde".

Bonne continuation !

EDIT : Je viens de voir que MiniBug avait fait, avant moi, la même remarque* au sujet des "marques" journalières lorsque le mois affiché n'est pas celui en cours.

*Voir dans le sujet "comment-selectionner-une-ligne-d-un-grid"
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyDim 5 Mai 2019 - 16:15

Marc a écrit:
Suggestion : Supprimer les deux marques quand le mois affiché ne correspond pas à celui en cours.

C’est fait !

Marc a écrit:
Autre suggestion pour l'énoncé vocal de l'heure : scinder l'heure en morceau pour intercaler au bon endroit les mots "heure, minute et seconde".

Là, ce n’est pas évident ! La Virginie prononce le texte de la variable système " time()" du VBS et je ne vois pas trop comment  intervenir pour le modifier.
De toutes les façons ce n’est qu’un petit plus qu’apporte la voix de Virginie.

Le forum ne veut plus accepter la nouvelle version, revue et corrigée (avec aussi un petit plus Wink  ) pour cause : " La longueur de votre message dépasse la limite autorisée."

J'ai déposé sur mon webdev CalcPrayerTimes_3_4.zip que vous pouvez télécharger.

Cette nouvelle version corrige le bug de deux marques, ajoute le pays (et certaines villes de l') Italie, et aussi un petit plus pour quitter l'application tongue
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Marc

Marc


Nombre de messages : 2466
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyDim 5 Mai 2019 - 16:40

Papydall a écrit:
La Virginie prononce le texte de la variable système " time()" du VBS et je ne vois pas trop comment  intervenir pour le modifier.

Par exemple :

Code:
   file_writeln 9999,"speaks="+chr$(34)+"Il est,"+chr$(34)+CHR$(34)+STR$(TIME_HOUR)+"heure"+STR$(TIME_MINUTE)+CHR$(34)

Ce qui fait donne sous la forme auditive : "il est 16 heure 30"
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. EmptyDim 5 Mai 2019 - 17:02

Merci Marc.
C’est fait et la virginie a appris sa leçon : il est 16 heures, zéro minute  45 secondes.
C’est sur mon webdav
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Yannick




Nombre de messages : 8635
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

Calculateur des heures de prière. Empty
MessageSujet: re   Calculateur des heures de prière. EmptyLun 6 Mai 2019 - 18:23

Après un passage par Wikipédia, me voilà avec une petite remarque voir deux.
Pas tous les musulmans habite Moknine... Laughing
Cela serait bien si les petit outils s' adaptait à la localisation géographique.
D'autre part, cela serait bien si les calculs se refaisait automatiquement à
chaque changement.

Bon, ca va, je sors... Embarassed
Revenir en haut Aller en bas
Contenu sponsorisé





Calculateur des heures de prière. Empty
MessageSujet: Re: Calculateur des heures de prière.   Calculateur des heures de prière. Empty

Revenir en haut Aller en bas
 
Calculateur des heures de prière.
Revenir en haut 
Page 1 sur 2Aller à la page : 1, 2  Suivant
 Sujets similaires
-
» Calculateur des heures de prière 2.0
» Un petit calculateur du IMC et du poids idéal
» Deux heures de voyage au coeur d’un Mandelbrot
» Heures de passage au méridien / lever / coucher du soleil

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: