Imports System.Data
Imports System.Configuration.ConfigurationSettings

' written by David Carroll
' www.dcarroll.com

Public Class ReadingPlan
    Inherits System.Web.UI.Page
    Protected WithEvents Tbl As System.Web.UI.WebControls.PlaceHolder
    Dim Start As Date

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        InitBible(Server.MapPath("Bible.xml"))
        Start = AppSettings("BibleStartDate")
        Dim dt As Date = Now
        If Request("date") <> "" Then dt = Request("date")
        If Request("Redirect") = 1 Then
            Response.Redirect(BibleGatewayUrl(dt.Subtract(Start).Days + 1))
            Exit Sub
        End If
        Tbl.Controls.Add(New ReadPlan(Start))
    End Sub

    Public Class ReadPlan
        Inherits Web.UI.Control
        Dim Start As Date

        Public Sub New(ByVal sd As Date)
            Start = sd
        End Sub

        Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
            writer.WriteLine("<table border=1>")
            writer.WriteLine("<tr>")
            writer.WriteLine(vbTab & "<th>Date</th><th>Old Testament</th><th>New Testament</th><th>Psalms</th><th>Proverbs</th></tr>")
            writer.WriteLine("</tr>")
            For d As Integer = 1 To 365
                writer.WriteLine("<tr>")
                writer.Write(vbTab & "<td>")
                If Start.AddDays(d - 1) = Now.Date Then
                    writer.Write("<a name=""today""/>")
                End If
                writer.WriteLine("<a href=""" & BibleGatewayUrl(d).Replace(" ", "+") & """>" & Start.AddDays(d - 1) & "</a></td>")
                Dim dr As DataRow = Readings.Rows.Find(d)
                For Each pre As String In New String() {"ot", "nt", "ps", "pr"}
                    writer.WriteLine(vbTab & "<td>" & Verses(d, pre) & "</td>")
                Next
                writer.WriteLine("</tr>")
            Next
            writer.WriteLine("</table>")
        End Sub
    End Class
End Class

Module Utility
    Public Bible As New DataSet
    Public Books As DataTable
    Public Readings As DataTable

    Sub InitBible(ByVal File As String)
        Bible.ReadXml(File)
        Books = Bible.Tables("Book")
        Books.PrimaryKey = New DataColumn() {Books.Columns("Ord")}

        Readings = Bible.Tables("Reading")
        Readings.PrimaryKey = New DataColumn() {Readings.Columns("Day")}
    End Sub

    Public Function BibleGatewayUrl(ByVal day As Integer) As String
        Dim dr As DataRow = Readings.Rows.Find(day)
        Return "http://www.biblegateway.com/cgi-bin/bible?version=NIV&passage=" & _
                String.Format("{0};{1};{2};{3}", Verses(dr, "ot"), Verses(dr, "nt"), Verses(dr, "ps"), Verses(dr, "pr")) & _
                "&showfn=off&showxref=off&interface=largeprint"
    End Function

    Public Function Verses(ByVal dr As DataRow, ByVal pre As String) As String
        Dim b1 As String = Books.Rows.Find(dr(pre & "sb")).Item("Abbr")
        Dim b2 As String = Books.Rows.Find(dr(pre & "eb")).Item("Abbr")
        Dim ref As String
        If b1 = b2 Then ' starting verse and ending verse are in same book
            ref = String.Format("{0} {1}:{2}-{3}:{4}", _
                    b1, dr(pre & "sc"), dr(pre & "sv"), dr(pre & "ec"), dr(pre & "ev"))
        Else ' have to form two sets of verse ranges, since more than one book is involved
            ref = String.Format("{0} {1}:{2}-", b1, dr(pre & "sc"), dr(pre & "sv"))
            ref &= String.Format(";{0} 1:1-{1}:{2}", b2, dr(pre & "ec"), dr(pre & "ev"))
        End If
        Return ref
    End Function

    Public Function Verses(ByVal d As Integer, ByVal pre As String) As String
        Return Verses(Readings.Rows.Find(d), pre)
    End Function

End Module