<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>massorah</title>
	<atom:link href="https://www.originalbibles.com/tag/massorah/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.originalbibles.com</link>
	<description></description>
	<lastBuildDate>Fri, 22 Aug 2025 21:36:17 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.originalbibles.com/wp-content/uploads/2019/11/cropped-Logo-2-32x32.jpg</url>
	<title>massorah</title>
	<link>https://www.originalbibles.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>The Massoretic Notes Alfred S. Geden (1905) PDF</title>
		<link>https://www.originalbibles.com/the-massoretic-notes-alfred-s-geden-1905-pdf/</link>
					<comments>https://www.originalbibles.com/the-massoretic-notes-alfred-s-geden-1905-pdf/#comments</comments>
		
		<dc:creator><![CDATA[Editor]]></dc:creator>
		<pubDate>Sat, 23 Feb 2013 10:00:31 +0000</pubDate>
				<category><![CDATA[1900]]></category>
		<category><![CDATA[Hebrew Bible]]></category>
		<category><![CDATA[read online]]></category>
		<category><![CDATA[original book]]></category>
		<category><![CDATA[old testament]]></category>
		<category><![CDATA[read on android]]></category>
		<category><![CDATA[read on iphone]]></category>
		<category><![CDATA[read on tablet]]></category>
		<category><![CDATA[The Old Testament]]></category>
		<category><![CDATA[read on apple]]></category>
		<category><![CDATA[alfed S. Geden]]></category>
		<category><![CDATA[masoretic]]></category>
		<category><![CDATA[1905]]></category>
		<category><![CDATA[massorah]]></category>
		<category><![CDATA[pdf]]></category>
		<guid isPermaLink="false">http://originalbibles.com/?p=1792</guid>

					<description><![CDATA[The Massoretic Notes By Alfred S. Geden 1905 PDF The Massorah are the Hebrew notes...]]></description>
										<content:encoded><![CDATA[<h3>The Massoretic Notes By Alfred S. Geden 1905 PDF</h3>
<p>The Massorah are the Hebrew notes that go with the Old Testament in Hebrew.</p>
<p>These notes should be of much use to Bible readers and scholars around the world.</p>
<p>Please be advised, that with all ancient texts, one must be careful and view it together with other editions/reprints (in case some text is lost or unreadable due to age etcetera). However, this does not reduce the pleasure of reading the original and ancient texts!</p>
    <div id="flipbook-controls" style="text-align:center; margin-bottom:10px;">
      <label for="scaleSelect">Page Zoom:</label>
      <select id="scaleSelect" onchange="updateScale()" style="font-size:16px; padding:4px;">
        <option value="1.0">50% — Extra Small</option>
        <option value="1.5">75% — Small</option>
        <option value="2.0" selected>100% — Medium</option>
        <option value="2.5">125% — Large</option>
        <option value="3.0">150% — Extra Large</option>
        <option value="4.0">200% — XL</option>
      </select>
      <span class="ob-zoom-indicator" id="obZoomIndicator" aria-live="polite">100%</span>

      <label for="pageSelect" style="margin-left:20px;">Go to Page:</label>
      <select id="pageSelect" onchange="goToPage()" style="font-size:16px; padding:4px;">
                  <option value="1">1</option>
                  <option value="2">2</option>
                  <option value="3">3</option>
                  <option value="4">4</option>
                  <option value="5">5</option>
                  <option value="6">6</option>
                  <option value="7">7</option>
                  <option value="8">8</option>
                  <option value="9">9</option>
                  <option value="10">10</option>
                  <option value="11">11</option>
                  <option value="12">12</option>
                  <option value="13">13</option>
                  <option value="14">14</option>
                  <option value="15">15</option>
                  <option value="16">16</option>
                  <option value="17">17</option>
                  <option value="18">18</option>
                  <option value="19">19</option>
                  <option value="20">20</option>
                  <option value="21">21</option>
                  <option value="22">22</option>
                  <option value="23">23</option>
                  <option value="24">24</option>
                  <option value="25">25</option>
                  <option value="26">26</option>
                  <option value="27">27</option>
                  <option value="28">28</option>
                  <option value="29">29</option>
                  <option value="30">30</option>
                  <option value="31">31</option>
                  <option value="32">32</option>
                  <option value="33">33</option>
                  <option value="34">34</option>
                  <option value="35">35</option>
                  <option value="36">36</option>
                  <option value="37">37</option>
                  <option value="38">38</option>
                  <option value="39">39</option>
                  <option value="40">40</option>
                  <option value="41">41</option>
                  <option value="42">42</option>
                  <option value="43">43</option>
                  <option value="44">44</option>
                  <option value="45">45</option>
                  <option value="46">46</option>
                  <option value="47">47</option>
                  <option value="48">48</option>
                  <option value="49">49</option>
                  <option value="50">50</option>
                  <option value="51">51</option>
                  <option value="52">52</option>
                  <option value="53">53</option>
                  <option value="54">54</option>
                  <option value="55">55</option>
                  <option value="56">56</option>
                  <option value="57">57</option>
                  <option value="58">58</option>
                  <option value="59">59</option>
                  <option value="60">60</option>
                  <option value="61">61</option>
                  <option value="62">62</option>
                  <option value="63">63</option>
                  <option value="64">64</option>
                  <option value="65">65</option>
                  <option value="66">66</option>
                  <option value="67">67</option>
                  <option value="68">68</option>
                  <option value="69">69</option>
                  <option value="70">70</option>
                  <option value="71">71</option>
                  <option value="72">72</option>
                  <option value="73">73</option>
                  <option value="74">74</option>
                  <option value="75">75</option>
                  <option value="76">76</option>
                  <option value="77">77</option>
                  <option value="78">78</option>
                  <option value="79">79</option>
                  <option value="80">80</option>
                  <option value="81">81</option>
                  <option value="82">82</option>
                  <option value="83">83</option>
                  <option value="84">84</option>
                  <option value="85">85</option>
                  <option value="86">86</option>
                  <option value="87">87</option>
                  <option value="88">88</option>
                  <option value="89">89</option>
                  <option value="90">90</option>
                  <option value="91">91</option>
                  <option value="92">92</option>
                  <option value="93">93</option>
                  <option value="94">94</option>
                  <option value="95">95</option>
                  <option value="96">96</option>
                  <option value="97">97</option>
                  <option value="98">98</option>
                  <option value="99">99</option>
                  <option value="100">100</option>
                  <option value="101">101</option>
                  <option value="102">102</option>
              </select>

      <label style="margin-left:20px;">
        <input type="checkbox" id="bandwidthToggle" onchange="updateBandwidth()" />
        High Bandwidth Mode (4 pages per screen)
      </label>

      <label style="margin-left:20px;">
        <input type="checkbox" id="ultraBandwidthToggle" onchange="updateBandwidth()" />
        Ultra Bandwidth Mode (8 pages per screen)
      </label>
    </div>

    <div id="flipbook-viewer" data-page-count="2" style="text-align:center;">
      <div style="margin-bottom:10px;">
        <button onclick="popOutPage()" style="font-size:16px; padding:6px 12px;"> Pop Out Page</button>
      </div>


      <div style="margin-top:20px;">
        <button onclick="prevPage()"> Prev</button>
        <button onclick="nextPage()">Next </button>
      </div>


      <div class="ob-reader-spread" role="group" aria-label="Scanned book pages">
                  <canvas id="pageCanvas0" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:inline-block;"></canvas>
                  <canvas id="pageCanvas1" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:inline-block;"></canvas>
                  <canvas id="pageCanvas2" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas3" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas4" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas5" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas6" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas7" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
              </div>
      <p class="ob-reader-status" id="obReaderStatus" aria-live="polite"></p>
      <p class="ob-reader-swipe-hint">Swipe sideways to view additional scanned pages.</p>

      <div style="margin-top:20px;">
        <button onclick="prevPage()"> Prev</button>
        <button onclick="nextPage()">Next </button>
      </div>
    </div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"></script>
    <script>
      const bookName = "MassoreticNotes1905";
      const maxPages = 102;
      const category = "Hebrew";
      let pageNum = 1;
      let scale = 2.0;
      let pageCount = 2;
      let renderGeneration = 0;
      const activeRenderTasks = new Array(8).fill(null);
      const canvasQueues = Array.from({ length: 8 }, () => Promise.resolve());

      const canvases = [];
      const contexts = [];
      for (let i = 0; i < 8; i++) {
        canvases[i] = document.getElementById('pageCanvas' + i);
        contexts[i] = canvases[i].getContext('2d');
      }

      // The reader's original stylesheet fixed all canvases at 50%/25%/12.5%
      // width, meaning the old Zoom/Quality menu only changed resolution.
      // Here we size the *visible* pages as well, allowing sideways scrolling
      // when a spread is wider than the reader.
      function updateCanvasWidths() {
        const spread = document.querySelector('#flipbook-viewer .ob-reader-spread');
        if (!spread) return;
        const mobile = window.matchMedia('(max-width: 800px)').matches;
        const baseline = mobile
          ? Math.min(window.innerWidth * (pageCount > 2 ? 0.70 : 0.82), pageCount > 2 ? 360 : 430)
          : Math.max(50, (spread.clientWidth - 8 - (pageCount - 1) * 12) / pageCount);
        const width = Math.max(50, Math.round(baseline * scale / 2.0));
        for (let i = 0; i < canvases.length; i++) {
          canvases[i].style.setProperty('width', width + 'px', 'important');
          canvases[i].style.setProperty('max-width', 'none', 'important');
        }
        const totalWidth = width * pageCount + 12 * (pageCount - 1);
        spread.classList.toggle('ob-reader-zoom-overflow', totalWidth > spread.clientWidth - 8);
        const indicator = document.getElementById('obZoomIndicator');
        if (indicator) indicator.textContent = String(Math.round(scale * 50)) + '%';
      }

      function updateScale() {
        const requested = parseFloat(document.getElementById('scaleSelect').value);
        if (!Number.isFinite(requested) || requested < 1 || requested > 4) return;
        scale = requested;
        renderPages();
      }

      function updateBandwidth() {
        const high = document.getElementById('bandwidthToggle').checked;
        const ultra = document.getElementById('ultraBandwidthToggle').checked;
        pageCount = ultra ? 8 : high ? 4 : 2;
        document.getElementById('flipbook-viewer').setAttribute('data-page-count', String(pageCount));
        renderPages();
      }

      function goToPage() {
        const selected = parseInt(document.getElementById('pageSelect').value, 10);
        if (!Number.isFinite(selected)) return;
        pageNum = selected % 2 === 0 ? selected - 1 : selected;
        renderPages();
      }

      function renderPages() {
        const generation = ++renderGeneration;
        // Cancel outdated jobs before a rapid zoom/page change. Per-canvas
        // queues below prevent concurrent PDF.js rendering onto one canvas.
        activeRenderTasks.forEach(task => {
          if (task) {
            try { task.cancel(); } catch (error) { /* already completed */ }
          }
        });
        updateCanvasWidths();
        const pageEnd = Math.min(pageNum + pageCount - 1, maxPages);
        const readerStatus = document.getElementById('obReaderStatus');
        if (readerStatus) readerStatus.textContent = `Pages ${pageNum}-${pageEnd} of ${maxPages}`;
        const pageSelect = document.getElementById('pageSelect');
        if (pageSelect) pageSelect.value = String(pageNum);
        for (let i = 0; i < 8; i++) {
          const part = pageNum + i;
          if (i < pageCount && part <= maxPages) {
            canvases[i].style.display = 'inline-block';
            canvasQueues[i] = canvasQueues[i].catch(() => {}).then(() => {
              if (generation !== renderGeneration) return;
              return renderPage(part, canvases[i], contexts[i], i, generation);
            });
          } else {
            canvases[i].style.display = 'none';
          }
        }
      }

      async function renderPage(num, canvas, ctx, index, generation) {
        const url = `/stream_pdf_from_local_zip.php?name=${encodeURIComponent(bookName)}&part=${encodeURIComponent(num)}&category=${encodeURIComponent(category)}`;
        let loadingTask = null;
        let pdf = null;
        let renderTask = null;
        try {
          // Disable PDF.js's PDF-supplied JavaScript evaluation feature.
          loadingTask = pdfjsLib.getDocument({ url: url, isEvalSupported: false });
          pdf = await loadingTask.promise;
          if (generation !== renderGeneration) return;
          const page = await pdf.getPage(1);
          if (generation !== renderGeneration) return;
          const viewport = page.getViewport({ scale: scale });
          canvas.width = Math.ceil(viewport.width);
          canvas.height = Math.ceil(viewport.height);
          renderTask = page.render({ canvasContext: ctx, viewport: viewport });
          activeRenderTasks[index] = renderTask;
          await renderTask.promise;
        } catch (error) {
          if (error && error.name === 'RenderingCancelledException') return;
          if (generation === renderGeneration) {
            const status = document.getElementById('obReaderStatus');
            if (status) status.textContent = 'Could not load page ' + num + '. Please try again.';
            console.error('OriginalBibles reader: page render failed', error);
          }
        } finally {
          if (renderTask && activeRenderTasks[index] === renderTask) activeRenderTasks[index] = null;
          if (pdf) {
            try { await pdf.destroy(); } catch (error) { /* release best effort */ }
          } else if (loadingTask && generation !== renderGeneration) {
            try { await loadingTask.destroy(); } catch (error) { /* release best effort */ }
          }
        }
      }

      let readerResizeFrame = null;
      window.addEventListener('resize', function () {
        if (readerResizeFrame !== null) cancelAnimationFrame(readerResizeFrame);
        readerResizeFrame = requestAnimationFrame(function () {
          readerResizeFrame = null;
          updateCanvasWidths();
        });
      });

      function nextPage() {
        if (pageNum + pageCount <= maxPages) {
          pageNum += pageCount;
          flip();
          renderPages();
        }
      }

      function prevPage() {
        if (pageNum - pageCount >= 1) {
          pageNum -= pageCount;
          flip();
          renderPages();
        }
      }

      function flip() {
        for (let i = 0; i < pageCount; i++) {
          canvases[i].style.transform = 'rotateY(180deg)';
        }
        setTimeout(() => {
          for (let i = 0; i < pageCount; i++) {
            canvases[i].style.transform = '';
          }
        }, 600);
      }

      function popOutPage() {
        const url = `/stream_pdf_from_local_zip.php?name=${encodeURIComponent(bookName)}&part=${encodeURIComponent(pageNum)}&category=${encodeURIComponent(category)}`;
        window.open(url, '_blank');
      }

      renderPages();
    </script>
    
<p>    <style>
    #geminiModal {
        display: none;
        position: fixed;
        top: 20%;
        left: 50%;
        transform: translateX(-50%);
        width: 60%;
        background: #fdfcf7;
        border: 1px solid #ccc;
        padding: 20px;
        box-shadow: 0 0 20px rgba(0,0,0,0.3);
        z-index: 9999;
        font-family: 'Georgia', serif;
        opacity: 0;
        transition: opacity 0.5s ease-in-out;
    }
    #geminiModal.show { display: block; opacity: 1; }
    #geminiModalText { white-space: pre-wrap; font-size: 16px; color: #3b2f1e; }

    #assistant-launcher button {
        font-family: 'Georgia', serif;
        background-color: #eae6d9;
        border: 1px solid #ccc;
        color: #3b2f1e;
        cursor: pointer;
        padding: 10px 20px;
        font-size: 16px;
        margin-right: 10px;
        margin-top: 10px;
    }
    #assistant-launcher textarea {
        font-family: 'Georgia', serif;
        background-color: #fffef8;
        border: 1px solid #ccc;
        color: #3b2f1e;
        padding: 10px;
        font-size: 16px;
        resize: vertical;
        width: 60%;
    }
    </style>

    <div id="assistant-launcher" style="text-align:center; margin:40px 0 20px 0;">
        <textarea id="sacredPrompt" placeholder="Enter your theological or Biblical questions... (AI can make mistakes so be aware!)" rows="4"></textarea><br><br>
        <button onclick="launchCopilot()">Ask Copilot</button>
        <button onclick="launchChatGPT()">Ask ChatGPT</button>
        <button onclick="launchGeminiModal()">Ask Gemini</button>
    </div>

    <div id="geminiModal">
        <p id="geminiModalText"></p>
        <button onclick="confirmGemini()">Open Gemini</button>
        <button onclick="closeGeminiModal()" style="margin-left:10px;">Cancel</button>
    </div>

    <script>
    async function getSacredQuery() {
        const userInput = document.getElementById("sacredPrompt").value.trim();
        if (!userInput) return null;

        const frame = `As a biblical scholar engaging with sacred scripture, I seek a reverent, theologically grounded analysis of the following passage. Please treat the text as divinely inspired and central to Christian tradition. Your response should include canonical context (situating the passage within the broader biblical canon and theological tradition), historical background (relevant cultural, geopolitical, and religious context at the time of composition), literary structure (analysis of composition, genre, and rhetorical features), and theological interpretation (a coherent, tradition-respecting reading consistent with respected scholarly perspectives). Include original-language forms in Hebrew (Tanakh), Greek (Septuagint or New Testament), and Aramaic (where applicable), with transliteration, translation, and brief commentary on linguistic nuance. Avoid reduction to metaphor or myth. Emphasize theological coherence, canonical fidelity, and interpretive depth. Reference the Oxford Bible Commentary where appropriate, and draw from respected scholarly traditions rooted in historical-critical, canonical, and theological methodologies. Please do not include the sacred name Yahweh or other divine names that may cause discomfort or offense among Christians and Jews. Use respectful and widely accepted alternatives such as “God” or “The Lord.`;

        return encodeURIComponent(frame + " " + userInput);
    }

    async function launchCopilot() {
        const query = await getSacredQuery();
        if (!query) return;
        openPopup(`https://copilot.microsoft.com/?q=${query}`);
    }

    async function launchChatGPT() {
        const query = await getSacredQuery();
        if (!query) return;
        openPopup(`https://chat.openai.com/?q=${query}`);
    }

    async function launchGeminiModal() {
        const query = await getSacredQuery();
        if (!query) return;
        const promptText = decodeURIComponent(query);
        const modal = document.getElementById("geminiModal");
        document.getElementById("geminiModalText").innerText =
            "Gemini will open in a new window. Please paste or retype your sacred question to begin:\n\n" + promptText;
        modal.classList.add("show");
    }

    function confirmGemini() { openPopup("https://gemini.google.com/"); closeGeminiModal(); }
    function closeGeminiModal() {
        const modal = document.getElementById("geminiModal");
        modal.classList.remove("show");
        setTimeout(() => { modal.style.display = "none"; }, 500);
    }

    function openPopup(url) {
        const isMobile = window.innerWidth < 768;
        if (isMobile) {
            alert("Opening in a new tab for better mobile experience.");
            window.location.href = url;
        } else {
            const screenX = typeof window.screenX !== 'undefined' ? window.screenX : window.screenLeft;
            const screenY = typeof window.screenY !== 'undefined' ? window.screenY : window.screenTop;
            const outerWidth = typeof window.outerWidth !== 'undefined' ? window.outerWidth : document.documentElement.clientWidth;
            const outerHeight = typeof window.outerHeight !== 'undefined' ? window.outerHeight : document.documentElement.clientHeight;

            const width = Math.floor(outerWidth * 0.3);
            const height = Math.floor(outerHeight * 0.3);
            const left = screenX + Math.floor((outerWidth - width) / 2);
            const top = screenY + Math.floor((outerHeight - height) / 2);

            window.open(
                url,
                "AssistantPopup",
                `width=${width},height=${height},top=${top},left=${left},` +
                "noopener,noreferrer,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes,resizable=yes"
            );
        }
    }
    </script>
    <br />
