Skip to content

Instantly share code, notes, and snippets.

@NightScript370
Created September 7, 2025 22:35
Show Gist options
  • Select an option

  • Save NightScript370/f47051869db3d0805958c4616fe966b7 to your computer and use it in GitHub Desktop.

Select an option

Save NightScript370/f47051869db3d0805958c4616fe966b7 to your computer and use it in GitHub Desktop.
Makam for Swift
[
"Hoseni",
"Hijaz",
"Hijaz Kar",
"Bayat",
"Saba",
"Sigah",
"Ajam",
"Rast",
"Sasgar",
"Iraq",
"Mahour",
"Nahwand",
"Nawah",
"Mehayar",
"Bustanigar",
"Ashiran",
"Girka",
"Oj",
"Rahawi",
"Arazbar",
"Shuri",
"Kurd",
"Zangiran",
"Mouhayar",
"Huseyni",
"Acem Ashiran",
"Segah",
"Hicaz",
"Nahoft",
"Dugah",
"Mahur",
"Nihavend",
"Araban",
"Beyati",
"Ussak",
"Isfahan",
"Cargah",
"Sehnaz",
"Sebah",
"Farahnaq",
"Huzam",
"Qargigar",
"Busaliq",
"Muhayer",
"Suzniq",
"Bayati"
]
//
// MakamJCal.swift
// Rabbi Ovadiah Yosef Calendar
//
// Created by Noah Wolfson on 9/7/25.
//
import KosherSwift
import Foundation
enum AllBooks {
case BERESHIT, SHEMOT, VAYIKRA, BAMIDBAR, DEVARIM
}
enum Makam: CaseIterable {
case HOSENI, HIJAZ, HIJAZ_KAR, BAYAT, SABA, SIGAH, AJAM, RAST, SASGAR, IRAQ, MAHOUR, NAHWAND, NAWAH, MEHAYAR, BUSTANIGAR, ASHIRAN, GIRKA, OJ, RAHAWI, ARAZBAR, SHURI, KURD, ZANGIRAN, MOUHAYAR,
// TURKISH
HUSEYNI, ACEM_ASHIRAN, SEGAH, HICAZ, NAHOFT, DUGAH, MAHUR, NIHAVEND, ARABAN, BEYATI, USSAK, ISFAHAN, CARGAH, SEHNAZ, SEBAH,
// GREEK
FARAHNAQ, HUZAM, QARGIGAR, BUSALIQ, MUHAYER, SUZNIQ, BAYATI,
// Questionable Makam
Q_BUSTANIGAR, Q_FARAHNAQ, Q_HOSENI, Q_SIGAH, Q_QARGIGAR
}
class MakamJCal {
/**
* This method returns a string that contains the weekly Makam. The {@link JewishCalendar}
* object passed into this method should be preset with the correct date.
* @param jCal the JewishCalendar object set to Saturday
* @return All the data fields
*/
static private func getAllBooks(allBooks: AllBooks) -> [String] {
let allSefer = ["ADES: 24793", "GABRIEL A SHREM 1964 SUHV", "TABBUSH Ms NLI 8*7622, Aleppo", "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905", "TEBELE Pre1888", "ELIE SHAUL COHEN FROM AINTAB, ~1880", "YAAQOB ABADI-PARSIYA", "YISHAQ YEQAR ARGENTINA", "Dibre Shelomo S KASSIN Pre1915", "Knis Betesh Geniza List, Aleppo", "ABRAHAM DWECK Pre1920", "IDELSOHN Pre1923", "S SAGIR Laniado", "M H Elias, SHIR HADASH, Jerusalem, 1930", "ASHEAR list", "ASHEAR NOTES 1936-1940", "ABRAHAM E SHREM ~1945", "Argentina 1947 & Ezra Mishanieh", "Shire Zimra H S ABOUD Jerusalem, 1950", "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO", "YOSEF YEHEZKEL Jerusalem 1975", "Ish Massliah \"Abia Renanot\" Tunisians", "Shaare Zimra YANANI Buenos Aires, 01", "BOZO, Ades, Shir Ushbaha 2005", "Yishaq Yeranen Halabi", "MOSHE AMASH (Shami)", "EZRA MASLATON TARAB (Shami)", "ABRAHAM SHAMRICHA (Shami)"]
return switch allBooks {
case AllBooks.BERESHIT:
allSefer + ["Victor Afya, Istanbul List", "Izak Alaluf, Izmir List", "Hallel VeZimrah, Salonika, 1928"]
case AllBooks.SHEMOT:
allSefer + ["Victor Afya, Istanbul List", "Izak Alaluf, Izmir List", "Hallel VeZimrah, Greece List, 1926"]
case AllBooks.VAYIKRA:
allSefer + ["Victor Afya, Istanbul List", "Izak Alaluf, Izmir List", "Hallel VeZimrah, Greece List, 1926"]
case AllBooks.BAMIDBAR:
allSefer + ["Hallel VeZimrah, Greece List, 1926"]
case AllBooks.DEVARIM:
allSefer + ["Hallel VeZimrah, Greece List, 1926"]
}
}
static func generateUniformMap<K, V>(keys: [K], value: V, normal: [K: V]) -> [K: V] where K: Hashable {
// Create a new dictionary where each key from 'keys' is associated with the given 'value'.
// If 'keys' contains duplicate elements, only the first association for that unique key will be preserved
// (though in this case, all duplicate keys would map to the same 'value' anyway).
let uniformMap: [K: V] = keys.reduce(into: [:]) { result, key in
result[key] = value
}
// Merge the 'uniformMap' with the 'normal' map.
// In Kotlin's map '+' operator, entries from the right-hand map ('normal')
// override entries from the left-hand map ('uniformMap') if keys overlap.
var finalMap = uniformMap
for (key, val) in normal {
finalMap[key] = val // This will add new keys or overwrite existing keys from uniformMap
}
return finalMap
}
static func getMakamData(jCal: JewishCalendar) -> [String: [Makam]] {
if jCal.isYomTov() {
switch jCal.getYomTovIndex() {
case JewishCalendar.ROSH_HASHANA:
return jCal.getJewishDayOfMonth() == 1 ? ["Eliahou Yaaqob DWECK-KESAR": [Makam.HOSENI], "YISHAQ YEQAR ARGENTINA": [Makam.HIJAZ], "IDELSOHN Pre1923": [Makam.SABA]] : ["Eliahou Yaaqob DWECK-KESAR": [Makam.HOSENI], "YISHAQ YEQAR ARGENTINA": [Makam.HIJAZ], "IDELSOHN Pre1923": [Makam.BAYAT]]
case JewishCalendar.YOM_KIPPUR:
return ["Eliahou Yaaqob DWECK-KESAR": [Makam.HIJAZ, Makam.HOSENI], "YISHAQ YEQAR ARGENTINA": [Makam.HIJAZ], "IDELSOHN Pre1923": [Makam.HIJAZ]]
case JewishCalendar.SUCCOS:
return jCal.getJewishDayOfMonth() == 15 ? ["SASSOON #647 Aleppo, 1850": [Makam.SIGAH], "Eliahou Yaaqob DWECK-KESAR": [Makam.SIGAH], "YAAQOB ABADI-PARSIYA": [Makam.SIGAH], "YISHAQ YEQAR ARGENTINA": [Makam.SIGAH], "ABRAHAM DWECK Pre1920": [Makam.SIGAH], "IDELSOHN Pre1923": [Makam.SIGAH], "S SAGIR Laniado": [Makam.SIGAH], "ASHEAR list": [Makam.SIGAH], "ASHEAR NOTES 1936-1940": [Makam.SIGAH], "ABRAHAM E SHREM ~1945": [Makam.SIGAH], "Argentina 1947 & Ezra Mishanieh": [Makam.SIGAH], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.SIGAH], "GABRIEL A SHREM 1964 SUHV": [Makam.SIGAH], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.AJAM], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.SIGAH], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.SIGAH], "BOZO, Ades, Shir Ushbaha 2005": [Makam.SIGAH], "MOSHE AMASH (Shami)": [Makam.RAST], "EZRA MASLATON TARAB (Shami)": [Makam.RAST], "ABRAHAM SHAMRICHA (Shami)": [Makam.RAST], "Hallel VeZimrah, Greece List, 1926": [Makam.SIGAH]] : ["SASSOON #647 Aleppo, 1850": [Makam.SASGAR], "Eliahou Yaaqob DWECK-KESAR": [Makam.AJAM], "YAAQOB ABADI-PARSIYA": [Makam.SASGAR], "YISHAQ YEQAR ARGENTINA": [Makam.AJAM], "ABRAHAM DWECK Pre1920": [Makam.SASGAR], "S SAGIR Laniado": [Makam.AJAM], "ASHEAR list": [Makam.AJAM], "ASHEAR NOTES 1936-1940": [Makam.AJAM], "ABRAHAM E SHREM ~1945": [Makam.AJAM], "Argentina 1947 & Ezra Mishanieh": [Makam.AJAM], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.AJAM], "GABRIEL A SHREM 1964 SUHV": [Makam.AJAM], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.AJAM], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.AJAM], "BOZO, Ades, Shir Ushbaha 2005": [Makam.AJAM], "MOSHE AMASH (Shami)": [Makam.SIGAH], "EZRA MASLATON TARAB (Shami)": [Makam.SIGAH], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Hallel VeZimrah, Greece List, 1926": [Makam.RAST]]
case JewishCalendar.CHOL_HAMOED_SUCCOS:
var cholHamoedSukMap: [String: [Makam]] = switch jCal.getJewishDayOfMonth() {
case 16:
["SASSOON #647 Aleppo, 1850": [Makam.SASGAR], "Eliahou Yaaqob DWECK-KESAR": [Makam.AJAM], "YAAQOB ABADI-PARSIYA": [Makam.SASGAR], "YISHAQ YEQAR ARGENTINA": [Makam.AJAM], "ABRAHAM DWECK Pre1920": [Makam.SASGAR], "S SAGIR Laniado": [Makam.AJAM], "ASHEAR list": [Makam.AJAM], "ASHEAR NOTES 1936-1940": [Makam.AJAM], "ABRAHAM E SHREM ~1945": [Makam.AJAM], "Argentina 1947 & Ezra Mishanieh": [Makam.AJAM], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.AJAM], "GABRIEL A SHREM 1964 SUHV": [Makam.AJAM], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.AJAM], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.AJAM], "BOZO, Ades, Shir Ushbaha 2005": [Makam.AJAM], "MOSHE AMASH (Shami)": [Makam.SIGAH], "EZRA MASLATON TARAB (Shami)": [Makam.SIGAH], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Hallel VeZimrah, Greece List, 1926": [Makam.RAST]]
case // Day 2 of Diaspora, but 1st day Hol Hamoed Israel
17:
["SASSOON #647 Aleppo, 1850": [Makam.IRAQ], "Eliahou Yaaqob DWECK-KESAR": [Makam.SABA], "YAAQOB ABADI-PARSIYA": [Makam.IRAQ], "YISHAQ YEQAR ARGENTINA": [Makam.SABA], "ASHEAR list": [Makam.IRAQ], "ASHEAR NOTES 1936-1940": [Makam.IRAQ], "Argentina 1947 & Ezra Mishanieh": [Makam.IRAQ], "GABRIEL A SHREM 1964 SUHV": [Makam.IRAQ]]
case 18:
["SASSOON #647 Aleppo, 1850": [Makam.SABA], "Eliahou Yaaqob DWECK-KESAR": [Makam.BAYAT], "YAAQOB ABADI-PARSIYA": [Makam.SABA], "YISHAQ YEQAR ARGENTINA": [Makam.RAST], "ASHEAR list": [Makam.RAST], "ASHEAR NOTES 1936-1940": [Makam.RAST], "Argentina 1947 & Ezra Mishanieh": [Makam.RAST], "GABRIEL A SHREM 1964 SUHV": [Makam.RAST]]
case 19:
["SASSOON #647 Aleppo, 1850": [Makam.RAST], "Eliahou Yaaqob DWECK-KESAR": [Makam.RAST], "YAAQOB ABADI-PARSIYA": [Makam.RAST], "YISHAQ YEQAR ARGENTINA": [Makam.BAYAT], "ASHEAR list": [Makam.NAWAH], "ASHEAR NOTES 1936-1940": [Makam.NAWAH], "Argentina 1947 & Ezra Mishanieh": [Makam.NAHWAND], "GABRIEL A SHREM 1964 SUHV": [Makam.NAHWAND]]
case 20:
["SASSOON #647 Aleppo, 1850": [Makam.HOSENI], "Eliahou Yaaqob DWECK-KESAR": [Makam.NAWAH], "YAAQOB ABADI-PARSIYA": [Makam.HOSENI], "YISHAQ YEQAR ARGENTINA": [Makam.HOSENI], "ASHEAR list": [Makam.BAYAT], "ASHEAR NOTES 1936-1940": [Makam.BAYAT], "Argentina 1947 & Ezra Mishanieh": [Makam.BAYAT], "GABRIEL A SHREM 1964 SUHV": [Makam.HOSENI]]
default:
[:]
}
if jCal.getDayOfWeek() == 7 {
cholHamoedSukMap["Eliahou Yaaqob DWECK-KESAR"] = [Makam.ASHIRAN];
cholHamoedSukMap["ASHEAR NOTES 1936-1940"] = [Makam.MAHOUR];
cholHamoedSukMap["ABRAHAM E SHREM ~1945"] = [Makam.BAYAT];
cholHamoedSukMap["GABRIEL A SHREM 1964 SUHV"] = [Makam.BAYAT];
cholHamoedSukMap["BOZO, Ades, Shir Ushbaha 2005"] = [Makam.BAYAT];
cholHamoedSukMap["MOSHE AMASH (Shami)"] = [Makam.SABA];
cholHamoedSukMap["EZRA MASLATON TARAB (Shami)"] = [Makam.BAYAT];
cholHamoedSukMap["Hallel VeZimrah, Greece List, 1926"] = [Makam.Q_BUSTANIGAR];
}
return cholHamoedSukMap
case JewishCalendar.HOSHANA_RABBA:
return ["Eliahou Yaaqob DWECK-KESAR": [Makam.HOSENI], "YAAQOB ABADI-PARSIYA": [Makam.SABA], "YISHAQ YEQAR ARGENTINA": [Makam.ASHIRAN], "ASHEAR list": [Makam.MEHAYAR], "ASHEAR NOTES 1936-1940": [Makam.MEHAYAR], "Argentina 1947 & Ezra Mishanieh": [Makam.MEHAYAR]]
case JewishCalendar.SHEMINI_ATZERES:
return !jCal.inIsrael ? ["SASSOON #647 Aleppo, 1850": [Makam.AJAM], "Eliahou Yaaqob DWECK-KESAR": [Makam.ASHIRAN], "YAAQOB ABADI-PARSIYA": [Makam.BAYAT], "ABRAHAM DWECK Pre1920": [Makam.BAYAT], "ASHEAR list": [Makam.AJAM], "ASHEAR NOTES 1936-1940": [Makam.AJAM], "ABRAHAM E SHREM ~1945": [Makam.SABA], "Argentina 1947 & Ezra Mishanieh": [Makam.AJAM], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.HOSENI], "GABRIEL A SHREM 1964 SUHV": [Makam.SABA, Makam.SIGAH], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.RAST], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.AJAM], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.SABA], "BOZO, Ades, Shir Ushbaha 2005": [Makam.SABA, Makam.SIGAH, Makam.HOSENI], "MOSHE AMASH (Shami)": [Makam.RAST], "EZRA MASLATON TARAB (Shami)": [Makam.RAST], "ABRAHAM SHAMRICHA (Shami)": [Makam.RAST], "Hallel VeZimrah, Greece List, 1926": [Makam.HIJAZ_KAR]] :
// This data is taken from the Parasha Page on VeZot Haberacha
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.AJAM], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.AJAM], "TEBELE Pre1888": [Makam.AJAM], "YAAQOB ABADI-PARSIYA": [Makam.AJAM], "YISHAQ YEQAR ARGENTINA": [Makam.AJAM], "ADES: 24793": [Makam.AJAM], "Dibre Shelomo S KASSIN Pre1915": [Makam.AJAM], "ABRAHAM DWECK Pre1920": [Makam.AJAM], "IDELSOHN Pre1923": [Makam.AJAM], "S SAGIR Laniado": [Makam.AJAM], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.AJAM], "ASHEAR list": [Makam.AJAM], "ABRAHAM E SHREM ~1945": [Makam.AJAM], "Argentina 1947 & Ezra Mishanieh": [Makam.AJAM], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.AJAM], "GABRIEL A SHREM 1964 SUHV": [Makam.AJAM], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.AJAM], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.AJAM], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.AJAM], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.AJAM], "BOZO, Ades, Shir Ushbaha 2005": [Makam.AJAM], "Yishaq Yeranen Halabi": [Makam.AJAM], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT]]
case JewishCalendar.SIMCHAS_TORAH:
// This data is taken from the Yom Tov Page
return ["SASSOON #647 Aleppo, 1850": [Makam.BAYAT], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.AJAM], "Eliahou Yaaqob DWECK-KESAR": [Makam.AJAM], "YAAQOB ABADI-PARSIYA": [Makam.AJAM], "YISHAQ YEQAR ARGENTINA": [Makam.AJAM], "ADES: 24793": [Makam.AJAM], "Dibre Shelomo S KASSIN Pre1915": [Makam.AJAM], "ABRAHAM DWECK Pre1920": [Makam.AJAM], "IDELSOHN Pre1923": [Makam.AJAM], "S SAGIR Laniado": [Makam.AJAM], "ASHEAR list": [Makam.SABA], "ASHEAR NOTES 1936-1940": [Makam.SABA], "ABRAHAM E SHREM ~1945": [Makam.AJAM], "Argentina 1947 & Ezra Mishanieh": [Makam.SABA], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.AJAM], "GABRIEL A SHREM 1964 SUHV": [Makam.AJAM], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.GIRKA], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.SIGAH], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.AJAM], "BOZO, Ades, Shir Ushbaha 2005": [Makam.AJAM], "Yishaq Yeranen Halabi": [Makam.AJAM], "MOSHE AMASH (Shami)": [Makam.BAYAT], "EZRA MASLATON TARAB (Shami)": [Makam.BAYAT], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT]]
case JewishCalendar.PURIM, JewishCalendar.SHUSHAN_PURIM:
return ["Eliahou Yaaqob DWECK-KESAR": [Makam.OJ, Makam.SABA], "IDELSOHN Pre1923": [Makam.OJ, Makam.SIGAH], "ASHEAR NOTES 1936-1940": [Makam.SIGAH], "GABRIEL A SHREM 1964 SUHV": [jCal.getYomTovIndex() == JewishCalendar.PURIM ? Makam.OJ : Makam.SIGAH], "BOZO, Ades, Shir Ushbaha 2005": [Makam.OJ, Makam.SIGAH], "MOSHE AMASH (Shami)": [Makam.SIGAH], "EZRA MASLATON TARAB (Shami)": [jCal.getYomTovIndex() == JewishCalendar.PURIM ? Makam.SIGAH : Makam.RAST], "ABRAHAM SHAMRICHA (Shami)": [Makam.SIGAH]]
case JewishCalendar.PESACH:
return switch jCal.getJewishDayOfMonth() {
case 15:
["Eliahou Yaaqob DWECK-KESAR": [Makam.SIGAH], "YAAQOB ABADI-PARSIYA": [Makam.SIGAH], "ABRAHAM DWECK Pre1920": [Makam.SIGAH], "IDELSOHN Pre1923": [Makam.BAYAT], "S SAGIR Laniado": [Makam.SIGAH], "ASHEAR list": [Makam.SIGAH], "ASHEAR NOTES 1936-1940": [Makam.SIGAH], "ABRAHAM E SHREM ~1945": [Makam.SIGAH], "Argentina 1947 & Ezra Mishanieh": [Makam.SIGAH], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.SIGAH], "GABRIEL A SHREM 1964 SUHV": [Makam.SIGAH], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.SIGAH], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.SIGAH], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.SIGAH], "BOZO, Ades, Shir Ushbaha 2005": [Makam.SIGAH, Makam.BAYAT], "MOSHE AMASH (Shami)": [Makam.RAST], "EZRA MASLATON TARAB (Shami)": [Makam.RAST], "ABRAHAM SHAMRICHA (Shami)": [Makam.RAST], "Hallel VeZimrah, Greece List, 1926": [Makam.SIGAH]]
case 16:
["Eliahou Yaaqob DWECK-KESAR": [Makam.AJAM], "YAAQOB ABADI-PARSIYA": [Makam.SASGAR], "ABRAHAM DWECK Pre1920": [Makam.SASGAR], "IDELSOHN Pre1923": [Makam.SASGAR], "S SAGIR Laniado": [Makam.AJAM], "ASHEAR list": [Makam.AJAM], "ASHEAR NOTES 1936-1940": [Makam.AJAM], "ABRAHAM E SHREM ~1945": [Makam.AJAM], "Argentina 1947 & Ezra Mishanieh": [Makam.AJAM], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.AJAM], "GABRIEL A SHREM 1964 SUHV": [Makam.AJAM], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.AJAM], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.AJAM], "BOZO, Ades, Shir Ushbaha 2005": [Makam.AJAM, Makam.SASGAR], "MOSHE AMASH (Shami)": [Makam.SIGAH], "EZRA MASLATON TARAB (Shami)": [Makam.SIGAH], "ABRAHAM SHAMRICHA (Shami)": [Makam.SIGAH], "Hallel VeZimrah, Greece List, 1926": [Makam.AJAM]]
case 21:
["Eliahou Yaaqob DWECK-KESAR": [Makam.AJAM], "YAAQOB ABADI-PARSIYA": [Makam.AJAM], "ABRAHAM DWECK Pre1920": [Makam.AJAM], "IDELSOHN Pre1923": [Makam.AJAM], "S SAGIR Laniado": [Makam.AJAM], "ASHEAR list": [Makam.AJAM], "ASHEAR NOTES 1936-1940": [Makam.AJAM], "ABRAHAM E SHREM ~1945": [Makam.AJAM], "Argentina 1947 & Ezra Mishanieh": [Makam.AJAM], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.AJAM], "GABRIEL A SHREM 1964 SUHV": [Makam.AJAM], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.GIRKA], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.AJAM], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.AJAM], "BOZO, Ades, Shir Ushbaha 2005": [Makam.AJAM], "MOSHE AMASH (Shami)": [Makam.AJAM], "EZRA MASLATON TARAB (Shami)": [Makam.AJAM], "ABRAHAM SHAMRICHA (Shami)": [Makam.AJAM], "Hallel VeZimrah, Greece List, 1926": [Makam.FARAHNAQ]]
case 22:
["Eliahou Yaaqob DWECK-KESAR": [Makam.ASHIRAN], "ABRAHAM DWECK Pre1920": [Makam.BAYAT], "IDELSOHN Pre1923": [Makam.MEHAYAR], "S SAGIR Laniado": [Makam.SABA], "ASHEAR list": [Makam.SABA], "ASHEAR NOTES 1936-1940": [Makam.SABA], "ABRAHAM E SHREM ~1945": [Makam.SABA], "Argentina 1947 & Ezra Mishanieh": [Makam.SABA], "GABRIEL A SHREM 1964 SUHV": [Makam.SABA], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.SABA], "BOZO, Ades, Shir Ushbaha 2005": [Makam.SABA, Makam.MEHAYAR], "MOSHE AMASH (Shami)": [Makam.BAYAT], "EZRA MASLATON TARAB (Shami)": [Makam.BAYAT], "Hallel VeZimrah, Greece List, 1926": [Makam.IRAQ]]
default:
[:]
}
case JewishCalendar.CHOL_HAMOED_PESACH:
var pesachHHReturnData: [String: [Makam]] = switch jCal.getJewishDayOfMonth() {
case 16:
["Eliahou Yaaqob DWECK-KESAR": [Makam.AJAM], "YAAQOB ABADI-PARSIYA": [Makam.SASGAR], "ABRAHAM DWECK Pre1920": [Makam.SASGAR], "IDELSOHN Pre1923": [Makam.SASGAR], "S SAGIR Laniado": [Makam.AJAM], "ASHEAR list": [Makam.AJAM], "ASHEAR NOTES 1936-1940": [Makam.AJAM], "ABRAHAM E SHREM ~1945": [Makam.AJAM], "Argentina 1947 & Ezra Mishanieh": [Makam.AJAM], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.AJAM], "GABRIEL A SHREM 1964 SUHV": [Makam.AJAM], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.AJAM], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.AJAM], "BOZO, Ades, Shir Ushbaha 2005": [Makam.AJAM, Makam.SASGAR], "MOSHE AMASH (Shami)": [Makam.SIGAH], "EZRA MASLATON TARAB (Shami)": [Makam.SIGAH], "ABRAHAM SHAMRICHA (Shami)": [Makam.SIGAH], "Hallel VeZimrah, Greece List, 1926": [Makam.AJAM]]
case 17:
["Eliahou Yaaqob DWECK-KESAR": [Makam.SABA], "YAAQOB ABADI-PARSIYA": [Makam.IRAQ], "IDELSOHN Pre1923": [Makam.IRAQ], "ASHEAR list": [Makam.IRAQ], "Argentina 1947 & Ezra Mishanieh": [Makam.IRAQ], "GABRIEL A SHREM 1964 SUHV": [Makam.IRAQ]]
case 18:
["Eliahou Yaaqob DWECK-KESAR": [Makam.BAYAT], "YAAQOB ABADI-PARSIYA": [Makam.RAHAWI], "IDELSOHN Pre1923": [Makam.RAHAWI], "ASHEAR list": [Makam.SABA], "Argentina 1947 & Ezra Mishanieh": [Makam.SABA], "GABRIEL A SHREM 1964 SUHV": [Makam.RAHAWI]]
case 19:
["Eliahou Yaaqob DWECK-KESAR": [Makam.RAST], "YAAQOB ABADI-PARSIYA": [Makam.RAST], "IDELSOHN Pre1923": [Makam.RAST], "ASHEAR list": [Makam.RAST], "Argentina 1947 & Ezra Mishanieh": [Makam.RAST], "GABRIEL A SHREM 1964 SUHV": [Makam.RAST]]
case 20:
["Eliahou Yaaqob DWECK-KESAR": [Makam.RAHAWI], "YAAQOB ABADI-PARSIYA": [Makam.SABA], "IDELSOHN Pre1923": [Makam.SABA], "ASHEAR list": [Makam.BAYAT], "Argentina 1947 & Ezra Mishanieh": [Makam.BAYAT], "GABRIEL A SHREM 1964 SUHV": [Makam.BAYAT]]
default:
[:]
}
if jCal.getDayOfWeek() == 7 {
pesachHHReturnData["GABRIEL A SHREM 1964 SUHV"] = [Makam.BAYAT]
}
return pesachHHReturnData
case JewishCalendar.SHAVUOS:
return jCal.getJewishDayOfMonth() == 7 ? ["Eliahou Yaaqob DWECK-KESAR": [Makam.AJAM], "ABRAHAM DWECK Pre1920": [Makam.SASGAR], "S SAGIR Laniado": [Makam.AJAM], "ASHEAR list": [Makam.AJAM], "ASHEAR NOTES 1936-1940": [Makam.AJAM], "Argentina 1947 & Ezra Mishanieh": [Makam.SASGAR], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.HOSENI], "GABRIEL A SHREM 1964 SUHV": [Makam.AJAM], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.HOSENI], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.SIGAH], "BOZO, Ades, Shir Ushbaha 2005": [Makam.AJAM], "MOSHE AMASH (Shami)": [Makam.BAYAT], "EZRA MASLATON TARAB (Shami)": [Makam.BAYAT], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Hallel VeZimrah, Greece List, 1926": [Makam.BUSTANIGAR]] : ["Eliahou Yaaqob DWECK-KESAR": [Makam.SIGAH], "ABRAHAM DWECK Pre1920": [Makam.SIGAH], "IDELSOHN Pre1923": [Makam.SIGAH], "S SAGIR Laniado": [Makam.SIGAH], "ASHEAR list": [Makam.SIGAH], "ASHEAR NOTES 1936-1940": [Makam.SIGAH], "Argentina 1947 & Ezra Mishanieh": [Makam.SIGAH], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.AJAM], "GABRIEL A SHREM 1964 SUHV": [Makam.SIGAH], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.BAYAT, Makam.AJAM], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.AJAM], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.AJAM], "BOZO, Ades, Shir Ushbaha 2005": [Makam.SIGAH], "MOSHE AMASH (Shami)": [Makam.RAST], "EZRA MASLATON TARAB (Shami)": [Makam.RAST], "ABRAHAM SHAMRICHA (Shami)": [Makam.RAST], "Hallel VeZimrah, Greece List, 1926": [Makam.RAST]]
default: break
// ignore
}
}
// Combine the two Parashiot entries into one
let mergeParashaMap = [JewishCalendar.Parsha.VAYAKHEL_PEKUDEI: JewishCalendar.Parsha.VAYAKHEL, JewishCalendar.Parsha.TAZRIA_METZORA: JewishCalendar.Parsha.TAZRIA, JewishCalendar.Parsha.ACHREI_MOS_KEDOSHIM: JewishCalendar.Parsha.ACHREI_MOS, JewishCalendar.Parsha.BEHAR_BECHUKOSAI: JewishCalendar.Parsha.BEHAR, JewishCalendar.Parsha.CHUKAS_BALAK: JewishCalendar.Parsha.CHUKAS, JewishCalendar.Parsha.MATOS_MASEI: JewishCalendar.Parsha.MATOS, JewishCalendar.Parsha.NITZAVIM_VAYEILECH: JewishCalendar.Parsha.NITZAVIM]
let parsha = jCal.getParshah()
let thisWeekParsha = mergeParashaMap[parsha] ?? parsha
let data: [String: [Makam]] = switch thisWeekParsha {
case .BERESHIS:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.BERESHIT), value: [Makam.RAST], normal: ["R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.RAST, Makam.BAYAT], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.RAST, Makam.BAYAT], "Dibre Shelomo S KASSIN Pre1915": [Makam.RAST, Makam.BAYAT], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.BAYAT, Makam.RAST], "Victor Afya, Istanbul List": [Makam.SEGAH], "Izak Alaluf, Izmir List": [Makam.SEGAH]])
case .NOACH:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.IRAQ], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.IRAQ, Makam.SABA], "TEBELE Pre1888": [Makam.IRAQ], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.IRAQ, Makam.SABA], "YAAQOB ABADI-PARSIYA": [Makam.BAYAT], "YISHAQ YEQAR ARGENTINA": [Makam.IRAQ], "ADES: 24793": [Makam.IRAQ, Makam.SABA], "Dibre Shelomo S KASSIN Pre1915": [Makam.IRAQ, Makam.SABA], "Knis Betesh Geniza List, Aleppo": [Makam.IRAQ, Makam.SIGAH], "ABRAHAM DWECK Pre1920": [Makam.SIGAH], "IDELSOHN Pre1923": [Makam.IRAQ], "S SAGIR Laniado": [Makam.BAYAT], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.SIGAH], "ASHEAR list": [Makam.IRAQ], "ASHEAR NOTES 1936-1940": [Makam.IRAQ, Makam.SIGAH], "ABRAHAM E SHREM ~1945": [Makam.SIGAH], "Argentina 1947 & Ezra Mishanieh": [Makam.IRAQ], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.IRAQ, Makam.BAYAT], "GABRIEL A SHREM 1964 SUHV": [Makam.SIGAH], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.SIGAH], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.HIJAZ], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.HIJAZ], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.BAYAT], "BOZO, Ades, Shir Ushbaha 2005": [Makam.BAYAT, Makam.SIGAH], "Yishaq Yeranen Halabi": [Makam.BAYAT], "MOSHE AMASH (Shami)": [Makam.NAWAH], "EZRA MASLATON TARAB (Shami)": [Makam.NAWAH], "ABRAHAM SHAMRICHA (Shami)": [Makam.NAWAH], "Victor Afya, Istanbul List": [Makam.HICAZ], "Izak Alaluf, Izmir List": [Makam.HICAZ]]
case
// Parsha.VZOS_HABERACHA is unused
.LECH_LECHA:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.BERESHIT), value: [Makam.SABA], normal: ["MOSHE AMASH (Shami)": [Makam.SIGAH, Makam.IRAQ], "EZRA MASLATON TARAB (Shami)": [Makam.SIGAH, Makam.IRAQ], "ABRAHAM SHAMRICHA (Shami)": [Makam.SIGAH], "Victor Afya, Istanbul List": [Makam.HUSEYNI], "Izak Alaluf, Izmir List": [Makam.HUSEYNI], "Hallel VeZimrah, Salonika, 1928": [Makam.NAHOFT]])
case .VAYERA:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.NAWAH], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.NAWAH], "TEBELE Pre1888": [Makam.NAWAH], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.NAWAH], "YAAQOB ABADI-PARSIYA": [Makam.NAWAH], "YISHAQ YEQAR ARGENTINA": [Makam.NAWAH], "ADES: 24793": [Makam.NAWAH], "Dibre Shelomo S KASSIN Pre1915": [Makam.NAWAH], "Knis Betesh Geniza List, Aleppo": [Makam.NAWAH], "ABRAHAM DWECK Pre1920": [Makam.HOSENI], "IDELSOHN Pre1923": [Makam.NAWAH], "S SAGIR Laniado": [Makam.NAWAH], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.BAYAT], "ASHEAR list": [Makam.NAWAH], "ASHEAR NOTES 1936-1940": [Makam.NAWAH, Makam.RAST], "ABRAHAM E SHREM ~1945": [Makam.BAYAT], "Argentina 1947 & Ezra Mishanieh": [Makam.NAHWAND], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.NAWAH], "GABRIEL A SHREM 1964 SUHV": [Makam.RAHAWI, Makam.NAWAH], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.BAYAT], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.HIJAZ], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.NAHWAND], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.NAWAH], "BOZO, Ades, Shir Ushbaha 2005": [Makam.NAWAH], "Yishaq Yeranen Halabi": [Makam.NAWAH], "MOSHE AMASH (Shami)": [Makam.AJAM], "EZRA MASLATON TARAB (Shami)": [Makam.BAYAT], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Victor Afya, Istanbul List": [Makam.ARABAN], "Izak Alaluf, Izmir List": [Makam.NIHAVEND], "Hallel VeZimrah, Salonika, 1928": [Makam.HIJAZ]]
case .CHAYEI_SARA:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.BERESHIT), value: [Makam.HIJAZ], normal: ["ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.HOSENI], "ADES: 24793": [Makam.ARAZBAR], "Dibre Shelomo S KASSIN Pre1915": [Makam.HIJAZ, Makam.ARAZBAR], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.NAHWAND], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.HIJAZ_KAR], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.HIJAZ_KAR], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.NAHWAND], "MOSHE AMASH (Shami)": [Makam.SABA], "EZRA MASLATON TARAB (Shami)": [Makam.SABA], "ABRAHAM SHAMRICHA (Shami)": [Makam.SABA], "Victor Afya, Istanbul List": [Makam.DUGAH], "Izak Alaluf, Izmir List": [Makam.DUGAH], "Hallel VeZimrah, Salonika, 1928": [Makam.BUSTANIGAR]])
case .TOLDOS:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.BERESHIT), value: [Makam.MAHOUR], normal: ["Knis Betesh Geniza List, Aleppo": [Makam.RAST], "ABRAHAM DWECK Pre1920": [Makam.RAST], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.RAST], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.RAST], "MOSHE AMASH (Shami)": [Makam.RAST], "Victor Afya, Istanbul List": [Makam.MAHUR], "Izak Alaluf, Izmir List": [Makam.ARABAN], "Hallel VeZimrah, Salonika, 1928": [Makam.IRAQ]])
case .VAYETZEI:
["R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.GIRKA], "TEBELE Pre1888": [Makam.GIRKA], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.GIRKA], "YAAQOB ABADI-PARSIYA": [Makam.GIRKA], "YISHAQ YEQAR ARGENTINA": [Makam.GIRKA], "ADES: 24793": [Makam.GIRKA], "Dibre Shelomo S KASSIN Pre1915": [Makam.GIRKA, Makam.AJAM], "Knis Betesh Geniza List, Aleppo": [Makam.SABA], "ABRAHAM DWECK Pre1920": [Makam.SABA], "IDELSOHN Pre1923": [Makam.GIRKA], "S SAGIR Laniado": [Makam.AJAM], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.SABA], "ASHEAR NOTES 1936-1940": [Makam.AJAM], "ABRAHAM E SHREM ~1945": [Makam.SABA], "Argentina 1947 & Ezra Mishanieh": [Makam.GIRKA], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.AJAM], "GABRIEL A SHREM 1964 SUHV": [Makam.AJAM], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.SABA], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.AJAM], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.AJAM], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.AJAM], "BOZO, Ades, Shir Ushbaha 2005": [Makam.AJAM], "Yishaq Yeranen Halabi": [Makam.AJAM], "MOSHE AMASH (Shami)": [Makam.AJAM], "EZRA MASLATON TARAB (Shami)": [Makam.AJAM], "ABRAHAM SHAMRICHA (Shami)": [Makam.AJAM], "Victor Afya, Istanbul List": [Makam.NIHAVEND], "Izak Alaluf, Izmir List": [Makam.BEYATI], "Hallel VeZimrah, Salonika, 1928": [Makam.SABA]]
case .VAYISHLACH:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.IRAQ], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.IRAQ, Makam.SABA], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.IRAQ, Makam.SABA], "TEBELE Pre1888": [Makam.IRAQ], "YAAQOB ABADI-PARSIYA": [Makam.BAYAT], "YISHAQ YEQAR ARGENTINA": [Makam.SIGAH], "ADES: 24793": [Makam.IRAQ, Makam.SABA], "Dibre Shelomo S KASSIN Pre1915": [Makam.IRAQ, Makam.SABA], "Knis Betesh Geniza List, Aleppo": [Makam.IRAQ], "ABRAHAM DWECK Pre1920": [Makam.BAYAT], "IDELSOHN Pre1923": [Makam.IRAQ], "S SAGIR Laniado": [Makam.BAYAT], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.HOSENI], "ASHEAR list": [Makam.IRAQ], "ASHEAR NOTES 1936-1940": [Makam.SIGAH, Makam.IRAQ], "ABRAHAM E SHREM ~1945": [Makam.HOSENI], "Argentina 1947 & Ezra Mishanieh": [Makam.IRAQ], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.SABA, Makam.SIGAH], "GABRIEL A SHREM 1964 SUHV": [Makam.SABA, Makam.SIGAH], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.SIGAH], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.SABA], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.SABA], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.BAYAT], "BOZO, Ades, Shir Ushbaha 2005": [Makam.BAYAT, Makam.SIGAH], "Yishaq Yeranen Halabi": [Makam.BAYAT], "MOSHE AMASH (Shami)": [Makam.BAYAT], "EZRA MASLATON TARAB (Shami)": [Makam.BAYAT], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Victor Afya, Istanbul List": [Makam.ACEM_ASHIRAN], "Izak Alaluf, Izmir List": [Makam.ACEM_ASHIRAN], "Hallel VeZimrah, Salonika, 1928": [Makam.HUZAM]]
case .VAYESHEV:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.RAHAWI], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.RAHAWI], "TEBELE Pre1888": [Makam.RAHAWI], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.RAHAWI], "YAAQOB ABADI-PARSIYA": [Makam.RAHAWI], "YISHAQ YEQAR ARGENTINA": [Makam.RAHAWI], "ADES: 24793": [Makam.RAHAWI], "Dibre Shelomo S KASSIN Pre1915": [Makam.RAHAWI], "Knis Betesh Geniza List, Aleppo": [Makam.RAHAWI], "IDELSOHN Pre1923": [Makam.RAHAWI], "S SAGIR Laniado": [Makam.NAWAH], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.RAHAWI], "ASHEAR list": [Makam.RAHAWI], "ASHEAR NOTES 1936-1940": [Makam.NAWAH, Makam.NAHWAND], "ABRAHAM E SHREM ~1945": [Makam.RAHAWI, Makam.NAHWAND], "Argentina 1947 & Ezra Mishanieh": [Makam.RAHAWI], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.RAHAWI], "GABRIEL A SHREM 1964 SUHV": [Makam.RAHAWI, Makam.NAHWAND], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.NAWAH], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.NAHWAND], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.NAHWAND], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.NAWAH], "BOZO, Ades, Shir Ushbaha 2005": [Makam.RAHAWI, Makam.NAWAH], "Yishaq Yeranen Halabi": [Makam.NAWAH], "MOSHE AMASH (Shami)": [Makam.NAWAH], "EZRA MASLATON TARAB (Shami)": [Makam.NAWAH], "ABRAHAM SHAMRICHA (Shami)": [Makam.NAWAH], "Victor Afya, Istanbul List": [Makam.USSAK], "Izak Alaluf, Izmir List": [Makam.ISFAHAN], "Hallel VeZimrah, Salonika, 1928": [Makam.SIGAH]]
case .MIKETZ:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.BERESHIT).removing("Victor Afya, Istanbul List"), value: [Makam.SIGAH], normal: ["MOSHE AMASH (Shami)": [Makam.RAHAWI], "EZRA MASLATON TARAB (Shami)": [Makam.RAHAWI], "ABRAHAM SHAMRICHA (Shami)": [Makam.RAHAWI], "Izak Alaluf, Izmir List": [Makam.USSAK], "Hallel VeZimrah, Salonika, 1928": [Makam.USSAK]])
case .VAYIGASH:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.BAYAT], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.BAYAT], "TEBELE Pre1888": [Makam.BAYAT], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.IRAQ, Makam.SABA, Makam.BAYAT, Makam.RAST], "YAAQOB ABADI-PARSIYA": [Makam.SABA], "YISHAQ YEQAR ARGENTINA": [Makam.BAYAT], "ADES: 24793": [Makam.BAYAT], "Dibre Shelomo S KASSIN Pre1915": [Makam.BAYAT], "Knis Betesh Geniza List, Aleppo": [Makam.SABA], "ABRAHAM DWECK Pre1920": [Makam.SABA], "IDELSOHN Pre1923": [Makam.BAYAT], "S SAGIR Laniado": [Makam.SABA], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.MAHOUR], "ASHEAR list": [Makam.BAYAT], "ASHEAR NOTES 1936-1940": [Makam.BAYAT], "ABRAHAM E SHREM ~1945": [Makam.MAHOUR], "Argentina 1947 & Ezra Mishanieh": [Makam.BAYAT], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.BAYAT, Makam.SABA], "GABRIEL A SHREM 1964 SUHV": [Makam.BAYAT], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.BAYAT], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.BAYAT], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.BAYAT], "BOZO, Ades, Shir Ushbaha 2005": [Makam.BAYAT], "Yishaq Yeranen Halabi": [Makam.BAYAT, Makam.SABA], "MOSHE AMASH (Shami)": [Makam.SIGAH], "EZRA MASLATON TARAB (Shami)": [Makam.SIGAH], "ABRAHAM SHAMRICHA (Shami)": [Makam.SIGAH], "Victor Afya, Istanbul List": [Makam.SEGAH], "Izak Alaluf, Izmir List": [Makam.NIHAVEND], "Hallel VeZimrah, Salonika, 1928": [Makam.MUHAYER]]
case .VAYECHI:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.BERESHIT), value: [Makam.HIJAZ], normal: ["ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.HIJAZ, Makam.SABA], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.NAHWAND], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.SHURI], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.NAHWAND], "MOSHE AMASH (Shami)": [Makam.SABA], "EZRA MASLATON TARAB (Shami)": [Makam.SABA], "ABRAHAM SHAMRICHA (Shami)": [Makam.SABA], "Victor Afya, Istanbul List": [Makam.BEYATI], "Izak Alaluf, Izmir List": [Makam.CARGAH], "Hallel VeZimrah, Salonika, 1928": [Makam.AJAM]])
case .SHEMOS:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.RAST], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.BAYAT, Makam.RAST], "TEBELE Pre1888": [Makam.BAYAT], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.BAYAT, Makam.RAST], "YAAQOB ABADI-PARSIYA": [Makam.BAYAT], "YISHAQ YEQAR ARGENTINA": [Makam.RAST], "ADES: 24793": [Makam.BAYAT, Makam.RAST], "Dibre Shelomo S KASSIN Pre1915": [Makam.BAYAT, Makam.RAST], "Knis Betesh Geniza List, Aleppo": [Makam.RAST], "ABRAHAM DWECK Pre1920": [Makam.RAST], "IDELSOHN Pre1923": [Makam.RAST], "S SAGIR Laniado": [Makam.BAYAT], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.HOSENI], "ASHEAR list": [Makam.BAYAT, Makam.RAST], "ASHEAR NOTES 1936-1940": [Makam.BAYAT, Makam.RAST], "ABRAHAM E SHREM ~1945": [Makam.HOSENI], "Argentina 1947 & Ezra Mishanieh": [Makam.BAYAT, Makam.RAST], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.BAYAT, Makam.RAST], "GABRIEL A SHREM 1964 SUHV": [Makam.BAYAT, Makam.RAST], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.RAST], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.RAST], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.RAST], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.RAST], "BOZO, Ades, Shir Ushbaha 2005": [Makam.BAYAT, Makam.RAST], "Yishaq Yeranen Halabi": [Makam.BAYAT], "MOSHE AMASH (Shami)": [Makam.RAST], "EZRA MASLATON TARAB (Shami)": [Makam.RAST], "ABRAHAM SHAMRICHA (Shami)": [Makam.RAST], "Victor Afya, Istanbul List": [Makam.NIHAVEND], "Izak Alaluf, Izmir List": [Makam.NIHAVEND], "Hallel VeZimrah, Greece List, 1926": [Makam.BAYATI]]
case .VAERA:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.SABA], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.HOSENI, Makam.NAWAH], "TEBELE Pre1888": [Makam.HOSENI], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.IRAQ, Makam.HOSENI, Makam.NAWAH], "YAAQOB ABADI-PARSIYA": [Makam.IRAQ, Makam.HOSENI], "YISHAQ YEQAR ARGENTINA": [Makam.SIGAH], "ADES: 24793": [Makam.HOSENI, Makam.NAWAH], "Dibre Shelomo S KASSIN Pre1915": [Makam.HOSENI, Makam.NAWAH], "Knis Betesh Geniza List, Aleppo": [Makam.BAYAT], "ABRAHAM DWECK Pre1920": [Makam.BAYAT], "IDELSOHN Pre1923": [Makam.HOSENI, Makam.NAWAH], "S SAGIR Laniado": [Makam.SIGAH], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.SABA], "ASHEAR list": [Makam.SIGAH], "ASHEAR NOTES 1936-1940": [Makam.NAHWAND, Makam.BAYAT], "ABRAHAM E SHREM ~1945": [Makam.SABA], "Argentina 1947 & Ezra Mishanieh": [Makam.SIGAH], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.HOSENI, Makam.SIGAH], "GABRIEL A SHREM 1964 SUHV": [Makam.HOSENI, Makam.RAST], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.BAYAT], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.HOSENI], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.BAYAT], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.SIGAH], "BOZO, Ades, Shir Ushbaha 2005": [Makam.NAWAH, Makam.HOSENI], "Yishaq Yeranen Halabi": [Makam.NAWAH], "MOSHE AMASH (Shami)": [Makam.BAYAT], "EZRA MASLATON TARAB (Shami)": [Makam.BAYAT], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Victor Afya, Istanbul List": [Makam.HICAZ], "Izak Alaluf, Izmir List": [Makam.HICAZ], "Hallel VeZimrah, Greece List, 1926": [Makam.BUSALIQ]]
case .BO:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.IRAQ], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.IRAQ, Makam.RAST], "TEBELE Pre1888": [Makam.IRAQ], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.IRAQ, Makam.RAST], "YAAQOB ABADI-PARSIYA": [Makam.SIGAH, Makam.RAST], "YISHAQ YEQAR ARGENTINA": [Makam.BAYAT], "ADES: 24793": [Makam.IRAQ, Makam.RAST], "Dibre Shelomo S KASSIN Pre1915": [Makam.IRAQ, Makam.RAST], "Knis Betesh Geniza List, Aleppo": [Makam.SABA], "ABRAHAM DWECK Pre1920": [Makam.RAHAWI], "IDELSOHN Pre1923": [Makam.IRAQ], "S SAGIR Laniado": [Makam.RAST], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.BAYAT], "ASHEAR list": [Makam.RAST], "ASHEAR NOTES 1936-1940": [Makam.NAWAH, Makam.NAHWAND], "ABRAHAM E SHREM ~1945": [Makam.NAHWAND], "Argentina 1947 & Ezra Mishanieh": [Makam.RAST], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.SIGAH, Makam.RAST], "GABRIEL A SHREM 1964 SUHV": [Makam.SIGAH], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.SIGAH], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.SIGAH], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.SIGAH], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.NAWAH], "BOZO, Ades, Shir Ushbaha 2005": [Makam.SIGAH], "Yishaq Yeranen Halabi": [Makam.SIGAH], "MOSHE AMASH (Shami)": [Makam.RAST], "EZRA MASLATON TARAB (Shami)": [Makam.RAHAWI], "ABRAHAM SHAMRICHA (Shami)": [Makam.NAWAH], "Victor Afya, Istanbul List": [Makam.HUSEYNI], "Izak Alaluf, Izmir List": [Makam.HUSEYNI], "Hallel VeZimrah, Greece List, 1926": [Makam.QARGIGAR]]
case .BESHALACH:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.SHEMOT), value: [Makam.AJAM], normal: ["Victor Afya, Istanbul List": [Makam.ACEM_ASHIRAN], "Izak Alaluf, Izmir List": [Makam.ACEM_ASHIRAN], "Hallel VeZimrah, Greece List, 1926": [Makam.Q_FARAHNAQ]])
case .YISRO:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.SHEMOT), value: [Makam.HOSENI], normal: ["ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.Q_HOSENI], "IDELSOHN Pre1923": [Makam.SIGAH], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.BAYAT], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.KURD], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.KURD, Makam.HOSENI], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.BAYAT], "BOZO, Ades, Shir Ushbaha 2005": [Makam.HOSENI, Makam.SIGAH], "MOSHE AMASH (Shami)": [Makam.BAYAT], "EZRA MASLATON TARAB (Shami)": [Makam.BAYAT], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Victor Afya, Istanbul List": [Makam.MAHUR, Makam.SEHNAZ], "Izak Alaluf, Izmir List": [Makam.MAHUR], "Hallel VeZimrah, Greece List, 1926": [Makam.RAST]])
case .MISHPATIM:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.NAWAH], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.RAST, Makam.SABA], "TEBELE Pre1888": [Makam.SABA], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.NAWAH, Makam.SABA], "YAAQOB ABADI-PARSIYA": [Makam.NAWAH, Makam.SABA], "YISHAQ YEQAR ARGENTINA": [Makam.NAWAH], "ADES: 24793": [Makam.SABA], "Dibre Shelomo S KASSIN Pre1915": [Makam.SABA], "Knis Betesh Geniza List, Aleppo": [Makam.NAWAH], "ABRAHAM DWECK Pre1920": [Makam.NAHWAND], "IDELSOHN Pre1923": [Makam.SABA], "S SAGIR Laniado": [Makam.NAWAH], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.RAST, Makam.SABA], "ASHEAR list": [Makam.NAWAH], "ASHEAR NOTES 1936-1940": [Makam.BAYAT, Makam.NAWAH], "ABRAHAM E SHREM ~1945": [Makam.RAST], "Argentina 1947 & Ezra Mishanieh": [Makam.NAHWAND], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.SABA], "GABRIEL A SHREM 1964 SUHV": [Makam.SABA], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.SABA], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.SABA, Makam.ISFAHAN], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.SABA], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.RAST], "BOZO, Ades, Shir Ushbaha 2005": [Makam.SABA], "Yishaq Yeranen Halabi": [Makam.SABA], "MOSHE AMASH (Shami)": [Makam.SIGAH], "EZRA MASLATON TARAB (Shami)": [Makam.SIGAH], "ABRAHAM SHAMRICHA (Shami)": [Makam.SIGAH], "Victor Afya, Istanbul List": [Makam.ARABAN], "Izak Alaluf, Izmir List": [Makam.BEYATI]]
case .TERUMAH:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.SHEMOT), value: [Makam.SABA], normal: ["ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.SABA, Makam.RAST], "YAAQOB ABADI-PARSIYA": [Makam.SABA, Makam.RAST], "Dibre Shelomo S KASSIN Pre1915": [Makam.SABA, Makam.MOUHAYAR], "IDELSOHN Pre1923": [Makam.SIGAH], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.SABA, Makam.HOSENI], "ASHEAR NOTES 1936-1940": [Makam.BAYAT], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.BAYAT, Makam.SABA], "GABRIEL A SHREM 1964 SUHV": [Makam.HOSENI], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.RAST], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.BAYAT, Makam.HOSENI], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.BAYAT], "BOZO, Ades, Shir Ushbaha 2005": [Makam.BAYAT, Makam.SIGAH], "Yishaq Yeranen Halabi": [Makam.BAYAT], "MOSHE AMASH (Shami)": [Makam.RAST], "EZRA MASLATON TARAB (Shami)": [Makam.BAYAT], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Victor Afya, Istanbul List": [Makam.BEYATI], "Izak Alaluf, Izmir List": [Makam.SEGAH], "Hallel VeZimrah, Greece List, 1926": [Makam.NAHWAND]])
case .TETZAVEH:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.SHEMOT), value: [Makam.SABA], normal: ["ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.SABA, Makam.RAST], "YAAQOB ABADI-PARSIYA": [Makam.SABA, Makam.RAST], "Dibre Shelomo S KASSIN Pre1915": [Makam.SABA, Makam.MOUHAYAR], "IDELSOHN Pre1923": [Makam.SIGAH], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.SABA, Makam.HOSENI], "ASHEAR NOTES 1936-1940": [Makam.BAYAT], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.BAYAT, Makam.SABA], "GABRIEL A SHREM 1964 SUHV": [Makam.HOSENI], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.RAST], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.BAYAT, Makam.HOSENI], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.BAYAT], "BOZO, Ades, Shir Ushbaha 2005": [Makam.BAYAT, Makam.SIGAH], "Yishaq Yeranen Halabi": [Makam.BAYAT], "MOSHE AMASH (Shami)": [Makam.RAST], "EZRA MASLATON TARAB (Shami)": [Makam.BAYAT], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Victor Afya, Istanbul List": [Makam.BEYATI], "Izak Alaluf, Izmir List": [Makam.SEGAH], "Hallel VeZimrah, Greece List, 1926": [Makam.NAHWAND]])
case .KI_SISA:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.SHEMOT).removing("Hallel VeZimrah, Greece List, 1926"), value: [Makam.HIJAZ], normal: ["D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.NAHWAND], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.SHURI], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.NAHWAND], "MOSHE AMASH (Shami)": [Makam.SABA], "EZRA MASLATON TARAB (Shami)": [Makam.SABA], "ABRAHAM SHAMRICHA (Shami)": [Makam.SABA], "Victor Afya, Istanbul List": [Makam.HICAZ], "Izak Alaluf, Izmir List": [Makam.ARABAN]])
case .VAYAKHEL:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.SHEMOT).removing("M H Elias, SHIR HADASH, Jerusalem, 1930").removing("YOSEF YEHEZKEL Jerusalem 1975").removing("ABRAHAM SHAMRICHA (Shami)").removing("Victor Afya, Istanbul List").removing("Izak Alaluf, Izmir List"), value: [Makam.HOSENI], normal: ["YISHAQ YEQAR ARGENTINA": [Makam.SABA], "S SAGIR Laniado": [Makam.BAYAT], "ASHEAR NOTES 1936-1940": [Makam.BAYAT], "ABRAHAM E SHREM ~1945": [Makam.BAYAT], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.BAYAT], "MOSHE AMASH (Shami)": [Makam.AJAM], "EZRA MASLATON TARAB (Shami)": [Makam.MAHOUR], "Hallel VeZimrah, Greece List, 1926": [Makam.BUSTANIGAR]])
case .PEKUDEI:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.SHEMOT).removing("YOSEF YEHEZKEL Jerusalem 1975").removing("Victor Afya, Istanbul List").removing("Izak Alaluf, Izmir List"), value: [Makam.NAWAH], normal: ["M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.RAST, Makam.SABA], "ABRAHAM E SHREM ~1945": [Makam.SABA], "Argentina 1947 & Ezra Mishanieh": [Makam.NAHWAND], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.BAYAT], "MOSHE AMASH (Shami)": [Makam.BAYAT], "EZRA MASLATON TARAB (Shami)": [Makam.BAYAT], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Hallel VeZimrah, Greece List, 1926": [Makam.HUZAM]])
case .VAYIKRA:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.RAST], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.RAST], "TEBELE Pre1888": [Makam.RAST], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.RAST], "YAAQOB ABADI-PARSIYA": [Makam.RAST], "YISHAQ YEQAR ARGENTINA": [Makam.RAST], "ADES: 24793": [Makam.RAST], "Dibre Shelomo S KASSIN Pre1915": [Makam.RAST], "Knis Betesh Geniza List, Aleppo": [Makam.RAST], "ABRAHAM DWECK Pre1920": [Makam.RAST], "IDELSOHN Pre1923": [Makam.RAST], "S SAGIR Laniado": [Makam.RAST], "ASHEAR list": [Makam.RAST], "ASHEAR NOTES 1936-1940": [Makam.RAST], "Argentina 1947 & Ezra Mishanieh": [Makam.RAST], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.RAST], "GABRIEL A SHREM 1964 SUHV": [Makam.RAST], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.RAST], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.RAST], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.RAST], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.RAST], "BOZO, Ades, Shir Ushbaha 2005": [Makam.RAST], "Yishaq Yeranen Halabi": [Makam.RAST], "MOSHE AMASH (Shami)": [Makam.RAST], "EZRA MASLATON TARAB (Shami)": [Makam.RAST], "ABRAHAM SHAMRICHA (Shami)": [Makam.RAST], "Victor Afya, Istanbul List": [Makam.SEBAH], "Izak Alaluf, Izmir List": [Makam.HICAZ], "Hallel VeZimrah, Greece List, 1926": [Makam.SABA]]
case .TZAV:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.IRAQ], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.IRAQ], "TEBELE Pre1888": [Makam.IRAQ], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.RAHAWI, Makam.IRAQ], "YAAQOB ABADI-PARSIYA": [Makam.RAHAWI, Makam.IRAQ], "YISHAQ YEQAR ARGENTINA": [Makam.RAHAWI], "ADES: 24793": [Makam.IRAQ], "Dibre Shelomo S KASSIN Pre1915": [Makam.IRAQ], "Knis Betesh Geniza List, Aleppo": [Makam.RAHAWI], "ABRAHAM DWECK Pre1920": [Makam.RAHAWI], "IDELSOHN Pre1923": [Makam.IRAQ], "S SAGIR Laniado": [Makam.NAWAH], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.RAHAWI], "ASHEAR list": [Makam.RAHAWI], "ASHEAR NOTES 1936-1940": [Makam.BAYAT], "Argentina 1947 & Ezra Mishanieh": [Makam.RAHAWI], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.IRAQ], "GABRIEL A SHREM 1964 SUHV": [Makam.RAHAWI, Makam.NAWAH], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.BAYAT], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.IRAQ], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.NAHWAND], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.SIGAH], "BOZO, Ades, Shir Ushbaha 2005": [Makam.NAWAH], "Yishaq Yeranen Halabi": [Makam.NAWAH], "MOSHE AMASH (Shami)": [Makam.NAWAH], "EZRA MASLATON TARAB (Shami)": [Makam.BAYAT], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Victor Afya, Istanbul List": [Makam.ISFAHAN, Makam.ACEM_ASHIRAN], "Izak Alaluf, Izmir List": [Makam.SEGAH], "Hallel VeZimrah, Greece List, 1926": [Makam.Q_HOSENI]]
case .SHMINI:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.HOSENI], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.HOSENI], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.HOSENI], "YAAQOB ABADI-PARSIYA": [Makam.HOSENI], "YISHAQ YEQAR ARGENTINA": [Makam.HOSENI], "ADES: 24793": [Makam.HOSENI], "Dibre Shelomo S KASSIN Pre1915": [Makam.HOSENI], "Knis Betesh Geniza List, Aleppo": [Makam.HOSENI], "ABRAHAM DWECK Pre1920": [Makam.HOSENI], "IDELSOHN Pre1923": [Makam.HOSENI], "S SAGIR Laniado": [Makam.HOSENI], "ASHEAR list": [Makam.HOSENI], "ASHEAR NOTES 1936-1940": [Makam.NAHWAND], "Argentina 1947 & Ezra Mishanieh": [Makam.HOSENI], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.HOSENI], "GABRIEL A SHREM 1964 SUHV": [Makam.HOSENI], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.RAST], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.HOSENI], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.HOSENI], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.BAYAT], "BOZO, Ades, Shir Ushbaha 2005": [Makam.HOSENI], "Yishaq Yeranen Halabi": [Makam.HOSENI], "MOSHE AMASH (Shami)": [Makam.SABA], "EZRA MASLATON TARAB (Shami)": [Makam.SABA], "ABRAHAM SHAMRICHA (Shami)": [Makam.SABA], "Victor Afya, Istanbul List": [Makam.HICAZ], "Izak Alaluf, Izmir List": [Makam.HICAZ], "Hallel VeZimrah, Greece List, 1926": [Makam.BAYATI]]
case .TAZRIA:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.BAYAT], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.BAYAT], "TEBELE Pre1888": [Makam.BAYAT], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.BAYAT], "YAAQOB ABADI-PARSIYA": [Makam.BAYAT], "YISHAQ YEQAR ARGENTINA": [Makam.MEHAYAR], "ADES: 24793": [Makam.BAYAT], "Dibre Shelomo S KASSIN Pre1915": [Makam.BAYAT], "Knis Betesh Geniza List, Aleppo": [Makam.BAYAT], "ABRAHAM DWECK Pre1920": [Makam.BAYAT], "IDELSOHN Pre1923": [Makam.BAYAT], "S SAGIR Laniado": [Makam.SIGAH], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.BAYAT], "ASHEAR list": [Makam.SIGAH], "ASHEAR NOTES 1936-1940": [Makam.BAYAT, Makam.SIGAH], "Argentina 1947 & Ezra Mishanieh": [Makam.SIGAH], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.BAYAT, Makam.RAST], "GABRIEL A SHREM 1964 SUHV": [Makam.BAYAT, Makam.SABA], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.BAYAT], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.MEHAYAR], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.SIGAH], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.SABA], "BOZO, Ades, Shir Ushbaha 2005": [Makam.BAYAT, Makam.SABA], "Yishaq Yeranen Halabi": [Makam.SABA], "MOSHE AMASH (Shami)": [Makam.BAYAT], "EZRA MASLATON TARAB (Shami)": [Makam.SIGAH], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Victor Afya, Istanbul List": [Makam.MAHUR], "Izak Alaluf, Izmir List": [Makam.ACEM_ASHIRAN], "Hallel VeZimrah, Greece List, 1926": [Makam.SUZNIQ]]
case .METZORA:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.IRAQ], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.IRAQ], "TEBELE Pre1888": [Makam.IRAQ], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.RAHAWI], "YAAQOB ABADI-PARSIYA": [Makam.NAWAH], "YISHAQ YEQAR ARGENTINA": [Makam.SIGAH], "ADES: 24793": [Makam.IRAQ], "Dibre Shelomo S KASSIN Pre1915": [Makam.IRAQ], "Knis Betesh Geniza List, Aleppo": [Makam.RAHAWI], "ABRAHAM DWECK Pre1920": [Makam.NAHWAND], "IDELSOHN Pre1923": [Makam.IRAQ], "S SAGIR Laniado": [Makam.NAWAH], "ASHEAR NOTES 1936-1940": [Makam.NAHWAND, Makam.SIGAH], "Argentina 1947 & Ezra Mishanieh": [Makam.SIGAH], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.SABA, Makam.SIGAH], "GABRIEL A SHREM 1964 SUHV": [Makam.NAHWAND, Makam.SIGAH], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.SIGAH], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.RAST], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.NAWAH], "BOZO, Ades, Shir Ushbaha 2005": [Makam.SABA, Makam.SIGAH], "Yishaq Yeranen Halabi": [Makam.SABA], "MOSHE AMASH (Shami)": [Makam.RAST], "EZRA MASLATON TARAB (Shami)": [Makam.BAYAT], "Izak Alaluf, Izmir List": [Makam.SEGAH], "Hallel VeZimrah, Greece List, 1926": [Makam.Q_SIGAH]]
case .ACHREI_MOS:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.VAYIKRA).removing("Izak Alaluf, Izmir List").removing("Victor Afya, Istanbul List"), value: [Makam.HIJAZ], normal: ["D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.NAHWAND], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.NAHWAND], "MOSHE AMASH (Shami)": [Makam.SABA], "EZRA MASLATON TARAB (Shami)": [Makam.SABA], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Hallel VeZimrah, Greece List, 1926": [Makam.NAHOFT]])
case .KEDOSHIM:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.SABA], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.SABA], "YAAQOB ABADI-PARSIYA": [Makam.IRAQ, Makam.SABA], "YISHAQ YEQAR ARGENTINA": [Makam.IRAQ], "ADES: 24793": [Makam.SABA], "Dibre Shelomo S KASSIN Pre1915": [Makam.SABA], "Knis Betesh Geniza List, Aleppo": [Makam.SABA], "ABRAHAM DWECK Pre1920": [Makam.SABA], "IDELSOHN Pre1923": [Makam.SABA], "S SAGIR Laniado": [Makam.SABA], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.RAST], "ASHEAR list": [Makam.IRAQ], "ASHEAR NOTES 1936-1940": [Makam.SABA], "Argentina 1947 & Ezra Mishanieh": [Makam.IRAQ], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.SABA], "GABRIEL A SHREM 1964 SUHV": [Makam.SABA], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.RAST], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.SABA], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.SABA], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.BAYAT], "BOZO, Ades, Shir Ushbaha 2005": [Makam.SABA], "Yishaq Yeranen Halabi": [Makam.SABA], "MOSHE AMASH (Shami)": [Makam.AJAM], "EZRA MASLATON TARAB (Shami)": [Makam.SIGAH], "ABRAHAM SHAMRICHA (Shami)": [Makam.SIGAH], "Hallel VeZimrah, Greece List, 1926": [Makam.HIJAZ]]
case .EMOR:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.ASHIRAN], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.ASHIRAN], "TEBELE Pre1888": [Makam.ASHIRAN], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.ASHIRAN, Makam.SABA], "YAAQOB ABADI-PARSIYA": [Makam.ASHIRAN], "YISHAQ YEQAR ARGENTINA": [Makam.ASHIRAN], "ADES: 24793": [Makam.ASHIRAN], "Dibre Shelomo S KASSIN Pre1915": [Makam.ASHIRAN], "Knis Betesh Geniza List, Aleppo": [Makam.ASHIRAN], "ABRAHAM DWECK Pre1920": [Makam.SIGAH], "IDELSOHN Pre1923": [Makam.ASHIRAN], "S SAGIR Laniado": [Makam.ASHIRAN], "ASHEAR list": [Makam.ASHIRAN], "ASHEAR NOTES 1936-1940": [Makam.SIGAH, Makam.HOSENI], "Argentina 1947 & Ezra Mishanieh": [Makam.ASHIRAN], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.SIGAH, Makam.HOSENI], "GABRIEL A SHREM 1964 SUHV": [Makam.SIGAH, Makam.HOSENI], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.SIGAH], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.OJ], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.HOSENI], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.SIGAH], "BOZO, Ades, Shir Ushbaha 2005": [Makam.SIGAH, Makam.HOSENI], "Yishaq Yeranen Halabi": [Makam.SIGAH], "MOSHE AMASH (Shami)": [Makam.RAST], "EZRA MASLATON TARAB (Shami)": [Makam.RAST], "ABRAHAM SHAMRICHA (Shami)": [Makam.RAST], "Hallel VeZimrah, Greece List, 1926": [Makam.BUSALIQ]]
case .BEHAR:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.NAWAH], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.NAWAH], "TEBELE Pre1888": [Makam.NAWAH], "YAAQOB ABADI-PARSIYA": [Makam.NAWAH], "YISHAQ YEQAR ARGENTINA": [Makam.SABA], "ADES: 24793": [Makam.NAWAH], "Dibre Shelomo S KASSIN Pre1915": [Makam.NAWAH], "Knis Betesh Geniza List, Aleppo": [Makam.NAWAH], "ABRAHAM DWECK Pre1920": [Makam.NAWAH], "IDELSOHN Pre1923": [Makam.NAWAH], "S SAGIR Laniado": [Makam.NAWAH], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.SABA], "ASHEAR NOTES 1936-1940": [Makam.NAWAH], "ABRAHAM E SHREM ~1945": [Makam.SABA], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.NAWAH], "GABRIEL A SHREM 1964 SUHV": [Makam.NAWAH, Makam.SABA], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.BAYAT], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.NAHWAND], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.NAWAH], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.NAWAH], "BOZO, Ades, Shir Ushbaha 2005": [Makam.NAWAH, Makam.SABA], "Yishaq Yeranen Halabi": [Makam.NAWAH], "MOSHE AMASH (Shami)": [Makam.SIGAH], "ABRAHAM SHAMRICHA (Shami)": [Makam.AJAM], "Hallel VeZimrah, Greece List, 1926": [Makam.Q_QARGIGAR]]
case .BECHUKOSAI:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.NAWAH], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.NAWAH], "TEBELE Pre1888": [Makam.NAWAH], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.NAWAH], "YAAQOB ABADI-PARSIYA": [Makam.NAWAH], "YISHAQ YEQAR ARGENTINA": [Makam.NAWAH], "ADES: 24793": [Makam.NAWAH], "Dibre Shelomo S KASSIN Pre1915": [Makam.RAHAWI], "Knis Betesh Geniza List, Aleppo": [Makam.BAYAT], "IDELSOHN Pre1923": [Makam.NAWAH, Makam.BAYAT], "S SAGIR Laniado": [Makam.NAHWAND], "ASHEAR list": [Makam.NAWAH], "Argentina 1947 & Ezra Mishanieh": [Makam.NAHWAND], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.BAYAT], "GABRIEL A SHREM 1964 SUHV": [Makam.NAHWAND], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.NAHWAND], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.KURD], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.SABA], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.RAST], "BOZO, Ades, Shir Ushbaha 2005": [Makam.NAWAH, Makam.BAYAT], "Yishaq Yeranen Halabi": [Makam.BAYAT], "MOSHE AMASH (Shami)": [Makam.BAYAT], "EZRA MASLATON TARAB (Shami)": [Makam.AJAM], "Hallel VeZimrah, Greece List, 1926": [Makam.IRAQ]]
case .BAMIDBAR:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.MEHAYAR], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.MEHAYAR], "TEBELE Pre1888": [Makam.MEHAYAR], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.NAWAH], "YAAQOB ABADI-PARSIYA": [Makam.RAST], "YISHAQ YEQAR ARGENTINA": [Makam.RAST], "ADES: 24793": [Makam.MEHAYAR], "Dibre Shelomo S KASSIN Pre1915": [Makam.MEHAYAR, Makam.RAST], "Knis Betesh Geniza List, Aleppo": [Makam.RAST], "IDELSOHN Pre1923": [Makam.MEHAYAR], "S SAGIR Laniado": [Makam.RAST], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.RAST], "ASHEAR list": [Makam.MEHAYAR], "ASHEAR NOTES 1936-1940": [Makam.HOSENI, Makam.RAST], "ABRAHAM E SHREM ~1945": [Makam.RAST], "Argentina 1947 & Ezra Mishanieh": [Makam.MEHAYAR], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.SABA, Makam.RAST], "GABRIEL A SHREM 1964 SUHV": [Makam.RAST], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.RAST], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.RAST], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.RAST], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.BAYAT], "BOZO, Ades, Shir Ushbaha 2005": [Makam.HOSENI, Makam.RAST], "Yishaq Yeranen Halabi": [Makam.BAYAT], "MOSHE AMASH (Shami)": [Makam.RAST, Makam.AJAM], "EZRA MASLATON TARAB (Shami)": [Makam.RAST], "ABRAHAM SHAMRICHA (Shami)": [Makam.RAST]]
case .NASSO:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.BAMIDBAR).removing("M H Elias, SHIR HADASH, Jerusalem, 1930"), value: [Makam.SABA], normal: ["Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.HOSENI, Makam.SABA], "GABRIEL A SHREM 1964 SUHV": [Makam.RAST, Makam.SABA], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.ZANGIRAN], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.HOSENI], "BOZO, Ades, Shir Ushbaha 2005": [Makam.SABA, Makam.RAST], "Yishaq Yeranen Halabi": [Makam.HOSENI, Makam.SABA], "MOSHE AMASH (Shami)": [Makam.SIGAH], "EZRA MASLATON TARAB (Shami)": [Makam.BAYAT], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Hallel VeZimrah, Greece List, 1926": [Makam.HIJAZ]])
case .BEHAALOSCHA:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.HOSENI], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.OJ], "TEBELE Pre1888": [Makam.SIGAH], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.SIGAH, Makam.HOSENI], "YAAQOB ABADI-PARSIYA": [Makam.SIGAH], "YISHAQ YEQAR ARGENTINA": [Makam.SIGAH], "ADES: 24793": [Makam.OJ], "Dibre Shelomo S KASSIN Pre1915": [Makam.HOSENI], "Knis Betesh Geniza List, Aleppo": [Makam.SIGAH], "ABRAHAM DWECK Pre1920": [Makam.SIGAH], "IDELSOHN Pre1923": [Makam.SIGAH], "S SAGIR Laniado": [Makam.SIGAH], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.SIGAH], "ASHEAR list": [Makam.SIGAH], "ASHEAR NOTES 1936-1940": [Makam.SIGAH], "ABRAHAM E SHREM ~1945": [Makam.SIGAH], "Argentina 1947 & Ezra Mishanieh": [Makam.SIGAH], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.SIGAH], "GABRIEL A SHREM 1964 SUHV": [Makam.SIGAH], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.SIGAH], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.SIGAH], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.SIGAH], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.SIGAH], "BOZO, Ades, Shir Ushbaha 2005": [Makam.SIGAH], "Yishaq Yeranen Halabi": [Makam.SIGAH], "MOSHE AMASH (Shami)": [Makam.NAWAH], "EZRA MASLATON TARAB (Shami)": [Makam.RAHAWI], "ABRAHAM SHAMRICHA (Shami)": [Makam.NAWAH]]
case .SHLACH:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.IRAQ], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.IRAQ, Makam.NAWAH], "TEBELE Pre1888": [Makam.IRAQ], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.IRAQ, Makam.NAWAH], "YAAQOB ABADI-PARSIYA": [Makam.NAWAH], "YISHAQ YEQAR ARGENTINA": [Makam.HIJAZ], "ADES: 24793": [Makam.IRAQ, Makam.NAWAH], "Dibre Shelomo S KASSIN Pre1915": [Makam.IRAQ], "Knis Betesh Geniza List, Aleppo": [Makam.IRAQ], "ABRAHAM DWECK Pre1920": [Makam.HIJAZ], "IDELSOHN Pre1923": [Makam.IRAQ], "S SAGIR Laniado": [Makam.NAWAH], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.HIJAZ], "ASHEAR list": [Makam.IRAQ], "ASHEAR NOTES 1936-1940": [Makam.HIJAZ], "ABRAHAM E SHREM ~1945": [Makam.HIJAZ], "Argentina 1947 & Ezra Mishanieh": [Makam.IRAQ], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.IRAQ, Makam.NAWAH], "GABRIEL A SHREM 1964 SUHV": [Makam.HIJAZ], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.NAHWAND], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.SHURI], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.NAWAH], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.NAHWAND], "BOZO, Ades, Shir Ushbaha 2005": [Makam.HIJAZ, Makam.NAHWAND], "Yishaq Yeranen Halabi": [Makam.NAHWAND], "MOSHE AMASH (Shami)": [Makam.SABA], "EZRA MASLATON TARAB (Shami)": [Makam.SABA], "ABRAHAM SHAMRICHA (Shami)": [Makam.SABA], "Hallel VeZimrah, Greece List, 1926": [Makam.HUZAM]]
case .KORACH:
["R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.HOSENI], "TEBELE Pre1888": [Makam.HOSENI], "YAAQOB ABADI-PARSIYA": [Makam.HOSENI], "YISHAQ YEQAR ARGENTINA": [Makam.HOSENI], "ADES: 24793": [Makam.HOSENI], "Dibre Shelomo S KASSIN Pre1915": [Makam.HOSENI], "IDELSOHN Pre1923": [Makam.HOSENI], "S SAGIR Laniado": [Makam.HOSENI], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.HOSENI], "ASHEAR list": [Makam.HOSENI], "ASHEAR NOTES 1936-1940": [Makam.BAYAT], "ABRAHAM E SHREM ~1945": [Makam.NAHWAND], "Argentina 1947 & Ezra Mishanieh": [Makam.HOSENI], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.HOSENI], "GABRIEL A SHREM 1964 SUHV": [Makam.NAHWAND], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.BAYAT], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.HOSENI], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.NAHWAND], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.BAYAT], "BOZO, Ades, Shir Ushbaha 2005": [Makam.NAHWAND, Makam.HOSENI], "Yishaq Yeranen Halabi": [Makam.HOSENI], "MOSHE AMASH (Shami)": [Makam.BAYAT], "EZRA MASLATON TARAB (Shami)": [Makam.SIGAH], "ABRAHAM SHAMRICHA (Shami)": [Makam.SIGAH], "Hallel VeZimrah, Greece List, 1926": [Makam.IRAQ]]
case .CHUKAS:
["R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.HOSENI], "TEBELE Pre1888": [Makam.HOSENI], "YAAQOB ABADI-PARSIYA": [Makam.BAYAT], "ADES: 24793": [Makam.HOSENI], "Dibre Shelomo S KASSIN Pre1915": [Makam.RAST], "IDELSOHN Pre1923": [Makam.RAST], "S SAGIR Laniado": [Makam.MAHOUR], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.ASHIRAN], "ASHEAR NOTES 1936-1940": [Makam.BAYAT], "ABRAHAM E SHREM ~1945": [Makam.HOSENI], "Argentina 1947 & Ezra Mishanieh": [Makam.HOSENI], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.RAST], "GABRIEL A SHREM 1964 SUHV": [Makam.HOSENI], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.AJAM], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.RAST], "BOZO, Ades, Shir Ushbaha 2005": [Makam.RAST, Makam.HOSENI], "Yishaq Yeranen Halabi": [Makam.RAST], "MOSHE AMASH (Shami)": [Makam.AJAM], "EZRA MASLATON TARAB (Shami)": [Makam.BAYAT], "ABRAHAM SHAMRICHA (Shami)": [Makam.AJAM], "Hallel VeZimrah, Greece List, 1926": [Makam.SUZNIQ]]
case .BALAK:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.BAYAT], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.BAYAT], "TEBELE Pre1888": [Makam.BAYAT], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.BAYAT], "YISHAQ YEQAR ARGENTINA": [Makam.RAST], "ADES: 24793": [Makam.BAYAT], "Dibre Shelomo S KASSIN Pre1915": [Makam.BAYAT], "Knis Betesh Geniza List, Aleppo": [Makam.BAYAT], "ABRAHAM DWECK Pre1920": [Makam.BAYAT], "IDELSOHN Pre1923": [Makam.BAYAT], "S SAGIR Laniado": [Makam.BAYAT], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.RAST], "ASHEAR list": [Makam.NAHWAND], "ASHEAR NOTES 1936-1940": [Makam.NAHWAND], "ABRAHAM E SHREM ~1945": [Makam.MAHOUR], "Argentina 1947 & Ezra Mishanieh": [Makam.NAHWAND], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.BAYAT], "GABRIEL A SHREM 1964 SUHV": [Makam.MAHOUR], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.BAYAT], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.BAYAT], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.RAST], "BOZO, Ades, Shir Ushbaha 2005": [Makam.BAYAT, Makam.MAHOUR], "Yishaq Yeranen Halabi": [Makam.BAYAT], "MOSHE AMASH (Shami)": [Makam.SIGAH], "EZRA MASLATON TARAB (Shami)": [Makam.BAYAT], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Hallel VeZimrah, Greece List, 1926": [Makam.SIGAH]]
case .PINCHAS:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.BAMIDBAR), value: [Makam.SABA], normal: ["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.BAYAT], "ASHEAR NOTES 1936-1940": [Makam.SABA, Makam.BAYAT], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.BUSTANIGAR], "Hallel VeZimrah, Greece List, 1926": [Makam.MUHAYER]])
case .MATOS:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.NAWAH], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.NAWAH], "TEBELE Pre1888": [Makam.NAWAH], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.NAWAH], "YAAQOB ABADI-PARSIYA": [Makam.NAWAH], "YISHAQ YEQAR ARGENTINA": [Makam.BAYAT], "ADES: 24793": [Makam.NAWAH], "Dibre Shelomo S KASSIN Pre1915": [Makam.NAWAH], "Knis Betesh Geniza List, Aleppo": [Makam.NAWAH], "ABRAHAM DWECK Pre1920": [Makam.NAWAH], "IDELSOHN Pre1923": [Makam.NAWAH], "S SAGIR Laniado": [Makam.NAWAH, Makam.NAHWAND], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.RAHAWI], "ASHEAR list": [Makam.NAWAH], "ASHEAR NOTES 1936-1940": [Makam.BAYAT], "ABRAHAM E SHREM ~1945": [Makam.NAHWAND], "Argentina 1947 & Ezra Mishanieh": [Makam.NAHWAND], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.NAWAH], "GABRIEL A SHREM 1964 SUHV": [Makam.RAHAWI, Makam.NAHWAND], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.SABA], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.NAHWAND], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.SABA], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.NAWAH], "BOZO, Ades, Shir Ushbaha 2005": [Makam.NAWAH, Makam.NAHWAND], "Yishaq Yeranen Halabi": [Makam.NAWAH], "MOSHE AMASH (Shami)": [Makam.RAST], "EZRA MASLATON TARAB (Shami)": [Makam.MAHOUR], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Hallel VeZimrah, Greece List, 1926": [Makam.SABA]]
case .MASEI:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.SABA], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.SABA], "TEBELE Pre1888": [Makam.SABA], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.SABA], "YAAQOB ABADI-PARSIYA": [Makam.NAHWAND], "YISHAQ YEQAR ARGENTINA": [Makam.NAHWAND], "ADES: 24793": [Makam.SABA], "Dibre Shelomo S KASSIN Pre1915": [Makam.MEHAYAR], "Knis Betesh Geniza List, Aleppo": [Makam.SABA], "IDELSOHN Pre1923": [Makam.SABA], "S SAGIR Laniado": [Makam.NAWAH, Makam.NAHWAND], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.SABA], "ASHEAR list": [Makam.SABA], "ASHEAR NOTES 1936-1940": [Makam.NAWAH], "ABRAHAM E SHREM ~1945": [Makam.SABA], "Argentina 1947 & Ezra Mishanieh": [Makam.SABA], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.SABA], "GABRIEL A SHREM 1964 SUHV": [Makam.SABA], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.NAHWAND], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.SABA, Makam.ISFAHAN], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.NAHWAND], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.NAHWAND], "BOZO, Ades, Shir Ushbaha 2005": [Makam.BAYAT, Makam.SABA], "Yishaq Yeranen Halabi": [Makam.SABA], "MOSHE AMASH (Shami)": [Makam.BAYAT], "EZRA MASLATON TARAB (Shami)": [Makam.BAYAT], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Hallel VeZimrah, Greece List, 1926": [Makam.NAHWAND]]
case .DEVARIM:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.DEVARIM), value: [Makam.HIJAZ], normal: ["YOSEF YEHEZKEL Jerusalem 1975": [Makam.ZANGIRAN], "Hallel VeZimrah, Greece List, 1926": [Makam.AJAM]])
case .VAESCHANAN:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.DEVARIM), value: [Makam.HOSENI], normal: ["ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.HOSENI, Makam.ASHIRAN], "Knis Betesh Geniza List, Aleppo": [Makam.ASHIRAN], "ABRAHAM DWECK Pre1920": [Makam.ASHIRAN], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.BAYAT], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.BAYAT], "MOSHE AMASH (Shami)": [Makam.RAST], "EZRA MASLATON TARAB (Shami)": [Makam.RAST], "ABRAHAM SHAMRICHA (Shami)": [Makam.RAST], "Hallel VeZimrah, Greece List, 1926": [Makam.RAST]])
case .EIKEV:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.DEVARIM), value: [Makam.SIGAH], normal: ["YISHAQ YEQAR ARGENTINA": [Makam.RAST], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.RAST], "ASHEAR NOTES 1936-1940": [Makam.SIGAH, Makam.IRAQ], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.RAST], "BOZO, Ades, Shir Ushbaha 2005": [Makam.SIGAH, Makam.IRAQ], "Hallel VeZimrah, Greece List, 1926": [Makam.QARGIGAR]])
case .REEH:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.IRAQ], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.IRAQ, Makam.RAST], "TEBELE Pre1888": [Makam.ASHIRAN], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.IRAQ], "YAAQOB ABADI-PARSIYA": [Makam.RAST], "YISHAQ YEQAR ARGENTINA": [Makam.ASHIRAN], "ADES: 24793": [Makam.IRAQ], "Dibre Shelomo S KASSIN Pre1915": [Makam.IRAQ], "Knis Betesh Geniza List, Aleppo": [Makam.SABA], "ABRAHAM DWECK Pre1920": [Makam.SABA], "IDELSOHN Pre1923": [Makam.IRAQ], "S SAGIR Laniado": [Makam.NAHWAND], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.NAWAH], "ASHEAR list": [Makam.ASHIRAN], "ASHEAR NOTES 1936-1940": [Makam.BAYAT], "ABRAHAM E SHREM ~1945": [Makam.BAYAT], "Argentina 1947 & Ezra Mishanieh": [Makam.ASHIRAN], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.SIGAH, Makam.RAST], "GABRIEL A SHREM 1964 SUHV": [Makam.RAST], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.RAST], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.RAST], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.RAST], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.BAYAT], "BOZO, Ades, Shir Ushbaha 2005": [Makam.RAST], "Yishaq Yeranen Halabi": [Makam.RAST], "MOSHE AMASH (Shami)": [Makam.BAYAT], "EZRA MASLATON TARAB (Shami)": [Makam.NAWAH], "ABRAHAM SHAMRICHA (Shami)": [Makam.NAWAH], "Hallel VeZimrah, Greece List, 1926": [Makam.Q_HOSENI]]
case .SHOFTIM:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.SABA], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.SABA, Makam.SIGAH], "TEBELE Pre1888": [Makam.SABA], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.SIGAH, Makam.SABA], "YAAQOB ABADI-PARSIYA": [Makam.SABA], "YISHAQ YEQAR ARGENTINA": [Makam.AJAM], "ADES: 24793": [Makam.SABA, Makam.SIGAH], "Dibre Shelomo S KASSIN Pre1915": [Makam.SASGAR], "Knis Betesh Geniza List, Aleppo": [Makam.AJAM], "ABRAHAM DWECK Pre1920": [Makam.AJAM], "IDELSOHN Pre1923": [Makam.SIGAH], "S SAGIR Laniado": [Makam.AJAM], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.AJAM], "ASHEAR list": [Makam.SABA], "ASHEAR NOTES 1936-1940": [Makam.AJAM], "ABRAHAM E SHREM ~1945": [Makam.AJAM], "Argentina 1947 & Ezra Mishanieh": [Makam.SABA], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.SABA], "GABRIEL A SHREM 1964 SUHV": [Makam.AJAM], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.AJAM], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.GIRKA], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.SABA, Makam.AJAM], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.AJAM], "BOZO, Ades, Shir Ushbaha 2005": [Makam.SIGAH, Makam.AJAM], "Yishaq Yeranen Halabi": [Makam.AJAM], "MOSHE AMASH (Shami)": [Makam.AJAM], "EZRA MASLATON TARAB (Shami)": [Makam.AJAM], "ABRAHAM SHAMRICHA (Shami)": [Makam.AJAM], "Hallel VeZimrah, Greece List, 1926": [Makam.HIJAZ]]
case .KI_SEITZEI:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.SABA], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.SABA, Makam.RAST], "TEBELE Pre1888": [Makam.SABA], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.RAST, Makam.IRAQ, Makam.NAWAH], "YAAQOB ABADI-PARSIYA": [Makam.RAST], "YISHAQ YEQAR ARGENTINA": [Makam.SABA], "ADES: 24793": [Makam.SABA, Makam.RAST], "Dibre Shelomo S KASSIN Pre1915": [Makam.SABA], "Knis Betesh Geniza List, Aleppo": [Makam.RAST], "ABRAHAM DWECK Pre1920": [Makam.NAHWAND], "IDELSOHN Pre1923": [Makam.SABA], "S SAGIR Laniado": [Makam.RAST], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.SABA], "ASHEAR list": [Makam.NAWAH], "ASHEAR NOTES 1936-1940": [Makam.SABA, Makam.SIGAH], "ABRAHAM E SHREM ~1945": [Makam.SABA], "Argentina 1947 & Ezra Mishanieh": [Makam.NAHWAND], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.RAST], "GABRIEL A SHREM 1964 SUHV": [Makam.SABA], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.SABA], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.BAYAT, Makam.AJAM], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.RAST], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.SABA], "BOZO, Ades, Shir Ushbaha 2005": [Makam.SABA], "Yishaq Yeranen Halabi": [Makam.SABA], "MOSHE AMASH (Shami)": [Makam.SIGAH], "EZRA MASLATON TARAB (Shami)": [Makam.SIGAH], "ABRAHAM SHAMRICHA (Shami)": [Makam.SIGAH], "Hallel VeZimrah, Greece List, 1926": [Makam.BAYATI]]
case .KI_SAVO:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.IRAQ], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.IRAQ], "TEBELE Pre1888": [Makam.IRAQ], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.IRAQ], "YAAQOB ABADI-PARSIYA": [Makam.IRAQ], "YISHAQ YEQAR ARGENTINA": [Makam.NAWAH], "ADES: 24793": [Makam.IRAQ], "Dibre Shelomo S KASSIN Pre1915": [Makam.IRAQ], "Knis Betesh Geniza List, Aleppo": [Makam.IRAQ], "ABRAHAM DWECK Pre1920": [Makam.RAST], "IDELSOHN Pre1923": [Makam.IRAQ], "S SAGIR Laniado": [Makam.SIGAH], "ASHEAR list": [Makam.IRAQ], "ASHEAR NOTES 1936-1940": [Makam.NAWAH, Makam.SABA, Makam.SIGAH], "ABRAHAM E SHREM ~1945": [Makam.SIGAH], "Argentina 1947 & Ezra Mishanieh": [Makam.IRAQ], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.SIGAH], "GABRIEL A SHREM 1964 SUHV": [Makam.SIGAH], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.SIGAH], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.OJ], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.HIJAZ], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.SIGAH], "BOZO, Ades, Shir Ushbaha 2005": [Makam.SIGAH, Makam.IRAQ], "Yishaq Yeranen Halabi": [Makam.SIGAH], "MOSHE AMASH (Shami)": [Makam.SABA], "EZRA MASLATON TARAB (Shami)": [Makam.SABA], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Hallel VeZimrah, Greece List, 1926": [Makam.Q_SIGAH]]
case .NITZAVIM:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.NAWAH], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.NAWAH], "TEBELE Pre1888": [Makam.NAWAH], "ELIE SHAUL COHEN FROM AINTAB, ~1880": [Makam.NAWAH], "YAAQOB ABADI-PARSIYA": [Makam.NAWAH], "YISHAQ YEQAR ARGENTINA": [Makam.RAST], "ADES: 24793": [Makam.NAWAH], "Dibre Shelomo S KASSIN Pre1915": [Makam.NAWAH], "Knis Betesh Geniza List, Aleppo": [Makam.NAWAH], "ABRAHAM DWECK Pre1920": [Makam.HIJAZ], "IDELSOHN Pre1923": [Makam.NAWAH], "S SAGIR Laniado": [Makam.NAWAH], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.RAST], "ASHEAR list": [Makam.NAWAH], "ABRAHAM E SHREM ~1945": [Makam.NAHWAND], "Argentina 1947 & Ezra Mishanieh": [Makam.NAHWAND], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.NAWAH], "GABRIEL A SHREM 1964 SUHV": [Makam.NAHWAND], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.RAST], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.RAST], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.NAHWAND], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.BAYAT], "BOZO, Ades, Shir Ushbaha 2005": [Makam.NAWAH, Makam.NAHWAND], "Yishaq Yeranen Halabi": [Makam.NAWAH], "MOSHE AMASH (Shami)": [Makam.AJAM], "EZRA MASLATON TARAB (Shami)": [Makam.BAYAT], "ABRAHAM SHAMRICHA (Shami)": [Makam.SIGAH], "Hallel VeZimrah, Greece List, 1926": [Makam.SABA]]
case .VAYEILECH:
["TABBUSH Ms NLI 8*7622, Aleppo": [Makam.NAWAH], "R COHEN \"SHIR USHBAHA\" Jerusalem, 1905": [Makam.NAWAH], "YAAQOB ABADI-PARSIYA": [Makam.RAST], "YISHAQ YEQAR ARGENTINA": [Makam.HIJAZ], "ADES: 24793": [Makam.NAWAH], "Dibre Shelomo S KASSIN Pre1915": [Makam.NAWAH], "S SAGIR Laniado": [Makam.NAWAH], "M H Elias, SHIR HADASH, Jerusalem, 1930": [Makam.HOSENI], "ASHEAR NOTES 1936-1940": [Makam.HOSENI], "ABRAHAM E SHREM ~1945": [Makam.BAYAT, Makam.HOSENI], "Argentina 1947 & Ezra Mishanieh": [Makam.AJAM], "Shire Zimra H S ABOUD Jerusalem, 1950": [Makam.RAST], "GABRIEL A SHREM 1964 SUHV": [Makam.HOSENI], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.BAYAT], "Ish Massliah \"Abia Renanot\" Tunisians": [Makam.RAST], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.BAYAT], "BOZO, Ades, Shir Ushbaha 2005": [Makam.RAST, Makam.HOSENI], "Yishaq Yeranen Halabi": [Makam.RAST], "MOSHE AMASH (Shami)": [Makam.BAYAT], "ABRAHAM SHAMRICHA (Shami)": [Makam.AJAM], "Hallel VeZimrah, Greece List, 1926": [Makam.HOSENI]]
case .HAAZINU:
generateUniformMap(keys: getAllBooks(allBooks: AllBooks.DEVARIM).removing("M H Elias, SHIR HADASH, Jerusalem, 1930").removing("ASHEAR NOTES 1936-1940"), value: [Makam.HOSENI], normal: ["S SAGIR Laniado": [Makam.BAYAT], "ABRAHAM E SHREM ~1945": [Makam.BAYAT], "GABRIEL A SHREM 1964 SUHV": [Makam.MEHAYAR], "D KASSIN/ ISAAC CAIN; RODFE SEDEQ; MEXICO": [Makam.BAYAT], "YOSEF YEHEZKEL Jerusalem 1975": [Makam.SHURI], "Shaare Zimra YANANI Buenos Aires, 01": [Makam.BAYAT], "BOZO, Ades, Shir Ushbaha 2005": [Makam.HOSENI, Makam.MEHAYAR], "MOSHE AMASH (Shami)": [Makam.AJAM], "EZRA MASLATON TARAB (Shami)": [Makam.AJAM], "ABRAHAM SHAMRICHA (Shami)": [Makam.BAYAT], "Hallel VeZimrah, Greece List, 1926": [Makam.NAHWAND]])
default:
[:]
}
var currentData = data;
switch jCal.getParshah() {
case .VAYAKHEL_PEKUDEI:
currentData["GABRIEL A SHREM 1964 SUHV"] = [Makam.BAYAT]
case .TAZRIA_METZORA:
currentData["GABRIEL A SHREM 1964 SUHV"] = [Makam.SABA]
case .ACHREI_MOS_KEDOSHIM:
currentData["GABRIEL A SHREM 1964 SUHV"] = [Makam.BAYAT, Makam.HIJAZ]
case .BEHAR_BECHUKOSAI:
currentData["GABRIEL A SHREM 1964 SUHV"] = [Makam.SABA]
case .CHUKAS_BALAK:
currentData["GABRIEL A SHREM 1964 SUHV"] = [Makam.HOSENI]
case .MATOS_MASEI:
currentData["GABRIEL A SHREM 1964 SUHV"] = [Makam.SABA]
case .NITZAVIM_VAYEILECH:
currentData["GABRIEL A SHREM 1964 SUHV"] = [Makam.HOSENI]
default: break
// unused
}
if jCal.getJewishMonth() == JewishCalendar.TISHREI && jCal.getJewishDayOfMonth() > 10 && jCal.getParshah() == .HAAZINU {
currentData["ASHEAR NOTES 1936-1940"] = [Makam.HOSENI]
}
if jCal.getDayOfWeek() == 7 {
var shavuotInUpcoming = false
let restoreDate = jCal.workingDate
for i in 1...7 {
jCal.forward()
if jCal.isShavuos() {
shavuotInUpcoming = true
break
}
}
jCal.workingDate = restoreDate
if shavuotInUpcoming {
currentData["GABRIEL A SHREM 1964 SUHV"] = [Makam.HOSENI]
}
return currentData
}
if jCal.getDayOfChanukah() != -1 {
return switch jCal.getDayOfChanukah() {
case 1:
["SASSOON #647 Aleppo, 1850": [Makam.RAHAWI], "GABRIEL A SHREM 1964 SUHV": [Makam.RAHAWI], "ABRAHAM SHAMRICHA (Shami)": [Makam.NAWAH]]
case 2:
["SASSOON #647 Aleppo, 1850": [Makam.IRAQ], "GABRIEL A SHREM 1964 SUHV": [Makam.IRAQ]]
case 3:
["SASSOON #647 Aleppo, 1850": [Makam.SIGAH], "GABRIEL A SHREM 1964 SUHV": [Makam.SIGAH]]
case 4:
["SASSOON #647 Aleppo, 1850": [Makam.SABA], "GABRIEL A SHREM 1964 SUHV": [Makam.SABA]]
case 5:
["SASSOON #647 Aleppo, 1850": [Makam.RAST], "GABRIEL A SHREM 1964 SUHV": [Makam.RAST]]
case 6:
["GABRIEL A SHREM 1964 SUHV": [Makam.NAHWAND]]
case 7:
["GABRIEL A SHREM 1964 SUHV": [Makam.SIGAH]]
case 8:
["GABRIEL A SHREM 1964 SUHV": [Makam.BAYAT]]
default:
[:]
}
}
return [:]
}
}
//
// ZmanimView.swift
// Rabbi Ovadiah Yosef Calendar
//
// Created by Elyahu Jacobi on 2/10/25.
//
import SwiftUI
import KosherSwift
import WatchConnectivity
import SunCalc
import CoreLocation
import ActivityKit
import Combine
import SwiftUIScrollOffset
import SwiftyJSON
struct ZmanimView: View {
@State var locationName: String = ""
@State var lat: Double = 0
@State var long: Double = 0
@State var elevation: Double = 0.0
@State var timezone: TimeZone = TimeZone.current
@State var shabbatMode: Bool = false
@State var useElevation: Bool = false
@State var userChosenDate: Date = GlobalStruct.userChosenDate
@State var lastTimeUserWasInApp: Date = Date()
@State var nextUpcomingZman: Date? = nil
@State private var zmanimCalendar: ComplexZmanimCalendar = ComplexZmanimCalendar()
@State var jewishCalendar: JewishCalendar = JewishCalendar()
let defaults = UserDefaults(suiteName: "group.com.elyjacobi.Rabbi-Ovadiah-Yosef-Calendar") ?? UserDefaults.standard
@State private var zmanimList: [ZmanListEntry] = []
let dateFormatterForZmanim = DateFormatter()
let dateFormatterForRT = DateFormatter()
@State var timer = Timer.publish(every: 0.001, on: .main, in: .common).autoconnect()
@State var timerForShabbatMode: Publishers.Autoconnect<Timer.TimerPublisher> = .init(upstream: .init(interval: .greatestFiniteMagnitude, runLoop: .current, mode: .default))
@State var scrollViewOffset = CGFloat(1000)
@State var timerForNextZman: Timer?
var shouldAddMisheyakirZman = false
@State var askedToUpdateTablesAlready = false
@StateObject private var sessionManager = WCSessionManager.shared
@State var simpleList = false
@State var showSetup = false
@State var didLocationUpdate = false // DO NOT DELETE
@State var datePickerIsVisible = false
@State var hebrewDatePickerIsVisible = false
@State var scrollToTop = false
@State var scrollDirection = 1
@ScrollOffsetProxy(.bottom, id: "Scroller") private var scrollOffsetProxy
@State var showZmanAlert = false
@State var showLocationInfoAlert = false
@State var selectedZman: ZmanListEntry = ZmanListEntry(title: "")
@State var showLocationServicesDisabledAlert = false
@State var showInIsraelAlert = false
@State var showOutOfIsraelAlert = false
@State var showTablesNeedToBeUpdatedAlert = false
@State var showChaitablesErrorAlert = false
@State var showAppUpdateAlert = false
@State var appStoreURL: String? = nil
@State var showShareSheet = false
@State var nextView = NextView.none
@State var showNextView = false
@State var isBannerHidden = false
@State var isFirstTimeForShabbatBanner = true
init() {
dateFormatterForZmanim.dateFormat = (Locale.isHebrewLocale() ? "H" : "h") + ":mm" + (defaults.bool(forKey: "showSeconds") ? ":ss" : "")
dateFormatterForRT.dateFormat = (Locale.isHebrewLocale() ? "H" : "h") + ":mm" + (defaults.bool(forKey: "roundUpRT") ? "" : ":ss")
dateFormatterForZmanim.timeZone = timezone
dateFormatterForRT.timeZone = timezone
}
func startShabbatMode() {
userChosenDate = Date()
syncCalendarDates()
updateZmanimList()
isBannerHidden = false
scheduleTimer()//to update zmanim at 12AM
}
func endShabbatMode() {
updateZmanimList()
scrollViewOffset = CGFloat(1000)
}
func scheduleTimer() {
let calendar = Calendar.current
let currentDate = Date()
var dateComponents = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: currentDate)
dateComponents.day! += 1
dateComponents.hour = 0
dateComponents.minute = 0
dateComponents.second = 2
let targetDate = calendar.date(from: dateComponents)!
let timeInterval = calendar.dateComponents([.second], from: currentDate, to: targetDate).second!
timerForShabbatMode = Timer.publish(every: TimeInterval(timeInterval), on: .main, in: .common).autoconnect()
}
func formatDate(using calendar: Calendar = Calendar.current, format: String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = format
dateFormatter.locale = Locale.current
dateFormatter.calendar = calendar
return dateFormatter.string(from: GlobalStruct.userChosenDate)
}
func getFastStartTime() -> String {
let zmanimNames = ZmanimTimeNames(mIsZmanimInHebrew: defaults.bool(forKey: "isZmanimInHebrew"), mIsZmanimEnglishTranslated: defaults.bool(forKey: "isZmanimEnglishTranslated"))
let useAHZmanim = defaults.bool(forKey: "LuachAmudeiHoraah")
if jewishCalendar.isTaanis()
&& !jewishCalendar.isTishaBav()
&& !jewishCalendar.isYomKippur() {
return zmanimNames.getTaanitString() + zmanimNames.getStartsString() + ": " + dateFormatterForZmanim.string(from:((useAHZmanim ? zmanimCalendar.getAlosAmudeiHoraah() : zmanimCalendar.getAlos72Zmanis()) ?? Date()))
} else if jewishCalendar.tomorrow().isTaanis() && jewishCalendar.tomorrow().isTishaBav() {
return zmanimNames.getTaanitString() + zmanimNames.getStartsString() + ": " + dateFormatterForZmanim.string(from:( zmanimCalendar.getElevationAdjustedSunset() ?? Date()))
} else {
if jewishCalendar.tomorrow().isTaanis() && !jewishCalendar.tomorrow().isTishaBav() {
zmanimCalendar.workingDate = zmanimCalendar.workingDate.addingTimeInterval(86400)
let tomorrowAlot = dateFormatterForZmanim.string(from:((useAHZmanim ? zmanimCalendar.getAlosAmudeiHoraah() : zmanimCalendar.getAlos72Zmanis()) ?? Date()))
zmanimCalendar.workingDate = zmanimCalendar.workingDate.addingTimeInterval(-86400)
return zmanimNames.getTaanitString() + zmanimNames.getStartsString() + ": " + tomorrowAlot
} else {
zmanimCalendar.workingDate = zmanimCalendar.workingDate.addingTimeInterval(-86400)
let yesterdaySunset = dateFormatterForZmanim.string(from:(zmanimCalendar.getElevationAdjustedSunset() ?? Date()))
zmanimCalendar.workingDate = zmanimCalendar.workingDate.addingTimeInterval(86400)
return zmanimNames.getTaanitString() + zmanimNames.getStartsString() + ": " + yesterdaySunset
}
}
}
func getFastEndTime() -> String {
let zmanimNames = ZmanimTimeNames(mIsZmanimInHebrew: defaults.bool(forKey: "isZmanimInHebrew"), mIsZmanimEnglishTranslated: defaults.bool(forKey: "isZmanimEnglishTranslated"))
let useAHZmanim = defaults.bool(forKey: "LuachAmudeiHoraah")
if jewishCalendar.isTaanis()
&& jewishCalendar.getYomTovIndex() != JewishCalendar.YOM_KIPPUR {
return zmanimNames.getTzaitString() + zmanimNames.getTaanitString() + zmanimNames.getEndsString() + ": " + dateFormatterForZmanim.string(from: (useAHZmanim ? zmanimCalendar.getTzaisAmudeiHoraahLChumra() : zmanimCalendar.getTzaisAteretTorah(minutes: 20)) ?? Date())
} else {// This method was called the day before
zmanimCalendar.workingDate = zmanimCalendar.workingDate.addingTimeInterval(86400)
let fastEnds = dateFormatterForZmanim.string(from: (useAHZmanim ? zmanimCalendar.getTzaisAmudeiHoraahLChumra() ?? Date() : zmanimCalendar.getTzaisAteretTorah(minutes: 20) ?? Date()))
zmanimCalendar.workingDate = zmanimCalendar.workingDate.addingTimeInterval(-86400)
return zmanimNames.getTaanitString() + zmanimNames.getEndsString() + ": " + fastEnds
}
}
func getShabbatStartEndsAsString() -> String {
let zmanimNames = ZmanimTimeNames(mIsZmanimInHebrew: defaults.bool(forKey: "isZmanimInHebrew"), mIsZmanimEnglishTranslated: defaults.bool(forKey: "isZmanimEnglishTranslated"))
let useAHZmanim = defaults.bool(forKey: "LuachAmudeiHoraah")
let backup = jewishCalendar.workingDate
while jewishCalendar.isAssurBemelacha() {
jewishCalendar.back()// go back until the start of shabbat/yom tov
}
zmanimCalendar.workingDate = jewishCalendar.workingDate
let startTime = dateFormatterForZmanim.string(from: zmanimCalendar.getCandleLighting() ?? Date())
while jewishCalendar.tomorrow().isAssurBemelacha() {
jewishCalendar.forward()
}
zmanimCalendar.workingDate = jewishCalendar.workingDate
zmanimCalendar.ateretTorahSunsetOffset = defaults.bool(forKey: "inIsrael") ? 30 : 40
if defaults.object(forKey: "shabbatOffset") != nil {
zmanimCalendar.ateretTorahSunsetOffset = Double(defaults.integer(forKey: "shabbatOffset"))
}
var endShabbat: Date?
if !defaults.bool(forKey: "overrideAHEndShabbatTime") {// default zman
endShabbat = (useAHZmanim ? zmanimCalendar.getTzaisShabbosAmudeiHoraah() : zmanimCalendar.getTzaisAteretTorah())
} else {// if user wants to override
if defaults.integer(forKey: "endOfShabbatOpinion") == 1 || defaults.object(forKey: "endOfShabbatOpinion") == nil {
endShabbat = zmanimCalendar.getTzaisAteretTorah()
} else if defaults.integer(forKey: "endOfShabbatOpinion") == 2 {
endShabbat = zmanimCalendar.getTzaisShabbosAmudeiHoraah()
} else {
endShabbat = zmanimCalendar.getTzaisShabbosAmudeiHoraahLesserThan40()
}
}
let endTime = dateFormatterForZmanim.string(from: endShabbat ?? Date())
let result = getShabbatAndOrChag() + zmanimNames.getStartsString() + ": " + startTime + " - " + zmanimNames.getEndsString() + ": " + endTime
jewishCalendar.workingDate = backup
return result
}
func getShabbatAndOrChag() -> String {
if (defaults.bool(forKey: "isZmanimInHebrew")) {
if jewishCalendar.isYomTovAssurBemelacha() && jewishCalendar.getDayOfWeek() == 7 {
return "\u{05E9}\u{05D1}\u{05EA}/\u{05D7}\u{05D2}"
} else if jewishCalendar.getDayOfWeek() == 7 {
return "\u{05E9}\u{05D1}\u{05EA}"
} else {
return "\u{05D7}\u{05D2}"
}
} else {
if jewishCalendar.isYomTovAssurBemelacha() && jewishCalendar.getDayOfWeek() == 7 {
return "Shabbat/Chag";
} else if jewishCalendar.getDayOfWeek() == 7 {
return "Shabbat";
} else {
return "Chag";
}
}
}
func getMoonRiseSet(isRise: Bool) -> String {
do {
var cal = Calendar.current
cal.timeZone = timezone
let moonTimes = try MoonTimes.compute()
.on(cal.startOfDay(for: userChosenDate))
.at(lat, long)
.timezone(timezone)
.limit(TimeInterval.ofDays(1))
.execute()
if (moonTimes.alwaysUp) {
return "The moon is up all night".localized()
} else if (moonTimes.alwaysDown) {
return "There is no moon tonight".localized()
} else {
let dateFormatterForMoonTimes = DateFormatter()
dateFormatterForMoonTimes.dateFormat = Locale.isHebrewLocale() ? "H:mm" : "h:mm aa"
var moonRiseSet = ""
if (isRise && moonTimes.rise != nil) {
moonRiseSet += "Moonrise: ".localized() + dateFormatterForMoonTimes.string(from: Date(timeIntervalSince1970: moonTimes.rise!.timeIntervalSince1970))
}
if (!isRise && moonTimes.set != nil) {
moonRiseSet += "Moonset: ".localized() + dateFormatterForMoonTimes.string(from: Date(timeIntervalSince1970: moonTimes.set!.timeIntervalSince1970))
}
if (!moonRiseSet.isEmpty) {
return moonRiseSet
}
}
} catch {
print(error)
}
return ""
}
func updateZmanimList(add66Misheyakir: Bool = false) {
zmanimList = []
if !simpleList {
zmanimList = ZmanimFactory.addZmanim(list: zmanimList, defaults: defaults, zmanimCalendar: zmanimCalendar, jewishCalendar: jewishCalendar, add66Misheyakir: add66Misheyakir)
return
}
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "d MMMM, yyyy"
dateFormatter.timeZone = timezone
zmanimList.append(ZmanListEntry(title: locationName))
var date = dateFormatter.string(from: userChosenDate)
let hDateFormatter = DateFormatter()
hDateFormatter.calendar = Calendar(identifier: .hebrew)
hDateFormatter.dateFormat = "d MMMM, yyyy"
var hebrewDate = hDateFormatter.string(from: userChosenDate)
.replacingOccurrences(of: "Heshvan", with: "Cheshvan")
.replacingOccurrences(of: "Tamuz", with: "Tammuz")
var postSunsetHDate = hDateFormatter.string(from: userChosenDate.addingTimeInterval(86400))
.replacingOccurrences(of: "Heshvan", with: "Cheshvan")
.replacingOccurrences(of: "Tamuz", with: "Tammuz")
if Locale.isHebrewLocale() {
let hebrewDateFormatter = HebrewDateFormatter()
hebrewDateFormatter.hebrewFormat = true
hebrewDate = hebrewDateFormatter.format(jewishCalendar: jewishCalendar)
postSunsetHDate = hebrewDateFormatter.format(jewishCalendar: jewishCalendar.tomorrow())
}
if Calendar.current.isDateInToday(userChosenDate) {
date = "Today - ".localized() + date + "\n"
if Date().timeIntervalSince1970 > zmanimCalendar.getSunset()?.timeIntervalSince1970 ?? TimeInterval.infinity {
date += "Post-sunset date:".localized() + " " + postSunsetHDate
} else {
date += "Pre-sunset date:".localized() + " " + hebrewDate
}
} else {
date += " " + hebrewDate
}
zmanimList.append(ZmanListEntry(title:date))
//forward jewish calendar to saturday
while jewishCalendar.getDayOfWeek() != 7 {
jewishCalendar.forward()
}
let hebrewDateFormatter = HebrewDateFormatter()
hebrewDateFormatter.hebrewFormat = true
//now that we are on saturday, check the parasha
let specialParasha = hebrewDateFormatter.formatSpecialParsha(jewishCalendar: jewishCalendar)
var parasha = hebrewDateFormatter.formatParsha(parsha: jewishCalendar.getParshah())
if !specialParasha.isEmpty {
parasha += " / " + specialParasha
}
if !parasha.isEmpty {
zmanimList.append(ZmanListEntry(title:parasha))
} else {
zmanimList.append(ZmanListEntry(title:"No Weekly Parasha".localized()))
}
let haftorah = WeeklyHaftarahReading.getThisWeeksHaftarah(jewishCalendar: jewishCalendar)
.replacingOccurrences(of: "מפטירין", with: Locale.isHebrewLocale() ? "מפטירין" : "Haftarah: \u{202B}")
if !haftorah.isEmpty {
zmanimList.append(ZmanListEntry(title: haftorah))
}
let makam = MakamJCal.getMakamData(jCal: <#T##JewishCalendar#>)
if let path = Bundle.main.path(forResource: "makam", ofType: "json") {
do {
let data = try Data(contentsOf: URL(fileURLWithPath: path))
let jsonArray = try JSON(data: data).arrayValue.map { $0.stringValue }
if let makamList = makam["GABRIEL A SHREM 1964 SUHV"], !makamList.isEmpty {
var makamStr = "Makam "
for makamInd in makamList {
if let index = Makam.allCases.firstIndex(of: makamInd), index < jsonArray.count {
makamStr += jsonArray[index] + " "
} else {
// Fallback if index not found or out of bounds
makamStr += "\(makamInd) "
}
}
zmanimList.append(ZmanListEntry(title: makamStr.trimmingCharacters(in: .whitespaces)))
}
} catch {
print("Error reading makam.json: \(error)")
}
}
syncCalendarDates()//reset
if defaults.bool(forKey: "showShabbatMevarchim") {
if (jewishCalendar.isShabbosMevorchim()) {
zmanimList.append(ZmanListEntry(title: "שבת מברכים"))
}
}
dateFormatter.dateFormat = "EEEE"
hebrewDateFormatter.setLongWeekFormat(longWeekFormat: true)
if Locale.isHebrewLocale() {
zmanimList.append(ZmanListEntry(title:dateFormatter.string(from: zmanimCalendar.workingDate)))
} else {
zmanimList.append(ZmanListEntry(title:dateFormatter.string(from: zmanimCalendar.workingDate) + " / " + "יום " + hebrewDateFormatter.formatDayOfWeek(jewishCalendar: jewishCalendar)))
}
hebrewDateFormatter.hebrewFormat = false
let specialDay = jewishCalendar.getSpecialDay(addOmer:false)
if !specialDay.isEmpty {
zmanimList.append(ZmanListEntry(title:specialDay))
}
let omerDay = jewishCalendar.addDayOfOmer(result: Array())
if omerDay.count == 1 && !omerDay[0].isEmpty {
zmanimList.append(ZmanListEntry(title:omerDay[0]))
}
if jewishCalendar.is3Weeks() {
if jewishCalendar.is9Days() {
if jewishCalendar.isShevuahShechalBo() {
zmanimList.append(ZmanListEntry(title: "Shevuah Shechal Bo".localized()))
} else {
zmanimList.append(ZmanListEntry(title: "Nine Days".localized()))
}
} else {
zmanimList.append(ZmanListEntry(title: "Three Weeks".localized()))
}
}
if jewishCalendar.isRoshHashana() && jewishCalendar.isShmitaYear() {
zmanimList.append(ZmanListEntry(title: "This year is a Shemita year".localized()))
}
let music = jewishCalendar.isOKToListenToMusic()
if !music.isEmpty {
zmanimList.append(ZmanListEntry(title: music))
}
let hallel = jewishCalendar.getHallelOrChatziHallel()
if !hallel.isEmpty {
zmanimList.append(ZmanListEntry(title: hallel))
}
let ulChaparatPesha = jewishCalendar.getIsUlChaparatPeshaSaid()
if !ulChaparatPesha.isEmpty {
zmanimList.append(ZmanListEntry(title: ulChaparatPesha))
}
zmanimList.append(ZmanListEntry(title:jewishCalendar.getTachanun()))
if (jewishCalendar.isPurimMeshulash()) {
zmanimList.append(ZmanListEntry(title: "No Tachanun in Yerushalayim or a Safek Mukaf Choma".localized()))
}
let bircatHelevana = jewishCalendar.getBirchatLevanaStatus()
if !bircatHelevana.isEmpty {
zmanimList.append(ZmanListEntry(title: bircatHelevana))
do {
var cal = Calendar.current
cal.timeZone = timezone
let moonTimes = try MoonTimes.compute()
.on(cal.startOfDay(for: userChosenDate))
.at(lat, long)
.timezone(timezone)
.limit(TimeInterval.ofDays(1))
.execute()
if (moonTimes.alwaysUp) {
zmanimList.append(ZmanListEntry(title: "The moon is up all night".localized()))
} else if (moonTimes.alwaysDown) {
zmanimList.append(ZmanListEntry(title: "There is no moon tonight".localized()))
} else {
let dateFormatterForMoonTimes = DateFormatter()
if (Locale.isHebrewLocale()) {
dateFormatterForMoonTimes.dateFormat = "H:mm"
} else {
dateFormatterForMoonTimes.dateFormat = "h:mm aa"
}
var moonRiseSet = ""
if (moonTimes.rise != nil) {
moonRiseSet += "Moonrise: ".localized() + dateFormatterForMoonTimes.string(from: Date(timeIntervalSince1970: moonTimes.rise!.timeIntervalSince1970))
}
if (moonTimes.set != nil) {
if (!moonRiseSet.isEmpty) {
moonRiseSet += " - ";
}
moonRiseSet += "Moonset: ".localized() + dateFormatterForMoonTimes.string(from: Date(timeIntervalSince1970: moonTimes.set!.timeIntervalSince1970))
}
if (!moonRiseSet.isEmpty) {
zmanimList.append(ZmanListEntry(title: moonRiseSet));
}
}
} catch {
print(error)
}
}
if jewishCalendar.isBirkasHachamah() {
zmanimList.append(ZmanListEntry(title: "Birchat Ha'Ḥamah is said today".localized()))
}
if (jewishCalendar.tomorrow().getDayOfWeek() == 7
&& jewishCalendar.tomorrow().getYomTovIndex() == JewishCalendar.EREV_PESACH) {
zmanimList.append(ZmanListEntry(title: "Burn your Ḥametz today".localized()))
}
if Locale.isHebrewLocale() {
dateFormatter.dateFormat = "H:mm"
} else {
dateFormatter.dateFormat = "h:mm aa"
}
dateFormatter.timeZone = timezone
let tekufaSetting = defaults.integer(forKey: "tekufaOpinion")
if (tekufaSetting == 0 && !defaults.bool(forKey: "LuachAmudeiHoraah")) || tekufaSetting == 1 { // 0 is default
let tekufa = jewishCalendar.getTekufaAsDate()
if tekufa != nil {
if Calendar.current.isDate(tekufa!, inSameDayAs: userChosenDate) {
zmanimList.append(ZmanListEntry(title: "Tekufa ".localized() + jewishCalendar.getTekufaName().localized() + " is today at ".localized() + dateFormatter.string(from: tekufa!)))
addTekufaLength(tekufa, dateFormatter)
}
}
jewishCalendar.forward()
let checkTomorrowForTekufa = jewishCalendar.getTekufaAsDate()
if checkTomorrowForTekufa != nil {
if Calendar.current.isDate(checkTomorrowForTekufa!, inSameDayAs: userChosenDate) {
zmanimList.append(ZmanListEntry(title: "Tekufa ".localized() + jewishCalendar.getTekufaName().localized() + " is today at ".localized() + dateFormatter.string(from: checkTomorrowForTekufa!)))
addTekufaLength(checkTomorrowForTekufa, dateFormatter)
}
}
jewishCalendar.workingDate = userChosenDate //reset
} else if tekufaSetting == 2 || (tekufaSetting == 0 && defaults.bool(forKey: "LuachAmudeiHoraah")) {
let tekufa = jewishCalendar.getTekufaAsDate(shouldMinus21Minutes: true)
if tekufa != nil {
if Calendar.current.isDate(tekufa!, inSameDayAs: userChosenDate) {
zmanimList.append(ZmanListEntry(title: "Tekufa ".localized() + jewishCalendar.getTekufaName().localized() + " is today at ".localized() + dateFormatter.string(from: tekufa!)))
addTekufaLength(tekufa, dateFormatter)
}
}
jewishCalendar.forward()
let checkTomorrowForTekufa = jewishCalendar.getTekufaAsDate(shouldMinus21Minutes: true)
if checkTomorrowForTekufa != nil {
if Calendar.current.isDate(checkTomorrowForTekufa!, inSameDayAs: userChosenDate) {
zmanimList.append(ZmanListEntry(title: "Tekufa ".localized() + jewishCalendar.getTekufaName().localized() + " is today at ".localized() + dateFormatter.string(from: checkTomorrowForTekufa!)))
addTekufaLength(checkTomorrowForTekufa, dateFormatter)
}
}
jewishCalendar.workingDate = userChosenDate //reset
} else {
let tekufa = jewishCalendar.getTekufaAsDate()
if tekufa != nil {
if Calendar.current.isDate(tekufa!, inSameDayAs: userChosenDate) {
zmanimList.append(ZmanListEntry(title: "Tekufa ".localized() + jewishCalendar.getTekufaName().localized() + " is today at ".localized() + dateFormatter.string(from: tekufa!)))
}
}
jewishCalendar.forward()
let checkTomorrowForTekufa = jewishCalendar.getTekufaAsDate()
if checkTomorrowForTekufa != nil {
if Calendar.current.isDate(checkTomorrowForTekufa!, inSameDayAs: userChosenDate) {
zmanimList.append(ZmanListEntry(title: "Tekufa ".localized() + jewishCalendar.getTekufaName().localized() + " is today at ".localized() + dateFormatter.string(from: checkTomorrowForTekufa!)))
}
}
jewishCalendar.workingDate = userChosenDate //reset
let tekufaAH = jewishCalendar.getTekufaAsDate(shouldMinus21Minutes: true)
if tekufaAH != nil {
if Calendar.current.isDate(tekufaAH!, inSameDayAs: userChosenDate) {
zmanimList.append(ZmanListEntry(title: "Tekufa ".localized() + jewishCalendar.getTekufaName().localized() + " is today at ".localized() + dateFormatter.string(from: tekufaAH!)))
}
}
jewishCalendar.forward()
let checkTomorrowForAHTekufa = jewishCalendar.getTekufaAsDate(shouldMinus21Minutes: true)
if checkTomorrowForAHTekufa != nil {
if Calendar.current.isDate(checkTomorrowForAHTekufa!, inSameDayAs: userChosenDate) {
zmanimList.append(ZmanListEntry(title: "Tekufa ".localized() + jewishCalendar.getTekufaName().localized() + " is today at ".localized() + dateFormatter.string(from: checkTomorrowForAHTekufa!)))
}
}
var earlierTekufa = tekufaAH
if earlierTekufa == nil {
earlierTekufa = checkTomorrowForAHTekufa
}
var laterTekufa = tekufa
if laterTekufa == nil {
laterTekufa = checkTomorrowForTekufa
}
if earlierTekufa != nil && laterTekufa != nil && Calendar.current.isDate(earlierTekufa!, inSameDayAs: userChosenDate) {
let halfHourBefore = earlierTekufa!.addingTimeInterval(-1800)
let halfHourAfter = laterTekufa!.addingTimeInterval(1800)
if Locale.isHebrewLocale() {
zmanimList.append(ZmanListEntry(title: "Tekufa Length: ".localized()
.appending(dateFormatter.string(from: halfHourAfter))
.appending(" - ")
.appending(dateFormatter.string(from: halfHourBefore))))
} else {
zmanimList.append(ZmanListEntry(title: "Tekufa Length: ".localized()
.appending(dateFormatter.string(from: halfHourBefore))
.appending(" - ")
.appending(dateFormatter.string(from: halfHourAfter))))
}
}
jewishCalendar.workingDate = userChosenDate //reset
}
zmanimList = ZmanimFactory.addZmanim(list: zmanimList, defaults: defaults, zmanimCalendar: zmanimCalendar, jewishCalendar: jewishCalendar, add66Misheyakir: add66Misheyakir)
zmanimList.append(ZmanListEntry(title:jewishCalendar.getIsMashivHaruchOrMoridHatalSaid() + " / " + jewishCalendar.getIsBarcheinuOrBarechAleinuSaid()))
let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute, .second]
formatter.unitsStyle = .abbreviated
// TODO replace with only colons
zmanimList.append(ZmanListEntry(title:"Shaah Zmanit GR\"A: ".localized() + (formatter.string(from: TimeInterval(zmanimCalendar.getShaahZmanisGra() / 1000)) ?? "XX:XX")))
if defaults.bool(forKey: "LuachAmudeiHoraah") {
zmanimList.append(ZmanListEntry(title:"Shaah Zemanit MG\"A (A\"H): ".localized() + (formatter.string(from: TimeInterval(zmanimCalendar.getTemporalHour(startOfDay: zmanimCalendar.getAlosAmudeiHoraah(), endOfDay: zmanimCalendar.getTzais72ZmanisAmudeiHoraah()) / 1000)) ?? "XX:XX")))
} else {
zmanimList.append(ZmanListEntry(title:"Shaah Zemanit MG\"A (O\"H): ".localized() + (formatter.string(from: TimeInterval(zmanimCalendar.getShaahZmanis72MinutesZmanis() / 1000)) ?? "XX:XX")))
}
if defaults.bool(forKey: "showShmita") {
switch (jewishCalendar.getYearOfShmitaCycle()) {
case 1:
zmanimList.append(ZmanListEntry(title: "First year of Shemita".localized()))
break;
case 2:
zmanimList.append(ZmanListEntry(title: "Second year of Shemita".localized()))
break;
case 3:
zmanimList.append(ZmanListEntry(title: "Third year of Shemita".localized()))
break;
case 4:
zmanimList.append(ZmanListEntry(title: "Fourth year of Shemita".localized()))
break;
case 5:
zmanimList.append(ZmanListEntry(title: "Fifth year of Shemita".localized()))
break;
case 6:
zmanimList.append(ZmanListEntry(title: "Sixth year of Shemita".localized()))
break;
default:
zmanimList.append(ZmanListEntry(title: "This year is a Shemita Year".localized()))
break;
}
}
dateFormatterForZmanim.timeZone = timezone
dateFormatterForRT.timeZone = timezone
}
func addTekufaLength(_ tekufa: Date?, _ dateFormatter: DateFormatter) {
let halfHourBefore = tekufa!.addingTimeInterval(-1800)
let halfHourAfter = tekufa!.addingTimeInterval(1800)
if Locale.isHebrewLocale() {
zmanimList.append(ZmanListEntry(title: "Tekufa Length: ".localized()
.appending(dateFormatter.string(from: halfHourAfter))
.appending(" - ")
.appending(dateFormatter.string(from: halfHourBefore))))
} else {
zmanimList.append(ZmanListEntry(title: "Tekufa Length: ".localized()
.appending(dateFormatter.string(from: halfHourBefore))
.appending(" - ")
.appending(dateFormatter.string(from: halfHourAfter))))
}
}
func doesTekufaOccurToday() -> Bool {
let tekufaSetting = defaults.integer(forKey: "tekufaOpinion")
if (tekufaSetting == 0 && !defaults.bool(forKey: "LuachAmudeiHoraah")) || tekufaSetting == 1 { // 0 is default
let tekufa = jewishCalendar.getTekufaAsDate()
if tekufa != nil {
if Calendar.current.isDate(tekufa!, inSameDayAs: userChosenDate) {
return true
}
}
jewishCalendar.forward()
let checkTomorrowForTekufa = jewishCalendar.getTekufaAsDate()
if checkTomorrowForTekufa != nil {
if Calendar.current.isDate(checkTomorrowForTekufa!, inSameDayAs: userChosenDate) {
return true
}
}
jewishCalendar.workingDate = userChosenDate //reset
} else if tekufaSetting == 2 || (tekufaSetting == 0 && defaults.bool(forKey: "LuachAmudeiHoraah")) {
let tekufa = jewishCalendar.getTekufaAsDate(shouldMinus21Minutes: true)
if tekufa != nil {
if Calendar.current.isDate(tekufa!, inSameDayAs: userChosenDate) {
return true
}
}
jewishCalendar.forward()
let checkTomorrowForTekufa = jewishCalendar.getTekufaAsDate(shouldMinus21Minutes: true)
if checkTomorrowForTekufa != nil {
if Calendar.current.isDate(checkTomorrowForTekufa!, inSameDayAs: userChosenDate) {
return true
}
}
jewishCalendar.workingDate = userChosenDate //reset
} else {
let tekufa = jewishCalendar.getTekufaAsDate()
if tekufa != nil {
if Calendar.current.isDate(tekufa!, inSameDayAs: userChosenDate) {
return true
}
}
jewishCalendar.forward()
let checkTomorrowForTekufa = jewishCalendar.getTekufaAsDate()
if checkTomorrowForTekufa != nil {
if Calendar.current.isDate(checkTomorrowForTekufa!, inSameDayAs: userChosenDate) {
return true
}
}
jewishCalendar.workingDate = userChosenDate //reset
let tekufaAH = jewishCalendar.getTekufaAsDate(shouldMinus21Minutes: true)
if tekufaAH != nil {
if Calendar.current.isDate(tekufaAH!, inSameDayAs: userChosenDate) {
return true
}
}
jewishCalendar.forward()
let checkTomorrowForAHTekufa = jewishCalendar.getTekufaAsDate(shouldMinus21Minutes: true)
if checkTomorrowForAHTekufa != nil {
if Calendar.current.isDate(checkTomorrowForAHTekufa!, inSameDayAs: userChosenDate) {
return true
}
}
jewishCalendar.workingDate = userChosenDate //reset
}
return false
}
func recreateZmanimCalendar() {
zmanimCalendar = ComplexZmanimCalendar(location: GeoLocation(locationName: locationName, latitude: lat, longitude: long, elevation: elevation, timeZone: timezone.corrected()))
zmanimCalendar.useElevation = GlobalStruct.useElevation
zmanimCalendar.useAstronomicalChatzos = false
GlobalStruct.geoLocation = zmanimCalendar.geoLocation
}
func setNextUpcomingZman() {
var theZman: Date? = nil
var zmanim = Array<ZmanListEntry>()
var today = Date()
today = today.advanced(by: -86400)//yesterday
jewishCalendar.workingDate = today
zmanimCalendar.workingDate = today
zmanim = ZmanimFactory.addZmanim(list: zmanim, defaults: defaults, zmanimCalendar: zmanimCalendar, jewishCalendar: jewishCalendar, add66Misheyakir: false)
today = today.advanced(by: 86400)//today
jewishCalendar.workingDate = today
zmanimCalendar.workingDate = today
zmanim = ZmanimFactory.addZmanim(list: zmanim, defaults: defaults, zmanimCalendar: zmanimCalendar, jewishCalendar: jewishCalendar, add66Misheyakir: false)
today = today.advanced(by: 86400)//tomorrow
jewishCalendar.workingDate = today
zmanimCalendar.workingDate = today
zmanim = ZmanimFactory.addZmanim(list: zmanim, defaults: defaults, zmanimCalendar: zmanimCalendar, jewishCalendar: jewishCalendar, add66Misheyakir: false)
zmanimCalendar.workingDate = userChosenDate//reset
jewishCalendar.workingDate = userChosenDate//reset
for entry in zmanim {
let zman = entry.zman
if zman != nil {
if zman! > Date() && (theZman == nil || zman! < theZman!) {
theZman = zman
}
}
}
nextUpcomingZman = theZman
}
func createBackgroundThreadForNextUpcomingZman() {
setNextUpcomingZman()
updateZmanimList()
let calendar = Calendar.current
let timeInterval = calendar.dateComponents([.second], from: Date(), to: nextUpcomingZman!).second!
timerForNextZman = Timer.scheduledTimer(withTimeInterval: TimeInterval(timeInterval + 1), repeats: false) { _ in
createBackgroundThreadForNextUpcomingZman()
}
}
func syncCalendarDates() {//with userChosenDate
zmanimCalendar.workingDate = userChosenDate
jewishCalendar.workingDate = userChosenDate
GlobalStruct.jewishCalendar.workingDate = userChosenDate
GlobalStruct.userChosenDate = userChosenDate
}
func setNotificationsDefaults() {
defaults.set(false, forKey: "showDayOfOmer")
defaults.set(true, forKey: "roundUpRT")
defaults.set(false, forKey: "zmanim_notifications")
defaults.set(false, forKey: "zmanim_notifications_on_shabbat")
defaults.set(true, forKey: "omerNotifications")
defaults.set(false, forKey: "NotifyAlot Hashachar")
defaults.set(false, forKey: "NotifyTalit And Tefilin")
defaults.set(false, forKey: "NotifySunrise")
defaults.set(true, forKey: "NotifySof Zman Shma MGA")
defaults.set(true, forKey: "NotifySof Zman Shma GRA")
defaults.set(true, forKey: "NotifySof Zman Tefila")
defaults.set(true, forKey: "NotifyAchilat Chametz")
defaults.set(true, forKey: "NotifyBiur Chametz")
defaults.set(false, forKey: "NotifyChatzot")
defaults.set(false, forKey: "NotifyMincha Gedolah")
defaults.set(false, forKey: "NotifyMincha Ketana")
defaults.set(false, forKey: "NotifyPlag HaMincha Yalkut Yosef")
defaults.set(false, forKey: "NotifyPlag HaMincha Halacha Berurah")
defaults.set(true, forKey: "NotifyCandle Lighting")
defaults.set(true, forKey: "NotifySunset")
defaults.set(true, forKey: "NotifyTzeit Hacochavim")
defaults.set(true, forKey: "NotifyTzeit Hacochavim (Stringent)")
defaults.set(true, forKey: "NotifyFast Ends")
defaults.set(false, forKey: "NotifyShabbat Ends")
defaults.set(false, forKey: "NotifyRabbeinu Tam")
defaults.set(false, forKey: "NotifyChatzot Layla")
defaults.set(-1, forKey: "Alot Hashachar")
defaults.set(-1, forKey: "Talit And Tefilin")
defaults.set(-1, forKey: "Sunrise")
defaults.set(15, forKey: "Sof Zman Shma MGA")
defaults.set(15, forKey: "Sof Zman Shma GRA")
defaults.set(15, forKey: "Sof Zman Tefila")
defaults.set(15, forKey: "Achilat Chametz")
defaults.set(15, forKey: "Biur Chametz")
defaults.set(20, forKey: "Chatzot")
defaults.set(-1, forKey: "Mincha Gedolah")
defaults.set(-1, forKey: "Mincha Ketana")
defaults.set(-1, forKey: "Plag HaMincha Yalkut Yosef")
defaults.set(-1, forKey: "Plag HaMincha Halacha Berurah")
defaults.set(15, forKey: "Candle Lighting")
defaults.set(15, forKey: "Sunset")
defaults.set(15, forKey: "Tzeit Hacochavim")
defaults.set(15, forKey: "Tzeit Hacochavim (Stringent)")
defaults.set(15, forKey: "Fast Ends")
defaults.set(-1, forKey: "Shabbat Ends")
defaults.set(0, forKey: "Rabbeinu Tam")
defaults.set(-1, forKey: "Chatzot Layla")
}
func getUserLocation() {
let concurrentQueue = DispatchQueue(label: "mainApp", attributes: .concurrent)
LocationManager.shared.getUserLocation {//4.4 fixed the location issue
location in concurrentQueue.async { [self] in
if location != nil {
lat = location!.coordinate.latitude
long = location!.coordinate.longitude
timezone = TimeZone.current.corrected()
recreateZmanimCalendar()
defaults.set(timezone.identifier, forKey: "timezone")
defaults.set(false, forKey: "useZipcode")
defaults.set(false, forKey: "useAdvanced")
LocationManager.shared.resolveLocationName(with: location!) { [self] locationName in
self.locationName = locationName ?? ""
resolveElevation()
recreateZmanimCalendar()
jewishCalendar = JewishCalendar(workingDate: Date(), timezone: timezone, inIsrael: defaults.bool(forKey: "inIsrael"), useModernHolidays: true)
GlobalStruct.jewishCalendar = jewishCalendar
setNextUpcomingZman()
updateZmanimList()
didLocationUpdate = true
NotificationManager.instance.requestAuthorization()
NotificationManager.instance.initializeLocationObjectsAndSetNotifications()
sessionManager.sendMessage(self.getSettingsDictionary())
}
} else {
print("location is nil")
}
}
}
}
func getSettingsDictionary() -> [String : Any] {
return ["useElevation" : defaults.bool(forKey: "useElevation"),
"showSeconds" : defaults.bool(forKey: "showSeconds"),
"inIsrael" : defaults.bool(forKey: "inIsrael"),
"tekufaOpinion" : defaults.integer(forKey: "tekufaOpinion"),
"LuachAmudeiHoraah" : defaults.bool(forKey: "LuachAmudeiHoraah"),
"isZmanimInHebrew" : defaults.bool(forKey: "isZmanimInHebrew"),
"isZmanimEnglishTranslated" : defaults.bool(forKey: "isZmanimEnglishTranslated"),
"visibleSunriseTable\(locationName)\(jewishCalendar.getJewishYear())" : defaults.string(forKey: "visibleSunriseTable\(locationName)\(jewishCalendar.getJewishYear())") ?? "",
"alwaysShowMishorSunrise" : defaults.bool(forKey: "alwaysShowMishorSunrise"),
"showPreferredMisheyakirZman" : defaults.bool(forKey: "showPreferredMisheyakirZman"),
"plagOpinion" : defaults.integer(forKey: "plagOpinion"),
"candleLightingOffset" : defaults.integer(forKey: "candleLightingOffset"),
"showWhenShabbatChagEnds" : defaults.bool(forKey: "showWhenShabbatChagEnds"),
"showRegularWhenShabbatChagEnds" : defaults.bool(forKey: "showRegularWhenShabbatChagEnds"),
"shabbatOffset" : defaults.integer(forKey: "shabbatOffset"),
"endOfShabbatOpinion" : defaults.integer(forKey: "endOfShabbatOpinion"),
"showRTWhenShabbatChagEnds" : defaults.bool(forKey: "showRTWhenShabbatChagEnds"),
"overrideAHEndShabbatTime" : defaults.bool(forKey: "overrideAHEndShabbatTime"),
"showTzeitLChumra" : defaults.bool(forKey: "showTzeitLChumra"),
"alwaysShowRT" : defaults.bool(forKey: "alwaysShowRT"),
"useZipcode" : defaults.string(forKey: "useZipcode") ?? "",
"locationName" : defaults.string(forKey: "locationName") ?? "",
"lat" : defaults.double(forKey: "lat"),
"long" : defaults.double(forKey: "long"),
"elevation" + locationName : defaults.double(forKey: "elevation" + locationName),
"setElevationToLastKnownLocation" : defaults.bool(forKey: "setElevationToLastKnownLocation"),
"lastKnownLocation" : defaults.string(forKey: "lastKnownLocation") ?? "",
"timezone" : defaults.string(forKey: "timezone") ?? "",
"useAdvanced" : defaults.bool(forKey: "useAdvanced"),
"advancedLN" : defaults.string(forKey: "advancedLN") ?? "",
"advancedLat" : defaults.double(forKey: "advancedLat"),
"advancedLong" : defaults.double(forKey: "advancedLong"),
"advancedTimezone" : defaults.string(forKey: "advancedTimezone") ?? "",
"useLocation1" : defaults.bool(forKey: "useLocation1"),
"useLocation2" : defaults.bool(forKey: "useLocation2"),
"useLocation3" : defaults.bool(forKey: "useLocation3"),
"useLocation4" : defaults.bool(forKey: "useLocation4"),
"useLocation5" : defaults.bool(forKey: "useLocation5"),
"location1" : defaults.string(forKey: "location1") ?? "",
"location1Lat" : defaults.double(forKey: "location1Lat"),
"location1Long" : defaults.double(forKey: "location1Long"),
"location1Timezone" : defaults.string(forKey: "location1Timezone") ?? "",
"location2" : defaults.string(forKey: "location2") ?? "",
"location2Lat" : defaults.double(forKey: "location2Lat"),
"location2Long" : defaults.double(forKey: "location2Long"),
"location2Timezone" : defaults.string(forKey: "location2Timezone") ?? "",
"location3" : defaults.string(forKey: "location3") ?? "",
"location3Lat" : defaults.double(forKey: "location3Lat"),
"location3Long" : defaults.double(forKey: "location3Long"),
"location3Timezone" : defaults.string(forKey: "location3Timezone") ?? "",
"location4" : defaults.string(forKey: "location4") ?? "",
"location4Lat" : defaults.double(forKey: "location4Lat"),
"location4Long" : defaults.double(forKey: "location4Long"),
"location4Timezone" : defaults.string(forKey: "location4Timezone") ?? "",
"location5" : defaults.string(forKey: "location5") ?? "",
"location5Lat" : defaults.double(forKey: "location5Lat"),
"location5Long" : defaults.double(forKey: "location5Long"),
"location5Timezone" : defaults.string(forKey: "location5Timezone") ?? "",
]
}
func resolveElevation() {
if self.defaults.object(forKey: "elevation" + self.locationName) != nil {//if we have been here before, use the elevation saved for this location
if self.defaults.bool(forKey: "useElevation") {
self.elevation = self.defaults.double(forKey: "elevation" + self.locationName)
} else {
self.elevation = 0
}
} else {//we have never been here before, get the elevation from online
if self.defaults.bool(forKey: "useElevation") {
self.getElevationFromOnline()
} else {
self.elevation = 0//undo any previous values
}
}
if locationName.isEmpty {
locationName = "Lat: " + String(lat) + " Long: " + String(long)
if defaults.bool(forKey: "setElevationToLastKnownLocation") {
self.elevation = self.defaults.double(forKey: "elevation" + (defaults.string(forKey: "lastKnownLocation") ?? ""))
}
}
}
func getElevationFromOnline() {
var intArray: [Int] = []
var e1:Int = 0
var e2:Int = 0
var e3:Int = 0
let group = DispatchGroup()
group.enter()
let geocoder = LSGeoLookup(withUserID: "Elyahu41")
geocoder.findElevationGtopo30(latitude: lat, longitude: long) {
elevation in
if let elevation = elevation {
e1 = Int(truncating: elevation)
}
group.leave()
}
group.enter()
geocoder.findElevationSRTM3(latitude: lat, longitude: long) {
elevation in
if let elevation = elevation {
e2 = Int(truncating: elevation)
}
group.leave()
}
group.enter()
geocoder.findElevationAstergdem(latitude: lat, longitude: long) {
elevation in
if let elevation = elevation {
e3 = Int(truncating: elevation)
}
group.leave()
}
group.notify(queue: .main) {
if e1 > 0 {
intArray.append(e1)
} else {
e1 = 0
}
if e2 > 0 {
intArray.append(e2)
} else {
e2 = 0
}
if e3 > 0 {
intArray.append(e3)
} else {
e3 = 0
}
var count = Double(intArray.count)
if count == 0 {
count = 1 //edge case
}
let text = String(Double(e1 + e2 + e3) / Double(count))
self.elevation = Double(text) ?? 0
self.defaults.set(self.elevation, forKey: "elevation" + self.locationName)
self.recreateZmanimCalendar()
self.jewishCalendar = JewishCalendar(workingDate: Date(), timezone: self.timezone, inIsrael: self.defaults.bool(forKey: "inIsrael"), useModernHolidays: true)
self.setNextUpcomingZman()
self.updateZmanimList()
}
}
func refreshTable() {
if defaults.bool(forKey: "useAdvanced") {
setLocation(defaultsLN: "advancedLN", defaultsLat: "advancedLat", defaultsLong: "advancedLong", defaultsTimezone: "advancedTimezone")
} else if defaults.bool(forKey: "useLocation1") {
setLocation(defaultsLN: "location1", defaultsLat: "location1Lat", defaultsLong: "location1Long", defaultsTimezone: "location1Timezone")
} else if defaults.bool(forKey: "useLocation2") {
setLocation(defaultsLN: "location2", defaultsLat: "location2Lat", defaultsLong: "location2Long", defaultsTimezone: "location2Timezone")
} else if defaults.bool(forKey: "useLocation3") {
setLocation(defaultsLN: "location3", defaultsLat: "location3Lat", defaultsLong: "location3Long", defaultsTimezone: "location3Timezone")
} else if defaults.bool(forKey: "useLocation4") {
setLocation(defaultsLN: "location4", defaultsLat: "location4Lat", defaultsLong: "location4Long", defaultsTimezone: "location4Timezone")
} else if defaults.bool(forKey: "useLocation5") {
setLocation(defaultsLN: "location5", defaultsLat: "location5Lat", defaultsLong: "location5Long", defaultsTimezone: "location5Timezone")
} else if defaults.bool(forKey: "useZipcode") {
setLocation(defaultsLN: "locationName", defaultsLat: "lat", defaultsLong: "long", defaultsTimezone: "timezone")
} else {
if defaults.bool(forKey: "isSetup") {
getUserLocation()
}
}
userChosenDate = Date()
syncCalendarDates()
updateZmanimList()
}
func setLocation(defaultsLN:String, defaultsLat:String, defaultsLong:String, defaultsTimezone:String) {
locationName = defaults.string(forKey: defaultsLN) ?? ""
lat = defaults.double(forKey: defaultsLat)
long = defaults.double(forKey: defaultsLong)
resolveElevation()
timezone = TimeZone(identifier: defaults.string(forKey: defaultsTimezone) ?? TimeZone.current.identifier) ?? TimeZone.current
recreateZmanimCalendar()
jewishCalendar = JewishCalendar(workingDate: Date(), timezone: timezone, inIsrael: defaults.bool(forKey: "inIsrael"), useModernHolidays: true)
GlobalStruct.jewishCalendar = jewishCalendar
setNextUpcomingZman()
updateZmanimList()
NotificationManager.instance.requestAuthorization()
NotificationManager.instance.initializeLocationObjectsAndSetNotifications()
}
func syncOldDefaults() {
let oldDefaults = UserDefaults.standard
if oldDefaults.bool(forKey: "hasBeenSynced") {
return
}
if oldDefaults.object(forKey: "isSetup") != nil {
for (key, value) in oldDefaults.dictionaryRepresentation() {
defaults.set(value, forKey: key)
}
}
oldDefaults.setValue(true, forKey: "hasBeenSynced")
}
func getShabbatBannerText(isFirstTime:Bool) -> String {
if isFirstTime {
jewishCalendar.forward()
}
let isShabbat = jewishCalendar.getDayOfWeek() == 7
var bannerText = ""
switch jewishCalendar.getYomTovIndex() {
case JewishCalendar.PESACH:
bannerText += "PESACH".localized()
if isShabbat {
bannerText += "/SHABBAT".localized()
}
bannerText += " MODE".localized() + " "
case JewishCalendar.SHAVUOS:
bannerText += "SHAVUOT".localized()
if isShabbat {
bannerText += "/SHABBAT".localized()
}
bannerText += " MODE".localized() + " "
case JewishCalendar.SUCCOS:
bannerText += "SUCCOT"
if isShabbat {
bannerText += "/SHABBAT".localized()
}
bannerText += " MODE".localized() + " "
case JewishCalendar.SHEMINI_ATZERES:
bannerText += "SHEMINI ATZERET".localized()
if isShabbat {
bannerText += "/SHABBAT".localized()
}
bannerText += " MODE".localized() + " "
case JewishCalendar.SIMCHAS_TORAH:
bannerText += "SIMCHAT TORAH".localized()
if isShabbat {
bannerText += "/SHABBAT".localized()
}
bannerText += " MODE".localized() + " "
case JewishCalendar.ROSH_HASHANA:
bannerText += "ROSH HASHANA".localized()
if isShabbat {
bannerText += "/SHABBAT".localized()
}
bannerText += " MODE".localized() + " "
case JewishCalendar.YOM_KIPPUR:
bannerText += "YOM KIPPUR".localized()
if isShabbat {
bannerText += "/SHABBAT".localized()
}
bannerText += " MODE".localized() + " "
default:
bannerText = "SHABBAT MODE SHABBAT MODE SHABBAT MODE SHABBAT MODE SHABBAT MODE SHABBAT MODE SHABBAT MODE SHABBAT MODE SHABBAT MODE SHABBAT MODE SHABBAT MODE SHABBAT MODE ".localized()
}
if isFirstTime {
jewishCalendar.back()
}
return bannerText
}
func getShabbatBannerColors(isFirstTime:Bool, textOnly: Bool) -> Color {
if isFirstTime {
jewishCalendar.forward()
}
var bannerBGColor = Color.black
var bannerTextColor = Color.white
switch jewishCalendar.getYomTovIndex() {
case JewishCalendar.PESACH:
bannerBGColor = Color("light_yellow")
bannerTextColor = .black
case JewishCalendar.SHAVUOS:
bannerBGColor = .blue
bannerTextColor = .white
case JewishCalendar.SUCCOS:
bannerBGColor = .green
bannerTextColor = .black
case JewishCalendar.SHEMINI_ATZERES:
bannerBGColor = .green
bannerTextColor = .black
case JewishCalendar.SIMCHAS_TORAH:
bannerBGColor = .green
bannerTextColor = .black
case JewishCalendar.ROSH_HASHANA:
bannerBGColor = .red
bannerTextColor = .white
case JewishCalendar.YOM_KIPPUR:
bannerBGColor = .white
bannerTextColor = .black
default:
bannerBGColor = Color(.darkBlue)
bannerTextColor = .white
}
if isFirstTime {
jewishCalendar.back()
}
if textOnly {
return bannerTextColor
} else {
return bannerBGColor
}
}
func checkIfUserIsInIsrael() {
if defaults.bool(forKey: "neverAskInIsrael") {
return
}
if !defaults.bool(forKey: "inIsrael") && timezone.corrected().identifier == "Asia/Jerusalem" {
showInIsraelAlert = true
}
if defaults.bool(forKey: "inIsrael") && timezone.corrected().identifier != "Asia/Jerusalem" {
showOutOfIsraelAlert = true
}
}
func checkIfTablesNeedToBeUpdated() {
if defaults.object(forKey: "chaitablesLink" + locationName) == nil || askedToUpdateTablesAlready {
return
}
let chaitables = ChaiTables(locationName: locationName, jewishCalendar: jewishCalendar, defaults: defaults)
if chaitables.getVisibleSurise(forDate: userChosenDate) == nil && chaitables.useVisibleSunrise {
if chaitables.chaitableVisibleSunrise == "" {
showTablesNeedToBeUpdatedAlert = true
askedToUpdateTablesAlready = true
} else {// There is an issue, because there is something in the string that is not formatting properly
print(chaitables.chaitableVisibleSunrise)
showChaitablesErrorAlert = true
}
}
}
func ZmanimMenu() -> some View {
Menu {
Button(action: {
withAnimation {
isFirstTimeForShabbatBanner = true
shabbatMode.toggle()
shabbatMode ? endShabbatMode() : startShabbatMode()
}
}) {
if shabbatMode {
Label("Shabbat/Chag Mode", systemImage: "checkmark")
} else {
Text("Shabbat/Chag Mode")
}
}
// if #available(iOS 17.0, *) {
// Button(action: {
// simpleList.toggle()
// defaults.set(simpleList, forKey: "useSimpleList")
// updateZmanimList()
// }) {
// if simpleList {
// Label("Use Simple List", systemImage: "checkmark")
// } else {
// Text("Use Simple List")
// }
// }
// }
Button(action: {
useElevation.toggle()
defaults.set(useElevation, forKey: "useElevation")
GlobalStruct.useElevation = useElevation
resolveElevation()
recreateZmanimCalendar()
setNextUpcomingZman()
updateZmanimList()
}) {
if useElevation {
Label("Use Elevation", systemImage: "checkmark")
} else {
Text("Use Elevation")
}
}
Button("Netz Countdown") {
nextView = .netz
showNextView = true
}
Button("Molad Calculator") {
nextView = .molad
showNextView = true
}
Button("Jerusalem Direction") {
nextView = .jerDirection
showNextView = true
}
Divider()
Button("Setup") {
GetUserLocationView.loneView = false
nextView = .setup
showNextView = true
}
Button("Search For A Place") {
GetUserLocationView.loneView = true
nextView = .searchForPlace
showNextView = true
}
Button("Website") {
if let url = URL(string: "https://royzmanim.com/") {
UIApplication.shared.open(url)
}
}
Button("Settings") {
nextView = .settings
showNextView = true
}
} label: {
Image(systemName: "ellipsis")
.font(.title3)
.padding(10)
.background(alignment: .center) {
Color.gray.opacity(0.2)
}
.clipShape(Circle())
}
}
func alerts(view: any View) -> some View {
let result = view.overlay {
ZStack {
ZStack { }
.alert("Visible Sunrise Data Error", isPresented: $showChaitablesErrorAlert) {
Button("Do not use visible sunrise for this location") {
defaults.set(true, forKey: "useMishorSunrise".appending(GlobalStruct.geoLocation.locationName))
}
Button("Dismiss".localized(), role: .cancel) {}
} message: {
Text("An error occurred while trying to read the data that was retrieved from chaitables.com for this location. A table was expected but this was found instead:\n\n"
.appending(ChaiTables(locationName: locationName, jewishCalendar: jewishCalendar, defaults: defaults).chaitableVisibleSunrise
.appending("\n\nPlease try to download the table again, or choose to not use visible sunrise for this location.")))
}
ZStack { }
.alert("Location Issues".localized(), isPresented: $showLocationServicesDisabledAlert) {
Button("Search For A Place".localized()) {
GetUserLocationView.loneView = true
nextView = .searchForPlace
showNextView = true
}
Button("Dismiss".localized(), role: .cancel) {}
} message: {
Text("The application is having issues requesting your device's location. Location Services might be disabled or parental controls may be restricting the application. If you would like to use a zipcode/address instead, choose the \"Search For A Place\" option.".localized())
}
ZStack { }
.alert("Chaitables out of date".localized(), isPresented: $showTablesNeedToBeUpdatedAlert) {
Button("Yes".localized()) {
let oldLink = self.defaults.string(forKey: "chaitablesLink" + self.locationName)
let hebrewYear = String(self.jewishCalendar.getJewishYear())
let pattern = "&cgi_yrheb=\\d{4}"
let newLink = oldLink?.replacingOccurrences(of: pattern, with: "&cgi_yrheb=" + hebrewYear, options: .regularExpression)
let scraper = ChaiTablesScraper(link: newLink ?? "", locationName: self.locationName, jewishYear: self.jewishCalendar.getJewishYear(), defaults: self.defaults)
scraper.scrape {
self.updateZmanimList()
}
}
Button("No".localized()) {}
} message: {
Text("The current hebrew year is out of scope for the visible sunrise times that were downloaded from Chaitables. Would you like to download the tables for this hebrew year?".localized())
}
ZStack { }
.alert("Are you in Israel now?".localized(), isPresented: $showInIsraelAlert) {
Button("Yes".localized()) {
self.defaults.set(true, forKey: "inIsrael")
self.defaults.set(false, forKey: "LuachAmudeiHoraah")
self.defaults.set(true, forKey: "useElevation")
self.jewishCalendar.inIsrael = true
GlobalStruct.jewishCalendar.inIsrael = self.jewishCalendar.inIsrael
GlobalStruct.useElevation = true
self.resolveElevation()
self.recreateZmanimCalendar()
self.updateZmanimList()
}
Button("Dismiss".localized(), role: .cancel) {}
Button("Do Not Ask Again".localized()) {
self.defaults.set(true, forKey: "neverAskInIsrael")
}
} message: {
Text("If you are in Israel, please confirm below.".localized())
}
ZStack { }
.alert("Have you left Israel?".localized(), isPresented: $showOutOfIsraelAlert) {
Button("Yes".localized()) {
self.defaults.set(false, forKey: "inIsrael")
self.jewishCalendar.inIsrael = false
GlobalStruct.jewishCalendar.inIsrael = false
self.defaults.set(true, forKey: "LuachAmudeiHoraah")
self.defaults.set(false, forKey: "useElevation")
GlobalStruct.useElevation = false
self.resolveElevation()
self.recreateZmanimCalendar()
self.updateZmanimList()
}
Button("Dismiss".localized(), role: .cancel) {}
Button("Do Not Ask Again".localized()) {
self.defaults.set(true, forKey: "neverAskInIsrael")
}
} message: {
Text("If you have left Israel, please confirm below.".localized())
}
ZStack { }
.alert("New version".localized(), isPresented: $showAppUpdateAlert) {
Button("Update".localized()) {
guard let url = URL(string: appStoreURL ?? "") else {
return
}
UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
Button("Not now".localized(), role: .cancel) {}
} message: {
Text("A new version of our app is available on the App Store. Update now!".localized())
}
ZStack { }
.confirmationDialog("Location info for: " + locationName, isPresented: $showLocationInfoAlert) {
Button("Change Location".localized()) {
GetUserLocationView.loneView = true
nextView = .searchForPlace
showNextView = true
}
Button("Set Elevation".localized()) {
nextView = .setupElevation
showNextView = true
}
Button("Share".localized()) {
showShareSheet = true
}
} message: {
Text("Location".localized().appending(": \(locationName)\n")
.appending("Latitude".localized()).appending(": \(lat)\n")
.appending("Longitude".localized()).appending(": \(long)\n")
.appending("Elevation".localized()).appending(": \(elevation) ").appending("meters".localized()).appending("\n")
.appending("Time Zone".localized()).appending(": \(timezone.corrected().identifier)\n")
.appending("Version: \(Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "0.0")"))
}
ZStack {
if datePickerIsVisible {
VStack {
DatePicker("", selection: $userChosenDate, displayedComponents: .date)
.labelsHidden()
.datePickerStyle(.graphical)
.onChange(of: userChosenDate) { newValue in
syncCalendarDates()
updateZmanimList()
checkIfTablesNeedToBeUpdated()
}
HStack {
Button {
datePickerIsVisible.toggle()
hebrewDatePickerIsVisible.toggle()
} label: {
Text("Change Calendar")
}
Spacer()
Button {
datePickerIsVisible.toggle()
} label: {
Text("Done")
}
}.padding()
}.frame(width: 320)
.background {
RoundedRectangle(cornerRadius: 8, style: .continuous)
.foregroundColor(Color(UIColor.secondarySystemBackground))
.shadow(radius: 1)
}
}
if hebrewDatePickerIsVisible {
VStack {
DatePicker("", selection: $userChosenDate, displayedComponents: .date)
.labelsHidden()
.datePickerStyle(.graphical)
.environment(\.locale, Locale(identifier: "he"))
.environment(\.calendar, Calendar(identifier: .hebrew))
.onChange(of: userChosenDate) { newValue in
syncCalendarDates()
updateZmanimList()
checkIfTablesNeedToBeUpdated()
}
HStack {
Button {
hebrewDatePickerIsVisible.toggle()
datePickerIsVisible.toggle()
} label: {
Text("Change Calendar")
}
Spacer()
Button {
hebrewDatePickerIsVisible.toggle()
} label: {
Text("Done")
}
}.padding()
}.frame(width: 320)
.background {
RoundedRectangle(cornerRadius: 8, style: .continuous)
.foregroundColor(Color(UIColor.secondarySystemBackground))
.shadow(radius: 1)
}
}
}
}
}
return AnyView(result)
}
var simpleListView: some View {
ScrollViewReader { scrollViewProxy in
List(zmanimList, id: \.self) { zmanEntry in
Button {
if shabbatMode || !defaults.bool(forKey: "showZmanDialogs") {
return //do not show the dialogs
}
if zmanimList.first?.title == zmanEntry.title {
showLocationInfoAlert = true
}
if zmanimList.count > 1 && zmanEntry.title == zmanimList[1].title {
datePickerIsVisible.toggle()
}
if zmanEntry.title == ZmanimTimeNames(mIsZmanimInHebrew: defaults.bool(forKey: "isZmanimInHebrew"), mIsZmanimEnglishTranslated: defaults.bool(forKey: "isZmanimEnglishTranslated")).getTalitTefilinString() && !zmanimList.contains(where: { $0.is66MisheyakirZman == true }) {
withAnimation {
updateZmanimList(add66Misheyakir: true)
}
} else {
if !ZmanimAlertInfoHolder(title: zmanEntry.title, mIsZmanimInHebrew: defaults.bool(forKey: "isZmanimInHebrew"), mIsZmanimEnglishTranslated: defaults.bool(forKey: "isZmanimEnglishTranslated")).getFullTitle().isEmpty {
selectedZman = zmanEntry
showZmanAlert = true
}
}
} label: {
if zmanEntry.isZman {
zmanEntryRow(zmanEntry)
} else {
HStack {
Text("").frame(maxWidth: 0)
Spacer()
if zmanEntry.title.contains("\n") {
Text(zmanEntry.title)
.frame(maxWidth: .infinity, alignment: .center)
.multilineTextAlignment(.center)
.lineLimit(2)
.minimumScaleFactor(0.5)
// .padding(4) // Add padding to give space between text and border
// .overlay(
// RoundedRectangle(cornerRadius: 6)
// .stroke(
// LinearGradient(
// colors: [Color.orange, Color.orange, Color.orange],
// startPoint: .leading,
// endPoint: .trailing
// ),
// lineWidth: 2
// )
// )
} else {
Text(zmanEntry.title)
.frame(maxWidth: .infinity, alignment: .center)
.lineLimit(1)
.minimumScaleFactor(0.5)
}
Spacer()
}
}
}
.id(zmanEntry.title)
.confirmationDialog(ZmanimAlertInfoHolder(title: selectedZman.title, mIsZmanimInHebrew: defaults.bool(forKey: "isZmanimInHebrew"), mIsZmanimEnglishTranslated: defaults.bool(forKey: "isZmanimEnglishTranslated")).getFullTitle(), isPresented: $showZmanAlert, titleVisibility: .visible) {
if selectedZman.title.contains(ZmanimTimeNames(mIsZmanimInHebrew: defaults.bool(forKey: "isZmanimInHebrew"), mIsZmanimEnglishTranslated: defaults.bool(forKey: "isZmanimEnglishTranslated")).getHaNetzString()) {
Button("Setup Visible Sunrise") {
nextView = .setupVisibleSunrise
showNextView = true
}
}
if selectedZman.title.contains("Birkat Halevana") || selectedZman.title.contains("ברכת הלבנה") {
Button("Show Full Text") {
GlobalStruct.chosenPrayer = "Birchat Halevana"
nextView = .siddur
showNextView = true
}
}
if selectedZman.title.contains("day of Omer") || selectedZman.title.contains("ימים לעומר") {
Button("Show Full Text") {
GlobalStruct.chosenPrayer = "Sefirat HaOmer"
nextView = .siddur
showNextView = true
}
}
if #available(iOS 16.2, *), ActivityAuthorizationInfo().areActivitiesEnabled {
if selectedZman.isZman
&& (selectedZman.zman?.timeIntervalSince1970 ?? Date().timeIntervalSince1970 > Date().timeIntervalSince1970) //after now
&& selectedZman.zman?.timeIntervalSinceNow ?? Date().timeIntervalSinceNow < 28800 {// not after 8 hours
Button("Keep track of this zman with a Live Activity?") {
let attributes = Rabbi_Ovadiah_Yosef_Calendar_WidgetAttributes(zmanName: selectedZman.title)
let contentState = Rabbi_Ovadiah_Yosef_Calendar_WidgetAttributes.TimerStatus(endTime: selectedZman.zman ?? Date())
_ = try? Activity<Rabbi_Ovadiah_Yosef_Calendar_WidgetAttributes>.request(attributes: attributes, content: ActivityContent.init(state: contentState, staleDate: nil), pushType: nil)
}
}
}
Button("Dismiss", role: .cancel) { }
} message: {
Text(ZmanimAlertInfoHolder(title: selectedZman.title, mIsZmanimInHebrew: defaults.bool(forKey: "isZmanimInHebrew"), mIsZmanimEnglishTranslated: defaults.bool(forKey: "isZmanimEnglishTranslated")).getFullMessage().replacingOccurrences(of: "%c", with: String(zmanimCalendar.candleLightingOffset)))
}.textCase(nil)
}
.listStyle(.plain)
.scrollOffsetID("Scroller")
.refreshable {
refreshTable()
}
.gesture(DragGesture(minimumDistance: 5, coordinateSpace: .global).onEnded { value in
let horizontalAmount = value.translation.width
let verticalAmount = value.translation.height
if abs(horizontalAmount) > abs(verticalAmount) {
if horizontalAmount < 0 {
updateDate(86400)
} else {
updateDate(-86400)
}
}
})
.onChange(of: scrollViewOffset) { newValue in
if shabbatMode {
DispatchQueue.main.async {
scrollOffsetProxy.scrollTo(newValue, withAnimation: false)
}
}
}
.onChange(of: scrollToTop) { newValue in
DispatchQueue.main.async {
scrollViewProxy.scrollTo(zmanimList.first?.title, anchor: .bottom)
}
}
.onReceive(timer) { _ in
guard shabbatMode else { return }
let topOfView = ScrollOffset.proxy(.top, id: "Scroller")
let bottomOfView = ScrollOffset.proxy(.bottom, id: "Scroller")
if scrollViewOffset == CGFloat(1000) {
scrollViewOffset = bottomOfView.offset
}
if scrollDirection == 1 {
scrollViewOffset += 0.25
} else {
scrollViewOffset -= 0.25
}
// Reverse direction at bounds
if topOfView.offset == 0 {
scrollDirection = -1
} else if bottomOfView.offset == 0 {
scrollDirection = 1
}
}
.onReceive(timerForShabbatMode) { _ in
guard shabbatMode else { return }
scheduleTimer()
isFirstTimeForShabbatBanner = false
refreshTable()
}
}
}
fileprivate func zmanEntryRow(_ zmanEntry: ZmanListEntry) -> some View {
return HStack {
if defaults.bool(forKey: "isZmanimInHebrew") && !Locale.isHebrewLocale() {
if zmanEntry.isRTZman {
Text(zmanEntry.zman == nil ? "XX:XX" : dateFormatterForRT.string(from: zmanEntry.zman!))
.font(.system(size: 20, weight: .regular))
} else {
Text(zmanEntry.zman == nil ? "XX:XX" : dateFormatterForZmanim.string(from: zmanEntry.zman!))
.font(.system(size: zmanEntry.is66MisheyakirZman ? 18 : 20, weight: .regular))
}
if zmanEntry.zman == nextUpcomingZman {
Image(systemName: "arrowtriangle.backward.fill")
}
Spacer()
if zmanEntry.is66MisheyakirZman {
Text(zmanEntry.title)
.font(.system(size: 18, weight: .regular))
.lineLimit(1)
.minimumScaleFactor(0.5)
} else {
if zmanEntry.title.contains(ZmanimTimeNames(mIsZmanimInHebrew: defaults.bool(forKey: "isZmanimInHebrew")).getHalachaBerurahString()) || zmanEntry.title.contains(ZmanimTimeNames(mIsZmanimInHebrew: defaults.bool(forKey: "isZmanimInHebrew")).getYalkutYosefString()) {
PelagZmanView(title: zmanEntry.title)
} else {
Text(zmanEntry.title)
.font(.system(size: 20, weight: .bold))
.lineLimit(1)
.minimumScaleFactor(0.5)
}
}
} else {
if zmanEntry.is66MisheyakirZman {
Text(zmanEntry.title)
.font(.system(size: 18, weight: .regular))
.lineLimit(1)
.minimumScaleFactor(0.5)
} else {
if zmanEntry.title.contains(ZmanimTimeNames(mIsZmanimInHebrew: defaults.bool(forKey: "isZmanimInHebrew")).getHalachaBerurahString()) || zmanEntry.title.contains(ZmanimTimeNames(mIsZmanimInHebrew: defaults.bool(forKey: "isZmanimInHebrew")).getYalkutYosefString()) {
PelagZmanView(title: zmanEntry.title)
} else {
Text(zmanEntry.title)
.font(.system(size: 20, weight: .bold))
.lineLimit(1)
.minimumScaleFactor(0.5)
}
}
Spacer()
if zmanEntry.zman == nextUpcomingZman {
Image(systemName: "arrowtriangle.forward.fill")
}
if zmanEntry.isRTZman {
Text(zmanEntry.zman == nil ? "XX:XX" : dateFormatterForRT.string(from: zmanEntry.zman!)).font(.system(size: 20, weight: .regular))
} else {
Text(zmanEntry.zman == nil ? "XX:XX" : dateFormatterForZmanim.string(from: zmanEntry.zman!)).font(.system(size: zmanEntry.is66MisheyakirZman ? 18 : 20, weight: .regular))
}
}
}
.foregroundStyle(zmanEntry.shouldBeDimmed ? .gray : (zmanEntry.isBirchatHachamahZman ? .black : .primary))
.background(
zmanEntry.isBirchatHachamahZman ?
LinearGradient(
gradient: Gradient(colors: [Color("Gold"), Color("GoldStart"), Color("Gold")]),
startPoint: .leading,
endPoint: .trailing
)
: .init(stops: [], startPoint: .leading, endPoint: .trailing)
)
}
struct PelagZmanView: View {
let title: String
var body: some View {
let (mainTitle, parenTitle) = splitTitle(title)
HStack(spacing: 2) {
Text(mainTitle)
.font(.system(size: 20, weight: .bold))
.lineLimit(1)
.layoutPriority(1) // prioritize full title
if !parenTitle.isEmpty {
Text(parenTitle)
.font(.system(size: 20, weight: .bold))
.lineLimit(1)
.minimumScaleFactor(0.4) // only shrink the parens
.layoutPriority(0) // lower priority so it shrinks first
}
}
.frame(maxWidth: .infinity, alignment: .leading)
.environment(\.layoutDirection, isHebrew(text: title) ? .rightToLeft : .leftToRight)
}
private func splitTitle(_ full: String) -> (String, String) {
let pattern = #"^(.*?)\s*(\([^)]*\))?$"#
guard let regex = try? NSRegularExpression(pattern: pattern),
let match = regex.firstMatch(in: full, range: NSRange(full.startIndex..., in: full)) else {
return (full, "")
}
let main = Range(match.range(at: 1), in: full).map { String(full[$0]) } ?? full
let paren = Range(match.range(at: 2), in: full).map { String(full[$0]) } ?? ""
return (main, paren)
}
private func isHebrew(text: String) -> Bool {
return text.range(of: #"[\u0590-\u05FF]"#, options: .regularExpression) != nil
}
}
var scrollView: some View {
VStack {
ScrollViewReader { scrollViewProxy in
ScrollView {
HStack {
VStack(spacing: 10) {
Color.clear.frame(height: 1).id("top") // this as a scroll anchor
if Calendar.current.isDateInToday(userChosenDate) {
Text(formatDate(format: "EEEE")).fontWeight(.heavy).foregroundStyle(Color.red)
} else {
Text(formatDate(format: "EEEE")).bold().foregroundStyle(Color.red)
}
Divider()
HStack {
VStack {
Text(formatDate(using: Calendar(identifier: .hebrew), format: "MMM")).bold()
Text(String(jewishCalendar.getJewishDayOfMonth())).font(.largeTitle)
Text(String(jewishCalendar.getJewishYear()))
}
.frame(maxWidth: .infinity, alignment: .center)
Divider()
VStack {
Text(formatDate(format: "MMM")).bold()
Text(String(Calendar.current.dateComponents([.day], from: GlobalStruct.userChosenDate).day ?? 1)).font(.largeTitle)
Text(String(Calendar.current.dateComponents([.year], from: GlobalStruct.userChosenDate).year ?? 1))
}
.frame(maxWidth: .infinity, alignment: .center)
}
.frame(maxWidth: .infinity)
}
.padding(.top, 0)
.padding(.bottom, nil)
.background(Color(.systemBackground))
.frame(maxWidth: .infinity)
.clipShape(RoundedRectangle(cornerRadius: 26))
.onTapGesture {
if datePickerIsVisible {
withAnimation {
datePickerIsVisible.toggle()
}
}
if hebrewDatePickerIsVisible {
withAnimation {
hebrewDatePickerIsVisible.toggle()
}
}
}
VStack(alignment: .leading) {
Text(locationName.isEmpty ? "Updating...".localized() : locationName).fontWeight(.heavy).padding(.bottom, 5)
.onTapGesture {
showLocationInfoAlert = true
}
Text(jewishCalendar.getThisWeeksParasha()).fontWeight(.heavy).foregroundStyle(Color.gray)
HStack(spacing: 5) {
Image(systemName: "star")
.frame(width: 20).hidden()
Text(jewishCalendar.getSpecialDay(addOmer: false))
.frame(maxWidth: .infinity, alignment: .leading)
}
}
.frame(maxWidth: .infinity)
}
.frame(maxWidth: .infinity)
.padding()
VStack {
if jewishCalendar.tomorrow().isAssurBemelacha() || jewishCalendar.isAssurBemelacha() {
Text(getShabbatStartEndsAsString())
Rectangle()
.frame(height: 1)
.foregroundColor(Color.secondary)
}
if !jewishCalendar.tomorrow().isYomKippur() || !jewishCalendar.isYomKippur() {
if jewishCalendar.tomorrow().isTaanis() {
Text(jewishCalendar.tomorrow().yomTovAsString())
Text(getFastStartTime())
Text(getFastEndTime())
Rectangle()
.frame(height: 1)
.foregroundColor(Color.secondary)
} else if jewishCalendar.isTaanis() {
Text(jewishCalendar.yomTovAsString())
Text(getFastStartTime())
Text(getFastEndTime())
Rectangle()
.frame(height: 1)
.foregroundColor(Color.secondary)
}
}
if !jewishCalendar.getBirchatLevanaStatus().isEmpty {
Text(jewishCalendar.getBirchatLevanaStatus())
Text(getMoonRiseSet(isRise: true))
Text(getMoonRiseSet(isRise: false))
Rectangle()
.frame(height: 1)
.foregroundColor(Color.secondary)
}
if doesTekufaOccurToday() {
Text(jewishCalendar.getTekufaName())
Text("Do not drink ....")
Rectangle()
.frame(height: 1)
.foregroundColor(Color.secondary)
}
Divider()
ForEach(zmanimList, id: \.self) { zmanEntry in
if zmanEntry.isZman {
zmanEntryRow(zmanEntry)
.padding(.leading).padding(.trailing)
.onTapGesture {
if shabbatMode || !defaults.bool(forKey: "showZmanDialogs") {
return//do not show the dialogs
}
if zmanEntry.title == ZmanimTimeNames(mIsZmanimInHebrew: defaults.bool(forKey: "isZmanimInHebrew"), mIsZmanimEnglishTranslated: defaults.bool(forKey: "isZmanimEnglishTranslated")).getTalitTefilinString() && !zmanimList.contains(where: { $0.is66MisheyakirZman == true }) {
withAnimation {
updateZmanimList(add66Misheyakir: true)
}
} else {
selectedZman = zmanEntry
showZmanAlert = true
}
}
.confirmationDialog(ZmanimAlertInfoHolder(title: selectedZman.title, mIsZmanimInHebrew: defaults.bool(forKey: "isZmanimInHebrew"), mIsZmanimEnglishTranslated: defaults.bool(forKey: "isZmanimEnglishTranslated")).getFullTitle(), isPresented: $showZmanAlert, titleVisibility: .visible) {
if selectedZman.title.contains(ZmanimTimeNames(mIsZmanimInHebrew: defaults.bool(forKey: "isZmanimInHebrew"), mIsZmanimEnglishTranslated: defaults.bool(forKey: "isZmanimEnglishTranslated")).getHaNetzString()) {
Button("Setup Visible Sunrise") {
nextView = .setupVisibleSunrise
showNextView = true
}
}
if selectedZman.title.contains("Birkat Halevana") || selectedZman.title.contains("ברכת הלבנה") {
Button("Show Full Text") {
GlobalStruct.chosenPrayer = "Birchat Halevana"
nextView = .siddur
showNextView = true
}
}
if selectedZman.title.contains("day of Omer") || selectedZman.title.contains("ימים לעומר") {
Button("Show Full Text") {
GlobalStruct.chosenPrayer = "Sefirat HaOmer"
nextView = .siddur
showNextView = true
}
}
if #available(iOS 16.2, *), ActivityAuthorizationInfo().areActivitiesEnabled {
if selectedZman.isZman
&& (selectedZman.zman?.timeIntervalSince1970 ?? Date().timeIntervalSince1970 > Date().timeIntervalSince1970) //after now
&& selectedZman.zman?.timeIntervalSinceNow ?? Date().timeIntervalSinceNow < 28800 {// not after 8 hours
Button("Keep track of this zman with a Live Activity?") {
let attributes = Rabbi_Ovadiah_Yosef_Calendar_WidgetAttributes(zmanName: selectedZman.title)
let contentState = Rabbi_Ovadiah_Yosef_Calendar_WidgetAttributes.TimerStatus(endTime: selectedZman.zman ?? Date())
_ = try? Activity<Rabbi_Ovadiah_Yosef_Calendar_WidgetAttributes>.request(attributes: attributes, content: ActivityContent.init(state: contentState, staleDate: nil), pushType: nil)
}
}
}
Button("Dismiss", role: .cancel) { }
} message: {
Text(ZmanimAlertInfoHolder(title: selectedZman.title, mIsZmanimInHebrew: defaults.bool(forKey: "isZmanimInHebrew"), mIsZmanimEnglishTranslated: defaults.bool(forKey: "isZmanimEnglishTranslated")).getFullMessage().replacingOccurrences(of: "%c", with: String(zmanimCalendar.candleLightingOffset)))
}.textCase(nil)
Divider()
}
}
Text(jewishCalendar.getTachanun())
Text(jewishCalendar.getIsUlChaparatPeshaSaid())
Text(jewishCalendar.getIsMashivHaruchOrMoridHatalSaid()).padding()
}
.frame(maxWidth: .infinity, maxHeight: .infinity) // Takes up all remaining space
.background(Color(.systemBackground))
}
.background(Color(uiColor: .systemGray6))
.offset(y: scrollViewOffset)
.refreshable {
refreshTable()
}
.gesture(DragGesture(minimumDistance: 5, coordinateSpace: .global).onEnded { value in
let horizontalAmount = value.translation.width
let verticalAmount = value.translation.height
if abs(horizontalAmount) > abs(verticalAmount) {
if horizontalAmount < 0 {
updateDate(86400)
} else {
updateDate(-86400)
}
}
})
.onChange(of: scrollToTop) { newValue in
DispatchQueue.main.async {
scrollViewProxy.scrollTo("top", anchor: .bottom)// use the anchor
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) // Keep it compact
}
}
}
fileprivate func updateDate(_ seconds: TimeInterval) {
userChosenDate = userChosenDate.advanced(by: seconds)
syncCalendarDates()
updateZmanimList()
checkIfTablesNeedToBeUpdated()
scrollToTop.toggle()
}
var body: some View {
if shabbatMode && !isBannerHidden {
MarqueeText(
text: getShabbatBannerText(isFirstTime: isFirstTimeForShabbatBanner) + getShabbatBannerText(isFirstTime: isFirstTimeForShabbatBanner) + getShabbatBannerText(isFirstTime: isFirstTimeForShabbatBanner),
font: UIFont.systemFont(ofSize: UIFont.buttonFontSize, weight: .bold),
leftFade: 0,
rightFade: 0,
startDelay: 0,
foregroundColor: getShabbatBannerColors(isFirstTime: isFirstTimeForShabbatBanner, textOnly: true),
backgroundColor: getShabbatBannerColors(isFirstTime: isFirstTimeForShabbatBanner, textOnly: false)
)
.onTapGesture {
isBannerHidden = true
}
}
if #available(iOS 17.0, *) {
alerts(view: simpleList ? simpleListView : scrollView)
.scrollDisabled(shabbatMode)
} else {// The ScrollView should work on iOS 16 and below, but SwiftUI on those iOS verisons does not like the turnary above
if #available(iOS 16.0, *) {
alerts(view: simpleListView)
.scrollDisabled(shabbatMode)
} else {
alerts(view: simpleListView)
}
}
HStack {
Button {
updateDate(-86400)
} label: {
Image(systemName: "arrowtriangle.backward.fill").resizable().scaledToFit().frame(width: 18, height: 18)
}
Spacer()
Button {
withAnimation(.easeInOut) {
datePickerIsVisible.toggle()
}
} label: {
Image(systemName: "calendar").resizable().scaledToFit().frame(width: 26, height: 26)
}
Spacer()
Button {
updateDate(86400)
} label: {
Image(systemName: "arrowtriangle.forward.fill").resizable().scaledToFit().frame(width: 18, height: 18)
}
}
.padding(.init(top: 2, leading: 0, bottom: 8, trailing: 0))
.sheet(isPresented: $showShareSheet) {
let image = UIImage(named: "AppIcon")
let textToShare = "Find all the Zmanim on Zmanei Yosef".localized()
if let myWebsite = URL(string: "https://royzmanim.com/calendar?locationName=\(locationName)&lat=\(lat)&long=\(long)&elevation=\(elevation)&timeZone=\(timezone.identifier)") {
ShareSheet(items: [textToShare, myWebsite, image ?? UIImage(systemName: "square.and.arrow.up") as Any])
}
}
.disabled(shabbatMode)
.toolbar {
ToolbarItem(placement: .primaryAction) {
ZmanimMenu()
}
}
.onReceive(timerForShabbatMode) { _ in
refreshTable()
}
.onReceive(NotificationCenter.default.publisher(for: Notification.Name("elevation"))) { notification in
if let value = notification.object as? String,
let doubleValue = Double(value) {
elevation = doubleValue
defaults.set(elevation, forKey: "elevation" + locationName)
recreateZmanimCalendar()
setNextUpcomingZman()
updateZmanimList()
}
}
.onAppear {
UIApplication.shared.isIdleTimerDisabled = true
if !defaults.bool(forKey: "isSetup") {
defaults.set(true, forKey: "showZmanDialogs")
setNotificationsDefaults()
}
if !defaults.bool(forKey: "massUpdateCheck") {// since version 6.4, we need to move everyone to AH mode if they are outside of Israel. This should eventually be removed, but far into the future
if !defaults.bool(forKey: "inIsrael") {
defaults.set(true, forKey: "LuachAmudeiHoraah")
defaults.set(false, forKey: "useElevation")
}
defaults.set(true, forKey: "massUpdateCheck")// do not check again
}
GlobalStruct.useElevation = defaults.bool(forKey: "useElevation")
CheckUpdate.shared.showUpdate(withConfirmation: true, isForSwiftUI: true) { needsUpdate, appURL in
appStoreURL = appURL
showAppUpdateAlert = needsUpdate
}
dateFormatterForZmanim.dateFormat = (Locale.isHebrewLocale() ? "H" : "h") + ":mm" + (defaults.bool(forKey: "showSeconds") ? ":ss" : "") + (Locale.isHebrewLocale() ? "" : " aa")
dateFormatterForRT.dateFormat = (Locale.isHebrewLocale() ? "H" : "h") + ":mm" + (defaults.bool(forKey: "roundUpRT") ? "" : ":ss") + (Locale.isHebrewLocale() ? "" : " aa")
dateFormatterForZmanim.timeZone = timezone
dateFormatterForRT.timeZone = timezone
syncOldDefaults()
userChosenDate = GlobalStruct.userChosenDate
syncCalendarDates()
//simpleList = defaults.bool(forKey: "useSimpleList")
simpleList = true// temp
if !defaults.bool(forKey: "isSetup") {
nextView = .setup
showNextView = true
} else { //not first run
if defaults.bool(forKey: "useAdvanced") {
setLocation(defaultsLN: "advancedLN", defaultsLat: "advancedLat", defaultsLong: "advancedLong", defaultsTimezone: "advancedTimezone")
} else if defaults.bool(forKey: "useLocation1") {
setLocation(defaultsLN: "location1", defaultsLat: "location1Lat", defaultsLong: "location1Long", defaultsTimezone: "location1Timezone")
} else if defaults.bool(forKey: "useLocation2") {
setLocation(defaultsLN: "location2", defaultsLat: "location2Lat", defaultsLong: "location2Long", defaultsTimezone: "location2Timezone")
} else if defaults.bool(forKey: "useLocation3") {
setLocation(defaultsLN: "location3", defaultsLat: "location3Lat", defaultsLong: "location3Long", defaultsTimezone: "location3Timezone")
} else if defaults.bool(forKey: "useLocation4") {
setLocation(defaultsLN: "location4", defaultsLat: "location4Lat", defaultsLong: "location4Long", defaultsTimezone: "location4Timezone")
} else if defaults.bool(forKey: "useLocation5") {
setLocation(defaultsLN: "location5", defaultsLat: "location5Lat", defaultsLong: "location5Long", defaultsTimezone: "location5Timezone")
} else if defaults.bool(forKey: "useZipcode") {
setLocation(defaultsLN: "locationName", defaultsLat: "lat", defaultsLong: "long", defaultsTimezone: "timezone")
} else {
DispatchQueue.global().async {
if CLLocationManager.locationServicesEnabled() {
let locationManager = CLLocationManager()
switch locationManager.authorizationStatus {
case .restricted, .denied:
DispatchQueue.main.async {
showLocationServicesDisabledAlert = true
}
print("No access")
break
case .authorizedAlways, .authorizedWhenInUse:
//self.getUserLocation() this does not work for some reason. I assume it is because it works on another thread
break
case .notDetermined:
break
@unknown default:
break
}
} else {
showLocationServicesDisabledAlert = true
print("No access")
}
}
getUserLocation()
}
// another swiftUI hack because they removed onViewDidAppear, I'm concerned about what will happen if it takes too long to get the location...
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
refreshTable()
}
}
defaults.set(locationName, forKey: "lastKnownLocation")
checkIfUserIsInIsrael()
checkIfTablesNeedToBeUpdated()
createBackgroundThreadForNextUpcomingZman()
if !Calendar.current.isDate(lastTimeUserWasInApp, inSameDayAs: Date()) && lastTimeUserWasInApp.timeIntervalSinceNow < 7200 {//2 hours
refreshTable()
} else {
updateZmanimList()
}
lastTimeUserWasInApp = Date()
}
.background {
NavigationLink("", isActive: $showNextView) {
switch nextView {
case .netz:
NetzView().applyToolbarHidden()
case .molad:
MoladView().applyToolbarHidden()
case .jerDirection:
JerDirectionView().applyToolbarHidden()
case .setup:
WelcomeScreenView()
.navigationBarBackButtonHidden(!defaults.bool(forKey: "isSetup"))
.applyToolbarHidden()
case .setupElevation:
SetupElevationView().applyToolbarHidden()
case .searchForPlace:
GetUserLocationView().applyToolbarHidden()
case .settings:
SettingsView().applyToolbarHidden()
case .setupVisibleSunrise:
SetupChooserView().applyToolbarHidden()
case .siddur:
UIKitSiddurControllerView().applyToolbarHidden() // Temp
default:
EmptyView()
}
}.hidden()
}
}
}
// MARK: - View Modifier for Hiding Toolbar
extension View {
@ViewBuilder
func applyToolbarHidden() -> some View {
if #available(iOS 18.0, *) {
self.toolbarVisibility(.hidden, for: .tabBar)
} else if #available(iOS 16.0, *) {
self.toolbar(.hidden, for: .tabBar)
} else {
self // TODO
}
}
}
public enum NextView {
case setupVisibleSunrise
case netz
case molad
case jerDirection
case setup
case setupElevation
case searchForPlace
case settings
case siddur
case none
}
struct ShareSheet: UIViewControllerRepresentable {
let items: [Any]
func makeUIViewController(context: Context) -> UIActivityViewController {
return UIActivityViewController(activityItems: items, applicationActivities: nil)
}
func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context) {}
}
#Preview {
ZmanimView()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment