#line 2 "salat.fox"
#include "salat.h"
#include "cgi.h"
#include "html.h"
void* run_salat(map* req){
_globals.dbs.geo="/data/geo.db"
_globals.dbs.bdgeo="/data/bdgeo.db"
_globals.js[]="var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-38692016-1']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();"
if "salat/".get().end
gps_salat()
data="Dhaka [GPS Disabled]".salat_data(23.8,90.42,"Asia/Dhaka",jd_now()).data_lang()
data.body=---
$(data.salat_box())
Please allow this site to use your mobile's GPS to find your location, when prompted
"
$(gps_js())
---;
data.title="Salat Time at Your GPS Location"
data.meta={{
description Accurate salat time calculation for wordwide cities and your current GPS location.
keywords muslim namaz namaj wakt waqt time gps fajar fazar prayer salat sehri iftar
}}
return data.show_page()
path={}
_globals.paths=path
if "salat/world/".get()
if path.end
return "select iso||'/',country from country order by country".sql_pairs(:geo).links_4cols().show_body({{
title Country List
meta
description List of countries for salat time
keywords salat muslim prayer namaz namaj wakt waqt time fajar fazar sehri iftar world country
}})
if "salat/world/([a-z][a-z])/".get([:country])
name=path.country.id_row(:country, :geo).country
name || not_found()
path.country_name=name
_globals.menu.salat.country.title=""..name
total="select count(*) from city where country_code=:code".sql_value(:geo, {code: path.country}).to_int()
if total==1
path.city="select * from city where country_code=:code".sql_row(:geo, {code: path.country})
if path.end
return path.city.city_salat()
if path.end
if total>150
return "select code||'/',name from admin1 where code like :code order by name".sql_pairs(:geo, {code: path.country.str_dup().str_upper()..".%"}).links_4cols().show_body({{
title ="$name: State List"
meta
description ="List of $name states for salat time"
keywords ="$name salat muslim prayer namaz namaj wakt waqt time fajar fazar sehri iftar world country"
}})
return "select geonameid||'/',asciiname from city where country_code=:code order by asciiname".sql_pairs(:geo, {code: path.country}).links_4cols().show_body({{
title ="$name: City List"
meta
description ="List of $name cities for salat time"
keywords ="$name salat muslim prayer namaz namaj wakt waqt time fajar fazar sehri iftar world country"
}})
if "salat/world/[a-z][a-z]/([A-Z][A-Z]).([0-9A-Za-z_]+)/".get([:country_capitalized, :state])
path.admin1=(path.country_capitalized.."."..path.state).id_row(:admin1, :geo).must_exist()
_globals.menu.salat.state.title=path.admin1.name
_globals.menu.salat.city1.visible=:no
if path.end
return "select geonameid||'/', asciiname from city where country_code=:country and admin1_code=:state order by asciiname".sql_pairs(:geo,{country: path.country, state: path.state}).links_4cols().show_body({{
title ="$(path.country_name), $(path.admin1.name): City List"
meta
description ="List of $(path.country_name), $(path.admin1.name) cities for salat time"
keywords ="$(path.country_name) $(path.admin1.name) salat muslim prayer namaz namaj wakt waqt time fajar fazar sehri iftar world country"
}})
if "salat/world/[a-z][a-z]/[A-Z][A-Z].[0-9A-Za-z_]+/([0-9]+)/".get([:cityid])
path.city=path.cityid.id_row(:city, :geo).must_exist()
_globals.menu.salat.city2.title=path.city.asciiname
if path.end
return path.city.city_salat()
if "salat/world/[a-z][a-z]/([0-9]+)/".get([:cityid])
path.city=path.cityid.id_row(:city, :geo).must_exist()
_globals.menu.salat.city1.title=path.city.asciiname
if path.end
return path.city.city_salat()
if "salat/world/[a-z][a-z]/[A-Z][A-Z].[0-9A-Za-z_]+/[0-9]+/fullyear/".get().end
return path.city.city_fullyear()
if "salat/world/[a-z][a-z]/[0-9]+/fullyear/".get().end
return path.city.city_fullyear()
if "salat/world/[a-z][a-z]/fullyear/".get().end
return path.city.city_fullyear()
if "salat/bangla/".get().end
data=:bg.gps_salat()
if !data
data="ঢাকা".salat_data(23.8,90.42,"Asia/Dhaka",jd_now()).data_lang(:bg)
data.body=---
$(data.salat_box())
আপনার মোবাইলের Do you want to share your location? জিজাসা করলে Accept বাটনে চাপ দিন, আপনার লোকেশনের সময়সূচি জানার জন্য
$(gps_js())
---;
data.title="GPS স্থানে আজকের নামাজের সময়সূচী"
data.meta={{
description নামাজের সময় সূচি। ঢাকা শহর, আপনার GPS স্থান, এবং বাংলাদেশের সর্বত্রের জন্য
keywords muslim namaz namaj namazer namajer shomoy somoy time gps fajar fazar prayer bangladesh dhaka bd salat sehri iftar
}}
return data.show_page()
if "salat/bangla/tomorrow/".get().end
data=:bg.gps_salat(1)
if !data
data="ঢাকা".salat_data(23.8,90.42,"Asia/Dhaka",jd_now()+1).data_lang(:bg)
data.body=---
$(data.salat_box())
আপনার মোবাইলের Do you want to share your location? জিজাসা করলে Accept বাটনে চাপ দিন, আপনার লোকেশনের সময়সূচি জানার জন্য
$(gps_js())
---;
data.title="GPS স্থানে আজকের নামাজের সময়সূচী"
data.meta={{
description নামাজের সময় সূচি। ঢাকা শহর, আপনার GPS স্থান, এবং বাংলাদেশের সর্বত্রের জন্য
keywords muslim namaz namaj namazer namajer shomoy somoy time gps fajar fazar prayer bangladesh dhaka bd salat sehri iftar
}}
return data.show_page()
if "salat/bangla/fullyear/".get().end
gets=_globals.req.get
lat=gets.lat.to_double()
lng=gets.lng.to_double()
row=points(lng,lat,1)
name=geo_name(lng,lat,row)
return name.bangla_fullyear(this_year(), lng, lat).show_body({{
title ="$name এর সারা বছরের নামাজের সময় সূচী"
meta
description ="$name জেলার জন্য সারা বছরের নামাজের সময় সূচি"
keywords ="Bangladesh $name বাংলাদেশ জেলা নামাজ নামায নামাজের সময় ওয়াক্ত ফজর সালাত সেহরি ইফতার সারা বছরের বছর full all year print প্রিন্ট স্থায়ী স্থায়ি ক্যলেন্ডার perpetual calendar salat muslim prayer namaz namaj wakt waqt time fajar fazar sehri iftar world country"
}})
if "salat/bangla/nextyear/".get().end
gets=_globals.req.get
lat=gets.lat.to_double()
lng=gets.lng.to_double()
row=points(lng,lat,1)
name=geo_name(lng,lat,row)
return name.bangla_fullyear(this_year()+1, lng, lat).show_body({{
title ="$name এর সারা বছরের নামাজের সময় সূচী"
meta
description ="$name জেলার জন্য সারা বছরের নামাজের সময় সূচি"
keywords ="Bangladesh $name বাংলাদেশ জেলা নামাজ নামায নামাজের সময় ওয়াক্ত ফজর সালাত সেহরি ইফতার সারা বছরের বছর full all year print প্রিন্ট স্থায়ী স্থায়ি ক্যলেন্ডার perpetual calendar salat muslim prayer namaz namaj wakt waqt time fajar fazar sehri iftar world country"
}})
if "salat/districts/".get()
if path.end
return ---
$("select code||'/',bangla from district order by bangla".sql_pairs(:bdgeo).links_4cols())
---.show_body({{
title বাংলাদেশের জেলা সমুহ
meta
description নামাজের সময় সূচির জন্য বাংলাদেশের ৬৪ জেলার লিষ্ট
keywords ="bangladesh district বাংলাদেশ জেলা নামাজ নামায নামাজের সময় ওয়াক্ত ফজর সালাত সেহরি ইফতার salat muslim prayer namaz namaj wakt waqt time fajar fazar sehri iftar world country"
}})
map* row=NULL
if "salat/districts/([a-z_]+)/".get([:district])
path.district=path.district.district_spelling()
row=path.district.id_row(:district, :bdgeo)
row || not_found()
_globals.menu.location.district.title=row.bangla
path.row=row
if path.end
data="$(row.bangla) জেলা".salat_data(row.lat.to_double(), row.lng.to_double(), "Asia/Dhaka", jd_now()).data_lang(:bg)
return data.salat_box().show_body({{
title =data.title
meta
description ="$(row.bangla) জেলার জন্য নামাজের সময় সূচি"
keywords ="Bangladesh district $(row.name) $(row.bangla) বাংলাদেশ জেলা নামাজ নামায নামাজের সময় ওয়াক্ত ফজর সালাত সেহরি ইফতার salat muslim prayer namaz namaj wakt waqt time fajar fazar sehri iftar world country"
}})
if "salat/districts/([a-z_]+)/tomorrow/".get([:district]).end
data="$(row.bangla) জেলা".salat_data(row.lat.to_double(), row.lng.to_double(), "Asia/Dhaka", jd_now()+1).data_lang(:bg)
return data.salat_box().show_body({{
title =data.title
meta
description ="$(row.bangla) জেলার জন্য নামাজের সময় সূচি"
keywords ="Bangladesh district $(row.name) $(row.bangla) বাংলাদেশ জেলা নামাজ নামায নামাজের সময় ওয়াক্ত ফজর সালাত সেহরি ইফতার salat muslim prayer namaz namaj wakt waqt time fajar fazar sehri iftar world country"
}})
if "salat/districts/[a-z_]+/fullyear/".get().end
return path.row.bangla.bangla_fullyear(this_year(), path.row.lng.to_double(), path.row.lat.to_double()).show_body({{
title ="$(path.row.bangla) এর সারা বছরের নামাজের সময় সূচী"
meta
description ="$(path.row.bangla) জেলার জন্য সারা বছরের নামাজের সময় সূচি"
keywords ="Bangladesh district $(path.row.name) $(path.row.bangla) বাংলাদেশ জেলা নামাজ নামায নামাজের সময় ওয়াক্ত ফজর সালাত সেহরি ইফতার সারা বছরের বছর full all year print প্রিন্ট স্থায়ী স্থায়ি ক্যলেন্ডার perpetual calendar salat muslim prayer namaz namaj wakt waqt time fajar fazar sehri iftar world country"
}})
if "salat/districts/[a-z_]+/nextyear/".get().end
return path.row.bangla.bangla_fullyear(this_year()+1, path.row.lng.to_double(), path.row.lat.to_double()).show_body({{
title ="$(path.row.bangla) এর সারা বছরের নামাজের সময় সূচী"
meta
description ="$(path.row.bangla) জেলার জন্য সারা বছরের নামাজের সময় সূচি"
keywords ="Bangladesh district $(path.row.name) $(path.row.bangla) বাংলাদেশ জেলা নামাজ নামায নামাজের সময় ওয়াক্ত ফজর সালাত সেহরি ইফতার সারা বছরের বছর full all year print প্রিন্ট স্থায়ী স্থায়ি ক্যলেন্ডার perpetual calendar salat muslim prayer namaz namaj wakt waqt time fajar fazar sehri iftar world country"
}})
if "salat/upozila/".get().end
rows="select upozila.*, district.bangla as district_name from upozila left join district on upozila.district=district.code where upozila.lat!='' order by district.bangla, upozila.bangla"
.sql_rows(:bdgeo) //.rows_group(:district)
body=''
curr=''
rows.each row
if row.district !== curr
if curr => body.=""
body.="$(row.district_name)
"
body.=""
return body.show_body({{
title প্রতিটি উপজেলার নামাজের সময়সূচী
meta
description নামাজের সময় সূচির জন্য বাংলাদেশের উপজেলা সমুহের লিষ্ট
keywords ="Bangladesh district বাংলাদেশ জেলা নামাজ নামায নামাজের সময় ওয়াক্ত ফজর সালাত সেহরি ইফতার সারা বছরের full year salat muslim prayer namaz namaj wakt waqt time fajar fazar sehri iftar world country"
}})
if "salat/upozila/([a-z_]+)/".get([:upozila])
row=path.upozila.id_row(:upozila, :bdgeo)
row || not_found()
path.row=row
_globals.menu.location.upozila.title=row.bangla
if path.end
data="$(row.bangla) উপজেলা".salat_data(row.lat.to_double(), row.lng.to_double(), "Asia/Dhaka", jd_now()).data_lang(:bg)
return data.salat_box().show_body({{
title =data.title
meta
description ="$(row.bangla) উপজেলার জন্য নামাজের সময় সূচি"
keywords ="Bangladesh $(row.bangla) $(row.name) $(row.district) বাংলাদেশ জেলা নামাজ নামায নামাজের সময় ওয়াক্ত ফজর সালাত সেহরি ইফতার salat muslim prayer namaz namaj wakt waqt time fajar fazar sehri iftar world country"
}})
if "salat/upozila/([a-z_]+)/tomorrow/".get([:upozila]).end
data="$(row.bangla) উপজেলা".salat_data(row.lat.to_double(), row.lng.to_double(), "Asia/Dhaka", jd_now()+1).data_lang(:bg)
return data.salat_box().show_body({{
title =data.title
meta
description ="$(row.bangla) উপজেলার জন্য নামাজের সময় সূচি"
keywords ="Bangladesh $(row.bangla) $(row.name) $(row.district) বাংলাদেশ জেলা নামাজ নামায নামাজের সময় ওয়াক্ত ফজর সালাত সেহরি ইফতার salat muslim prayer namaz namaj wakt waqt time fajar fazar sehri iftar world country"
}})
if "salat/upozila/[a-z_]+/fullyear/".get().end
return path.row.bangla.bangla_fullyear(this_year(), path.row.lng.to_double(), path.row.lat.to_double()).show_body({{
title ="$(path.row.bangla) এর সারা বছরের নামাজের সময় সূচী"
meta
description ="$(path.row.bangla) উপজেলার জন্য সারা বছরের নামাজের সময় সূচি"
keywords ="Bangladesh $(path.row.bangla) $(path.row.name) $(path.row.district) বাংলাদেশ জেলা নামাজ নামায নামাজের সময় ওয়াক্ত ফজর সালাত সেহরি ইফতার সারা বছরের বছর full all year print প্রিন্ট স্থায়ী স্থায়ি ক্যলেন্ডার perpetual calendar salat muslim prayer namaz namaj wakt waqt time fajar fazar sehri iftar world country"
}})
if "salat/upozila/[a-z_]+/nextyear/".get().end
return path.row.bangla.bangla_fullyear(this_year()+1, path.row.lng.to_double(), path.row.lat.to_double()).show_body({{
title ="$(path.row.bangla) এর সারা বছরের নামাজের সময় সূচী"
meta
description ="$(path.row.bangla) উপজেলার জন্য সারা বছরের নামাজের সময় সূচি"
keywords ="Bangladesh $(path.row.bangla) $(path.row.name) $(path.row.district) বাংলাদেশ জেলা নামাজ নামায নামাজের সময় ওয়াক্ত ফজর সালাত সেহরি ইফতার সারা বছরের বছর full all year print প্রিন্ট স্থায়ী স্থায়ি ক্যলেন্ডার perpetual calendar salat muslim prayer namaz namaj wakt waqt time fajar fazar sehri iftar world country"
}})
not_found()
return 0
}
map* rows_group(map* rows, char* by){
ret={}
rows.each row
if !ret[row[by]] => ret[row[by]]=[]
ret[row[by]][]=row
return ret
}
char* district_spelling(char* in){
ret={{
jhenaidah jhenaida
jaipurhat joypurhat
khagrachari khagrachhari
maulvibazar moulvibazar
netrakona netrokona
sirajgonj sirajganj
}}
return ret[in] or in
}
char* city_salat(map* row){
path=_globals.paths
// double tz="select rawoffset from timezone where countrycode=:country and timezoneid=:tz".sql_value(:geo, {country: row.country_code.str_dup().str_upper(), tz: row.timezone}).str_double()
// double tz=.tz_hour()
title="$(row.asciiname), $(path.admin1 ? path.admin1.name..', ' : '')$(path.country_name)"
row.asciiname.name_tab()
return title.salat_data(row.latitude.to_double(), row.longitude.to_double(), row.timezone, jd_now()).data_lang().salat_box().show_body({{
title =title
meta
description ="Muslim Salat time at $title"
keywords ="$title muslim namaz namaj wakt waqt time gps fajar fazar prayer salat sehri iftar"
}})
}
char* links_4cols(map* rows){
idx=0
ret=''
for i=0; i<4; i++
ret.=""
while idx
return NULL
data=_globals.req.get
tz={{
name =data.tzname
offset =data.tzoffset.str_double()
dst =data.tzdst===:DST ? :DST : ''
utc =data.tzoffset.offset_utc()
}}
row=points(data.lng,data.lat,1)
name=geo_name(data.lng,data.lat,row)
location={{
en Location
bg এর স্থান
}}
data="GPS $(location[lang]) - $name".salat_data(data.lat,data.lng,tz,jd_now()+adddays,1).data_lang(lang)
data.body=---
$(data.salat_box())
Your GPS Location is Latitude: $(data.lat), Longitude: $(data.lng)
$(gps_js())
---;
return data
}
static char* gps_js(){
return ---
---;
}
map* data_lang(map* data, char* lang=:en){
map* titles=''
data.lang=lang
qibla=data.lng.qibla_direction(data.lat)
qstr=(int)(qibla/6+0.5)
if lang===:en
titles={{
fajar18 Fajar
rise Sun Rise
noon Duhr
asar1 Asar
asar2 Asar (Hanafi)
set Sun Set
esha Esha
}}
data.title="Salat Time at $(data.name)"
data.title3="Salat Time at $(data.name) [GPS Disabled]"
data.where="TimeZone: $(data.tz.name), $(data.tz.utc.str_join(\", \", data.tz.dst))
Latitude: $(data.lat.lat_human()), Longitude: $(data.lng.lng_human())
Qibla: $qstr clock minutes from North, Bearing: $((int)(qibla+.5))°"
data.ondate=data.date.date_human()
if lang===:bg
titles={{
fajar18 ফজর/সুবহে সাদিক
rise সূর্যোদয়
noon জোহর
asar1 জোহর শেষ (শাফি)
asar2 আসর (হানাফি)
set সূর্যাস্ত/মাগরিব
esha ইশা
}}
data.title="$(data.name) এর নামাজের সময়"
data.title3="$(data.name) এর নামাজের সময় [GPS Disabled]"
data.where="Latitude: $(data.lat.lat_human()), Longitude: $(data.lng.lng_human())".num_lang(:bg).str_tr({{
N উত্তর
S দক্ষিন
E পূর্ব
W পশ্চিম
Latitude অক্ষাংশ
Longitude দ্রাঘিমাংশ
}})
data.ondate=data.date.date_human()
data.rows.each val
val.long=val.long.num_lang(:bg).sub_str(0,-2)..(val.long.str_end(:am) ? "সকাল" : "বিকাল")
val.short=val.short.num_lang(:bg)
data.ondate=data.ondate.num_lang(:bg).str_tr({{
Jan জানুয়ারি
Feb ফেব্রুয়ারি
Mar মার্চ
Apr এপ্রিল
May মে
Jun জুন
Jul জুলাই
Aug অগাষ্ট
Sep সেপ্টেম্বর
Oct অক্টোবর
Nov নভেম্বর
Dec ডিসেম্বর
}})
data.calculated="হিসাবে আসে"
titles.each val,key
data.rows[key].title=val
return data
}
map* salat_data(char* name, double lat, double lng, void* tzdata, double jd,int is_gps=0){
tz=0.0
if tzdata.is_str() => tzdata=tzdata.tz_data()
tz=tzdata.offset.is_double()
// jd=jd-tz/24.;
salat=jd.salat_time(lng,lat)
return {{
name =name
lat =lat
lng =lng
tz =tzdata
jd =jd
is_gps =is_gps
date =jd.jd_str(tz).date_only()
rows
fajar18
short =(salat.fajar18.to_double()+1./1440.).jd_str(tz).time_short()
long =salat.fajar18.jd_str(tz).time_long()
rise
short =salat.rise.to_double().jd_str(tz).time_short()
long =salat.rise.jd_str(tz).time_long()
noon
short =(salat.noon.to_double()+3.5/1440.).jd_str(tz).time_short()
long =salat.noon.jd_str(tz).time_long()
asar1
short =(salat.asar1.to_double()+1./1440.).jd_str(tz).time_short()
long =salat.asar1.jd_str(tz).time_long()
asar2
short =(salat.asar2.to_double()+1./1440.).jd_str(tz).time_short()
long =salat.asar2.jd_str(tz).time_long()
set
short =(salat.set.to_double()+(is_gps ? 2 : 4.5)/1440.).jd_str(tz).time_short()
long =salat.set.jd_str(tz).time_long()
esha
short =(salat.esha.to_double()+1./1440.).jd_str(tz).time_short()
long =salat.esha.jd_str(tz).time_long()
}}
}
char* salat_box(map* data){
body=''
_globals.css[]=---
table.salat-time {max-width: 30em; }
table.salat-time th {text-align:right;color:black;font-size:11pt;font-weight:bold;background:none;}
table.salat-time td {text-align:right;padding:.5em; border-left:none; border-right: none; }
table.salat-time td.name {text-align:left;}
table.salat-time td.title-row {font-size:14pt;text-align:center;}
table.salat-time td.rounded {font-size:16pt;font-weight:bold;}
table.salat-time td.date-row {font-size:10pt;text-align:center;}
---;
data.rows.each row
body.=---
$(row.title) |
$(row.short) |
$(row.long) |
---
return ---
$(data.where) |
| $(data.ondate) | $(data.calculated or :Calculated) |
$body
---
}
char* time_long(char* date){
ret=date.sub_str(11,8)
hour=0
sscanf(ret,"%02d",&hour)
ampm="am"
if hour>=12 => ampm="pm"
if hour>12 => hour-=12
if !hour => hour=12
return hour..ret.sub_str(2,3)..""..ret.sub_str(5,3).." "..ampm
}
char* time_short(char* date){
ret=date.sub_str(11,5)
hour=0
sscanf(ret,"%02d",&hour)
if hour>12 => hour-=12
if !hour => hour=12
return hour..ret.sub_str(2,3)
}
char* lat_human(double val){
if !val => return "0"
return mstr("%0.5g %s",fabs(val),val>0 ? :N : :S)
}
char* lng_human(double val){
if !val => return "0"
return mstr("%0.5g %s",fabs(val),val>0 ? :E : :W)
}
char* geo_name(double lng,double lat,map* row){
if(!row) return "Unnamed Location"
distance1=diff_angle(lng, lat, row.longitude, row.latitude)
distance=(int)(distance1/360*40000+0.5)
name=row.accentcity
direc=bearing_name3(row.longitude, row.latitude, lng,lat)
country=row.country.id_row(:country, :geo).country
name.=", $country"
if(distance>=2) name="$distance km $direc of $name"
return name
}
double geo_distance(double lng1, double lat1, double lng2, double lat2){
lng1/=1000000000
lat1/=1000000000
lng2/=1000000000
lat2/=1000000000
double v1=fabs(lat1-lat2)
double v2=fabs(lng1-lng2)*cosd(lat1)
return sqrt(v1*v1+v2*v2)
}
static void sqlite_geo_distance(sqlite3_context *context, int argc, sqlite3_value **argv){
if argc != 4
context.sqlite3_result_null()
return
double lng1=argv[0].sqlite3_value_double()
double lat1=argv[1].sqlite3_value_double()
double lng2=argv[2].sqlite3_value_double()
double lat2=argv[3].sqlite3_value_double()
double ret=geo_distance(lng1,lat1,lng2,lat2)
sqlite3_result_double(context, ret)
}
map* points(double lng,double lat,int limit=1){
lng*=1000000000
lat*=1000000000
long long diff=10000000
//|SQLITE_DETERMINISTIC
:geo.lite_conn().sqlite3_create_function(:geo_distance, 4, SQLITE_UTF8, NULL, sqlite_geo_distance, NULL, NULL)
while 1
lng1=lng-diff
lng2=lng+diff
lat1=lat-diff
lat2=lat+diff
ret="select *,geo_distance(:lng,:lat,longitude,latitude) as distance from area where longitude>$lng1 and longitude<$lng2 and latitude>$lat1 and latitude<$lat2 order by distance limit $limit".sql_rows('geo',{lng: lng, lat: lat})
if ret.map_len()==limit
ret.each val, key
val.longitude=val.longitude.to_double()/1000000000
val.latitude=val.latitude.to_double()/1000000000
return limit==1 ? ret[0] : ret
diff*=10
if diff>100000000000ll => break
return NULL
}
int is_dst(time_t in){
struct tm* ret=localtime(&in)
return ret->tm_isdst==1 ? 1 : 0
}
map* dst_change(char* tz,int year){
struct tm tm={0}
tm.tm_year=year-1900
tm.tm_mon=1-1
tm.tm_mday=1
tm.tm_hour=6
tm.tm_min=0
tm.tm_sec=0
time_t secs1=mktime(&tm)
tm.tm_mon=7-1
time_t secs7=mktime(&tm)
if tz => :TZ.setenv(tz, 1)
is1=secs1.is_dst()
is7=secs7.is_dst()
time_t change1=0
time_t change2=0
if !is1 && !is7 => return NULL
for i=0; i<180; i++
if (secs1+i*86400).is_dst()!=is1 => change1=(secs1+i*86400); break
for i=0; i<180; i++
if (secs7+i*86400).is_dst()!=is7 => change2=(secs7+i*86400); break
double jd1=(change1/86400.-10957.5)
double jd2=(change2/86400.-10957.5)
return {{
dst =(is1 ? jd2 : jd1).double_var()
nodst =(is1 ? jd1 : jd2).double_var()
}}
}
char* city_fullyear(map* row){
path=_globals.paths
tzrow="select * from timezone where timezoneid=:id".sql_row(:geo,{id: row.timezone})
keys=''
name=''
if path.admin1
name="$(row.asciiname), $(path.admin1.name), $(path.country_name)"
keys="$(row.asciiname) $(path.admin1.name) $(path.country_name)"
else if !path.cityid
name=row.asciiname
keys="$(row.asciiname) $(path.country_name)"
else
name="$(row.asciiname), $(path.country_name)"
keys="$(row.asciiname) $(path.country_name)"
title=name
if title.str_len()<20
title="Salat Time Table For $title"
else if title.str_len()<30
title="Salat Time $title"
_globals.css[]=---
@media print { footer {page-break-after: always;} body {padding-left:5%; padding-right:5%;} }
tr.title { font-weight: bold; border-bottom: 1px solid gray; font-size: 16pt; line-height: 1.2em; }
tr.times { border-bottom: 1px solid gray; font-size: 16pt; line-height: 1.2em; }
tr.dst { font-size: 16pt; border-top: 1px solid gray; border-bottom: 1px solid gray; }
td.foot { font-size: 10pt; text-align: center; }
td {text-align: center; }
---;
ret=''
year=this_year()
tzdata=row.timezone.tz_data("$year-01-01")
double tz=tzdata.offset.is_double()
data=year.year_salat_data(row.longitude,row.latitude,tz)
dst=row.timezone.dst_change(year)
data.each val,key
month=key.is_int()
ret.=---
---;
ret.="$(month_en(month)) - $title |
\n";
ret.="Date | Fajar | Sun Rise | Duhr | Asar | Hanafi | Sun Set | Esha |
\n";
val.each row, j
if dst && floor(row.fajar18.to_double())==floor(dst.dst.to_double())
tzdata=row.timezone.tz_data((row.fajar18.to_double()+1).jd_str(tz))
tz=tzdata.offset.is_double()
ret.=---
DST Starts, $(tzdata.utc) |
---;
if dst && floor(row.fajar18.to_double())==floor(dst.nodst.to_double())
tzdata=row.timezone.tz_data((dst.nodst.to_double()+1).jd_str(tz))
tz=tzdata.offset.is_double()
ret.=---
DST Ends, $(tzdata.utc) |
---;
row.each v,k
row[k]=v.to_double().jd_str(tz).time_short()
int day=j.is_int()
ret.=---
$day |
$(row.fajar18) |
$(row.rise) |
$(row.noon) |
$(row.asar1) |
$(row.asar2) |
$(row.set) |
$(row.esha) |
---
ret.="
\n";
ret.="
";
dststr=''
if dst => dststr=" with DST correction"
return ret.show_body({{
title ="Full Year Salat Time : $name"
meta
description ="Full year salat time table for $name$dststr. Based on $year."
keywords ="$keys full all year print perpetual calendar salat muslim prayer namaz namaj wakt waqt time table fajar fazar sehri iftar world dst corrected"
}})
return ret
}
char* bangla_fullyear(char* name, int year,double lng,double lat){
_globals.css[]=---
@media print { footer {page-break-after: always;} body {padding-left:5%; padding-right:5%;} }
tr.title { font-weight: bold; border-bottom: 1px solid gray; font-size: 16pt; line-height: 1.2em; }
tr.times { border-bottom: 1px solid gray; font-size: 16pt; line-height: 1.2em; }
td.foot { font-size: 10pt; text-align: center; }
---;
ret=''
data=year.year_salat_data(lng,lat,6.)
data.each val,key
month=key.is_int()
ret.=---
---;
ret.="মাস : $(month_bg(month)) - নামাজের সময় - শহর : $(name) |
\n";
ret.="তারিখ | ফজর | সূর্যোদয় | জোহর | আসর | মাগরিব | ইশা |
\n";
val.each row, j
row.each v,k
row[k]=v.to_double().jd_str(6.).time_short().num_lang(:bg)
day=j.is_int().int_str().num_lang(:bg)
ret.=---
$day |
$(row.fajar18) |
$(row.rise) |
$(row.noon) |
$(row.asar2) |
$(row.set) |
$(row.esha) |
---;
ret.="
\n";
ret.="
";
return ret
}
map* year_salat_data(int year, double lng, double lat, double tz){
ret=[]
for i=1; i<=12; i++
ret[]=i.month_salat_data(year,lng,lat,tz)
return ret
}
map* month_salat_data(int month, int year, double lng, double lat, double tz){
days=month.days_in_month(year)
jd=jd3(year,month,1)-tz/24
adds={{
fajar18 =1.
rise =0.
noon =3.5
asar1 =1.
asar2 =1.
set =4.5
esha =1.
}}
ret=[]
for i=0; i return in ? in : not_found()
void* sqlite_func(char* name, char* db){
map* func=user_funcs()[name]
if !func => "Function $name not found in sqlite_func".fox_error()
db.lite_conn().sqlite3_create_function(name, -1, SQLITE_UTF8, func, sqlite_func_handler, NULL, NULL)
return name
}
static void sqlite_func_handler(sqlite3_context *context, int argc, sqlite3_value **argv){
map* func=context.sqlite3_user_data()
if !func.name => "sqlite_func_handler() corrupt function handler".fox_error()
params=[]
for i=0; i