Index of the book (please forgive any unreadable bits: this index is computer generated from ancient texts):</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.originalbibles.com/the-massoretic-notes-alfred-s-geden-1905-pdf/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>The Massorah &#8211; The Hebrew Notes (With English Translations) &#8211; Ginsburg 1889 PDF Part 6</title>
		<link>https://www.originalbibles.com/the-massorah-the-hebrew-notes-with-english-translations-ginsburg-1889-pdf-part-6/</link>
					<comments>https://www.originalbibles.com/the-massorah-the-hebrew-notes-with-english-translations-ginsburg-1889-pdf-part-6/#respond</comments>
		
		<dc:creator><![CDATA[Editor]]></dc:creator>
		<pubDate>Sat, 23 Feb 2013 09:54:02 +0000</pubDate>
				<category><![CDATA[1800]]></category>
		<category><![CDATA[Hebrew Bible]]></category>
		<category><![CDATA[original book]]></category>
		<category><![CDATA[read on android]]></category>
		<category><![CDATA[read on iphone]]></category>
		<category><![CDATA[The Old Testament]]></category>
		<category><![CDATA[read on tablet]]></category>
		<category><![CDATA[read on apple]]></category>
		<category><![CDATA[hebrew]]></category>
		<category><![CDATA[masoretic]]></category>
		<category><![CDATA[Christian D. Ginsburg]]></category>
		<category><![CDATA[massorah]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[read online]]></category>
		<guid isPermaLink="false">http://originalbibles.com/?p=1788</guid>

					<description><![CDATA[The Massorah 1889 PDF &#8211; Part 6 The Massorah are the Hebrew notes that go...]]></description>
										<content:encoded><![CDATA[<h3>The Massorah 1889 PDF &#8211; Part 6</h3>
<p>The Massorah are the Hebrew notes that go with the Old Testament in Hebrew. The books by Ginsburg also have English translations (this part does not).</p>
<p>These notes should be of much use to Bible readers and scholars around the world.</p>
<p>Please be advised, that with all ancient texts, one must be careful and view it together with other editions/reprints (in case some text is lost or unreadable due to age etcetera). However, this does not reduce the pleasure of reading the original and ancient texts!</p>
    <div id="flipbook-controls" style="text-align:center; margin-bottom:10px;">
      <label for="scaleSelect">Page Zoom:</label>
      <select id="scaleSelect" onchange="updateScale()" style="font-size:16px; padding:4px;">
        <option value="1.0">50% — Extra Small</option>
        <option value="1.5">75% — Small</option>
        <option value="2.0" selected>100% — Medium</option>
        <option value="2.5">125% — Large</option>
        <option value="3.0">150% — Extra Large</option>
        <option value="4.0">200% — XL</option>
      </select>
      <span class="ob-zoom-indicator" id="obZoomIndicator" aria-live="polite">100%</span>

      <label for="pageSelect" style="margin-left:20px;">Go to Page:</label>
      <select id="pageSelect" onchange="goToPage()" style="font-size:16px; padding:4px;">
                  <option value="1">1</option>
                  <option value="2">2</option>
                  <option value="3">3</option>
                  <option value="4">4</option>
                  <option value="5">5</option>
                  <option value="6">6</option>
                  <option value="7">7</option>
                  <option value="8">8</option>
                  <option value="9">9</option>
                  <option value="10">10</option>
                  <option value="11">11</option>
                  <option value="12">12</option>
                  <option value="13">13</option>
                  <option value="14">14</option>
                  <option value="15">15</option>
                  <option value="16">16</option>
                  <option value="17">17</option>
                  <option value="18">18</option>
                  <option value="19">19</option>
                  <option value="20">20</option>
                  <option value="21">21</option>
                  <option value="22">22</option>
                  <option value="23">23</option>
                  <option value="24">24</option>
                  <option value="25">25</option>
                  <option value="26">26</option>
                  <option value="27">27</option>
                  <option value="28">28</option>
                  <option value="29">29</option>
                  <option value="30">30</option>
                  <option value="31">31</option>
                  <option value="32">32</option>
                  <option value="33">33</option>
                  <option value="34">34</option>
                  <option value="35">35</option>
                  <option value="36">36</option>
                  <option value="37">37</option>
                  <option value="38">38</option>
                  <option value="39">39</option>
                  <option value="40">40</option>
                  <option value="41">41</option>
                  <option value="42">42</option>
                  <option value="43">43</option>
                  <option value="44">44</option>
                  <option value="45">45</option>
                  <option value="46">46</option>
                  <option value="47">47</option>
                  <option value="48">48</option>
                  <option value="49">49</option>
                  <option value="50">50</option>
                  <option value="51">51</option>
                  <option value="52">52</option>
                  <option value="53">53</option>
                  <option value="54">54</option>
                  <option value="55">55</option>
                  <option value="56">56</option>
                  <option value="57">57</option>
                  <option value="58">58</option>
                  <option value="59">59</option>
                  <option value="60">60</option>
                  <option value="61">61</option>
                  <option value="62">62</option>
                  <option value="63">63</option>
                  <option value="64">64</option>
                  <option value="65">65</option>
                  <option value="66">66</option>
                  <option value="67">67</option>
                  <option value="68">68</option>
                  <option value="69">69</option>
                  <option value="70">70</option>
              </select>

      <label style="margin-left:20px;">
        <input type="checkbox" id="bandwidthToggle" onchange="updateBandwidth()" />
        High Bandwidth Mode (4 pages per screen)
      </label>

      <label style="margin-left:20px;">
        <input type="checkbox" id="ultraBandwidthToggle" onchange="updateBandwidth()" />
        Ultra Bandwidth Mode (8 pages per screen)
      </label>
    </div>

    <div id="flipbook-viewer" data-page-count="2" style="text-align:center;">
      <div style="margin-bottom:10px;">
        <button onclick="popOutPage()" style="font-size:16px; padding:6px 12px;"> Pop Out Page</button>
      </div>


      <div style="margin-top:20px;">
        <button onclick="prevPage()"> Prev</button>
        <button onclick="nextPage()">Next </button>
      </div>


      <div class="ob-reader-spread" role="group" aria-label="Scanned book pages">
                  <canvas id="pageCanvas0" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:inline-block;"></canvas>
                  <canvas id="pageCanvas1" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:inline-block;"></canvas>
                  <canvas id="pageCanvas2" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas3" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas4" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas5" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas6" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas7" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
              </div>
      <p class="ob-reader-status" id="obReaderStatus" aria-live="polite"></p>
      <p class="ob-reader-swipe-hint">Swipe sideways to view additional scanned pages.</p>

      <div style="margin-top:20px;">
        <button onclick="prevPage()"> Prev</button>
        <button onclick="nextPage()">Next </button>
      </div>
    </div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"></script>
    <script>
      const bookName = "GinsburgMassoraP61889";
      const maxPages = 70;
      const category = "Hebrew";
      let pageNum = 1;
      let scale = 2.0;
      let pageCount = 2;
      let renderGeneration = 0;
      const activeRenderTasks = new Array(8).fill(null);
      const canvasQueues = Array.from({ length: 8 }, () => Promise.resolve());

      const canvases = [];
      const contexts = [];
      for (let i = 0; i < 8; i++) {
        canvases[i] = document.getElementById('pageCanvas' + i);
        contexts[i] = canvases[i].getContext('2d');
      }

      // The reader's original stylesheet fixed all canvases at 50%/25%/12.5%
      // width, meaning the old Zoom/Quality menu only changed resolution.
      // Here we size the *visible* pages as well, allowing sideways scrolling
      // when a spread is wider than the reader.
      function updateCanvasWidths() {
        const spread = document.querySelector('#flipbook-viewer .ob-reader-spread');
        if (!spread) return;
        const mobile = window.matchMedia('(max-width: 800px)').matches;
        const baseline = mobile
          ? Math.min(window.innerWidth * (pageCount > 2 ? 0.70 : 0.82), pageCount > 2 ? 360 : 430)
          : Math.max(50, (spread.clientWidth - 8 - (pageCount - 1) * 12) / pageCount);
        const width = Math.max(50, Math.round(baseline * scale / 2.0));
        for (let i = 0; i < canvases.length; i++) {
          canvases[i].style.setProperty('width', width + 'px', 'important');
          canvases[i].style.setProperty('max-width', 'none', 'important');
        }
        const totalWidth = width * pageCount + 12 * (pageCount - 1);
        spread.classList.toggle('ob-reader-zoom-overflow', totalWidth > spread.clientWidth - 8);
        const indicator = document.getElementById('obZoomIndicator');
        if (indicator) indicator.textContent = String(Math.round(scale * 50)) + '%';
      }

      function updateScale() {
        const requested = parseFloat(document.getElementById('scaleSelect').value);
        if (!Number.isFinite(requested) || requested < 1 || requested > 4) return;
        scale = requested;
        renderPages();
      }

      function updateBandwidth() {
        const high = document.getElementById('bandwidthToggle').checked;
        const ultra = document.getElementById('ultraBandwidthToggle').checked;
        pageCount = ultra ? 8 : high ? 4 : 2;
        document.getElementById('flipbook-viewer').setAttribute('data-page-count', String(pageCount));
        renderPages();
      }

      function goToPage() {
        const selected = parseInt(document.getElementById('pageSelect').value, 10);
        if (!Number.isFinite(selected)) return;
        pageNum = selected % 2 === 0 ? selected - 1 : selected;
        renderPages();
      }

      function renderPages() {
        const generation = ++renderGeneration;
        // Cancel outdated jobs before a rapid zoom/page change. Per-canvas
        // queues below prevent concurrent PDF.js rendering onto one canvas.
        activeRenderTasks.forEach(task => {
          if (task) {
            try { task.cancel(); } catch (error) { /* already completed */ }
          }
        });
        updateCanvasWidths();
        const pageEnd = Math.min(pageNum + pageCount - 1, maxPages);
        const readerStatus = document.getElementById('obReaderStatus');
        if (readerStatus) readerStatus.textContent = `Pages ${pageNum}-${pageEnd} of ${maxPages}`;
        const pageSelect = document.getElementById('pageSelect');
        if (pageSelect) pageSelect.value = String(pageNum);
        for (let i = 0; i < 8; i++) {
          const part = pageNum + i;
          if (i < pageCount && part <= maxPages) {
            canvases[i].style.display = 'inline-block';
            canvasQueues[i] = canvasQueues[i].catch(() => {}).then(() => {
              if (generation !== renderGeneration) return;
              return renderPage(part, canvases[i], contexts[i], i, generation);
            });
          } else {
            canvases[i].style.display = 'none';
          }
        }
      }

      async function renderPage(num, canvas, ctx, index, generation) {
        const url = `/stream_pdf_from_local_zip.php?name=${encodeURIComponent(bookName)}&part=${encodeURIComponent(num)}&category=${encodeURIComponent(category)}`;
        let loadingTask = null;
        let pdf = null;
        let renderTask = null;
        try {
          // Disable PDF.js's PDF-supplied JavaScript evaluation feature.
          loadingTask = pdfjsLib.getDocument({ url: url, isEvalSupported: false });
          pdf = await loadingTask.promise;
          if (generation !== renderGeneration) return;
          const page = await pdf.getPage(1);
          if (generation !== renderGeneration) return;
          const viewport = page.getViewport({ scale: scale });
          canvas.width = Math.ceil(viewport.width);
          canvas.height = Math.ceil(viewport.height);
          renderTask = page.render({ canvasContext: ctx, viewport: viewport });
          activeRenderTasks[index] = renderTask;
          await renderTask.promise;
        } catch (error) {
          if (error && error.name === 'RenderingCancelledException') return;
          if (generation === renderGeneration) {
            const status = document.getElementById('obReaderStatus');
            if (status) status.textContent = 'Could not load page ' + num + '. Please try again.';
            console.error('OriginalBibles reader: page render failed', error);
          }
        } finally {
          if (renderTask && activeRenderTasks[index] === renderTask) activeRenderTasks[index] = null;
          if (pdf) {
            try { await pdf.destroy(); } catch (error) { /* release best effort */ }
          } else if (loadingTask && generation !== renderGeneration) {
            try { await loadingTask.destroy(); } catch (error) { /* release best effort */ }
          }
        }
      }

      let readerResizeFrame = null;
      window.addEventListener('resize', function () {
        if (readerResizeFrame !== null) cancelAnimationFrame(readerResizeFrame);
        readerResizeFrame = requestAnimationFrame(function () {
          readerResizeFrame = null;
          updateCanvasWidths();
        });
      });

      function nextPage() {
        if (pageNum + pageCount <= maxPages) {
          pageNum += pageCount;
          flip();
          renderPages();
        }
      }

      function prevPage() {
        if (pageNum - pageCount >= 1) {
          pageNum -= pageCount;
          flip();
          renderPages();
        }
      }

      function flip() {
        for (let i = 0; i < pageCount; i++) {
          canvases[i].style.transform = 'rotateY(180deg)';
        }
        setTimeout(() => {
          for (let i = 0; i < pageCount; i++) {
            canvases[i].style.transform = '';
          }
        }, 600);
      }

      function popOutPage() {
        const url = `/stream_pdf_from_local_zip.php?name=${encodeURIComponent(bookName)}&part=${encodeURIComponent(pageNum)}&category=${encodeURIComponent(category)}`;
        window.open(url, '_blank');
      }

      renderPages();
    </script>
    
<p>    <style>
    #geminiModal {
        display: none;
        position: fixed;
        top: 20%;
        left: 50%;
        transform: translateX(-50%);
        width: 60%;
        background: #fdfcf7;
        border: 1px solid #ccc;
        padding: 20px;
        box-shadow: 0 0 20px rgba(0,0,0,0.3);
        z-index: 9999;
        font-family: 'Georgia', serif;
        opacity: 0;
        transition: opacity 0.5s ease-in-out;
    }
    #geminiModal.show { display: block; opacity: 1; }
    #geminiModalText { white-space: pre-wrap; font-size: 16px; color: #3b2f1e; }

    #assistant-launcher button {
        font-family: 'Georgia', serif;
        background-color: #eae6d9;
        border: 1px solid #ccc;
        color: #3b2f1e;
        cursor: pointer;
        padding: 10px 20px;
        font-size: 16px;
        margin-right: 10px;
        margin-top: 10px;
    }
    #assistant-launcher textarea {
        font-family: 'Georgia', serif;
        background-color: #fffef8;
        border: 1px solid #ccc;
        color: #3b2f1e;
        padding: 10px;
        font-size: 16px;
        resize: vertical;
        width: 60%;
    }
    </style>

    <div id="assistant-launcher" style="text-align:center; margin:40px 0 20px 0;">
        <textarea id="sacredPrompt" placeholder="Enter your theological or Biblical questions... (AI can make mistakes so be aware!)" rows="4"></textarea><br><br>
        <button onclick="launchCopilot()">Ask Copilot</button>
        <button onclick="launchChatGPT()">Ask ChatGPT</button>
        <button onclick="launchGeminiModal()">Ask Gemini</button>
    </div>

    <div id="geminiModal">
        <p id="geminiModalText"></p>
        <button onclick="confirmGemini()">Open Gemini</button>
        <button onclick="closeGeminiModal()" style="margin-left:10px;">Cancel</button>
    </div>

    <script>
    async function getSacredQuery() {
        const userInput = document.getElementById("sacredPrompt").value.trim();
        if (!userInput) return null;

        const frame = `As a biblical scholar engaging with sacred scripture, I seek a reverent, theologically grounded analysis of the following passage. Please treat the text as divinely inspired and central to Christian tradition. Your response should include canonical context (situating the passage within the broader biblical canon and theological tradition), historical background (relevant cultural, geopolitical, and religious context at the time of composition), literary structure (analysis of composition, genre, and rhetorical features), and theological interpretation (a coherent, tradition-respecting reading consistent with respected scholarly perspectives). Include original-language forms in Hebrew (Tanakh), Greek (Septuagint or New Testament), and Aramaic (where applicable), with transliteration, translation, and brief commentary on linguistic nuance. Avoid reduction to metaphor or myth. Emphasize theological coherence, canonical fidelity, and interpretive depth. Reference the Oxford Bible Commentary where appropriate, and draw from respected scholarly traditions rooted in historical-critical, canonical, and theological methodologies. Please do not include the sacred name Yahweh or other divine names that may cause discomfort or offense among Christians and Jews. Use respectful and widely accepted alternatives such as “God” or “The Lord.`;

        return encodeURIComponent(frame + " " + userInput);
    }

    async function launchCopilot() {
        const query = await getSacredQuery();
        if (!query) return;
        openPopup(`https://copilot.microsoft.com/?q=${query}`);
    }

    async function launchChatGPT() {
        const query = await getSacredQuery();
        if (!query) return;
        openPopup(`https://chat.openai.com/?q=${query}`);
    }

    async function launchGeminiModal() {
        const query = await getSacredQuery();
        if (!query) return;
        const promptText = decodeURIComponent(query);
        const modal = document.getElementById("geminiModal");
        document.getElementById("geminiModalText").innerText =
            "Gemini will open in a new window. Please paste or retype your sacred question to begin:\n\n" + promptText;
        modal.classList.add("show");
    }

    function confirmGemini() { openPopup("https://gemini.google.com/"); closeGeminiModal(); }
    function closeGeminiModal() {
        const modal = document.getElementById("geminiModal");
        modal.classList.remove("show");
        setTimeout(() => { modal.style.display = "none"; }, 500);
    }

    function openPopup(url) {
        const isMobile = window.innerWidth < 768;
        if (isMobile) {
            alert("Opening in a new tab for better mobile experience.");
            window.location.href = url;
        } else {
            const screenX = typeof window.screenX !== 'undefined' ? window.screenX : window.screenLeft;
            const screenY = typeof window.screenY !== 'undefined' ? window.screenY : window.screenTop;
            const outerWidth = typeof window.outerWidth !== 'undefined' ? window.outerWidth : document.documentElement.clientWidth;
            const outerHeight = typeof window.outerHeight !== 'undefined' ? window.outerHeight : document.documentElement.clientHeight;

            const width = Math.floor(outerWidth * 0.3);
            const height = Math.floor(outerHeight * 0.3);
            const left = screenX + Math.floor((outerWidth - width) / 2);
            const top = screenY + Math.floor((outerHeight - height) / 2);

            window.open(
                url,
                "AssistantPopup",
                `width=${width},height=${height},top=${top},left=${left},` +
                "noopener,noreferrer,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes,resizable=yes"
            );
        }
    }
    </script>
    <br />
Index of the book (please forgive any unreadable bits: this index is computer generated from ancient texts):</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.originalbibles.com/the-massorah-the-hebrew-notes-with-english-translations-ginsburg-1889-pdf-part-6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>The Massorah &#8211; The Hebrew Notes (With English Translations) &#8211; Ginsburg 1880 PDF Volume 4</title>
		<link>https://www.originalbibles.com/the-massorah-the-hebrew-notes-with-english-translations-ginsburg-1880-pdf-volume-4/</link>
					<comments>https://www.originalbibles.com/the-massorah-the-hebrew-notes-with-english-translations-ginsburg-1880-pdf-volume-4/#respond</comments>
		
		<dc:creator><![CDATA[Editor]]></dc:creator>
		<pubDate>Sat, 23 Feb 2013 09:46:29 +0000</pubDate>
				<category><![CDATA[Hebrew Bible]]></category>
		<category><![CDATA[1800]]></category>
		<category><![CDATA[read on apple]]></category>
		<category><![CDATA[masoretic]]></category>
		<category><![CDATA[Christian D. Ginsburg]]></category>
		<category><![CDATA[massorah]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[read online]]></category>
		<category><![CDATA[original book]]></category>
		<category><![CDATA[old testament]]></category>
		<category><![CDATA[read on android]]></category>
		<category><![CDATA[read on iphone]]></category>
		<category><![CDATA[The Old Testament]]></category>
		<category><![CDATA[read on tablet]]></category>
		<guid isPermaLink="false">http://originalbibles.com/?p=1784</guid>

					<description><![CDATA[The Massorah 1880 PDF &#8211; Ginsburg &#8211; Volume IV This is part 5 of a...]]></description>
										<content:encoded><![CDATA[<h3>The Massorah 1880 PDF &#8211; Ginsburg &#8211; Volume IV</h3>
<p>This is part 5 of a number of books by Christian D. Ginsburg (LL.D) regarding the Hebrew Bible. The Massorah are the Hebrew notes that go with the Old Testament in Hebrew. The books by Ginsburg also have English translations.</p>
<p>This book is Volume 4</p>
<p>These notes should be of much use to Bible readers and scholars around the world.</p>
<p>Please be advised, that with all ancient texts, one must be careful and view it together with other editions/reprints (in case some text is lost or unreadable due to age etcetera). However, this does not reduce the pleasure of reading the original and ancient texts!</p>
    <div id="flipbook-controls" style="text-align:center; margin-bottom:10px;">
      <label for="scaleSelect">Page Zoom:</label>
      <select id="scaleSelect" onchange="updateScale()" style="font-size:16px; padding:4px;">
        <option value="1.0">50% — Extra Small</option>
        <option value="1.5">75% — Small</option>
        <option value="2.0" selected>100% — Medium</option>
        <option value="2.5">125% — Large</option>
        <option value="3.0">150% — Extra Large</option>
        <option value="4.0">200% — XL</option>
      </select>
      <span class="ob-zoom-indicator" id="obZoomIndicator" aria-live="polite">100%</span>

      <label for="pageSelect" style="margin-left:20px;">Go to Page:</label>
      <select id="pageSelect" onchange="goToPage()" style="font-size:16px; padding:4px;">
                  <option value="1">1</option>
                  <option value="2">2</option>
                  <option value="3">3</option>
                  <option value="4">4</option>
                  <option value="5">5</option>
                  <option value="6">6</option>
                  <option value="7">7</option>
                  <option value="8">8</option>
                  <option value="9">9</option>
                  <option value="10">10</option>
                  <option value="11">11</option>
                  <option value="12">12</option>
                  <option value="13">13</option>
                  <option value="14">14</option>
                  <option value="15">15</option>
                  <option value="16">16</option>
                  <option value="17">17</option>
                  <option value="18">18</option>
                  <option value="19">19</option>
                  <option value="20">20</option>
                  <option value="21">21</option>
                  <option value="22">22</option>
                  <option value="23">23</option>
                  <option value="24">24</option>
                  <option value="25">25</option>
                  <option value="26">26</option>
                  <option value="27">27</option>
                  <option value="28">28</option>
                  <option value="29">29</option>
                  <option value="30">30</option>
                  <option value="31">31</option>
                  <option value="32">32</option>
                  <option value="33">33</option>
                  <option value="34">34</option>
                  <option value="35">35</option>
                  <option value="36">36</option>
                  <option value="37">37</option>
                  <option value="38">38</option>
                  <option value="39">39</option>
                  <option value="40">40</option>
                  <option value="41">41</option>
                  <option value="42">42</option>
                  <option value="43">43</option>
                  <option value="44">44</option>
                  <option value="45">45</option>
                  <option value="46">46</option>
                  <option value="47">47</option>
                  <option value="48">48</option>
                  <option value="49">49</option>
                  <option value="50">50</option>
                  <option value="51">51</option>
                  <option value="52">52</option>
                  <option value="53">53</option>
                  <option value="54">54</option>
                  <option value="55">55</option>
                  <option value="56">56</option>
                  <option value="57">57</option>
                  <option value="58">58</option>
                  <option value="59">59</option>
                  <option value="60">60</option>
                  <option value="61">61</option>
                  <option value="62">62</option>
                  <option value="63">63</option>
                  <option value="64">64</option>
                  <option value="65">65</option>
                  <option value="66">66</option>
                  <option value="67">67</option>
                  <option value="68">68</option>
                  <option value="69">69</option>
                  <option value="70">70</option>
                  <option value="71">71</option>
                  <option value="72">72</option>
                  <option value="73">73</option>
                  <option value="74">74</option>
                  <option value="75">75</option>
                  <option value="76">76</option>
                  <option value="77">77</option>
                  <option value="78">78</option>
                  <option value="79">79</option>
                  <option value="80">80</option>
                  <option value="81">81</option>
                  <option value="82">82</option>
                  <option value="83">83</option>
                  <option value="84">84</option>
                  <option value="85">85</option>
                  <option value="86">86</option>
                  <option value="87">87</option>
                  <option value="88">88</option>
                  <option value="89">89</option>
                  <option value="90">90</option>
                  <option value="91">91</option>
                  <option value="92">92</option>
                  <option value="93">93</option>
                  <option value="94">94</option>
                  <option value="95">95</option>
                  <option value="96">96</option>
                  <option value="97">97</option>
                  <option value="98">98</option>
                  <option value="99">99</option>
                  <option value="100">100</option>
                  <option value="101">101</option>
                  <option value="102">102</option>
                  <option value="103">103</option>
                  <option value="104">104</option>
                  <option value="105">105</option>
                  <option value="106">106</option>
                  <option value="107">107</option>
                  <option value="108">108</option>
                  <option value="109">109</option>
                  <option value="110">110</option>
                  <option value="111">111</option>
                  <option value="112">112</option>
                  <option value="113">113</option>
                  <option value="114">114</option>
                  <option value="115">115</option>
                  <option value="116">116</option>
                  <option value="117">117</option>
                  <option value="118">118</option>
                  <option value="119">119</option>
                  <option value="120">120</option>
                  <option value="121">121</option>
                  <option value="122">122</option>
                  <option value="123">123</option>
                  <option value="124">124</option>
                  <option value="125">125</option>
                  <option value="126">126</option>
                  <option value="127">127</option>
                  <option value="128">128</option>
                  <option value="129">129</option>
                  <option value="130">130</option>
                  <option value="131">131</option>
                  <option value="132">132</option>
                  <option value="133">133</option>
                  <option value="134">134</option>
                  <option value="135">135</option>
                  <option value="136">136</option>
                  <option value="137">137</option>
                  <option value="138">138</option>
                  <option value="139">139</option>
                  <option value="140">140</option>
                  <option value="141">141</option>
                  <option value="142">142</option>
                  <option value="143">143</option>
                  <option value="144">144</option>
                  <option value="145">145</option>
                  <option value="146">146</option>
                  <option value="147">147</option>
                  <option value="148">148</option>
                  <option value="149">149</option>
                  <option value="150">150</option>
                  <option value="151">151</option>
                  <option value="152">152</option>
                  <option value="153">153</option>
                  <option value="154">154</option>
                  <option value="155">155</option>
                  <option value="156">156</option>
                  <option value="157">157</option>
                  <option value="158">158</option>
                  <option value="159">159</option>
                  <option value="160">160</option>
                  <option value="161">161</option>
                  <option value="162">162</option>
                  <option value="163">163</option>
                  <option value="164">164</option>
                  <option value="165">165</option>
                  <option value="166">166</option>
                  <option value="167">167</option>
                  <option value="168">168</option>
                  <option value="169">169</option>
                  <option value="170">170</option>
                  <option value="171">171</option>
                  <option value="172">172</option>
                  <option value="173">173</option>
                  <option value="174">174</option>
                  <option value="175">175</option>
                  <option value="176">176</option>
                  <option value="177">177</option>
                  <option value="178">178</option>
                  <option value="179">179</option>
                  <option value="180">180</option>
                  <option value="181">181</option>
                  <option value="182">182</option>
                  <option value="183">183</option>
                  <option value="184">184</option>
                  <option value="185">185</option>
                  <option value="186">186</option>
                  <option value="187">187</option>
                  <option value="188">188</option>
                  <option value="189">189</option>
                  <option value="190">190</option>
                  <option value="191">191</option>
                  <option value="192">192</option>
                  <option value="193">193</option>
                  <option value="194">194</option>
                  <option value="195">195</option>
                  <option value="196">196</option>
                  <option value="197">197</option>
                  <option value="198">198</option>
                  <option value="199">199</option>
                  <option value="200">200</option>
                  <option value="201">201</option>
                  <option value="202">202</option>
                  <option value="203">203</option>
                  <option value="204">204</option>
                  <option value="205">205</option>
                  <option value="206">206</option>
                  <option value="207">207</option>
                  <option value="208">208</option>
                  <option value="209">209</option>
                  <option value="210">210</option>
                  <option value="211">211</option>
                  <option value="212">212</option>
                  <option value="213">213</option>
                  <option value="214">214</option>
                  <option value="215">215</option>
                  <option value="216">216</option>
                  <option value="217">217</option>
                  <option value="218">218</option>
                  <option value="219">219</option>
                  <option value="220">220</option>
                  <option value="221">221</option>
                  <option value="222">222</option>
                  <option value="223">223</option>
                  <option value="224">224</option>
                  <option value="225">225</option>
                  <option value="226">226</option>
                  <option value="227">227</option>
                  <option value="228">228</option>
                  <option value="229">229</option>
                  <option value="230">230</option>
                  <option value="231">231</option>
                  <option value="232">232</option>
                  <option value="233">233</option>
                  <option value="234">234</option>
                  <option value="235">235</option>
                  <option value="236">236</option>
                  <option value="237">237</option>
                  <option value="238">238</option>
                  <option value="239">239</option>
                  <option value="240">240</option>
                  <option value="241">241</option>
                  <option value="242">242</option>
                  <option value="243">243</option>
                  <option value="244">244</option>
                  <option value="245">245</option>
                  <option value="246">246</option>
                  <option value="247">247</option>
                  <option value="248">248</option>
                  <option value="249">249</option>
                  <option value="250">250</option>
                  <option value="251">251</option>
                  <option value="252">252</option>
                  <option value="253">253</option>
                  <option value="254">254</option>
                  <option value="255">255</option>
                  <option value="256">256</option>
                  <option value="257">257</option>
                  <option value="258">258</option>
                  <option value="259">259</option>
                  <option value="260">260</option>
                  <option value="261">261</option>
                  <option value="262">262</option>
                  <option value="263">263</option>
                  <option value="264">264</option>
                  <option value="265">265</option>
                  <option value="266">266</option>
                  <option value="267">267</option>
                  <option value="268">268</option>
                  <option value="269">269</option>
                  <option value="270">270</option>
                  <option value="271">271</option>
                  <option value="272">272</option>
                  <option value="273">273</option>
                  <option value="274">274</option>
                  <option value="275">275</option>
                  <option value="276">276</option>
                  <option value="277">277</option>
                  <option value="278">278</option>
                  <option value="279">279</option>
                  <option value="280">280</option>
                  <option value="281">281</option>
                  <option value="282">282</option>
                  <option value="283">283</option>
                  <option value="284">284</option>
                  <option value="285">285</option>
                  <option value="286">286</option>
                  <option value="287">287</option>
                  <option value="288">288</option>
                  <option value="289">289</option>
                  <option value="290">290</option>
                  <option value="291">291</option>
                  <option value="292">292</option>
                  <option value="293">293</option>
                  <option value="294">294</option>
                  <option value="295">295</option>
                  <option value="296">296</option>
                  <option value="297">297</option>
                  <option value="298">298</option>
                  <option value="299">299</option>
                  <option value="300">300</option>
                  <option value="301">301</option>
                  <option value="302">302</option>
                  <option value="303">303</option>
                  <option value="304">304</option>
                  <option value="305">305</option>
                  <option value="306">306</option>
                  <option value="307">307</option>
                  <option value="308">308</option>
                  <option value="309">309</option>
                  <option value="310">310</option>
                  <option value="311">311</option>
                  <option value="312">312</option>
                  <option value="313">313</option>
                  <option value="314">314</option>
                  <option value="315">315</option>
                  <option value="316">316</option>
                  <option value="317">317</option>
                  <option value="318">318</option>
                  <option value="319">319</option>
                  <option value="320">320</option>
                  <option value="321">321</option>
                  <option value="322">322</option>
                  <option value="323">323</option>
                  <option value="324">324</option>
                  <option value="325">325</option>
                  <option value="326">326</option>
                  <option value="327">327</option>
                  <option value="328">328</option>
                  <option value="329">329</option>
                  <option value="330">330</option>
                  <option value="331">331</option>
                  <option value="332">332</option>
                  <option value="333">333</option>
                  <option value="334">334</option>
                  <option value="335">335</option>
                  <option value="336">336</option>
                  <option value="337">337</option>
                  <option value="338">338</option>
                  <option value="339">339</option>
                  <option value="340">340</option>
                  <option value="341">341</option>
                  <option value="342">342</option>
                  <option value="343">343</option>
                  <option value="344">344</option>
                  <option value="345">345</option>
                  <option value="346">346</option>
                  <option value="347">347</option>
                  <option value="348">348</option>
                  <option value="349">349</option>
                  <option value="350">350</option>
                  <option value="351">351</option>
                  <option value="352">352</option>
                  <option value="353">353</option>
                  <option value="354">354</option>
                  <option value="355">355</option>
                  <option value="356">356</option>
                  <option value="357">357</option>
                  <option value="358">358</option>
                  <option value="359">359</option>
                  <option value="360">360</option>
                  <option value="361">361</option>
                  <option value="362">362</option>
                  <option value="363">363</option>
                  <option value="364">364</option>
                  <option value="365">365</option>
                  <option value="366">366</option>
                  <option value="367">367</option>
                  <option value="368">368</option>
                  <option value="369">369</option>
                  <option value="370">370</option>
                  <option value="371">371</option>
                  <option value="372">372</option>
                  <option value="373">373</option>
                  <option value="374">374</option>
                  <option value="375">375</option>
                  <option value="376">376</option>
                  <option value="377">377</option>
                  <option value="378">378</option>
                  <option value="379">379</option>
                  <option value="380">380</option>
                  <option value="381">381</option>
                  <option value="382">382</option>
                  <option value="383">383</option>
                  <option value="384">384</option>
                  <option value="385">385</option>
                  <option value="386">386</option>
                  <option value="387">387</option>
                  <option value="388">388</option>
                  <option value="389">389</option>
                  <option value="390">390</option>
                  <option value="391">391</option>
                  <option value="392">392</option>
                  <option value="393">393</option>
                  <option value="394">394</option>
                  <option value="395">395</option>
                  <option value="396">396</option>
                  <option value="397">397</option>
                  <option value="398">398</option>
                  <option value="399">399</option>
                  <option value="400">400</option>
                  <option value="401">401</option>
                  <option value="402">402</option>
                  <option value="403">403</option>
                  <option value="404">404</option>
                  <option value="405">405</option>
                  <option value="406">406</option>
                  <option value="407">407</option>
                  <option value="408">408</option>
                  <option value="409">409</option>
                  <option value="410">410</option>
                  <option value="411">411</option>
                  <option value="412">412</option>
                  <option value="413">413</option>
                  <option value="414">414</option>
                  <option value="415">415</option>
                  <option value="416">416</option>
                  <option value="417">417</option>
                  <option value="418">418</option>
                  <option value="419">419</option>
                  <option value="420">420</option>
                  <option value="421">421</option>
                  <option value="422">422</option>
                  <option value="423">423</option>
                  <option value="424">424</option>
                  <option value="425">425</option>
                  <option value="426">426</option>
                  <option value="427">427</option>
                  <option value="428">428</option>
                  <option value="429">429</option>
                  <option value="430">430</option>
                  <option value="431">431</option>
                  <option value="432">432</option>
                  <option value="433">433</option>
                  <option value="434">434</option>
                  <option value="435">435</option>
                  <option value="436">436</option>
                  <option value="437">437</option>
                  <option value="438">438</option>
                  <option value="439">439</option>
                  <option value="440">440</option>
                  <option value="441">441</option>
                  <option value="442">442</option>
                  <option value="443">443</option>
                  <option value="444">444</option>
                  <option value="445">445</option>
                  <option value="446">446</option>
                  <option value="447">447</option>
                  <option value="448">448</option>
                  <option value="449">449</option>
                  <option value="450">450</option>
                  <option value="451">451</option>
                  <option value="452">452</option>
                  <option value="453">453</option>
                  <option value="454">454</option>
                  <option value="455">455</option>
                  <option value="456">456</option>
                  <option value="457">457</option>
                  <option value="458">458</option>
                  <option value="459">459</option>
                  <option value="460">460</option>
                  <option value="461">461</option>
                  <option value="462">462</option>
                  <option value="463">463</option>
                  <option value="464">464</option>
                  <option value="465">465</option>
                  <option value="466">466</option>
                  <option value="467">467</option>
                  <option value="468">468</option>
                  <option value="469">469</option>
                  <option value="470">470</option>
                  <option value="471">471</option>
                  <option value="472">472</option>
                  <option value="473">473</option>
                  <option value="474">474</option>
                  <option value="475">475</option>
                  <option value="476">476</option>
                  <option value="477">477</option>
                  <option value="478">478</option>
                  <option value="479">479</option>
                  <option value="480">480</option>
                  <option value="481">481</option>
                  <option value="482">482</option>
                  <option value="483">483</option>
                  <option value="484">484</option>
                  <option value="485">485</option>
                  <option value="486">486</option>
                  <option value="487">487</option>
                  <option value="488">488</option>
                  <option value="489">489</option>
                  <option value="490">490</option>
                  <option value="491">491</option>
                  <option value="492">492</option>
                  <option value="493">493</option>
                  <option value="494">494</option>
                  <option value="495">495</option>
                  <option value="496">496</option>
                  <option value="497">497</option>
                  <option value="498">498</option>
                  <option value="499">499</option>
                  <option value="500">500</option>
                  <option value="501">501</option>
                  <option value="502">502</option>
                  <option value="503">503</option>
                  <option value="504">504</option>
                  <option value="505">505</option>
                  <option value="506">506</option>
                  <option value="507">507</option>
                  <option value="508">508</option>
                  <option value="509">509</option>
                  <option value="510">510</option>
                  <option value="511">511</option>
                  <option value="512">512</option>
                  <option value="513">513</option>
                  <option value="514">514</option>
                  <option value="515">515</option>
                  <option value="516">516</option>
                  <option value="517">517</option>
                  <option value="518">518</option>
                  <option value="519">519</option>
                  <option value="520">520</option>
                  <option value="521">521</option>
                  <option value="522">522</option>
                  <option value="523">523</option>
                  <option value="524">524</option>
                  <option value="525">525</option>
                  <option value="526">526</option>
                  <option value="527">527</option>
                  <option value="528">528</option>
                  <option value="529">529</option>
                  <option value="530">530</option>
                  <option value="531">531</option>
                  <option value="532">532</option>
                  <option value="533">533</option>
                  <option value="534">534</option>
                  <option value="535">535</option>
                  <option value="536">536</option>
                  <option value="537">537</option>
                  <option value="538">538</option>
                  <option value="539">539</option>
                  <option value="540">540</option>
                  <option value="541">541</option>
                  <option value="542">542</option>
                  <option value="543">543</option>
                  <option value="544">544</option>
                  <option value="545">545</option>
                  <option value="546">546</option>
                  <option value="547">547</option>
                  <option value="548">548</option>
                  <option value="549">549</option>
              </select>

      <label style="margin-left:20px;">
        <input type="checkbox" id="bandwidthToggle" onchange="updateBandwidth()" />
        High Bandwidth Mode (4 pages per screen)
      </label>

      <label style="margin-left:20px;">
        <input type="checkbox" id="ultraBandwidthToggle" onchange="updateBandwidth()" />
        Ultra Bandwidth Mode (8 pages per screen)
      </label>
    </div>

    <div id="flipbook-viewer" data-page-count="2" style="text-align:center;">
      <div style="margin-bottom:10px;">
        <button onclick="popOutPage()" style="font-size:16px; padding:6px 12px;"> Pop Out Page</button>
      </div>


      <div style="margin-top:20px;">
        <button onclick="prevPage()"> Prev</button>
        <button onclick="nextPage()">Next </button>
      </div>


      <div class="ob-reader-spread" role="group" aria-label="Scanned book pages">
                  <canvas id="pageCanvas0" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:inline-block;"></canvas>
                  <canvas id="pageCanvas1" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:inline-block;"></canvas>
                  <canvas id="pageCanvas2" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas3" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas4" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas5" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas6" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas7" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
              </div>
      <p class="ob-reader-status" id="obReaderStatus" aria-live="polite"></p>
      <p class="ob-reader-swipe-hint">Swipe sideways to view additional scanned pages.</p>

      <div style="margin-top:20px;">
        <button onclick="prevPage()"> Prev</button>
        <button onclick="nextPage()">Next </button>
      </div>
    </div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"></script>
    <script>
      const bookName = "GinsburgMassoraP51880";
      const maxPages = 549;
      const category = "Hebrew";
      let pageNum = 1;
      let scale = 2.0;
      let pageCount = 2;
      let renderGeneration = 0;
      const activeRenderTasks = new Array(8).fill(null);
      const canvasQueues = Array.from({ length: 8 }, () => Promise.resolve());

      const canvases = [];
      const contexts = [];
      for (let i = 0; i < 8; i++) {
        canvases[i] = document.getElementById('pageCanvas' + i);
        contexts[i] = canvases[i].getContext('2d');
      }

      // The reader's original stylesheet fixed all canvases at 50%/25%/12.5%
      // width, meaning the old Zoom/Quality menu only changed resolution.
      // Here we size the *visible* pages as well, allowing sideways scrolling
      // when a spread is wider than the reader.
      function updateCanvasWidths() {
        const spread = document.querySelector('#flipbook-viewer .ob-reader-spread');
        if (!spread) return;
        const mobile = window.matchMedia('(max-width: 800px)').matches;
        const baseline = mobile
          ? Math.min(window.innerWidth * (pageCount > 2 ? 0.70 : 0.82), pageCount > 2 ? 360 : 430)
          : Math.max(50, (spread.clientWidth - 8 - (pageCount - 1) * 12) / pageCount);
        const width = Math.max(50, Math.round(baseline * scale / 2.0));
        for (let i = 0; i < canvases.length; i++) {
          canvases[i].style.setProperty('width', width + 'px', 'important');
          canvases[i].style.setProperty('max-width', 'none', 'important');
        }
        const totalWidth = width * pageCount + 12 * (pageCount - 1);
        spread.classList.toggle('ob-reader-zoom-overflow', totalWidth > spread.clientWidth - 8);
        const indicator = document.getElementById('obZoomIndicator');
        if (indicator) indicator.textContent = String(Math.round(scale * 50)) + '%';
      }

      function updateScale() {
        const requested = parseFloat(document.getElementById('scaleSelect').value);
        if (!Number.isFinite(requested) || requested < 1 || requested > 4) return;
        scale = requested;
        renderPages();
      }

      function updateBandwidth() {
        const high = document.getElementById('bandwidthToggle').checked;
        const ultra = document.getElementById('ultraBandwidthToggle').checked;
        pageCount = ultra ? 8 : high ? 4 : 2;
        document.getElementById('flipbook-viewer').setAttribute('data-page-count', String(pageCount));
        renderPages();
      }

      function goToPage() {
        const selected = parseInt(document.getElementById('pageSelect').value, 10);
        if (!Number.isFinite(selected)) return;
        pageNum = selected % 2 === 0 ? selected - 1 : selected;
        renderPages();
      }

      function renderPages() {
        const generation = ++renderGeneration;
        // Cancel outdated jobs before a rapid zoom/page change. Per-canvas
        // queues below prevent concurrent PDF.js rendering onto one canvas.
        activeRenderTasks.forEach(task => {
          if (task) {
            try { task.cancel(); } catch (error) { /* already completed */ }
          }
        });
        updateCanvasWidths();
        const pageEnd = Math.min(pageNum + pageCount - 1, maxPages);
        const readerStatus = document.getElementById('obReaderStatus');
        if (readerStatus) readerStatus.textContent = `Pages ${pageNum}-${pageEnd} of ${maxPages}`;
        const pageSelect = document.getElementById('pageSelect');
        if (pageSelect) pageSelect.value = String(pageNum);
        for (let i = 0; i < 8; i++) {
          const part = pageNum + i;
          if (i < pageCount && part <= maxPages) {
            canvases[i].style.display = 'inline-block';
            canvasQueues[i] = canvasQueues[i].catch(() => {}).then(() => {
              if (generation !== renderGeneration) return;
              return renderPage(part, canvases[i], contexts[i], i, generation);
            });
          } else {
            canvases[i].style.display = 'none';
          }
        }
      }

      async function renderPage(num, canvas, ctx, index, generation) {
        const url = `/stream_pdf_from_local_zip.php?name=${encodeURIComponent(bookName)}&part=${encodeURIComponent(num)}&category=${encodeURIComponent(category)}`;
        let loadingTask = null;
        let pdf = null;
        let renderTask = null;
        try {
          // Disable PDF.js's PDF-supplied JavaScript evaluation feature.
          loadingTask = pdfjsLib.getDocument({ url: url, isEvalSupported: false });
          pdf = await loadingTask.promise;
          if (generation !== renderGeneration) return;
          const page = await pdf.getPage(1);
          if (generation !== renderGeneration) return;
          const viewport = page.getViewport({ scale: scale });
          canvas.width = Math.ceil(viewport.width);
          canvas.height = Math.ceil(viewport.height);
          renderTask = page.render({ canvasContext: ctx, viewport: viewport });
          activeRenderTasks[index] = renderTask;
          await renderTask.promise;
        } catch (error) {
          if (error && error.name === 'RenderingCancelledException') return;
          if (generation === renderGeneration) {
            const status = document.getElementById('obReaderStatus');
            if (status) status.textContent = 'Could not load page ' + num + '. Please try again.';
            console.error('OriginalBibles reader: page render failed', error);
          }
        } finally {
          if (renderTask && activeRenderTasks[index] === renderTask) activeRenderTasks[index] = null;
          if (pdf) {
            try { await pdf.destroy(); } catch (error) { /* release best effort */ }
          } else if (loadingTask && generation !== renderGeneration) {
            try { await loadingTask.destroy(); } catch (error) { /* release best effort */ }
          }
        }
      }

      let readerResizeFrame = null;
      window.addEventListener('resize', function () {
        if (readerResizeFrame !== null) cancelAnimationFrame(readerResizeFrame);
        readerResizeFrame = requestAnimationFrame(function () {
          readerResizeFrame = null;
          updateCanvasWidths();
        });
      });

      function nextPage() {
        if (pageNum + pageCount <= maxPages) {
          pageNum += pageCount;
          flip();
          renderPages();
        }
      }

      function prevPage() {
        if (pageNum - pageCount >= 1) {
          pageNum -= pageCount;
          flip();
          renderPages();
        }
      }

      function flip() {
        for (let i = 0; i < pageCount; i++) {
          canvases[i].style.transform = 'rotateY(180deg)';
        }
        setTimeout(() => {
          for (let i = 0; i < pageCount; i++) {
            canvases[i].style.transform = '';
          }
        }, 600);
      }

      function popOutPage() {
        const url = `/stream_pdf_from_local_zip.php?name=${encodeURIComponent(bookName)}&part=${encodeURIComponent(pageNum)}&category=${encodeURIComponent(category)}`;
        window.open(url, '_blank');
      }

      renderPages();
    </script>
    
<p>    <style>
    #geminiModal {
        display: none;
        position: fixed;
        top: 20%;
        left: 50%;
        transform: translateX(-50%);
        width: 60%;
        background: #fdfcf7;
        border: 1px solid #ccc;
        padding: 20px;
        box-shadow: 0 0 20px rgba(0,0,0,0.3);
        z-index: 9999;
        font-family: 'Georgia', serif;
        opacity: 0;
        transition: opacity 0.5s ease-in-out;
    }
    #geminiModal.show { display: block; opacity: 1; }
    #geminiModalText { white-space: pre-wrap; font-size: 16px; color: #3b2f1e; }

    #assistant-launcher button {
        font-family: 'Georgia', serif;
        background-color: #eae6d9;
        border: 1px solid #ccc;
        color: #3b2f1e;
        cursor: pointer;
        padding: 10px 20px;
        font-size: 16px;
        margin-right: 10px;
        margin-top: 10px;
    }
    #assistant-launcher textarea {
        font-family: 'Georgia', serif;
        background-color: #fffef8;
        border: 1px solid #ccc;
        color: #3b2f1e;
        padding: 10px;
        font-size: 16px;
        resize: vertical;
        width: 60%;
    }
    </style>

    <div id="assistant-launcher" style="text-align:center; margin:40px 0 20px 0;">
        <textarea id="sacredPrompt" placeholder="Enter your theological or Biblical questions... (AI can make mistakes so be aware!)" rows="4"></textarea><br><br>
        <button onclick="launchCopilot()">Ask Copilot</button>
        <button onclick="launchChatGPT()">Ask ChatGPT</button>
        <button onclick="launchGeminiModal()">Ask Gemini</button>
    </div>

    <div id="geminiModal">
        <p id="geminiModalText"></p>
        <button onclick="confirmGemini()">Open Gemini</button>
        <button onclick="closeGeminiModal()" style="margin-left:10px;">Cancel</button>
    </div>

    <script>
    async function getSacredQuery() {
        const userInput = document.getElementById("sacredPrompt").value.trim();
        if (!userInput) return null;

        const frame = `As a biblical scholar engaging with sacred scripture, I seek a reverent, theologically grounded analysis of the following passage. Please treat the text as divinely inspired and central to Christian tradition. Your response should include canonical context (situating the passage within the broader biblical canon and theological tradition), historical background (relevant cultural, geopolitical, and religious context at the time of composition), literary structure (analysis of composition, genre, and rhetorical features), and theological interpretation (a coherent, tradition-respecting reading consistent with respected scholarly perspectives). Include original-language forms in Hebrew (Tanakh), Greek (Septuagint or New Testament), and Aramaic (where applicable), with transliteration, translation, and brief commentary on linguistic nuance. Avoid reduction to metaphor or myth. Emphasize theological coherence, canonical fidelity, and interpretive depth. Reference the Oxford Bible Commentary where appropriate, and draw from respected scholarly traditions rooted in historical-critical, canonical, and theological methodologies. Please do not include the sacred name Yahweh or other divine names that may cause discomfort or offense among Christians and Jews. Use respectful and widely accepted alternatives such as “God” or “The Lord.`;

        return encodeURIComponent(frame + " " + userInput);
    }

    async function launchCopilot() {
        const query = await getSacredQuery();
        if (!query) return;
        openPopup(`https://copilot.microsoft.com/?q=${query}`);
    }

    async function launchChatGPT() {
        const query = await getSacredQuery();
        if (!query) return;
        openPopup(`https://chat.openai.com/?q=${query}`);
    }

    async function launchGeminiModal() {
        const query = await getSacredQuery();
        if (!query) return;
        const promptText = decodeURIComponent(query);
        const modal = document.getElementById("geminiModal");
        document.getElementById("geminiModalText").innerText =
            "Gemini will open in a new window. Please paste or retype your sacred question to begin:\n\n" + promptText;
        modal.classList.add("show");
    }

    function confirmGemini() { openPopup("https://gemini.google.com/"); closeGeminiModal(); }
    function closeGeminiModal() {
        const modal = document.getElementById("geminiModal");
        modal.classList.remove("show");
        setTimeout(() => { modal.style.display = "none"; }, 500);
    }

    function openPopup(url) {
        const isMobile = window.innerWidth < 768;
        if (isMobile) {
            alert("Opening in a new tab for better mobile experience.");
            window.location.href = url;
        } else {
            const screenX = typeof window.screenX !== 'undefined' ? window.screenX : window.screenLeft;
            const screenY = typeof window.screenY !== 'undefined' ? window.screenY : window.screenTop;
            const outerWidth = typeof window.outerWidth !== 'undefined' ? window.outerWidth : document.documentElement.clientWidth;
            const outerHeight = typeof window.outerHeight !== 'undefined' ? window.outerHeight : document.documentElement.clientHeight;

            const width = Math.floor(outerWidth * 0.3);
            const height = Math.floor(outerHeight * 0.3);
            const left = screenX + Math.floor((outerWidth - width) / 2);
            const top = screenY + Math.floor((outerHeight - height) / 2);

            window.open(
                url,
                "AssistantPopup",
                `width=${width},height=${height},top=${top},left=${left},` +
                "noopener,noreferrer,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes,resizable=yes"
            );
        }
    }
    </script>
    <br />
Index of the book (please forgive any unreadable bits: this index is computer generated from ancient texts):</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.originalbibles.com/the-massorah-the-hebrew-notes-with-english-translations-ginsburg-1880-pdf-volume-4/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>The Massorah &#8211; The Hebrew Notes (With English Translations) &#8211; Ginsburg 1880 PDF Part 3</title>
		<link>https://www.originalbibles.com/the-massorah-the-hebrew-notes-with-english-translations-ginsburg-1880-pdf-part-3/</link>
					<comments>https://www.originalbibles.com/the-massorah-the-hebrew-notes-with-english-translations-ginsburg-1880-pdf-part-3/#respond</comments>
		
		<dc:creator><![CDATA[Editor]]></dc:creator>
		<pubDate>Sat, 23 Feb 2013 09:34:01 +0000</pubDate>
				<category><![CDATA[1800]]></category>
		<category><![CDATA[Hebrew Bible]]></category>
		<category><![CDATA[1880]]></category>
		<category><![CDATA[HOLY BIBLE]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[read online]]></category>
		<category><![CDATA[old testament]]></category>
		<category><![CDATA[read on android]]></category>
		<category><![CDATA[The Old Testament]]></category>
		<category><![CDATA[read on iphone]]></category>
		<category><![CDATA[read on tablet]]></category>
		<category><![CDATA[hebrew]]></category>
		<category><![CDATA[read on apple]]></category>
		<category><![CDATA[Christian D. Ginsburg]]></category>
		<category><![CDATA[massorah]]></category>
		<guid isPermaLink="false">http://originalbibles.com/?p=1775</guid>

					<description><![CDATA[The Massorah 1880 PDF &#8211; Ginsburg &#8211; Volume II This is part 3 of a...]]></description>
										<content:encoded><![CDATA[<h3>The Massorah 1880 PDF &#8211; Ginsburg &#8211; Volume II</h3>
<p>This is part 3 of a number of books by Christian D. Ginsburg (LL.D) regarding the Hebrew Bible. The Massorah are the Hebrew notes that go with the Old Testament in Hebrew. The books by Ginsburg also have English translations.</p>
<p>This book has Caph to Tav</p>
<p>These notes should be of much use to Bible readers and scholars around the world.</p>
<p>Please be advised, that with all ancient texts, one must be careful and view it together with other editions/reprints (in case some text is lost or unreadable due to age etcetera). However, this does not reduce the pleasure of reading the original and ancient texts!<br />
    <div id="flipbook-controls" style="text-align:center; margin-bottom:10px;">
      <label for="scaleSelect">Page Zoom:</label>
      <select id="scaleSelect" onchange="updateScale()" style="font-size:16px; padding:4px;">
        <option value="1.0">50% — Extra Small</option>
        <option value="1.5">75% — Small</option>
        <option value="2.0" selected>100% — Medium</option>
        <option value="2.5">125% — Large</option>
        <option value="3.0">150% — Extra Large</option>
        <option value="4.0">200% — XL</option>
      </select>
      <span class="ob-zoom-indicator" id="obZoomIndicator" aria-live="polite">100%</span>

      <label for="pageSelect" style="margin-left:20px;">Go to Page:</label>
      <select id="pageSelect" onchange="goToPage()" style="font-size:16px; padding:4px;">
                  <option value="1">1</option>
                  <option value="2">2</option>
                  <option value="3">3</option>
                  <option value="4">4</option>
                  <option value="5">5</option>
                  <option value="6">6</option>
                  <option value="7">7</option>
                  <option value="8">8</option>
                  <option value="9">9</option>
                  <option value="10">10</option>
                  <option value="11">11</option>
                  <option value="12">12</option>
                  <option value="13">13</option>
                  <option value="14">14</option>
                  <option value="15">15</option>
                  <option value="16">16</option>
                  <option value="17">17</option>
                  <option value="18">18</option>
                  <option value="19">19</option>
                  <option value="20">20</option>
                  <option value="21">21</option>
                  <option value="22">22</option>
                  <option value="23">23</option>
                  <option value="24">24</option>
                  <option value="25">25</option>
                  <option value="26">26</option>
                  <option value="27">27</option>
                  <option value="28">28</option>
                  <option value="29">29</option>
                  <option value="30">30</option>
                  <option value="31">31</option>
                  <option value="32">32</option>
                  <option value="33">33</option>
                  <option value="34">34</option>
                  <option value="35">35</option>
                  <option value="36">36</option>
                  <option value="37">37</option>
                  <option value="38">38</option>
                  <option value="39">39</option>
                  <option value="40">40</option>
                  <option value="41">41</option>
                  <option value="42">42</option>
                  <option value="43">43</option>
                  <option value="44">44</option>
                  <option value="45">45</option>
                  <option value="46">46</option>
                  <option value="47">47</option>
                  <option value="48">48</option>
                  <option value="49">49</option>
                  <option value="50">50</option>
                  <option value="51">51</option>
                  <option value="52">52</option>
                  <option value="53">53</option>
                  <option value="54">54</option>
                  <option value="55">55</option>
                  <option value="56">56</option>
                  <option value="57">57</option>
                  <option value="58">58</option>
                  <option value="59">59</option>
                  <option value="60">60</option>
                  <option value="61">61</option>
                  <option value="62">62</option>
                  <option value="63">63</option>
                  <option value="64">64</option>
                  <option value="65">65</option>
                  <option value="66">66</option>
                  <option value="67">67</option>
                  <option value="68">68</option>
                  <option value="69">69</option>
                  <option value="70">70</option>
                  <option value="71">71</option>
                  <option value="72">72</option>
                  <option value="73">73</option>
                  <option value="74">74</option>
                  <option value="75">75</option>
                  <option value="76">76</option>
                  <option value="77">77</option>
                  <option value="78">78</option>
                  <option value="79">79</option>
                  <option value="80">80</option>
                  <option value="81">81</option>
                  <option value="82">82</option>
                  <option value="83">83</option>
                  <option value="84">84</option>
                  <option value="85">85</option>
                  <option value="86">86</option>
                  <option value="87">87</option>
                  <option value="88">88</option>
                  <option value="89">89</option>
                  <option value="90">90</option>
                  <option value="91">91</option>
                  <option value="92">92</option>
                  <option value="93">93</option>
                  <option value="94">94</option>
                  <option value="95">95</option>
                  <option value="96">96</option>
                  <option value="97">97</option>
                  <option value="98">98</option>
                  <option value="99">99</option>
                  <option value="100">100</option>
                  <option value="101">101</option>
                  <option value="102">102</option>
                  <option value="103">103</option>
                  <option value="104">104</option>
                  <option value="105">105</option>
                  <option value="106">106</option>
                  <option value="107">107</option>
                  <option value="108">108</option>
                  <option value="109">109</option>
                  <option value="110">110</option>
                  <option value="111">111</option>
                  <option value="112">112</option>
                  <option value="113">113</option>
                  <option value="114">114</option>
                  <option value="115">115</option>
                  <option value="116">116</option>
                  <option value="117">117</option>
                  <option value="118">118</option>
                  <option value="119">119</option>
                  <option value="120">120</option>
                  <option value="121">121</option>
                  <option value="122">122</option>
                  <option value="123">123</option>
                  <option value="124">124</option>
                  <option value="125">125</option>
                  <option value="126">126</option>
                  <option value="127">127</option>
                  <option value="128">128</option>
                  <option value="129">129</option>
                  <option value="130">130</option>
                  <option value="131">131</option>
                  <option value="132">132</option>
                  <option value="133">133</option>
                  <option value="134">134</option>
                  <option value="135">135</option>
                  <option value="136">136</option>
                  <option value="137">137</option>
                  <option value="138">138</option>
                  <option value="139">139</option>
                  <option value="140">140</option>
                  <option value="141">141</option>
                  <option value="142">142</option>
                  <option value="143">143</option>
                  <option value="144">144</option>
                  <option value="145">145</option>
                  <option value="146">146</option>
                  <option value="147">147</option>
                  <option value="148">148</option>
                  <option value="149">149</option>
                  <option value="150">150</option>
                  <option value="151">151</option>
                  <option value="152">152</option>
                  <option value="153">153</option>
                  <option value="154">154</option>
                  <option value="155">155</option>
                  <option value="156">156</option>
                  <option value="157">157</option>
                  <option value="158">158</option>
                  <option value="159">159</option>
                  <option value="160">160</option>
                  <option value="161">161</option>
                  <option value="162">162</option>
                  <option value="163">163</option>
                  <option value="164">164</option>
                  <option value="165">165</option>
                  <option value="166">166</option>
                  <option value="167">167</option>
                  <option value="168">168</option>
                  <option value="169">169</option>
                  <option value="170">170</option>
                  <option value="171">171</option>
                  <option value="172">172</option>
                  <option value="173">173</option>
                  <option value="174">174</option>
                  <option value="175">175</option>
                  <option value="176">176</option>
                  <option value="177">177</option>
                  <option value="178">178</option>
                  <option value="179">179</option>
                  <option value="180">180</option>
                  <option value="181">181</option>
                  <option value="182">182</option>
                  <option value="183">183</option>
                  <option value="184">184</option>
                  <option value="185">185</option>
                  <option value="186">186</option>
                  <option value="187">187</option>
                  <option value="188">188</option>
                  <option value="189">189</option>
                  <option value="190">190</option>
                  <option value="191">191</option>
                  <option value="192">192</option>
                  <option value="193">193</option>
                  <option value="194">194</option>
                  <option value="195">195</option>
                  <option value="196">196</option>
                  <option value="197">197</option>
                  <option value="198">198</option>
                  <option value="199">199</option>
                  <option value="200">200</option>
                  <option value="201">201</option>
                  <option value="202">202</option>
                  <option value="203">203</option>
                  <option value="204">204</option>
                  <option value="205">205</option>
                  <option value="206">206</option>
                  <option value="207">207</option>
                  <option value="208">208</option>
                  <option value="209">209</option>
                  <option value="210">210</option>
                  <option value="211">211</option>
                  <option value="212">212</option>
                  <option value="213">213</option>
                  <option value="214">214</option>
                  <option value="215">215</option>
                  <option value="216">216</option>
                  <option value="217">217</option>
                  <option value="218">218</option>
                  <option value="219">219</option>
                  <option value="220">220</option>
                  <option value="221">221</option>
                  <option value="222">222</option>
                  <option value="223">223</option>
                  <option value="224">224</option>
                  <option value="225">225</option>
                  <option value="226">226</option>
                  <option value="227">227</option>
                  <option value="228">228</option>
                  <option value="229">229</option>
                  <option value="230">230</option>
                  <option value="231">231</option>
                  <option value="232">232</option>
                  <option value="233">233</option>
                  <option value="234">234</option>
                  <option value="235">235</option>
                  <option value="236">236</option>
                  <option value="237">237</option>
                  <option value="238">238</option>
                  <option value="239">239</option>
                  <option value="240">240</option>
                  <option value="241">241</option>
                  <option value="242">242</option>
                  <option value="243">243</option>
                  <option value="244">244</option>
                  <option value="245">245</option>
                  <option value="246">246</option>
                  <option value="247">247</option>
                  <option value="248">248</option>
                  <option value="249">249</option>
                  <option value="250">250</option>
                  <option value="251">251</option>
                  <option value="252">252</option>
                  <option value="253">253</option>
                  <option value="254">254</option>
                  <option value="255">255</option>
                  <option value="256">256</option>
                  <option value="257">257</option>
                  <option value="258">258</option>
                  <option value="259">259</option>
                  <option value="260">260</option>
                  <option value="261">261</option>
                  <option value="262">262</option>
                  <option value="263">263</option>
                  <option value="264">264</option>
                  <option value="265">265</option>
                  <option value="266">266</option>
                  <option value="267">267</option>
                  <option value="268">268</option>
                  <option value="269">269</option>
                  <option value="270">270</option>
                  <option value="271">271</option>
                  <option value="272">272</option>
                  <option value="273">273</option>
                  <option value="274">274</option>
                  <option value="275">275</option>
                  <option value="276">276</option>
                  <option value="277">277</option>
                  <option value="278">278</option>
                  <option value="279">279</option>
                  <option value="280">280</option>
                  <option value="281">281</option>
                  <option value="282">282</option>
                  <option value="283">283</option>
                  <option value="284">284</option>
                  <option value="285">285</option>
                  <option value="286">286</option>
                  <option value="287">287</option>
                  <option value="288">288</option>
                  <option value="289">289</option>
                  <option value="290">290</option>
                  <option value="291">291</option>
                  <option value="292">292</option>
                  <option value="293">293</option>
                  <option value="294">294</option>
                  <option value="295">295</option>
                  <option value="296">296</option>
                  <option value="297">297</option>
                  <option value="298">298</option>
                  <option value="299">299</option>
                  <option value="300">300</option>
                  <option value="301">301</option>
                  <option value="302">302</option>
                  <option value="303">303</option>
                  <option value="304">304</option>
                  <option value="305">305</option>
                  <option value="306">306</option>
                  <option value="307">307</option>
                  <option value="308">308</option>
                  <option value="309">309</option>
                  <option value="310">310</option>
                  <option value="311">311</option>
                  <option value="312">312</option>
                  <option value="313">313</option>
                  <option value="314">314</option>
                  <option value="315">315</option>
                  <option value="316">316</option>
                  <option value="317">317</option>
                  <option value="318">318</option>
                  <option value="319">319</option>
                  <option value="320">320</option>
                  <option value="321">321</option>
                  <option value="322">322</option>
                  <option value="323">323</option>
                  <option value="324">324</option>
                  <option value="325">325</option>
                  <option value="326">326</option>
                  <option value="327">327</option>
                  <option value="328">328</option>
                  <option value="329">329</option>
                  <option value="330">330</option>
                  <option value="331">331</option>
                  <option value="332">332</option>
                  <option value="333">333</option>
                  <option value="334">334</option>
                  <option value="335">335</option>
                  <option value="336">336</option>
                  <option value="337">337</option>
                  <option value="338">338</option>
                  <option value="339">339</option>
                  <option value="340">340</option>
                  <option value="341">341</option>
                  <option value="342">342</option>
                  <option value="343">343</option>
                  <option value="344">344</option>
                  <option value="345">345</option>
                  <option value="346">346</option>
                  <option value="347">347</option>
                  <option value="348">348</option>
                  <option value="349">349</option>
                  <option value="350">350</option>
                  <option value="351">351</option>
                  <option value="352">352</option>
                  <option value="353">353</option>
                  <option value="354">354</option>
                  <option value="355">355</option>
                  <option value="356">356</option>
                  <option value="357">357</option>
                  <option value="358">358</option>
                  <option value="359">359</option>
                  <option value="360">360</option>
                  <option value="361">361</option>
                  <option value="362">362</option>
                  <option value="363">363</option>
                  <option value="364">364</option>
                  <option value="365">365</option>
                  <option value="366">366</option>
                  <option value="367">367</option>
                  <option value="368">368</option>
                  <option value="369">369</option>
                  <option value="370">370</option>
                  <option value="371">371</option>
                  <option value="372">372</option>
                  <option value="373">373</option>
                  <option value="374">374</option>
                  <option value="375">375</option>
                  <option value="376">376</option>
                  <option value="377">377</option>
                  <option value="378">378</option>
                  <option value="379">379</option>
                  <option value="380">380</option>
                  <option value="381">381</option>
                  <option value="382">382</option>
                  <option value="383">383</option>
                  <option value="384">384</option>
                  <option value="385">385</option>
                  <option value="386">386</option>
                  <option value="387">387</option>
                  <option value="388">388</option>
                  <option value="389">389</option>
                  <option value="390">390</option>
                  <option value="391">391</option>
                  <option value="392">392</option>
                  <option value="393">393</option>
                  <option value="394">394</option>
                  <option value="395">395</option>
                  <option value="396">396</option>
                  <option value="397">397</option>
                  <option value="398">398</option>
                  <option value="399">399</option>
                  <option value="400">400</option>
                  <option value="401">401</option>
                  <option value="402">402</option>
                  <option value="403">403</option>
                  <option value="404">404</option>
                  <option value="405">405</option>
                  <option value="406">406</option>
                  <option value="407">407</option>
                  <option value="408">408</option>
                  <option value="409">409</option>
                  <option value="410">410</option>
                  <option value="411">411</option>
              </select>

      <label style="margin-left:20px;">
        <input type="checkbox" id="bandwidthToggle" onchange="updateBandwidth()" />
        High Bandwidth Mode (4 pages per screen)
      </label>

      <label style="margin-left:20px;">
        <input type="checkbox" id="ultraBandwidthToggle" onchange="updateBandwidth()" />
        Ultra Bandwidth Mode (8 pages per screen)
      </label>
    </div>

    <div id="flipbook-viewer" data-page-count="2" style="text-align:center;">
      <div style="margin-bottom:10px;">
        <button onclick="popOutPage()" style="font-size:16px; padding:6px 12px;"> Pop Out Page</button>
      </div>


      <div style="margin-top:20px;">
        <button onclick="prevPage()"> Prev</button>
        <button onclick="nextPage()">Next </button>
      </div>


      <div class="ob-reader-spread" role="group" aria-label="Scanned book pages">
                  <canvas id="pageCanvas0" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:inline-block;"></canvas>
                  <canvas id="pageCanvas1" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:inline-block;"></canvas>
                  <canvas id="pageCanvas2" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas3" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas4" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas5" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas6" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas7" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
              </div>
      <p class="ob-reader-status" id="obReaderStatus" aria-live="polite"></p>
      <p class="ob-reader-swipe-hint">Swipe sideways to view additional scanned pages.</p>

      <div style="margin-top:20px;">
        <button onclick="prevPage()"> Prev</button>
        <button onclick="nextPage()">Next </button>
      </div>
    </div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"></script>
    <script>
      const bookName = "GinsburgMassoraP31880";
      const maxPages = 411;
      const category = "Hebrew";
      let pageNum = 1;
      let scale = 2.0;
      let pageCount = 2;
      let renderGeneration = 0;
      const activeRenderTasks = new Array(8).fill(null);
      const canvasQueues = Array.from({ length: 8 }, () => Promise.resolve());

      const canvases = [];
      const contexts = [];
      for (let i = 0; i < 8; i++) {
        canvases[i] = document.getElementById('pageCanvas' + i);
        contexts[i] = canvases[i].getContext('2d');
      }

      // The reader's original stylesheet fixed all canvases at 50%/25%/12.5%
      // width, meaning the old Zoom/Quality menu only changed resolution.
      // Here we size the *visible* pages as well, allowing sideways scrolling
      // when a spread is wider than the reader.
      function updateCanvasWidths() {
        const spread = document.querySelector('#flipbook-viewer .ob-reader-spread');
        if (!spread) return;
        const mobile = window.matchMedia('(max-width: 800px)').matches;
        const baseline = mobile
          ? Math.min(window.innerWidth * (pageCount > 2 ? 0.70 : 0.82), pageCount > 2 ? 360 : 430)
          : Math.max(50, (spread.clientWidth - 8 - (pageCount - 1) * 12) / pageCount);
        const width = Math.max(50, Math.round(baseline * scale / 2.0));
        for (let i = 0; i < canvases.length; i++) {
          canvases[i].style.setProperty('width', width + 'px', 'important');
          canvases[i].style.setProperty('max-width', 'none', 'important');
        }
        const totalWidth = width * pageCount + 12 * (pageCount - 1);
        spread.classList.toggle('ob-reader-zoom-overflow', totalWidth > spread.clientWidth - 8);
        const indicator = document.getElementById('obZoomIndicator');
        if (indicator) indicator.textContent = String(Math.round(scale * 50)) + '%';
      }

      function updateScale() {
        const requested = parseFloat(document.getElementById('scaleSelect').value);
        if (!Number.isFinite(requested) || requested < 1 || requested > 4) return;
        scale = requested;
        renderPages();
      }

      function updateBandwidth() {
        const high = document.getElementById('bandwidthToggle').checked;
        const ultra = document.getElementById('ultraBandwidthToggle').checked;
        pageCount = ultra ? 8 : high ? 4 : 2;
        document.getElementById('flipbook-viewer').setAttribute('data-page-count', String(pageCount));
        renderPages();
      }

      function goToPage() {
        const selected = parseInt(document.getElementById('pageSelect').value, 10);
        if (!Number.isFinite(selected)) return;
        pageNum = selected % 2 === 0 ? selected - 1 : selected;
        renderPages();
      }

      function renderPages() {
        const generation = ++renderGeneration;
        // Cancel outdated jobs before a rapid zoom/page change. Per-canvas
        // queues below prevent concurrent PDF.js rendering onto one canvas.
        activeRenderTasks.forEach(task => {
          if (task) {
            try { task.cancel(); } catch (error) { /* already completed */ }
          }
        });
        updateCanvasWidths();
        const pageEnd = Math.min(pageNum + pageCount - 1, maxPages);
        const readerStatus = document.getElementById('obReaderStatus');
        if (readerStatus) readerStatus.textContent = `Pages ${pageNum}-${pageEnd} of ${maxPages}`;
        const pageSelect = document.getElementById('pageSelect');
        if (pageSelect) pageSelect.value = String(pageNum);
        for (let i = 0; i < 8; i++) {
          const part = pageNum + i;
          if (i < pageCount && part <= maxPages) {
            canvases[i].style.display = 'inline-block';
            canvasQueues[i] = canvasQueues[i].catch(() => {}).then(() => {
              if (generation !== renderGeneration) return;
              return renderPage(part, canvases[i], contexts[i], i, generation);
            });
          } else {
            canvases[i].style.display = 'none';
          }
        }
      }

      async function renderPage(num, canvas, ctx, index, generation) {
        const url = `/stream_pdf_from_local_zip.php?name=${encodeURIComponent(bookName)}&part=${encodeURIComponent(num)}&category=${encodeURIComponent(category)}`;
        let loadingTask = null;
        let pdf = null;
        let renderTask = null;
        try {
          // Disable PDF.js's PDF-supplied JavaScript evaluation feature.
          loadingTask = pdfjsLib.getDocument({ url: url, isEvalSupported: false });
          pdf = await loadingTask.promise;
          if (generation !== renderGeneration) return;
          const page = await pdf.getPage(1);
          if (generation !== renderGeneration) return;
          const viewport = page.getViewport({ scale: scale });
          canvas.width = Math.ceil(viewport.width);
          canvas.height = Math.ceil(viewport.height);
          renderTask = page.render({ canvasContext: ctx, viewport: viewport });
          activeRenderTasks[index] = renderTask;
          await renderTask.promise;
        } catch (error) {
          if (error && error.name === 'RenderingCancelledException') return;
          if (generation === renderGeneration) {
            const status = document.getElementById('obReaderStatus');
            if (status) status.textContent = 'Could not load page ' + num + '. Please try again.';
            console.error('OriginalBibles reader: page render failed', error);
          }
        } finally {
          if (renderTask && activeRenderTasks[index] === renderTask) activeRenderTasks[index] = null;
          if (pdf) {
            try { await pdf.destroy(); } catch (error) { /* release best effort */ }
          } else if (loadingTask && generation !== renderGeneration) {
            try { await loadingTask.destroy(); } catch (error) { /* release best effort */ }
          }
        }
      }

      let readerResizeFrame = null;
      window.addEventListener('resize', function () {
        if (readerResizeFrame !== null) cancelAnimationFrame(readerResizeFrame);
        readerResizeFrame = requestAnimationFrame(function () {
          readerResizeFrame = null;
          updateCanvasWidths();
        });
      });

      function nextPage() {
        if (pageNum + pageCount <= maxPages) {
          pageNum += pageCount;
          flip();
          renderPages();
        }
      }

      function prevPage() {
        if (pageNum - pageCount >= 1) {
          pageNum -= pageCount;
          flip();
          renderPages();
        }
      }

      function flip() {
        for (let i = 0; i < pageCount; i++) {
          canvases[i].style.transform = 'rotateY(180deg)';
        }
        setTimeout(() => {
          for (let i = 0; i < pageCount; i++) {
            canvases[i].style.transform = '';
          }
        }, 600);
      }

      function popOutPage() {
        const url = `/stream_pdf_from_local_zip.php?name=${encodeURIComponent(bookName)}&part=${encodeURIComponent(pageNum)}&category=${encodeURIComponent(category)}`;
        window.open(url, '_blank');
      }

      renderPages();
    </script>
    </p>
<p>    <style>
    #geminiModal {
        display: none;
        position: fixed;
        top: 20%;
        left: 50%;
        transform: translateX(-50%);
        width: 60%;
        background: #fdfcf7;
        border: 1px solid #ccc;
        padding: 20px;
        box-shadow: 0 0 20px rgba(0,0,0,0.3);
        z-index: 9999;
        font-family: 'Georgia', serif;
        opacity: 0;
        transition: opacity 0.5s ease-in-out;
    }
    #geminiModal.show { display: block; opacity: 1; }
    #geminiModalText { white-space: pre-wrap; font-size: 16px; color: #3b2f1e; }

    #assistant-launcher button {
        font-family: 'Georgia', serif;
        background-color: #eae6d9;
        border: 1px solid #ccc;
        color: #3b2f1e;
        cursor: pointer;
        padding: 10px 20px;
        font-size: 16px;
        margin-right: 10px;
        margin-top: 10px;
    }
    #assistant-launcher textarea {
        font-family: 'Georgia', serif;
        background-color: #fffef8;
        border: 1px solid #ccc;
        color: #3b2f1e;
        padding: 10px;
        font-size: 16px;
        resize: vertical;
        width: 60%;
    }
    </style>

    <div id="assistant-launcher" style="text-align:center; margin:40px 0 20px 0;">
        <textarea id="sacredPrompt" placeholder="Enter your theological or Biblical questions... (AI can make mistakes so be aware!)" rows="4"></textarea><br><br>
        <button onclick="launchCopilot()">Ask Copilot</button>
        <button onclick="launchChatGPT()">Ask ChatGPT</button>
        <button onclick="launchGeminiModal()">Ask Gemini</button>
    </div>

    <div id="geminiModal">
        <p id="geminiModalText"></p>
        <button onclick="confirmGemini()">Open Gemini</button>
        <button onclick="closeGeminiModal()" style="margin-left:10px;">Cancel</button>
    </div>

    <script>
    async function getSacredQuery() {
        const userInput = document.getElementById("sacredPrompt").value.trim();
        if (!userInput) return null;

        const frame = `As a biblical scholar engaging with sacred scripture, I seek a reverent, theologically grounded analysis of the following passage. Please treat the text as divinely inspired and central to Christian tradition. Your response should include canonical context (situating the passage within the broader biblical canon and theological tradition), historical background (relevant cultural, geopolitical, and religious context at the time of composition), literary structure (analysis of composition, genre, and rhetorical features), and theological interpretation (a coherent, tradition-respecting reading consistent with respected scholarly perspectives). Include original-language forms in Hebrew (Tanakh), Greek (Septuagint or New Testament), and Aramaic (where applicable), with transliteration, translation, and brief commentary on linguistic nuance. Avoid reduction to metaphor or myth. Emphasize theological coherence, canonical fidelity, and interpretive depth. Reference the Oxford Bible Commentary where appropriate, and draw from respected scholarly traditions rooted in historical-critical, canonical, and theological methodologies. Please do not include the sacred name Yahweh or other divine names that may cause discomfort or offense among Christians and Jews. Use respectful and widely accepted alternatives such as “God” or “The Lord.`;

        return encodeURIComponent(frame + " " + userInput);
    }

    async function launchCopilot() {
        const query = await getSacredQuery();
        if (!query) return;
        openPopup(`https://copilot.microsoft.com/?q=${query}`);
    }

    async function launchChatGPT() {
        const query = await getSacredQuery();
        if (!query) return;
        openPopup(`https://chat.openai.com/?q=${query}`);
    }

    async function launchGeminiModal() {
        const query = await getSacredQuery();
        if (!query) return;
        const promptText = decodeURIComponent(query);
        const modal = document.getElementById("geminiModal");
        document.getElementById("geminiModalText").innerText =
            "Gemini will open in a new window. Please paste or retype your sacred question to begin:\n\n" + promptText;
        modal.classList.add("show");
    }

    function confirmGemini() { openPopup("https://gemini.google.com/"); closeGeminiModal(); }
    function closeGeminiModal() {
        const modal = document.getElementById("geminiModal");
        modal.classList.remove("show");
        setTimeout(() => { modal.style.display = "none"; }, 500);
    }

    function openPopup(url) {
        const isMobile = window.innerWidth < 768;
        if (isMobile) {
            alert("Opening in a new tab for better mobile experience.");
            window.location.href = url;
        } else {
            const screenX = typeof window.screenX !== 'undefined' ? window.screenX : window.screenLeft;
            const screenY = typeof window.screenY !== 'undefined' ? window.screenY : window.screenTop;
            const outerWidth = typeof window.outerWidth !== 'undefined' ? window.outerWidth : document.documentElement.clientWidth;
            const outerHeight = typeof window.outerHeight !== 'undefined' ? window.outerHeight : document.documentElement.clientHeight;

            const width = Math.floor(outerWidth * 0.3);
            const height = Math.floor(outerHeight * 0.3);
            const left = screenX + Math.floor((outerWidth - width) / 2);
            const top = screenY + Math.floor((outerHeight - height) / 2);

            window.open(
                url,
                "AssistantPopup",
                `width=${width},height=${height},top=${top},left=${left},` +
                "noopener,noreferrer,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes,resizable=yes"
            );
        }
    }
    </script>
    <br />
Index of the book (please forgive any unreadable bits: this index is computer generated from ancient texts):</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.originalbibles.com/the-massorah-the-hebrew-notes-with-english-translations-ginsburg-1880-pdf-part-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>The Massorah &#8211; The Hebrew Notes (With English Translations) &#8211; Ginsburg 1880 PDF Volume II</title>
		<link>https://www.originalbibles.com/the-massorah-the-hebrew-notes-with-english-translations-ginsburg-1880-pdf-volume-ii/</link>
					<comments>https://www.originalbibles.com/the-massorah-the-hebrew-notes-with-english-translations-ginsburg-1880-pdf-volume-ii/#respond</comments>
		
		<dc:creator><![CDATA[Editor]]></dc:creator>
		<pubDate>Sat, 23 Feb 2013 09:29:59 +0000</pubDate>
				<category><![CDATA[Hebrew Bible]]></category>
		<category><![CDATA[1800]]></category>
		<category><![CDATA[The Old Testament]]></category>
		<category><![CDATA[read on iphone]]></category>
		<category><![CDATA[read on tablet]]></category>
		<category><![CDATA[hebrew]]></category>
		<category><![CDATA[read on apple]]></category>
		<category><![CDATA[Christian D. Ginsburg]]></category>
		<category><![CDATA[hebrew notes with english translation]]></category>
		<category><![CDATA[massorah]]></category>
		<category><![CDATA[1880]]></category>
		<category><![CDATA[HOLY BIBLE]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[read online]]></category>
		<category><![CDATA[bible]]></category>
		<category><![CDATA[original book]]></category>
		<category><![CDATA[read on android]]></category>
		<guid isPermaLink="false">http://originalbibles.com/?p=1771</guid>

					<description><![CDATA[The Massorah 1880 PDF &#8211; Ginsburg &#8211; Volume II This is part 2 of a...]]></description>
										<content:encoded><![CDATA[<h3>The Massorah 1880 PDF &#8211; Ginsburg &#8211; Volume II</h3>
<p>This is part 2 of a number of books by Christian D. Ginsburg (LL.D) regarding the Hebrew Bible. The Massorah are the Hebrew notes that go with the Old Testament in Hebrew. The books by Ginsburg also have English translations.</p>
<p>This book has Aleph to Tav</p>
<p>These notes should be of much use to Bible readers and scholars around the world.</p>
<p>Please be advised, that with all ancient texts, one must be careful and view it together with other editions/reprints (in case some text is lost or unreadable due to age etcetera). However, this does not reduce the pleasure of reading the original and ancient texts!</p>
    <div id="flipbook-controls" style="text-align:center; margin-bottom:10px;">
      <label for="scaleSelect">Page Zoom:</label>
      <select id="scaleSelect" onchange="updateScale()" style="font-size:16px; padding:4px;">
        <option value="1.0">50% — Extra Small</option>
        <option value="1.5">75% — Small</option>
        <option value="2.0" selected>100% — Medium</option>
        <option value="2.5">125% — Large</option>
        <option value="3.0">150% — Extra Large</option>
        <option value="4.0">200% — XL</option>
      </select>
      <span class="ob-zoom-indicator" id="obZoomIndicator" aria-live="polite">100%</span>

      <label for="pageSelect" style="margin-left:20px;">Go to Page:</label>
      <select id="pageSelect" onchange="goToPage()" style="font-size:16px; padding:4px;">
                  <option value="1">1</option>
                  <option value="2">2</option>
                  <option value="3">3</option>
                  <option value="4">4</option>
                  <option value="5">5</option>
                  <option value="6">6</option>
                  <option value="7">7</option>
                  <option value="8">8</option>
                  <option value="9">9</option>
                  <option value="10">10</option>
                  <option value="11">11</option>
                  <option value="12">12</option>
                  <option value="13">13</option>
                  <option value="14">14</option>
                  <option value="15">15</option>
                  <option value="16">16</option>
                  <option value="17">17</option>
                  <option value="18">18</option>
                  <option value="19">19</option>
                  <option value="20">20</option>
                  <option value="21">21</option>
                  <option value="22">22</option>
                  <option value="23">23</option>
                  <option value="24">24</option>
                  <option value="25">25</option>
                  <option value="26">26</option>
                  <option value="27">27</option>
                  <option value="28">28</option>
                  <option value="29">29</option>
                  <option value="30">30</option>
                  <option value="31">31</option>
                  <option value="32">32</option>
                  <option value="33">33</option>
                  <option value="34">34</option>
                  <option value="35">35</option>
                  <option value="36">36</option>
                  <option value="37">37</option>
                  <option value="38">38</option>
                  <option value="39">39</option>
                  <option value="40">40</option>
                  <option value="41">41</option>
                  <option value="42">42</option>
                  <option value="43">43</option>
                  <option value="44">44</option>
                  <option value="45">45</option>
                  <option value="46">46</option>
                  <option value="47">47</option>
                  <option value="48">48</option>
                  <option value="49">49</option>
                  <option value="50">50</option>
                  <option value="51">51</option>
                  <option value="52">52</option>
                  <option value="53">53</option>
                  <option value="54">54</option>
                  <option value="55">55</option>
                  <option value="56">56</option>
                  <option value="57">57</option>
                  <option value="58">58</option>
                  <option value="59">59</option>
                  <option value="60">60</option>
                  <option value="61">61</option>
                  <option value="62">62</option>
                  <option value="63">63</option>
                  <option value="64">64</option>
                  <option value="65">65</option>
                  <option value="66">66</option>
                  <option value="67">67</option>
                  <option value="68">68</option>
                  <option value="69">69</option>
                  <option value="70">70</option>
                  <option value="71">71</option>
                  <option value="72">72</option>
                  <option value="73">73</option>
                  <option value="74">74</option>
                  <option value="75">75</option>
                  <option value="76">76</option>
                  <option value="77">77</option>
                  <option value="78">78</option>
                  <option value="79">79</option>
                  <option value="80">80</option>
                  <option value="81">81</option>
                  <option value="82">82</option>
                  <option value="83">83</option>
                  <option value="84">84</option>
                  <option value="85">85</option>
                  <option value="86">86</option>
                  <option value="87">87</option>
                  <option value="88">88</option>
                  <option value="89">89</option>
                  <option value="90">90</option>
                  <option value="91">91</option>
                  <option value="92">92</option>
                  <option value="93">93</option>
                  <option value="94">94</option>
                  <option value="95">95</option>
                  <option value="96">96</option>
                  <option value="97">97</option>
                  <option value="98">98</option>
                  <option value="99">99</option>
                  <option value="100">100</option>
                  <option value="101">101</option>
                  <option value="102">102</option>
                  <option value="103">103</option>
                  <option value="104">104</option>
                  <option value="105">105</option>
                  <option value="106">106</option>
                  <option value="107">107</option>
                  <option value="108">108</option>
                  <option value="109">109</option>
                  <option value="110">110</option>
                  <option value="111">111</option>
                  <option value="112">112</option>
                  <option value="113">113</option>
                  <option value="114">114</option>
                  <option value="115">115</option>
                  <option value="116">116</option>
                  <option value="117">117</option>
                  <option value="118">118</option>
                  <option value="119">119</option>
                  <option value="120">120</option>
                  <option value="121">121</option>
                  <option value="122">122</option>
                  <option value="123">123</option>
                  <option value="124">124</option>
                  <option value="125">125</option>
                  <option value="126">126</option>
                  <option value="127">127</option>
                  <option value="128">128</option>
                  <option value="129">129</option>
                  <option value="130">130</option>
                  <option value="131">131</option>
                  <option value="132">132</option>
                  <option value="133">133</option>
                  <option value="134">134</option>
                  <option value="135">135</option>
                  <option value="136">136</option>
                  <option value="137">137</option>
                  <option value="138">138</option>
                  <option value="139">139</option>
                  <option value="140">140</option>
                  <option value="141">141</option>
                  <option value="142">142</option>
                  <option value="143">143</option>
                  <option value="144">144</option>
                  <option value="145">145</option>
                  <option value="146">146</option>
                  <option value="147">147</option>
                  <option value="148">148</option>
                  <option value="149">149</option>
                  <option value="150">150</option>
                  <option value="151">151</option>
                  <option value="152">152</option>
                  <option value="153">153</option>
                  <option value="154">154</option>
                  <option value="155">155</option>
                  <option value="156">156</option>
                  <option value="157">157</option>
                  <option value="158">158</option>
                  <option value="159">159</option>
                  <option value="160">160</option>
                  <option value="161">161</option>
                  <option value="162">162</option>
                  <option value="163">163</option>
                  <option value="164">164</option>
                  <option value="165">165</option>
                  <option value="166">166</option>
                  <option value="167">167</option>
                  <option value="168">168</option>
                  <option value="169">169</option>
                  <option value="170">170</option>
                  <option value="171">171</option>
                  <option value="172">172</option>
                  <option value="173">173</option>
                  <option value="174">174</option>
                  <option value="175">175</option>
                  <option value="176">176</option>
                  <option value="177">177</option>
                  <option value="178">178</option>
                  <option value="179">179</option>
                  <option value="180">180</option>
                  <option value="181">181</option>
                  <option value="182">182</option>
                  <option value="183">183</option>
                  <option value="184">184</option>
                  <option value="185">185</option>
                  <option value="186">186</option>
                  <option value="187">187</option>
                  <option value="188">188</option>
                  <option value="189">189</option>
                  <option value="190">190</option>
                  <option value="191">191</option>
                  <option value="192">192</option>
                  <option value="193">193</option>
                  <option value="194">194</option>
                  <option value="195">195</option>
                  <option value="196">196</option>
                  <option value="197">197</option>
                  <option value="198">198</option>
                  <option value="199">199</option>
                  <option value="200">200</option>
                  <option value="201">201</option>
                  <option value="202">202</option>
                  <option value="203">203</option>
                  <option value="204">204</option>
                  <option value="205">205</option>
                  <option value="206">206</option>
                  <option value="207">207</option>
                  <option value="208">208</option>
                  <option value="209">209</option>
                  <option value="210">210</option>
                  <option value="211">211</option>
                  <option value="212">212</option>
                  <option value="213">213</option>
                  <option value="214">214</option>
                  <option value="215">215</option>
                  <option value="216">216</option>
                  <option value="217">217</option>
                  <option value="218">218</option>
                  <option value="219">219</option>
                  <option value="220">220</option>
                  <option value="221">221</option>
                  <option value="222">222</option>
                  <option value="223">223</option>
                  <option value="224">224</option>
                  <option value="225">225</option>
                  <option value="226">226</option>
                  <option value="227">227</option>
                  <option value="228">228</option>
                  <option value="229">229</option>
                  <option value="230">230</option>
                  <option value="231">231</option>
                  <option value="232">232</option>
                  <option value="233">233</option>
                  <option value="234">234</option>
                  <option value="235">235</option>
                  <option value="236">236</option>
                  <option value="237">237</option>
                  <option value="238">238</option>
                  <option value="239">239</option>
                  <option value="240">240</option>
                  <option value="241">241</option>
                  <option value="242">242</option>
                  <option value="243">243</option>
                  <option value="244">244</option>
                  <option value="245">245</option>
                  <option value="246">246</option>
                  <option value="247">247</option>
                  <option value="248">248</option>
                  <option value="249">249</option>
                  <option value="250">250</option>
                  <option value="251">251</option>
                  <option value="252">252</option>
                  <option value="253">253</option>
                  <option value="254">254</option>
                  <option value="255">255</option>
                  <option value="256">256</option>
                  <option value="257">257</option>
                  <option value="258">258</option>
                  <option value="259">259</option>
                  <option value="260">260</option>
                  <option value="261">261</option>
                  <option value="262">262</option>
                  <option value="263">263</option>
                  <option value="264">264</option>
                  <option value="265">265</option>
                  <option value="266">266</option>
                  <option value="267">267</option>
                  <option value="268">268</option>
                  <option value="269">269</option>
                  <option value="270">270</option>
                  <option value="271">271</option>
                  <option value="272">272</option>
                  <option value="273">273</option>
                  <option value="274">274</option>
                  <option value="275">275</option>
                  <option value="276">276</option>
                  <option value="277">277</option>
                  <option value="278">278</option>
                  <option value="279">279</option>
                  <option value="280">280</option>
                  <option value="281">281</option>
                  <option value="282">282</option>
                  <option value="283">283</option>
                  <option value="284">284</option>
                  <option value="285">285</option>
                  <option value="286">286</option>
                  <option value="287">287</option>
                  <option value="288">288</option>
                  <option value="289">289</option>
                  <option value="290">290</option>
                  <option value="291">291</option>
                  <option value="292">292</option>
                  <option value="293">293</option>
                  <option value="294">294</option>
                  <option value="295">295</option>
                  <option value="296">296</option>
                  <option value="297">297</option>
                  <option value="298">298</option>
                  <option value="299">299</option>
                  <option value="300">300</option>
                  <option value="301">301</option>
                  <option value="302">302</option>
                  <option value="303">303</option>
                  <option value="304">304</option>
                  <option value="305">305</option>
                  <option value="306">306</option>
                  <option value="307">307</option>
                  <option value="308">308</option>
                  <option value="309">309</option>
                  <option value="310">310</option>
                  <option value="311">311</option>
                  <option value="312">312</option>
                  <option value="313">313</option>
                  <option value="314">314</option>
                  <option value="315">315</option>
                  <option value="316">316</option>
                  <option value="317">317</option>
                  <option value="318">318</option>
                  <option value="319">319</option>
                  <option value="320">320</option>
                  <option value="321">321</option>
                  <option value="322">322</option>
                  <option value="323">323</option>
                  <option value="324">324</option>
                  <option value="325">325</option>
                  <option value="326">326</option>
                  <option value="327">327</option>
                  <option value="328">328</option>
                  <option value="329">329</option>
                  <option value="330">330</option>
                  <option value="331">331</option>
                  <option value="332">332</option>
                  <option value="333">333</option>
                  <option value="334">334</option>
                  <option value="335">335</option>
                  <option value="336">336</option>
                  <option value="337">337</option>
                  <option value="338">338</option>
                  <option value="339">339</option>
                  <option value="340">340</option>
                  <option value="341">341</option>
                  <option value="342">342</option>
                  <option value="343">343</option>
                  <option value="344">344</option>
                  <option value="345">345</option>
                  <option value="346">346</option>
                  <option value="347">347</option>
                  <option value="348">348</option>
                  <option value="349">349</option>
                  <option value="350">350</option>
                  <option value="351">351</option>
                  <option value="352">352</option>
                  <option value="353">353</option>
                  <option value="354">354</option>
                  <option value="355">355</option>
                  <option value="356">356</option>
                  <option value="357">357</option>
                  <option value="358">358</option>
                  <option value="359">359</option>
                  <option value="360">360</option>
                  <option value="361">361</option>
                  <option value="362">362</option>
                  <option value="363">363</option>
                  <option value="364">364</option>
                  <option value="365">365</option>
                  <option value="366">366</option>
                  <option value="367">367</option>
                  <option value="368">368</option>
                  <option value="369">369</option>
                  <option value="370">370</option>
                  <option value="371">371</option>
                  <option value="372">372</option>
                  <option value="373">373</option>
                  <option value="374">374</option>
                  <option value="375">375</option>
                  <option value="376">376</option>
                  <option value="377">377</option>
                  <option value="378">378</option>
                  <option value="379">379</option>
                  <option value="380">380</option>
                  <option value="381">381</option>
                  <option value="382">382</option>
                  <option value="383">383</option>
                  <option value="384">384</option>
                  <option value="385">385</option>
                  <option value="386">386</option>
                  <option value="387">387</option>
                  <option value="388">388</option>
                  <option value="389">389</option>
                  <option value="390">390</option>
                  <option value="391">391</option>
                  <option value="392">392</option>
                  <option value="393">393</option>
                  <option value="394">394</option>
                  <option value="395">395</option>
                  <option value="396">396</option>
                  <option value="397">397</option>
                  <option value="398">398</option>
                  <option value="399">399</option>
                  <option value="400">400</option>
                  <option value="401">401</option>
                  <option value="402">402</option>
                  <option value="403">403</option>
                  <option value="404">404</option>
                  <option value="405">405</option>
                  <option value="406">406</option>
                  <option value="407">407</option>
                  <option value="408">408</option>
                  <option value="409">409</option>
                  <option value="410">410</option>
                  <option value="411">411</option>
                  <option value="412">412</option>
                  <option value="413">413</option>
                  <option value="414">414</option>
                  <option value="415">415</option>
                  <option value="416">416</option>
                  <option value="417">417</option>
                  <option value="418">418</option>
                  <option value="419">419</option>
                  <option value="420">420</option>
                  <option value="421">421</option>
                  <option value="422">422</option>
                  <option value="423">423</option>
                  <option value="424">424</option>
                  <option value="425">425</option>
              </select>

      <label style="margin-left:20px;">
        <input type="checkbox" id="bandwidthToggle" onchange="updateBandwidth()" />
        High Bandwidth Mode (4 pages per screen)
      </label>

      <label style="margin-left:20px;">
        <input type="checkbox" id="ultraBandwidthToggle" onchange="updateBandwidth()" />
        Ultra Bandwidth Mode (8 pages per screen)
      </label>
    </div>

    <div id="flipbook-viewer" data-page-count="2" style="text-align:center;">
      <div style="margin-bottom:10px;">
        <button onclick="popOutPage()" style="font-size:16px; padding:6px 12px;"> Pop Out Page</button>
      </div>


      <div style="margin-top:20px;">
        <button onclick="prevPage()"> Prev</button>
        <button onclick="nextPage()">Next </button>
      </div>


      <div class="ob-reader-spread" role="group" aria-label="Scanned book pages">
                  <canvas id="pageCanvas0" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:inline-block;"></canvas>
                  <canvas id="pageCanvas1" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:inline-block;"></canvas>
                  <canvas id="pageCanvas2" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas3" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas4" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas5" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas6" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas7" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
              </div>
      <p class="ob-reader-status" id="obReaderStatus" aria-live="polite"></p>
      <p class="ob-reader-swipe-hint">Swipe sideways to view additional scanned pages.</p>

      <div style="margin-top:20px;">
        <button onclick="prevPage()"> Prev</button>
        <button onclick="nextPage()">Next </button>
      </div>
    </div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"></script>
    <script>
      const bookName = "GinsburgMassorah1880P2";
      const maxPages = 425;
      const category = "Hebrew";
      let pageNum = 1;
      let scale = 2.0;
      let pageCount = 2;
      let renderGeneration = 0;
      const activeRenderTasks = new Array(8).fill(null);
      const canvasQueues = Array.from({ length: 8 }, () => Promise.resolve());

      const canvases = [];
      const contexts = [];
      for (let i = 0; i < 8; i++) {
        canvases[i] = document.getElementById('pageCanvas' + i);
        contexts[i] = canvases[i].getContext('2d');
      }

      // The reader's original stylesheet fixed all canvases at 50%/25%/12.5%
      // width, meaning the old Zoom/Quality menu only changed resolution.
      // Here we size the *visible* pages as well, allowing sideways scrolling
      // when a spread is wider than the reader.
      function updateCanvasWidths() {
        const spread = document.querySelector('#flipbook-viewer .ob-reader-spread');
        if (!spread) return;
        const mobile = window.matchMedia('(max-width: 800px)').matches;
        const baseline = mobile
          ? Math.min(window.innerWidth * (pageCount > 2 ? 0.70 : 0.82), pageCount > 2 ? 360 : 430)
          : Math.max(50, (spread.clientWidth - 8 - (pageCount - 1) * 12) / pageCount);
        const width = Math.max(50, Math.round(baseline * scale / 2.0));
        for (let i = 0; i < canvases.length; i++) {
          canvases[i].style.setProperty('width', width + 'px', 'important');
          canvases[i].style.setProperty('max-width', 'none', 'important');
        }
        const totalWidth = width * pageCount + 12 * (pageCount - 1);
        spread.classList.toggle('ob-reader-zoom-overflow', totalWidth > spread.clientWidth - 8);
        const indicator = document.getElementById('obZoomIndicator');
        if (indicator) indicator.textContent = String(Math.round(scale * 50)) + '%';
      }

      function updateScale() {
        const requested = parseFloat(document.getElementById('scaleSelect').value);
        if (!Number.isFinite(requested) || requested < 1 || requested > 4) return;
        scale = requested;
        renderPages();
      }

      function updateBandwidth() {
        const high = document.getElementById('bandwidthToggle').checked;
        const ultra = document.getElementById('ultraBandwidthToggle').checked;
        pageCount = ultra ? 8 : high ? 4 : 2;
        document.getElementById('flipbook-viewer').setAttribute('data-page-count', String(pageCount));
        renderPages();
      }

      function goToPage() {
        const selected = parseInt(document.getElementById('pageSelect').value, 10);
        if (!Number.isFinite(selected)) return;
        pageNum = selected % 2 === 0 ? selected - 1 : selected;
        renderPages();
      }

      function renderPages() {
        const generation = ++renderGeneration;
        // Cancel outdated jobs before a rapid zoom/page change. Per-canvas
        // queues below prevent concurrent PDF.js rendering onto one canvas.
        activeRenderTasks.forEach(task => {
          if (task) {
            try { task.cancel(); } catch (error) { /* already completed */ }
          }
        });
        updateCanvasWidths();
        const pageEnd = Math.min(pageNum + pageCount - 1, maxPages);
        const readerStatus = document.getElementById('obReaderStatus');
        if (readerStatus) readerStatus.textContent = `Pages ${pageNum}-${pageEnd} of ${maxPages}`;
        const pageSelect = document.getElementById('pageSelect');
        if (pageSelect) pageSelect.value = String(pageNum);
        for (let i = 0; i < 8; i++) {
          const part = pageNum + i;
          if (i < pageCount && part <= maxPages) {
            canvases[i].style.display = 'inline-block';
            canvasQueues[i] = canvasQueues[i].catch(() => {}).then(() => {
              if (generation !== renderGeneration) return;
              return renderPage(part, canvases[i], contexts[i], i, generation);
            });
          } else {
            canvases[i].style.display = 'none';
          }
        }
      }

      async function renderPage(num, canvas, ctx, index, generation) {
        const url = `/stream_pdf_from_local_zip.php?name=${encodeURIComponent(bookName)}&part=${encodeURIComponent(num)}&category=${encodeURIComponent(category)}`;
        let loadingTask = null;
        let pdf = null;
        let renderTask = null;
        try {
          // Disable PDF.js's PDF-supplied JavaScript evaluation feature.
          loadingTask = pdfjsLib.getDocument({ url: url, isEvalSupported: false });
          pdf = await loadingTask.promise;
          if (generation !== renderGeneration) return;
          const page = await pdf.getPage(1);
          if (generation !== renderGeneration) return;
          const viewport = page.getViewport({ scale: scale });
          canvas.width = Math.ceil(viewport.width);
          canvas.height = Math.ceil(viewport.height);
          renderTask = page.render({ canvasContext: ctx, viewport: viewport });
          activeRenderTasks[index] = renderTask;
          await renderTask.promise;
        } catch (error) {
          if (error && error.name === 'RenderingCancelledException') return;
          if (generation === renderGeneration) {
            const status = document.getElementById('obReaderStatus');
            if (status) status.textContent = 'Could not load page ' + num + '. Please try again.';
            console.error('OriginalBibles reader: page render failed', error);
          }
        } finally {
          if (renderTask && activeRenderTasks[index] === renderTask) activeRenderTasks[index] = null;
          if (pdf) {
            try { await pdf.destroy(); } catch (error) { /* release best effort */ }
          } else if (loadingTask && generation !== renderGeneration) {
            try { await loadingTask.destroy(); } catch (error) { /* release best effort */ }
          }
        }
      }

      let readerResizeFrame = null;
      window.addEventListener('resize', function () {
        if (readerResizeFrame !== null) cancelAnimationFrame(readerResizeFrame);
        readerResizeFrame = requestAnimationFrame(function () {
          readerResizeFrame = null;
          updateCanvasWidths();
        });
      });

      function nextPage() {
        if (pageNum + pageCount <= maxPages) {
          pageNum += pageCount;
          flip();
          renderPages();
        }
      }

      function prevPage() {
        if (pageNum - pageCount >= 1) {
          pageNum -= pageCount;
          flip();
          renderPages();
        }
      }

      function flip() {
        for (let i = 0; i < pageCount; i++) {
          canvases[i].style.transform = 'rotateY(180deg)';
        }
        setTimeout(() => {
          for (let i = 0; i < pageCount; i++) {
            canvases[i].style.transform = '';
          }
        }, 600);
      }

      function popOutPage() {
        const url = `/stream_pdf_from_local_zip.php?name=${encodeURIComponent(bookName)}&part=${encodeURIComponent(pageNum)}&category=${encodeURIComponent(category)}`;
        window.open(url, '_blank');
      }

      renderPages();
    </script>
    
<p>    <style>
    #geminiModal {
        display: none;
        position: fixed;
        top: 20%;
        left: 50%;
        transform: translateX(-50%);
        width: 60%;
        background: #fdfcf7;
        border: 1px solid #ccc;
        padding: 20px;
        box-shadow: 0 0 20px rgba(0,0,0,0.3);
        z-index: 9999;
        font-family: 'Georgia', serif;
        opacity: 0;
        transition: opacity 0.5s ease-in-out;
    }
    #geminiModal.show { display: block; opacity: 1; }
    #geminiModalText { white-space: pre-wrap; font-size: 16px; color: #3b2f1e; }

    #assistant-launcher button {
        font-family: 'Georgia', serif;
        background-color: #eae6d9;
        border: 1px solid #ccc;
        color: #3b2f1e;
        cursor: pointer;
        padding: 10px 20px;
        font-size: 16px;
        margin-right: 10px;
        margin-top: 10px;
    }
    #assistant-launcher textarea {
        font-family: 'Georgia', serif;
        background-color: #fffef8;
        border: 1px solid #ccc;
        color: #3b2f1e;
        padding: 10px;
        font-size: 16px;
        resize: vertical;
        width: 60%;
    }
    </style>

    <div id="assistant-launcher" style="text-align:center; margin:40px 0 20px 0;">
        <textarea id="sacredPrompt" placeholder="Enter your theological or Biblical questions... (AI can make mistakes so be aware!)" rows="4"></textarea><br><br>
        <button onclick="launchCopilot()">Ask Copilot</button>
        <button onclick="launchChatGPT()">Ask ChatGPT</button>
        <button onclick="launchGeminiModal()">Ask Gemini</button>
    </div>

    <div id="geminiModal">
        <p id="geminiModalText"></p>
        <button onclick="confirmGemini()">Open Gemini</button>
        <button onclick="closeGeminiModal()" style="margin-left:10px;">Cancel</button>
    </div>

    <script>
    async function getSacredQuery() {
        const userInput = document.getElementById("sacredPrompt").value.trim();
        if (!userInput) return null;

        const frame = `As a biblical scholar engaging with sacred scripture, I seek a reverent, theologically grounded analysis of the following passage. Please treat the text as divinely inspired and central to Christian tradition. Your response should include canonical context (situating the passage within the broader biblical canon and theological tradition), historical background (relevant cultural, geopolitical, and religious context at the time of composition), literary structure (analysis of composition, genre, and rhetorical features), and theological interpretation (a coherent, tradition-respecting reading consistent with respected scholarly perspectives). Include original-language forms in Hebrew (Tanakh), Greek (Septuagint or New Testament), and Aramaic (where applicable), with transliteration, translation, and brief commentary on linguistic nuance. Avoid reduction to metaphor or myth. Emphasize theological coherence, canonical fidelity, and interpretive depth. Reference the Oxford Bible Commentary where appropriate, and draw from respected scholarly traditions rooted in historical-critical, canonical, and theological methodologies. Please do not include the sacred name Yahweh or other divine names that may cause discomfort or offense among Christians and Jews. Use respectful and widely accepted alternatives such as “God” or “The Lord.`;

        return encodeURIComponent(frame + " " + userInput);
    }

    async function launchCopilot() {
        const query = await getSacredQuery();
        if (!query) return;
        openPopup(`https://copilot.microsoft.com/?q=${query}`);
    }

    async function launchChatGPT() {
        const query = await getSacredQuery();
        if (!query) return;
        openPopup(`https://chat.openai.com/?q=${query}`);
    }

    async function launchGeminiModal() {
        const query = await getSacredQuery();
        if (!query) return;
        const promptText = decodeURIComponent(query);
        const modal = document.getElementById("geminiModal");
        document.getElementById("geminiModalText").innerText =
            "Gemini will open in a new window. Please paste or retype your sacred question to begin:\n\n" + promptText;
        modal.classList.add("show");
    }

    function confirmGemini() { openPopup("https://gemini.google.com/"); closeGeminiModal(); }
    function closeGeminiModal() {
        const modal = document.getElementById("geminiModal");
        modal.classList.remove("show");
        setTimeout(() => { modal.style.display = "none"; }, 500);
    }

    function openPopup(url) {
        const isMobile = window.innerWidth < 768;
        if (isMobile) {
            alert("Opening in a new tab for better mobile experience.");
            window.location.href = url;
        } else {
            const screenX = typeof window.screenX !== 'undefined' ? window.screenX : window.screenLeft;
            const screenY = typeof window.screenY !== 'undefined' ? window.screenY : window.screenTop;
            const outerWidth = typeof window.outerWidth !== 'undefined' ? window.outerWidth : document.documentElement.clientWidth;
            const outerHeight = typeof window.outerHeight !== 'undefined' ? window.outerHeight : document.documentElement.clientHeight;

            const width = Math.floor(outerWidth * 0.3);
            const height = Math.floor(outerHeight * 0.3);
            const left = screenX + Math.floor((outerWidth - width) / 2);
            const top = screenY + Math.floor((outerHeight - height) / 2);

            window.open(
                url,
                "AssistantPopup",
                `width=${width},height=${height},top=${top},left=${left},` +
                "noopener,noreferrer,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes,resizable=yes"
            );
        }
    }
    </script>
    <br />
Index of the book (please forgive any unreadable bits: this index is computer generated from ancient texts):</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.originalbibles.com/the-massorah-the-hebrew-notes-with-english-translations-ginsburg-1880-pdf-volume-ii/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>The Ginsburg Massorah Volume 1 Part 2. 1880 (Hebrew)</title>
		<link>https://www.originalbibles.com/the-ginsburg-massorah-volume-1-part-2-1880/</link>
					<comments>https://www.originalbibles.com/the-ginsburg-massorah-volume-1-part-2-1880/#comments</comments>
		
		<dc:creator><![CDATA[Editor]]></dc:creator>
		<pubDate>Fri, 11 Jan 2013 13:31:33 +0000</pubDate>
				<category><![CDATA[1800]]></category>
		<category><![CDATA[Hebrew Bible]]></category>
		<category><![CDATA[Christian D. Ginsburg]]></category>
		<category><![CDATA[massorah]]></category>
		<category><![CDATA[1880]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[bible]]></category>
		<category><![CDATA[read online]]></category>
		<category><![CDATA[original bible]]></category>
		<category><![CDATA[read on android]]></category>
		<category><![CDATA[read on iphone]]></category>
		<category><![CDATA[The Old Testament]]></category>
		<category><![CDATA[read on tablet]]></category>
		<category><![CDATA[read on apple]]></category>
		<category><![CDATA[hebrew]]></category>
		<category><![CDATA[masoretic]]></category>
		<guid isPermaLink="false">https://obibles5088.live-website.com/?p=343</guid>

					<description><![CDATA[The Ginsburg Massorah Volume 1 Part 2. 1880 (Hebrew) PDF Christian David Ginsburg between 1880...]]></description>
										<content:encoded><![CDATA[<h3>The Ginsburg Massorah Volume 1 Part 2. 1880 (Hebrew) PDF</h3>
<p>Christian David Ginsburg between 1880 &#8211; 1886 published the Massorah (sometimes spelt masorah). This is basically the Hebrew Bible with the various notes by the Masoretes.</p>
<p>See: Volume 1 has Aleph to Yod.</p>
<p>Please be advised, that with all ancient texts, one must be careful and view it together with other editions/reprints (in case some text is lost or unreadable due to age etcetera). However, this does not reduce the pleasure of reading the original and ancient texts!</p>
    <div id="flipbook-controls" style="text-align:center; margin-bottom:10px;">
      <label for="scaleSelect">Page Zoom:</label>
      <select id="scaleSelect" onchange="updateScale()" style="font-size:16px; padding:4px;">
        <option value="1.0">50% — Extra Small</option>
        <option value="1.5">75% — Small</option>
        <option value="2.0" selected>100% — Medium</option>
        <option value="2.5">125% — Large</option>
        <option value="3.0">150% — Extra Large</option>
        <option value="4.0">200% — XL</option>
      </select>
      <span class="ob-zoom-indicator" id="obZoomIndicator" aria-live="polite">100%</span>

      <label for="pageSelect" style="margin-left:20px;">Go to Page:</label>
      <select id="pageSelect" onchange="goToPage()" style="font-size:16px; padding:4px;">
                  <option value="1">1</option>
                  <option value="2">2</option>
                  <option value="3">3</option>
                  <option value="4">4</option>
                  <option value="5">5</option>
                  <option value="6">6</option>
                  <option value="7">7</option>
                  <option value="8">8</option>
                  <option value="9">9</option>
                  <option value="10">10</option>
                  <option value="11">11</option>
                  <option value="12">12</option>
                  <option value="13">13</option>
                  <option value="14">14</option>
                  <option value="15">15</option>
                  <option value="16">16</option>
                  <option value="17">17</option>
                  <option value="18">18</option>
                  <option value="19">19</option>
                  <option value="20">20</option>
                  <option value="21">21</option>
                  <option value="22">22</option>
                  <option value="23">23</option>
                  <option value="24">24</option>
                  <option value="25">25</option>
                  <option value="26">26</option>
                  <option value="27">27</option>
                  <option value="28">28</option>
                  <option value="29">29</option>
                  <option value="30">30</option>
                  <option value="31">31</option>
                  <option value="32">32</option>
                  <option value="33">33</option>
                  <option value="34">34</option>
                  <option value="35">35</option>
                  <option value="36">36</option>
                  <option value="37">37</option>
                  <option value="38">38</option>
                  <option value="39">39</option>
                  <option value="40">40</option>
                  <option value="41">41</option>
                  <option value="42">42</option>
                  <option value="43">43</option>
                  <option value="44">44</option>
                  <option value="45">45</option>
                  <option value="46">46</option>
                  <option value="47">47</option>
                  <option value="48">48</option>
                  <option value="49">49</option>
                  <option value="50">50</option>
                  <option value="51">51</option>
                  <option value="52">52</option>
                  <option value="53">53</option>
                  <option value="54">54</option>
                  <option value="55">55</option>
                  <option value="56">56</option>
                  <option value="57">57</option>
                  <option value="58">58</option>
                  <option value="59">59</option>
                  <option value="60">60</option>
                  <option value="61">61</option>
                  <option value="62">62</option>
                  <option value="63">63</option>
                  <option value="64">64</option>
                  <option value="65">65</option>
                  <option value="66">66</option>
                  <option value="67">67</option>
                  <option value="68">68</option>
                  <option value="69">69</option>
                  <option value="70">70</option>
                  <option value="71">71</option>
                  <option value="72">72</option>
                  <option value="73">73</option>
                  <option value="74">74</option>
                  <option value="75">75</option>
                  <option value="76">76</option>
                  <option value="77">77</option>
                  <option value="78">78</option>
                  <option value="79">79</option>
                  <option value="80">80</option>
                  <option value="81">81</option>
                  <option value="82">82</option>
                  <option value="83">83</option>
                  <option value="84">84</option>
                  <option value="85">85</option>
                  <option value="86">86</option>
                  <option value="87">87</option>
                  <option value="88">88</option>
                  <option value="89">89</option>
                  <option value="90">90</option>
                  <option value="91">91</option>
                  <option value="92">92</option>
                  <option value="93">93</option>
                  <option value="94">94</option>
                  <option value="95">95</option>
                  <option value="96">96</option>
                  <option value="97">97</option>
                  <option value="98">98</option>
                  <option value="99">99</option>
                  <option value="100">100</option>
                  <option value="101">101</option>
                  <option value="102">102</option>
                  <option value="103">103</option>
                  <option value="104">104</option>
                  <option value="105">105</option>
                  <option value="106">106</option>
                  <option value="107">107</option>
                  <option value="108">108</option>
                  <option value="109">109</option>
                  <option value="110">110</option>
                  <option value="111">111</option>
                  <option value="112">112</option>
                  <option value="113">113</option>
                  <option value="114">114</option>
                  <option value="115">115</option>
                  <option value="116">116</option>
                  <option value="117">117</option>
                  <option value="118">118</option>
                  <option value="119">119</option>
                  <option value="120">120</option>
                  <option value="121">121</option>
                  <option value="122">122</option>
                  <option value="123">123</option>
                  <option value="124">124</option>
                  <option value="125">125</option>
                  <option value="126">126</option>
                  <option value="127">127</option>
                  <option value="128">128</option>
                  <option value="129">129</option>
                  <option value="130">130</option>
                  <option value="131">131</option>
                  <option value="132">132</option>
                  <option value="133">133</option>
                  <option value="134">134</option>
                  <option value="135">135</option>
                  <option value="136">136</option>
                  <option value="137">137</option>
                  <option value="138">138</option>
                  <option value="139">139</option>
                  <option value="140">140</option>
                  <option value="141">141</option>
                  <option value="142">142</option>
                  <option value="143">143</option>
                  <option value="144">144</option>
                  <option value="145">145</option>
                  <option value="146">146</option>
                  <option value="147">147</option>
                  <option value="148">148</option>
                  <option value="149">149</option>
                  <option value="150">150</option>
                  <option value="151">151</option>
                  <option value="152">152</option>
                  <option value="153">153</option>
                  <option value="154">154</option>
                  <option value="155">155</option>
                  <option value="156">156</option>
                  <option value="157">157</option>
                  <option value="158">158</option>
                  <option value="159">159</option>
                  <option value="160">160</option>
                  <option value="161">161</option>
                  <option value="162">162</option>
                  <option value="163">163</option>
                  <option value="164">164</option>
                  <option value="165">165</option>
                  <option value="166">166</option>
                  <option value="167">167</option>
                  <option value="168">168</option>
                  <option value="169">169</option>
                  <option value="170">170</option>
                  <option value="171">171</option>
                  <option value="172">172</option>
                  <option value="173">173</option>
                  <option value="174">174</option>
                  <option value="175">175</option>
                  <option value="176">176</option>
                  <option value="177">177</option>
                  <option value="178">178</option>
                  <option value="179">179</option>
                  <option value="180">180</option>
                  <option value="181">181</option>
                  <option value="182">182</option>
                  <option value="183">183</option>
                  <option value="184">184</option>
                  <option value="185">185</option>
                  <option value="186">186</option>
                  <option value="187">187</option>
                  <option value="188">188</option>
                  <option value="189">189</option>
                  <option value="190">190</option>
                  <option value="191">191</option>
                  <option value="192">192</option>
                  <option value="193">193</option>
                  <option value="194">194</option>
                  <option value="195">195</option>
                  <option value="196">196</option>
                  <option value="197">197</option>
                  <option value="198">198</option>
                  <option value="199">199</option>
                  <option value="200">200</option>
                  <option value="201">201</option>
                  <option value="202">202</option>
                  <option value="203">203</option>
                  <option value="204">204</option>
                  <option value="205">205</option>
                  <option value="206">206</option>
                  <option value="207">207</option>
                  <option value="208">208</option>
                  <option value="209">209</option>
                  <option value="210">210</option>
                  <option value="211">211</option>
                  <option value="212">212</option>
                  <option value="213">213</option>
                  <option value="214">214</option>
                  <option value="215">215</option>
                  <option value="216">216</option>
                  <option value="217">217</option>
                  <option value="218">218</option>
                  <option value="219">219</option>
                  <option value="220">220</option>
                  <option value="221">221</option>
                  <option value="222">222</option>
                  <option value="223">223</option>
                  <option value="224">224</option>
                  <option value="225">225</option>
                  <option value="226">226</option>
                  <option value="227">227</option>
                  <option value="228">228</option>
                  <option value="229">229</option>
                  <option value="230">230</option>
                  <option value="231">231</option>
                  <option value="232">232</option>
                  <option value="233">233</option>
                  <option value="234">234</option>
                  <option value="235">235</option>
                  <option value="236">236</option>
                  <option value="237">237</option>
                  <option value="238">238</option>
                  <option value="239">239</option>
                  <option value="240">240</option>
                  <option value="241">241</option>
                  <option value="242">242</option>
                  <option value="243">243</option>
                  <option value="244">244</option>
                  <option value="245">245</option>
                  <option value="246">246</option>
                  <option value="247">247</option>
                  <option value="248">248</option>
                  <option value="249">249</option>
                  <option value="250">250</option>
                  <option value="251">251</option>
                  <option value="252">252</option>
                  <option value="253">253</option>
                  <option value="254">254</option>
                  <option value="255">255</option>
                  <option value="256">256</option>
                  <option value="257">257</option>
                  <option value="258">258</option>
                  <option value="259">259</option>
                  <option value="260">260</option>
                  <option value="261">261</option>
                  <option value="262">262</option>
                  <option value="263">263</option>
                  <option value="264">264</option>
                  <option value="265">265</option>
                  <option value="266">266</option>
                  <option value="267">267</option>
                  <option value="268">268</option>
                  <option value="269">269</option>
                  <option value="270">270</option>
                  <option value="271">271</option>
                  <option value="272">272</option>
                  <option value="273">273</option>
                  <option value="274">274</option>
                  <option value="275">275</option>
                  <option value="276">276</option>
                  <option value="277">277</option>
                  <option value="278">278</option>
                  <option value="279">279</option>
                  <option value="280">280</option>
                  <option value="281">281</option>
                  <option value="282">282</option>
                  <option value="283">283</option>
                  <option value="284">284</option>
                  <option value="285">285</option>
                  <option value="286">286</option>
                  <option value="287">287</option>
                  <option value="288">288</option>
                  <option value="289">289</option>
                  <option value="290">290</option>
                  <option value="291">291</option>
                  <option value="292">292</option>
                  <option value="293">293</option>
                  <option value="294">294</option>
                  <option value="295">295</option>
                  <option value="296">296</option>
                  <option value="297">297</option>
                  <option value="298">298</option>
                  <option value="299">299</option>
                  <option value="300">300</option>
                  <option value="301">301</option>
                  <option value="302">302</option>
                  <option value="303">303</option>
                  <option value="304">304</option>
                  <option value="305">305</option>
                  <option value="306">306</option>
                  <option value="307">307</option>
                  <option value="308">308</option>
                  <option value="309">309</option>
                  <option value="310">310</option>
                  <option value="311">311</option>
                  <option value="312">312</option>
                  <option value="313">313</option>
                  <option value="314">314</option>
                  <option value="315">315</option>
                  <option value="316">316</option>
                  <option value="317">317</option>
                  <option value="318">318</option>
                  <option value="319">319</option>
                  <option value="320">320</option>
                  <option value="321">321</option>
                  <option value="322">322</option>
                  <option value="323">323</option>
                  <option value="324">324</option>
                  <option value="325">325</option>
                  <option value="326">326</option>
                  <option value="327">327</option>
                  <option value="328">328</option>
                  <option value="329">329</option>
                  <option value="330">330</option>
                  <option value="331">331</option>
                  <option value="332">332</option>
                  <option value="333">333</option>
                  <option value="334">334</option>
                  <option value="335">335</option>
                  <option value="336">336</option>
                  <option value="337">337</option>
                  <option value="338">338</option>
                  <option value="339">339</option>
                  <option value="340">340</option>
                  <option value="341">341</option>
                  <option value="342">342</option>
                  <option value="343">343</option>
                  <option value="344">344</option>
                  <option value="345">345</option>
                  <option value="346">346</option>
                  <option value="347">347</option>
                  <option value="348">348</option>
                  <option value="349">349</option>
                  <option value="350">350</option>
                  <option value="351">351</option>
                  <option value="352">352</option>
                  <option value="353">353</option>
                  <option value="354">354</option>
                  <option value="355">355</option>
                  <option value="356">356</option>
                  <option value="357">357</option>
                  <option value="358">358</option>
                  <option value="359">359</option>
                  <option value="360">360</option>
                  <option value="361">361</option>
                  <option value="362">362</option>
                  <option value="363">363</option>
                  <option value="364">364</option>
                  <option value="365">365</option>
                  <option value="366">366</option>
                  <option value="367">367</option>
                  <option value="368">368</option>
                  <option value="369">369</option>
                  <option value="370">370</option>
                  <option value="371">371</option>
                  <option value="372">372</option>
                  <option value="373">373</option>
                  <option value="374">374</option>
                  <option value="375">375</option>
                  <option value="376">376</option>
                  <option value="377">377</option>
                  <option value="378">378</option>
                  <option value="379">379</option>
                  <option value="380">380</option>
              </select>

      <label style="margin-left:20px;">
        <input type="checkbox" id="bandwidthToggle" onchange="updateBandwidth()" />
        High Bandwidth Mode (4 pages per screen)
      </label>

      <label style="margin-left:20px;">
        <input type="checkbox" id="ultraBandwidthToggle" onchange="updateBandwidth()" />
        Ultra Bandwidth Mode (8 pages per screen)
      </label>
    </div>

    <div id="flipbook-viewer" data-page-count="2" style="text-align:center;">
      <div style="margin-bottom:10px;">
        <button onclick="popOutPage()" style="font-size:16px; padding:6px 12px;"> Pop Out Page</button>
      </div>


      <div style="margin-top:20px;">
        <button onclick="prevPage()"> Prev</button>
        <button onclick="nextPage()">Next </button>
      </div>


      <div class="ob-reader-spread" role="group" aria-label="Scanned book pages">
                  <canvas id="pageCanvas0" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:inline-block;"></canvas>
                  <canvas id="pageCanvas1" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:inline-block;"></canvas>
                  <canvas id="pageCanvas2" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas3" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas4" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas5" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas6" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas7" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
              </div>
      <p class="ob-reader-status" id="obReaderStatus" aria-live="polite"></p>
      <p class="ob-reader-swipe-hint">Swipe sideways to view additional scanned pages.</p>

      <div style="margin-top:20px;">
        <button onclick="prevPage()"> Prev</button>
        <button onclick="nextPage()">Next </button>
      </div>
    </div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"></script>
    <script>
      const bookName = "GinsburgMassorahV1P2";
      const maxPages = 380;
      const category = "Hebrew";
      let pageNum = 1;
      let scale = 2.0;
      let pageCount = 2;
      let renderGeneration = 0;
      const activeRenderTasks = new Array(8).fill(null);
      const canvasQueues = Array.from({ length: 8 }, () => Promise.resolve());

      const canvases = [];
      const contexts = [];
      for (let i = 0; i < 8; i++) {
        canvases[i] = document.getElementById('pageCanvas' + i);
        contexts[i] = canvases[i].getContext('2d');
      }

      // The reader's original stylesheet fixed all canvases at 50%/25%/12.5%
      // width, meaning the old Zoom/Quality menu only changed resolution.
      // Here we size the *visible* pages as well, allowing sideways scrolling
      // when a spread is wider than the reader.
      function updateCanvasWidths() {
        const spread = document.querySelector('#flipbook-viewer .ob-reader-spread');
        if (!spread) return;
        const mobile = window.matchMedia('(max-width: 800px)').matches;
        const baseline = mobile
          ? Math.min(window.innerWidth * (pageCount > 2 ? 0.70 : 0.82), pageCount > 2 ? 360 : 430)
          : Math.max(50, (spread.clientWidth - 8 - (pageCount - 1) * 12) / pageCount);
        const width = Math.max(50, Math.round(baseline * scale / 2.0));
        for (let i = 0; i < canvases.length; i++) {
          canvases[i].style.setProperty('width', width + 'px', 'important');
          canvases[i].style.setProperty('max-width', 'none', 'important');
        }
        const totalWidth = width * pageCount + 12 * (pageCount - 1);
        spread.classList.toggle('ob-reader-zoom-overflow', totalWidth > spread.clientWidth - 8);
        const indicator = document.getElementById('obZoomIndicator');
        if (indicator) indicator.textContent = String(Math.round(scale * 50)) + '%';
      }

      function updateScale() {
        const requested = parseFloat(document.getElementById('scaleSelect').value);
        if (!Number.isFinite(requested) || requested < 1 || requested > 4) return;
        scale = requested;
        renderPages();
      }

      function updateBandwidth() {
        const high = document.getElementById('bandwidthToggle').checked;
        const ultra = document.getElementById('ultraBandwidthToggle').checked;
        pageCount = ultra ? 8 : high ? 4 : 2;
        document.getElementById('flipbook-viewer').setAttribute('data-page-count', String(pageCount));
        renderPages();
      }

      function goToPage() {
        const selected = parseInt(document.getElementById('pageSelect').value, 10);
        if (!Number.isFinite(selected)) return;
        pageNum = selected % 2 === 0 ? selected - 1 : selected;
        renderPages();
      }

      function renderPages() {
        const generation = ++renderGeneration;
        // Cancel outdated jobs before a rapid zoom/page change. Per-canvas
        // queues below prevent concurrent PDF.js rendering onto one canvas.
        activeRenderTasks.forEach(task => {
          if (task) {
            try { task.cancel(); } catch (error) { /* already completed */ }
          }
        });
        updateCanvasWidths();
        const pageEnd = Math.min(pageNum + pageCount - 1, maxPages);
        const readerStatus = document.getElementById('obReaderStatus');
        if (readerStatus) readerStatus.textContent = `Pages ${pageNum}-${pageEnd} of ${maxPages}`;
        const pageSelect = document.getElementById('pageSelect');
        if (pageSelect) pageSelect.value = String(pageNum);
        for (let i = 0; i < 8; i++) {
          const part = pageNum + i;
          if (i < pageCount && part <= maxPages) {
            canvases[i].style.display = 'inline-block';
            canvasQueues[i] = canvasQueues[i].catch(() => {}).then(() => {
              if (generation !== renderGeneration) return;
              return renderPage(part, canvases[i], contexts[i], i, generation);
            });
          } else {
            canvases[i].style.display = 'none';
          }
        }
      }

      async function renderPage(num, canvas, ctx, index, generation) {
        const url = `/stream_pdf_from_local_zip.php?name=${encodeURIComponent(bookName)}&part=${encodeURIComponent(num)}&category=${encodeURIComponent(category)}`;
        let loadingTask = null;
        let pdf = null;
        let renderTask = null;
        try {
          // Disable PDF.js's PDF-supplied JavaScript evaluation feature.
          loadingTask = pdfjsLib.getDocument({ url: url, isEvalSupported: false });
          pdf = await loadingTask.promise;
          if (generation !== renderGeneration) return;
          const page = await pdf.getPage(1);
          if (generation !== renderGeneration) return;
          const viewport = page.getViewport({ scale: scale });
          canvas.width = Math.ceil(viewport.width);
          canvas.height = Math.ceil(viewport.height);
          renderTask = page.render({ canvasContext: ctx, viewport: viewport });
          activeRenderTasks[index] = renderTask;
          await renderTask.promise;
        } catch (error) {
          if (error && error.name === 'RenderingCancelledException') return;
          if (generation === renderGeneration) {
            const status = document.getElementById('obReaderStatus');
            if (status) status.textContent = 'Could not load page ' + num + '. Please try again.';
            console.error('OriginalBibles reader: page render failed', error);
          }
        } finally {
          if (renderTask && activeRenderTasks[index] === renderTask) activeRenderTasks[index] = null;
          if (pdf) {
            try { await pdf.destroy(); } catch (error) { /* release best effort */ }
          } else if (loadingTask && generation !== renderGeneration) {
            try { await loadingTask.destroy(); } catch (error) { /* release best effort */ }
          }
        }
      }

      let readerResizeFrame = null;
      window.addEventListener('resize', function () {
        if (readerResizeFrame !== null) cancelAnimationFrame(readerResizeFrame);
        readerResizeFrame = requestAnimationFrame(function () {
          readerResizeFrame = null;
          updateCanvasWidths();
        });
      });

      function nextPage() {
        if (pageNum + pageCount <= maxPages) {
          pageNum += pageCount;
          flip();
          renderPages();
        }
      }

      function prevPage() {
        if (pageNum - pageCount >= 1) {
          pageNum -= pageCount;
          flip();
          renderPages();
        }
      }

      function flip() {
        for (let i = 0; i < pageCount; i++) {
          canvases[i].style.transform = 'rotateY(180deg)';
        }
        setTimeout(() => {
          for (let i = 0; i < pageCount; i++) {
            canvases[i].style.transform = '';
          }
        }, 600);
      }

      function popOutPage() {
        const url = `/stream_pdf_from_local_zip.php?name=${encodeURIComponent(bookName)}&part=${encodeURIComponent(pageNum)}&category=${encodeURIComponent(category)}`;
        window.open(url, '_blank');
      }

      renderPages();
    </script>
    
<p>    <style>
    #geminiModal {
        display: none;
        position: fixed;
        top: 20%;
        left: 50%;
        transform: translateX(-50%);
        width: 60%;
        background: #fdfcf7;
        border: 1px solid #ccc;
        padding: 20px;
        box-shadow: 0 0 20px rgba(0,0,0,0.3);
        z-index: 9999;
        font-family: 'Georgia', serif;
        opacity: 0;
        transition: opacity 0.5s ease-in-out;
    }
    #geminiModal.show { display: block; opacity: 1; }
    #geminiModalText { white-space: pre-wrap; font-size: 16px; color: #3b2f1e; }

    #assistant-launcher button {
        font-family: 'Georgia', serif;
        background-color: #eae6d9;
        border: 1px solid #ccc;
        color: #3b2f1e;
        cursor: pointer;
        padding: 10px 20px;
        font-size: 16px;
        margin-right: 10px;
        margin-top: 10px;
    }
    #assistant-launcher textarea {
        font-family: 'Georgia', serif;
        background-color: #fffef8;
        border: 1px solid #ccc;
        color: #3b2f1e;
        padding: 10px;
        font-size: 16px;
        resize: vertical;
        width: 60%;
    }
    </style>

    <div id="assistant-launcher" style="text-align:center; margin:40px 0 20px 0;">
        <textarea id="sacredPrompt" placeholder="Enter your theological or Biblical questions... (AI can make mistakes so be aware!)" rows="4"></textarea><br><br>
        <button onclick="launchCopilot()">Ask Copilot</button>
        <button onclick="launchChatGPT()">Ask ChatGPT</button>
        <button onclick="launchGeminiModal()">Ask Gemini</button>
    </div>

    <div id="geminiModal">
        <p id="geminiModalText"></p>
        <button onclick="confirmGemini()">Open Gemini</button>
        <button onclick="closeGeminiModal()" style="margin-left:10px;">Cancel</button>
    </div>

    <script>
    async function getSacredQuery() {
        const userInput = document.getElementById("sacredPrompt").value.trim();
        if (!userInput) return null;

        const frame = `As a biblical scholar engaging with sacred scripture, I seek a reverent, theologically grounded analysis of the following passage. Please treat the text as divinely inspired and central to Christian tradition. Your response should include canonical context (situating the passage within the broader biblical canon and theological tradition), historical background (relevant cultural, geopolitical, and religious context at the time of composition), literary structure (analysis of composition, genre, and rhetorical features), and theological interpretation (a coherent, tradition-respecting reading consistent with respected scholarly perspectives). Include original-language forms in Hebrew (Tanakh), Greek (Septuagint or New Testament), and Aramaic (where applicable), with transliteration, translation, and brief commentary on linguistic nuance. Avoid reduction to metaphor or myth. Emphasize theological coherence, canonical fidelity, and interpretive depth. Reference the Oxford Bible Commentary where appropriate, and draw from respected scholarly traditions rooted in historical-critical, canonical, and theological methodologies. Please do not include the sacred name Yahweh or other divine names that may cause discomfort or offense among Christians and Jews. Use respectful and widely accepted alternatives such as “God” or “The Lord.`;

        return encodeURIComponent(frame + " " + userInput);
    }

    async function launchCopilot() {
        const query = await getSacredQuery();
        if (!query) return;
        openPopup(`https://copilot.microsoft.com/?q=${query}`);
    }

    async function launchChatGPT() {
        const query = await getSacredQuery();
        if (!query) return;
        openPopup(`https://chat.openai.com/?q=${query}`);
    }

    async function launchGeminiModal() {
        const query = await getSacredQuery();
        if (!query) return;
        const promptText = decodeURIComponent(query);
        const modal = document.getElementById("geminiModal");
        document.getElementById("geminiModalText").innerText =
            "Gemini will open in a new window. Please paste or retype your sacred question to begin:\n\n" + promptText;
        modal.classList.add("show");
    }

    function confirmGemini() { openPopup("https://gemini.google.com/"); closeGeminiModal(); }
    function closeGeminiModal() {
        const modal = document.getElementById("geminiModal");
        modal.classList.remove("show");
        setTimeout(() => { modal.style.display = "none"; }, 500);
    }

    function openPopup(url) {
        const isMobile = window.innerWidth < 768;
        if (isMobile) {
            alert("Opening in a new tab for better mobile experience.");
            window.location.href = url;
        } else {
            const screenX = typeof window.screenX !== 'undefined' ? window.screenX : window.screenLeft;
            const screenY = typeof window.screenY !== 'undefined' ? window.screenY : window.screenTop;
            const outerWidth = typeof window.outerWidth !== 'undefined' ? window.outerWidth : document.documentElement.clientWidth;
            const outerHeight = typeof window.outerHeight !== 'undefined' ? window.outerHeight : document.documentElement.clientHeight;

            const width = Math.floor(outerWidth * 0.3);
            const height = Math.floor(outerHeight * 0.3);
            const left = screenX + Math.floor((outerWidth - width) / 2);
            const top = screenY + Math.floor((outerHeight - height) / 2);

            window.open(
                url,
                "AssistantPopup",
                `width=${width},height=${height},top=${top},left=${left},` +
                "noopener,noreferrer,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes,resizable=yes"
            );
        }
    }
    </script>
    <br />
Index of the book (please forgive any unreadable bits: this index is computer generated from ancient texts):</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.originalbibles.com/the-ginsburg-massorah-volume-1-part-2-1880/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>The Ginsburg Massorah Volume 1 Part 1. 1880 (English)</title>
		<link>https://www.originalbibles.com/the-ginsburg-massorah-volume-1-part-1-1880/</link>
					<comments>https://www.originalbibles.com/the-ginsburg-massorah-volume-1-part-1-1880/#respond</comments>
		
		<dc:creator><![CDATA[Editor]]></dc:creator>
		<pubDate>Fri, 11 Jan 2013 13:19:28 +0000</pubDate>
				<category><![CDATA[Hebrew Bible]]></category>
		<category><![CDATA[1800]]></category>
		<category><![CDATA[read on iphone]]></category>
		<category><![CDATA[hebrew]]></category>
		<category><![CDATA[read on tablet]]></category>
		<category><![CDATA[masoretic]]></category>
		<category><![CDATA[read on apple]]></category>
		<category><![CDATA[Christian D. Ginsburg]]></category>
		<category><![CDATA[1860]]></category>
		<category><![CDATA[original]]></category>
		<category><![CDATA[massorah]]></category>
		<category><![CDATA[volume 1]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[bible]]></category>
		<category><![CDATA[read online]]></category>
		<category><![CDATA[read on android]]></category>
		<guid isPermaLink="false">https://obibles5088.live-website.com/?p=339</guid>

					<description><![CDATA[The Ginsburg Massorah Volume 1 Part 1. 1880 (English) PDF Christian David Ginsburg between 1880...]]></description>
										<content:encoded><![CDATA[<h3>The Ginsburg Massorah Volume 1 Part 1. 1880 (English) PDF</h3>
<p>Christian David Ginsburg between 1880 &#8211; 1886 published the Massorah (sometimes spelt masorah). This is basically the Hebrew Bible with the various notes by the Masoretes.</p>
<p>Please be advised, that with all ancient texts, one must be careful and view it together with other editions/reprints (in case some text is lost or unreadable due to age etcetera). However, this does not reduce the pleasure of reading the original and ancient texts!</p>
    <div id="flipbook-controls" style="text-align:center; margin-bottom:10px;">
      <label for="scaleSelect">Page Zoom:</label>
      <select id="scaleSelect" onchange="updateScale()" style="font-size:16px; padding:4px;">
        <option value="1.0">50% — Extra Small</option>
        <option value="1.5">75% — Small</option>
        <option value="2.0" selected>100% — Medium</option>
        <option value="2.5">125% — Large</option>
        <option value="3.0">150% — Extra Large</option>
        <option value="4.0">200% — XL</option>
      </select>
      <span class="ob-zoom-indicator" id="obZoomIndicator" aria-live="polite">100%</span>

      <label for="pageSelect" style="margin-left:20px;">Go to Page:</label>
      <select id="pageSelect" onchange="goToPage()" style="font-size:16px; padding:4px;">
                  <option value="1">1</option>
                  <option value="2">2</option>
                  <option value="3">3</option>
                  <option value="4">4</option>
                  <option value="5">5</option>
                  <option value="6">6</option>
                  <option value="7">7</option>
                  <option value="8">8</option>
                  <option value="9">9</option>
                  <option value="10">10</option>
                  <option value="11">11</option>
                  <option value="12">12</option>
                  <option value="13">13</option>
                  <option value="14">14</option>
                  <option value="15">15</option>
                  <option value="16">16</option>
                  <option value="17">17</option>
                  <option value="18">18</option>
                  <option value="19">19</option>
                  <option value="20">20</option>
                  <option value="21">21</option>
                  <option value="22">22</option>
                  <option value="23">23</option>
                  <option value="24">24</option>
                  <option value="25">25</option>
                  <option value="26">26</option>
                  <option value="27">27</option>
                  <option value="28">28</option>
                  <option value="29">29</option>
                  <option value="30">30</option>
                  <option value="31">31</option>
                  <option value="32">32</option>
                  <option value="33">33</option>
                  <option value="34">34</option>
                  <option value="35">35</option>
                  <option value="36">36</option>
                  <option value="37">37</option>
                  <option value="38">38</option>
                  <option value="39">39</option>
                  <option value="40">40</option>
                  <option value="41">41</option>
                  <option value="42">42</option>
                  <option value="43">43</option>
                  <option value="44">44</option>
                  <option value="45">45</option>
                  <option value="46">46</option>
                  <option value="47">47</option>
                  <option value="48">48</option>
                  <option value="49">49</option>
                  <option value="50">50</option>
                  <option value="51">51</option>
                  <option value="52">52</option>
                  <option value="53">53</option>
                  <option value="54">54</option>
                  <option value="55">55</option>
                  <option value="56">56</option>
                  <option value="57">57</option>
                  <option value="58">58</option>
                  <option value="59">59</option>
                  <option value="60">60</option>
                  <option value="61">61</option>
                  <option value="62">62</option>
                  <option value="63">63</option>
                  <option value="64">64</option>
                  <option value="65">65</option>
                  <option value="66">66</option>
                  <option value="67">67</option>
                  <option value="68">68</option>
                  <option value="69">69</option>
                  <option value="70">70</option>
                  <option value="71">71</option>
                  <option value="72">72</option>
                  <option value="73">73</option>
                  <option value="74">74</option>
                  <option value="75">75</option>
                  <option value="76">76</option>
                  <option value="77">77</option>
                  <option value="78">78</option>
                  <option value="79">79</option>
                  <option value="80">80</option>
                  <option value="81">81</option>
                  <option value="82">82</option>
                  <option value="83">83</option>
                  <option value="84">84</option>
                  <option value="85">85</option>
                  <option value="86">86</option>
                  <option value="87">87</option>
                  <option value="88">88</option>
                  <option value="89">89</option>
                  <option value="90">90</option>
                  <option value="91">91</option>
                  <option value="92">92</option>
                  <option value="93">93</option>
                  <option value="94">94</option>
                  <option value="95">95</option>
                  <option value="96">96</option>
                  <option value="97">97</option>
                  <option value="98">98</option>
                  <option value="99">99</option>
                  <option value="100">100</option>
                  <option value="101">101</option>
                  <option value="102">102</option>
                  <option value="103">103</option>
                  <option value="104">104</option>
                  <option value="105">105</option>
                  <option value="106">106</option>
                  <option value="107">107</option>
                  <option value="108">108</option>
                  <option value="109">109</option>
                  <option value="110">110</option>
                  <option value="111">111</option>
                  <option value="112">112</option>
                  <option value="113">113</option>
                  <option value="114">114</option>
                  <option value="115">115</option>
                  <option value="116">116</option>
                  <option value="117">117</option>
                  <option value="118">118</option>
                  <option value="119">119</option>
                  <option value="120">120</option>
                  <option value="121">121</option>
                  <option value="122">122</option>
                  <option value="123">123</option>
                  <option value="124">124</option>
                  <option value="125">125</option>
                  <option value="126">126</option>
                  <option value="127">127</option>
                  <option value="128">128</option>
                  <option value="129">129</option>
                  <option value="130">130</option>
                  <option value="131">131</option>
                  <option value="132">132</option>
                  <option value="133">133</option>
                  <option value="134">134</option>
                  <option value="135">135</option>
                  <option value="136">136</option>
                  <option value="137">137</option>
                  <option value="138">138</option>
                  <option value="139">139</option>
                  <option value="140">140</option>
                  <option value="141">141</option>
                  <option value="142">142</option>
                  <option value="143">143</option>
                  <option value="144">144</option>
                  <option value="145">145</option>
                  <option value="146">146</option>
                  <option value="147">147</option>
                  <option value="148">148</option>
                  <option value="149">149</option>
                  <option value="150">150</option>
                  <option value="151">151</option>
                  <option value="152">152</option>
                  <option value="153">153</option>
                  <option value="154">154</option>
                  <option value="155">155</option>
                  <option value="156">156</option>
                  <option value="157">157</option>
                  <option value="158">158</option>
                  <option value="159">159</option>
                  <option value="160">160</option>
                  <option value="161">161</option>
                  <option value="162">162</option>
                  <option value="163">163</option>
                  <option value="164">164</option>
                  <option value="165">165</option>
                  <option value="166">166</option>
                  <option value="167">167</option>
                  <option value="168">168</option>
                  <option value="169">169</option>
                  <option value="170">170</option>
                  <option value="171">171</option>
                  <option value="172">172</option>
                  <option value="173">173</option>
                  <option value="174">174</option>
                  <option value="175">175</option>
                  <option value="176">176</option>
                  <option value="177">177</option>
                  <option value="178">178</option>
                  <option value="179">179</option>
                  <option value="180">180</option>
                  <option value="181">181</option>
                  <option value="182">182</option>
                  <option value="183">183</option>
                  <option value="184">184</option>
                  <option value="185">185</option>
                  <option value="186">186</option>
                  <option value="187">187</option>
                  <option value="188">188</option>
                  <option value="189">189</option>
                  <option value="190">190</option>
                  <option value="191">191</option>
                  <option value="192">192</option>
                  <option value="193">193</option>
                  <option value="194">194</option>
                  <option value="195">195</option>
                  <option value="196">196</option>
                  <option value="197">197</option>
                  <option value="198">198</option>
                  <option value="199">199</option>
                  <option value="200">200</option>
                  <option value="201">201</option>
                  <option value="202">202</option>
                  <option value="203">203</option>
                  <option value="204">204</option>
                  <option value="205">205</option>
                  <option value="206">206</option>
                  <option value="207">207</option>
                  <option value="208">208</option>
                  <option value="209">209</option>
                  <option value="210">210</option>
                  <option value="211">211</option>
                  <option value="212">212</option>
                  <option value="213">213</option>
                  <option value="214">214</option>
                  <option value="215">215</option>
                  <option value="216">216</option>
                  <option value="217">217</option>
                  <option value="218">218</option>
                  <option value="219">219</option>
                  <option value="220">220</option>
                  <option value="221">221</option>
                  <option value="222">222</option>
                  <option value="223">223</option>
                  <option value="224">224</option>
                  <option value="225">225</option>
                  <option value="226">226</option>
                  <option value="227">227</option>
                  <option value="228">228</option>
                  <option value="229">229</option>
                  <option value="230">230</option>
                  <option value="231">231</option>
                  <option value="232">232</option>
                  <option value="233">233</option>
                  <option value="234">234</option>
                  <option value="235">235</option>
                  <option value="236">236</option>
                  <option value="237">237</option>
                  <option value="238">238</option>
                  <option value="239">239</option>
                  <option value="240">240</option>
                  <option value="241">241</option>
                  <option value="242">242</option>
                  <option value="243">243</option>
                  <option value="244">244</option>
                  <option value="245">245</option>
                  <option value="246">246</option>
                  <option value="247">247</option>
                  <option value="248">248</option>
                  <option value="249">249</option>
                  <option value="250">250</option>
                  <option value="251">251</option>
                  <option value="252">252</option>
                  <option value="253">253</option>
                  <option value="254">254</option>
                  <option value="255">255</option>
                  <option value="256">256</option>
                  <option value="257">257</option>
                  <option value="258">258</option>
                  <option value="259">259</option>
                  <option value="260">260</option>
                  <option value="261">261</option>
                  <option value="262">262</option>
                  <option value="263">263</option>
                  <option value="264">264</option>
                  <option value="265">265</option>
                  <option value="266">266</option>
                  <option value="267">267</option>
                  <option value="268">268</option>
                  <option value="269">269</option>
                  <option value="270">270</option>
                  <option value="271">271</option>
                  <option value="272">272</option>
                  <option value="273">273</option>
                  <option value="274">274</option>
                  <option value="275">275</option>
                  <option value="276">276</option>
                  <option value="277">277</option>
                  <option value="278">278</option>
                  <option value="279">279</option>
                  <option value="280">280</option>
                  <option value="281">281</option>
                  <option value="282">282</option>
                  <option value="283">283</option>
                  <option value="284">284</option>
                  <option value="285">285</option>
                  <option value="286">286</option>
                  <option value="287">287</option>
                  <option value="288">288</option>
                  <option value="289">289</option>
                  <option value="290">290</option>
                  <option value="291">291</option>
                  <option value="292">292</option>
                  <option value="293">293</option>
                  <option value="294">294</option>
                  <option value="295">295</option>
                  <option value="296">296</option>
                  <option value="297">297</option>
                  <option value="298">298</option>
                  <option value="299">299</option>
                  <option value="300">300</option>
                  <option value="301">301</option>
                  <option value="302">302</option>
                  <option value="303">303</option>
                  <option value="304">304</option>
                  <option value="305">305</option>
                  <option value="306">306</option>
                  <option value="307">307</option>
                  <option value="308">308</option>
                  <option value="309">309</option>
                  <option value="310">310</option>
                  <option value="311">311</option>
                  <option value="312">312</option>
                  <option value="313">313</option>
                  <option value="314">314</option>
                  <option value="315">315</option>
                  <option value="316">316</option>
                  <option value="317">317</option>
                  <option value="318">318</option>
                  <option value="319">319</option>
                  <option value="320">320</option>
                  <option value="321">321</option>
                  <option value="322">322</option>
                  <option value="323">323</option>
                  <option value="324">324</option>
                  <option value="325">325</option>
                  <option value="326">326</option>
                  <option value="327">327</option>
                  <option value="328">328</option>
                  <option value="329">329</option>
                  <option value="330">330</option>
                  <option value="331">331</option>
                  <option value="332">332</option>
                  <option value="333">333</option>
                  <option value="334">334</option>
                  <option value="335">335</option>
                  <option value="336">336</option>
                  <option value="337">337</option>
                  <option value="338">338</option>
                  <option value="339">339</option>
                  <option value="340">340</option>
                  <option value="341">341</option>
                  <option value="342">342</option>
                  <option value="343">343</option>
                  <option value="344">344</option>
                  <option value="345">345</option>
                  <option value="346">346</option>
                  <option value="347">347</option>
                  <option value="348">348</option>
                  <option value="349">349</option>
                  <option value="350">350</option>
                  <option value="351">351</option>
                  <option value="352">352</option>
                  <option value="353">353</option>
                  <option value="354">354</option>
                  <option value="355">355</option>
                  <option value="356">356</option>
                  <option value="357">357</option>
                  <option value="358">358</option>
                  <option value="359">359</option>
                  <option value="360">360</option>
                  <option value="361">361</option>
                  <option value="362">362</option>
                  <option value="363">363</option>
                  <option value="364">364</option>
                  <option value="365">365</option>
                  <option value="366">366</option>
                  <option value="367">367</option>
                  <option value="368">368</option>
                  <option value="369">369</option>
                  <option value="370">370</option>
                  <option value="371">371</option>
                  <option value="372">372</option>
                  <option value="373">373</option>
                  <option value="374">374</option>
                  <option value="375">375</option>
                  <option value="376">376</option>
                  <option value="377">377</option>
                  <option value="378">378</option>
                  <option value="379">379</option>
                  <option value="380">380</option>
                  <option value="381">381</option>
                  <option value="382">382</option>
                  <option value="383">383</option>
              </select>

      <label style="margin-left:20px;">
        <input type="checkbox" id="bandwidthToggle" onchange="updateBandwidth()" />
        High Bandwidth Mode (4 pages per screen)
      </label>

      <label style="margin-left:20px;">
        <input type="checkbox" id="ultraBandwidthToggle" onchange="updateBandwidth()" />
        Ultra Bandwidth Mode (8 pages per screen)
      </label>
    </div>

    <div id="flipbook-viewer" data-page-count="2" style="text-align:center;">
      <div style="margin-bottom:10px;">
        <button onclick="popOutPage()" style="font-size:16px; padding:6px 12px;"> Pop Out Page</button>
      </div>


      <div style="margin-top:20px;">
        <button onclick="prevPage()"> Prev</button>
        <button onclick="nextPage()">Next </button>
      </div>


      <div class="ob-reader-spread" role="group" aria-label="Scanned book pages">
                  <canvas id="pageCanvas0" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:inline-block;"></canvas>
                  <canvas id="pageCanvas1" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:inline-block;"></canvas>
                  <canvas id="pageCanvas2" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas3" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas4" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas5" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas6" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
                  <canvas id="pageCanvas7" style="margin:10px; box-shadow:0 0 20px #888; width:auto; max-width:100%; height:auto; display:none;"></canvas>
              </div>
      <p class="ob-reader-status" id="obReaderStatus" aria-live="polite"></p>
      <p class="ob-reader-swipe-hint">Swipe sideways to view additional scanned pages.</p>

      <div style="margin-top:20px;">
        <button onclick="prevPage()"> Prev</button>
        <button onclick="nextPage()">Next </button>
      </div>
    </div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"></script>
    <script>
      const bookName = "GinsburgMassorahV1P1";
      const maxPages = 383;
      const category = "Hebrew";
      let pageNum = 1;
      let scale = 2.0;
      let pageCount = 2;
      let renderGeneration = 0;
      const activeRenderTasks = new Array(8).fill(null);
      const canvasQueues = Array.from({ length: 8 }, () => Promise.resolve());

      const canvases = [];
      const contexts = [];
      for (let i = 0; i < 8; i++) {
        canvases[i] = document.getElementById('pageCanvas' + i);
        contexts[i] = canvases[i].getContext('2d');
      }

      // The reader's original stylesheet fixed all canvases at 50%/25%/12.5%
      // width, meaning the old Zoom/Quality menu only changed resolution.
      // Here we size the *visible* pages as well, allowing sideways scrolling
      // when a spread is wider than the reader.
      function updateCanvasWidths() {
        const spread = document.querySelector('#flipbook-viewer .ob-reader-spread');
        if (!spread) return;
        const mobile = window.matchMedia('(max-width: 800px)').matches;
        const baseline = mobile
          ? Math.min(window.innerWidth * (pageCount > 2 ? 0.70 : 0.82), pageCount > 2 ? 360 : 430)
          : Math.max(50, (spread.clientWidth - 8 - (pageCount - 1) * 12) / pageCount);
        const width = Math.max(50, Math.round(baseline * scale / 2.0));
        for (let i = 0; i < canvases.length; i++) {
          canvases[i].style.setProperty('width', width + 'px', 'important');
          canvases[i].style.setProperty('max-width', 'none', 'important');
        }
        const totalWidth = width * pageCount + 12 * (pageCount - 1);
        spread.classList.toggle('ob-reader-zoom-overflow', totalWidth > spread.clientWidth - 8);
        const indicator = document.getElementById('obZoomIndicator');
        if (indicator) indicator.textContent = String(Math.round(scale * 50)) + '%';
      }

      function updateScale() {
        const requested = parseFloat(document.getElementById('scaleSelect').value);
        if (!Number.isFinite(requested) || requested < 1 || requested > 4) return;
        scale = requested;
        renderPages();
      }

      function updateBandwidth() {
        const high = document.getElementById('bandwidthToggle').checked;
        const ultra = document.getElementById('ultraBandwidthToggle').checked;
        pageCount = ultra ? 8 : high ? 4 : 2;
        document.getElementById('flipbook-viewer').setAttribute('data-page-count', String(pageCount));
        renderPages();
      }

      function goToPage() {
        const selected = parseInt(document.getElementById('pageSelect').value, 10);
        if (!Number.isFinite(selected)) return;
        pageNum = selected % 2 === 0 ? selected - 1 : selected;
        renderPages();
      }

      function renderPages() {
        const generation = ++renderGeneration;
        // Cancel outdated jobs before a rapid zoom/page change. Per-canvas
        // queues below prevent concurrent PDF.js rendering onto one canvas.
        activeRenderTasks.forEach(task => {
          if (task) {
            try { task.cancel(); } catch (error) { /* already completed */ }
          }
        });
        updateCanvasWidths();
        const pageEnd = Math.min(pageNum + pageCount - 1, maxPages);
        const readerStatus = document.getElementById('obReaderStatus');
        if (readerStatus) readerStatus.textContent = `Pages ${pageNum}-${pageEnd} of ${maxPages}`;
        const pageSelect = document.getElementById('pageSelect');
        if (pageSelect) pageSelect.value = String(pageNum);
        for (let i = 0; i < 8; i++) {
          const part = pageNum + i;
          if (i < pageCount && part <= maxPages) {
            canvases[i].style.display = 'inline-block';
            canvasQueues[i] = canvasQueues[i].catch(() => {}).then(() => {
              if (generation !== renderGeneration) return;
              return renderPage(part, canvases[i], contexts[i], i, generation);
            });
          } else {
            canvases[i].style.display = 'none';
          }
        }
      }

      async function renderPage(num, canvas, ctx, index, generation) {
        const url = `/stream_pdf_from_local_zip.php?name=${encodeURIComponent(bookName)}&part=${encodeURIComponent(num)}&category=${encodeURIComponent(category)}`;
        let loadingTask = null;
        let pdf = null;
        let renderTask = null;
        try {
          // Disable PDF.js's PDF-supplied JavaScript evaluation feature.
          loadingTask = pdfjsLib.getDocument({ url: url, isEvalSupported: false });
          pdf = await loadingTask.promise;
          if (generation !== renderGeneration) return;
          const page = await pdf.getPage(1);
          if (generation !== renderGeneration) return;
          const viewport = page.getViewport({ scale: scale });
          canvas.width = Math.ceil(viewport.width);
          canvas.height = Math.ceil(viewport.height);
          renderTask = page.render({ canvasContext: ctx, viewport: viewport });
          activeRenderTasks[index] = renderTask;
          await renderTask.promise;
        } catch (error) {
          if (error && error.name === 'RenderingCancelledException') return;
          if (generation === renderGeneration) {
            const status = document.getElementById('obReaderStatus');
            if (status) status.textContent = 'Could not load page ' + num + '. Please try again.';
            console.error('OriginalBibles reader: page render failed', error);
          }
        } finally {
          if (renderTask && activeRenderTasks[index] === renderTask) activeRenderTasks[index] = null;
          if (pdf) {
            try { await pdf.destroy(); } catch (error) { /* release best effort */ }
          } else if (loadingTask && generation !== renderGeneration) {
            try { await loadingTask.destroy(); } catch (error) { /* release best effort */ }
          }
        }
      }

      let readerResizeFrame = null;
      window.addEventListener('resize', function () {
        if (readerResizeFrame !== null) cancelAnimationFrame(readerResizeFrame);
        readerResizeFrame = requestAnimationFrame(function () {
          readerResizeFrame = null;
          updateCanvasWidths();
        });
      });

      function nextPage() {
        if (pageNum + pageCount <= maxPages) {
          pageNum += pageCount;
          flip();
          renderPages();
        }
      }

      function prevPage() {
        if (pageNum - pageCount >= 1) {
          pageNum -= pageCount;
          flip();
          renderPages();
        }
      }

      function flip() {
        for (let i = 0; i < pageCount; i++) {
          canvases[i].style.transform = 'rotateY(180deg)';
        }
        setTimeout(() => {
          for (let i = 0; i < pageCount; i++) {
            canvases[i].style.transform = '';
          }
        }, 600);
      }

      function popOutPage() {
        const url = `/stream_pdf_from_local_zip.php?name=${encodeURIComponent(bookName)}&part=${encodeURIComponent(pageNum)}&category=${encodeURIComponent(category)}`;
        window.open(url, '_blank');
      }

      renderPages();
    </script>
    
<p>    <style>
    #geminiModal {
        display: none;
        position: fixed;
        top: 20%;
        left: 50%;
        transform: translateX(-50%);
        width: 60%;
        background: #fdfcf7;
        border: 1px solid #ccc;
        padding: 20px;
        box-shadow: 0 0 20px rgba(0,0,0,0.3);
        z-index: 9999;
        font-family: 'Georgia', serif;
        opacity: 0;
        transition: opacity 0.5s ease-in-out;
    }
    #geminiModal.show { display: block; opacity: 1; }
    #geminiModalText { white-space: pre-wrap; font-size: 16px; color: #3b2f1e; }

    #assistant-launcher button {
        font-family: 'Georgia', serif;
        background-color: #eae6d9;
        border: 1px solid #ccc;
        color: #3b2f1e;
        cursor: pointer;
        padding: 10px 20px;
        font-size: 16px;
        margin-right: 10px;
        margin-top: 10px;
    }
    #assistant-launcher textarea {
        font-family: 'Georgia', serif;
        background-color: #fffef8;
        border: 1px solid #ccc;
        color: #3b2f1e;
        padding: 10px;
        font-size: 16px;
        resize: vertical;
        width: 60%;
    }
    </style>

    <div id="assistant-launcher" style="text-align:center; margin:40px 0 20px 0;">
        <textarea id="sacredPrompt" placeholder="Enter your theological or Biblical questions... (AI can make mistakes so be aware!)" rows="4"></textarea><br><br>
        <button onclick="launchCopilot()">Ask Copilot</button>
        <button onclick="launchChatGPT()">Ask ChatGPT</button>
        <button onclick="launchGeminiModal()">Ask Gemini</button>
    </div>

    <div id="geminiModal">
        <p id="geminiModalText"></p>
        <button onclick="confirmGemini()">Open Gemini</button>
        <button onclick="closeGeminiModal()" style="margin-left:10px;">Cancel</button>
    </div>

    <script>
    async function getSacredQuery() {
        const userInput = document.getElementById("sacredPrompt").value.trim();
        if (!userInput) return null;

        const frame = `As a biblical scholar engaging with sacred scripture, I seek a reverent, theologically grounded analysis of the following passage. Please treat the text as divinely inspired and central to Christian tradition. Your response should include canonical context (situating the passage within the broader biblical canon and theological tradition), historical background (relevant cultural, geopolitical, and religious context at the time of composition), literary structure (analysis of composition, genre, and rhetorical features), and theological interpretation (a coherent, tradition-respecting reading consistent with respected scholarly perspectives). Include original-language forms in Hebrew (Tanakh), Greek (Septuagint or New Testament), and Aramaic (where applicable), with transliteration, translation, and brief commentary on linguistic nuance. Avoid reduction to metaphor or myth. Emphasize theological coherence, canonical fidelity, and interpretive depth. Reference the Oxford Bible Commentary where appropriate, and draw from respected scholarly traditions rooted in historical-critical, canonical, and theological methodologies. Please do not include the sacred name Yahweh or other divine names that may cause discomfort or offense among Christians and Jews. Use respectful and widely accepted alternatives such as “God” or “The Lord.`;

        return encodeURIComponent(frame + " " + userInput);
    }

    async function launchCopilot() {
        const query = await getSacredQuery();
        if (!query) return;
        openPopup(`https://copilot.microsoft.com/?q=${query}`);
    }

    async function launchChatGPT() {
        const query = await getSacredQuery();
        if (!query) return;
        openPopup(`https://chat.openai.com/?q=${query}`);
    }

    async function launchGeminiModal() {
        const query = await getSacredQuery();
        if (!query) return;
        const promptText = decodeURIComponent(query);
        const modal = document.getElementById("geminiModal");
        document.getElementById("geminiModalText").innerText =
            "Gemini will open in a new window. Please paste or retype your sacred question to begin:\n\n" + promptText;
        modal.classList.add("show");
    }

    function confirmGemini() { openPopup("https://gemini.google.com/"); closeGeminiModal(); }
    function closeGeminiModal() {
        const modal = document.getElementById("geminiModal");
        modal.classList.remove("show");
        setTimeout(() => { modal.style.display = "none"; }, 500);
    }

    function openPopup(url) {
        const isMobile = window.innerWidth < 768;
        if (isMobile) {
            alert("Opening in a new tab for better mobile experience.");
            window.location.href = url;
        } else {
            const screenX = typeof window.screenX !== 'undefined' ? window.screenX : window.screenLeft;
            const screenY = typeof window.screenY !== 'undefined' ? window.screenY : window.screenTop;
            const outerWidth = typeof window.outerWidth !== 'undefined' ? window.outerWidth : document.documentElement.clientWidth;
            const outerHeight = typeof window.outerHeight !== 'undefined' ? window.outerHeight : document.documentElement.clientHeight;

            const width = Math.floor(outerWidth * 0.3);
            const height = Math.floor(outerHeight * 0.3);
            const left = screenX + Math.floor((outerWidth - width) / 2);
            const top = screenY + Math.floor((outerHeight - height) / 2);

            window.open(
                url,
                "AssistantPopup",
                `width=${width},height=${height},top=${top},left=${left},` +
                "noopener,noreferrer,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes,resizable=yes"
            );
        }
    }
    </script>
    <br />
Index of the book (please forgive any unreadable bits: this index is computer generated from ancient texts):</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.originalbibles.com/the-ginsburg-massorah-volume-1-part-1-1880/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
