THEO TODMAN’S WEBSITE CODE PAGES



This Page provides a jumping-off point for the VBA Code that generates my Website.

Table of Code Documentation Location 35 (4 items)

ImageRefReference_Code_BridgeChange_Text_GeneralMonthly_Report_Note1005_Update

To access information, click on one of the links in the table above.

Go to top of page




Source Code of: Change_Text_General
Procedure Type: Public Sub
Module: Converson_Routines
Lines of Code: 27
Go To End of This Procedure

Line-No. / Ref.Code Line
0001Public Sub Change_Text_General()
0002'General-purpose routine to replace strings in selected objects
0003Dim rst As Recordset
0004Dim db As Database
0005Dim strText As String
0006Dim OK As String
0007Set db = CurrentDb
0008'Select the Objects
0009' ... Set rst = db.OpenRecordset("SELECT Papers.Abstract FROM Papers WHERE (((Papers.Abstract) Like ""*pseudo-Paper*""));")
0010 Set rst = db.OpenRecordset("SELECT Notes_Archive.Item_Text FROM Notes_Archive WHERE (((Notes_Archive.Item_Text) Like ""*""""../../BookCatalogCategorised_16_115_471.htm*""));")
0011If Not rst.EOF Then
0012 rst.MoveFirst
0013 Do While Not rst.EOF
0014 strText = rst.Fields(0).Value & ""
0015 'Replace
0016 If strText <> "" Then
0017 OK = ReplaceCode(strText, "../../BookCatalogCategorised_16_115_471.htm", "xyzabc")
0018 OK = ReplaceCode(OK, "xyzabc", "")
0019 'Update
0020 rst.Edit
0021 rst.Fields(0).Value = OK
0022 rst.Update
0023 End If
0024 rst.MoveNext
0025 Loop
0026End If
0027End Sub

Procedures Called By This Procedure (Change_Text_General) Tables / Queries / Fragments Directly Used By This Procedure (Change_Text_General) Go To Start of This Procedure
Go To Top of This Page
Link to VBA Code Control Page



Source Code of: ImageRef
Procedure Type: Public Function
Module: General_Functions
Lines of Code: 143
Go To End of This Procedure

Line-No. / Ref.Code Line
0001Public Function ImageRef(strLineIn, Caller, Calling_Type, Calling_ID, Calling_Timestamp, Optional iDepth)
0002Dim z As Long
0003Dim Y As Long
0004Dim y1 As Long
0005Dim y2 As Long
0006Dim yy As Long
0007Dim strLine As String
0008Dim strImageRef As String
0009Dim strPrefix As String
0010Dim Image_Found As Boolean
0011Dim Image_Ref_Kernel As String
0012Dim Image_ID As Long
0013strLine = strLineIn
0014Image_Found = False
0015z = 1
0016Select Case Caller
0017 Case "Notes", "NoteFootnotes", "Abstract"
0018 strPrefix = "../../Photos/Notes/"
0019 Case "NotesPrint"
0020 strPrefix = "../../../Photos/Notes/"
0021 Case "NotesConcatenated"
0022 strPrefix = "../Photos/Notes/"
0023 Case Else
0024 z = 0
0025End Select
0026If Not IsMissing(iDepth) Then
0027 Select Case iDepth
0028 Case 1
0029 strPrefix = Mid(strPrefix, 4, Len(strPrefix))
0030 Case 0, 2
0031 Case 3
0032 strPrefix = "../" & strPrefix
0033 Case Else
0034 End Select
0035End If
0036Do While z > 0
0037 'Find the next Weblink-start
0038 Y = InStr(z, strLine, "SRC")
0039 If Y > 0 Then
0040 yy = InStr(Y, strLine, "=")
0041 If yy > 0 Then
0042 If Trim(Mid(strLine, Y + 3, yy - Y - 2)) = "=" Then
0043 Y = InStr(Y, strLine, """")
0044 If Y > 0 Then
0045 If Y = yy + 1 Or Trim(Mid(strLine, yy + 1, Y - yy - 1)) & "" = "" Then
0046 yy = InStr(Y + 1, strLine, """")
0047 If yy > 0 Then
0048 Image_Found = True
0049 strImageRef = Trim(Mid(strLine, Y + 1, yy - Y - 1))
0050 strImageRef = Replace(strImageRef, "../", "")
0051 Image_ID = Images_Add("C:\Theo's Files\Websites\Theo's Website\Photos\Notes\", strImageRef, True, False)
0052 strImageRef = strPrefix & strImageRef
0053 If Calling_Type <> "X" Then
0054 OK = Cross_Reference_Add(Calling_Type, Calling_ID, Calling_Timestamp, "I", Image_ID, 0)
0055 End If
0056 strLine = Left(strLine, Y) & strImageRef & Mid(strLine, yy, Len(strLine))
0057 z = Y + Len(strImageRef)
0058 Else
0059 z = 0
0060 End If
0061 Else
0062 z = 0
0063 End If
0064 Else
0065 z = 0
0066 End If
0067 Else
0068 z = 0
0069 End If
0070 Else
0071 z = 0
0072 End If
0073 Else
0074 z = 0
0075 End If
0076Loop
0077z = 1
0078Do While z > 0
0079 'Find the next .gif, or .jpg
0080 y1 = InStr(z, strLine, ".gif")
0081 If y1 = 0 Then
0082 y1 = Len(strLine)
0083 End If
0084 y2 = InStr(z, strLine, ".jpg")
0085 If y2 = 0 Then
0086 y2 = Len(strLine)
0087 End If
0088 If y1 < y2 Then
0089 Y = y1
0090 Else
0091 Y = y2
0092 End If
0093 If Y < Len(strLine) Then
0094 yy = Y - 1
0095 Image_Found = False
0096 'Check for “.jpg” or “.gif” etc. used in documentation
0097 If Mid(strLine, yy, 1) = "“" Then
0098 z = Y + 1
0099 Else
0100 Do While yy > 0 And Image_Found = False
0101 'Search for previous "
0102 If Mid(strLine, yy, 1) = """" Then
0103 Image_Found = True
0104 Else
0105 yy = yy - 1
0106 End If
0107 Loop
0108 End If
0109 If Image_Found = True Then
0110 strImageRef = Trim(Mid(strLine, yy + 1, Y - yy - 1))
0111 strImageRef = Replace(strImageRef, "../", "")
0112 'Need to ignore external links
0113 If InStr(strImageRef, "http:") > 0 Or InStr(strImageRef, "www.") > 0 Then
0114 Else
0115 'Need to check not SRC, already fixed above ...
0116 If Mid(strLine, yy - 4, 3) = "SRC" Then
0117 Else
0118 Image_Ref_Kernel = strImageRef & Mid(strLine, Y, 5)
0119 Image_Ref_Kernel = Replace(Image_Ref_Kernel, """", "")
0120 Image_Ref_Kernel = Trim(Image_Ref_Kernel)
0121 'Check for duds
0122 If Len(Image_Ref_Kernel) > 100 Then
0123 Stop
0124 End If
0125 Image_ID = Images_Add("C:\Theo's Files\Websites\Theo's Website\Photos\Notes\", Image_Ref_Kernel, False, True)
0126 strImageRef = strPrefix & strImageRef
0127 If Calling_Type <> "X" Then
0128 OK = Cross_Reference_Add(Calling_Type, Calling_ID, Calling_Timestamp, "I", Image_ID, 0)
0129 End If
0130 strLine = Left(strLine, yy) & strImageRef & Mid(strLine, Y, Len(strLine))
0131 End If
0132 End If
0133 z = Y + Len(strImageRef)
0134 Else
0135 z = Y + 1
0136 End If
0137 Else
0138 z = 0
0139 End If
0140Loop
0141TheEnd:
0142ImageRef = strLine
0143End Function

Procedures Calling This Procedure (ImageRef) Procedures Called By This Procedure (ImageRef) Tables / Queries / Fragments Directly Used By This Procedure (ImageRef) Go To Start of This Procedure
Go To Top of This Page
Link to VBA Code Control Page



Source Code of: Monthly_Report_Note1005_Update
Procedure Type: Public Sub
Module: Monthly Reporting
Lines of Code: 265
Go To End of This Procedure

Line-No. / Ref.Code Line
0001Public Sub Monthly_Report_Note1005_Update(Timecode)
0002Static strLine_Stored As String
0003Dim rsTableControl As Recordset
0004Dim rsTableControl2 As Recordset
0005Dim strQuery As String
0006Dim i As Long
0007Dim j As Integer
0008Dim ifields As Integer
0009Dim Field_Width As Single
0010Dim Field_Width_Temp As Single
0011Dim iTableWidth As Single
0012Dim iTot(30) As Single
0013Dim iTot2(30) As Single
0014Dim iTotal As Single
0015Dim iTotal2 As Single
0016Dim Alignment As String
0017Dim Field_Temp As String
0018Dim YTD_Fields As Integer
0019Select Case Timecode
0020 Case 1
0021 strLine_Stored = "This page shows the following tables (which are unlikely to be of any interest to anyone other than myself):-|99|"
0022 strLine_Stored = strLine_Stored & "|1|Time expended on my <A HREF = ""#Time_By_Month_Grand_Summary"">various projects</A> over " & IIf(Right(iReporting_Year - 2007 + 1, 1) = 8, "an ", "a ") & iReporting_Year - 2007 + 1 & "-year period"
0023 strLine_Stored = strLine_Stored & "|1|Time expended on my various <A HREF = ""#Time_By_Month_Summary"">projects and the major sub-projects thereof</A> over " & IIf(Right(iReporting_Year - 2007 + 1, 1) = 8, "an ", "a ") & iReporting_Year - 2007 + 1 & "-year period"
0024 strLine_Stored = strLine_Stored & "|1|Time expended on my various <A HREF = ""#Time_By_Month"">projects and the sub-projects thereof</A> over " & IIf(Right(iReporting_Year - 2007 + 1, 1) = 8, "an ", "a ") & iReporting_Year - 2007 + 1 & "-year period|99|"
0025 strLine_Stored = strLine_Stored & "<a name = ""Time_By_Month_Grand_Summary""></a><h3>Projects</h3><p>Below is a table showing the split of time (in hours) expended between my various projects over " & IIf(Right(iReporting_Year - 2007 + 1, 1) = 8, "an ", "a ") & iReporting_Year - 2007 + 1 & "-year period:-</p>"
0026 strQuery = "Time_By_Month (Grand Summary)"
0027 Case 2
0028 strLine_Stored = strLine_Stored & "<a name = ""Time_By_Month_Summary""></a><h3>Projects & Major Sub-Projects</h3><p>Below is a table showing the split of time expended (in hours) between my various projects and the major sub-projects thereof over " & IIf(Right(iReporting_Year - 2007 + 1, 1) = 8, "an ", "a ") & iReporting_Year - 2007 + 1 & "-year period:-</p>"
0029 strQuery = "Time_By_Month (Summary)"
0030 Case 3
0031 strLine_Stored = strLine_Stored & "<a name = ""Time_By_Month""></a><h3>Projects & Sub-Projects</h3><p>Below is a table showing the split of time expended (in hours) between my various projects and the sub-projects thereof over " & IIf(Right(iReporting_Year - 2007 + 1, 1) = 8, "an ", "a ") & iReporting_Year - 2007 + 1 & "-year period:-</p>"
0032 strQuery = "Time_By_Month"
0033End Select
0034Set rsTableControl2 = CurrentDb.OpenRecordset(strQuery)
0035rsTableControl2.MoveFirst
0036ifields = rsTableControl2.Fields.Count
0037i = iEnd_Reporting_Month
0038If i > 9 Then
0039 i = 12 + 9 - i
0040Else
0041 i = 9 - i
0042End If
0043ifields = ifields - i
0044YTD_Fields = 12 - i
0045Field_Width = 100 / (ifields + 7)
0046iTableWidth = (ifields + 7) * 90
0047If Not rsTableControl2.EOF Then
0048 rsTableControl2.MoveFirst
0049 strLine_Stored = strLine_Stored & "<TABLE class = ""Bridge"" WIDTH=" & iTableWidth & ">"
0050End If
0051'Header Row
0052strLine_Stored = strLine_Stored & "<TR>"
0053j = 0
0054Do While j < ifields
0055 Field_Width_Temp = Field_Width
0056 Alignment = "Center"
0057 Select Case j
0058 Case 0
0059 Field_Width_Temp = Field_Width * 4
0060 Alignment = "Left"
0061 Field_Temp = rsTableControl2.Fields(j).Name
0062 Case Is > 0
0063 Field_Temp = rsTableControl2.Fields(j).Name
0064 End Select
0065 If Field_Temp <> "Not Required" Then
0066 strLine_Stored = strLine_Stored & "<TH WIDTH=""" & Round(Field_Width_Temp, 1) & "%"">" & Field_Temp & "</TH>"
0067 End If
0068 j = j + 1
0069Loop
0070'Repeat the sub-project name at the end column
0071Field_Width_Temp = Field_Width * 4
0072Alignment = "Left"
0073Field_Temp = rsTableControl2.Fields(0).Name
0074strLine_Stored = strLine_Stored & "<TH WIDTH=""" & Round(Field_Width_Temp, 1) & "%"">" & Field_Temp & "</TH>"
0075strLine_Stored = strLine_Stored & "</TR>"
0076'Output the rows
0077For j = 0 To 20
0078 iTot(j) = 0
0079Next j
0080For i = 0 To 20
0081 iTot2(i) = 0
0082Next i
0083iTotal = 0
0084iTotal2 = 0
0085i = 0
0086rsTableControl2.MoveFirst
0087Do While Not rsTableControl2.EOF
0088 i = i + 1
0089 strLine_Stored = strLine_Stored & "<TR>"
0090 iTotal = 0
0091 iTotal2 = 0
0092 For j = ifields - YTD_Fields To ifields - 1
0093 If rsTableControl2.Fields(j) & "" = "" Then
0094 Field_Temp = 0
0095 Else
0096 Field_Temp = rsTableControl2.Fields(j)
0097 End If
0098 iTotal = iTotal + Val(Field_Temp)
0099 Next j
0100 For j = 5 To ifields - 1
0101 If rsTableControl2.Fields(j) & "" = "" Then
0102 Field_Temp = 0
0103 Else
0104 Field_Temp = rsTableControl2.Fields(j)
0105 End If
0106 iTotal2 = iTotal2 + Field_Temp
0107 Next j
0108 j = 0
0109 Do While j < ifields
0110 Field_Width_Temp = Field_Width
0111 Alignment = "Center"
0112 Select Case j
0113 Case 0
0114 Field_Width_Temp = Field_Width * 4
0115 Alignment = "Left"
0116 Field_Temp = rsTableControl2.Fields(j)
0117 Case 1
0118 Field_Temp = iTotal
0119 iTot(j) = iTot(j) + Field_Temp
0120 Case 2
0121 Field_Temp = iTotal / YTD_Tot_Saved * 100
0122 iTot(j) = iTot(j) + Field_Temp
0123 Case 3
0124 Field_Temp = iTotal2
0125 iTot(j) = iTot(j) + Field_Temp
0126 Case 4
0127 Field_Temp = iTotal2 / Historic_Total * 100
0128 iTot(j) = iTot(j) + Field_Temp
0129 Case Is > 4
0130 If rsTableControl2.Fields(j) & "" = "" Then
0131 Field_Temp = 0
0132 Else
0133 Field_Temp = rsTableControl2.Fields(j)
0134 End If
0135 iTot(j) = iTot(j) + Field_Temp
0136 iTotal = iTotal + Field_Temp
0137 End Select
0138 If j > 0 Then
0139 If j = 2 Or j = 4 Then
0140 If Field_Temp < 0.005 Then
0141 Field_Temp = "&nbsp;"
0142 Else
0143 Field_Temp = Round(Field_Temp, 2)
0144 End If
0145 Else
0146 If Field_Temp < 0.05 Then
0147 Field_Temp = "&nbsp;"
0148 Else
0149 If Field_Temp < 0.05 Then
0150 Field_Temp = Round(Field_Temp, 1)
0151 Else
0152 Field_Temp = Round(Field_Temp, 0)
0153 End If
0154 End If
0155 End If
0156 End If
0157 If Field_Temp <> "Not Required" Then
0158 strLine_Stored = strLine_Stored & "<TD WIDTH=""" & Round(Field_Width_Temp, 1) & "%"">" & Field_Temp & "</TD>"
0159 End If
0160 j = j + 1
0161 Loop
0162 'Repeat the sub-project name at the end column
0163 Field_Width_Temp = Field_Width * 4
0164 Alignment = "Left"
0165 Field_Temp = rsTableControl2.Fields(0)
0166 strLine_Stored = strLine_Stored & "<TD WIDTH=""" & Round(Field_Width_Temp, 1) & "%"">" & Field_Temp & "</TD>"
0167 strLine_Stored = strLine_Stored & "</TR>"
0168 rsTableControl2.MoveNext
0169Loop
0170'Total Row
0171j = 0
0172iTotal = 0
0173strLine_Stored = strLine_Stored & "<TR>"
0174Do While j < ifields
0175 Field_Width_Temp = Field_Width
0176 Alignment = "Center"
0177 Select Case j
0178 Case 0
0179 Field_Width_Temp = Field_Width * 4
0180 Alignment = "Left"
0181 Field_Temp = "Total"
0182 Case Else
0183 Field_Temp = iTot(j)
0184 End Select
0185 If j > 0 Then
0186 If Field_Temp < 0.05 Then
0187 Field_Temp = "&nbsp;"
0188 Else
0189 If Field_Temp < 0.05 Then
0190 Field_Temp = Round(Field_Temp, 1)
0191 Else
0192 Field_Temp = Round(Field_Temp, 0)
0193 End If
0194 End If
0195 End If
0196 If Field_Temp <> "Not Required" Then
0197 strLine_Stored = strLine_Stored & "<TD WIDTH=""" & Round(Field_Width_Temp, 1) & "%""><FONT Size = 2 FACE=""Arial""><B>" & Field_Temp & "</TD>"
0198 End If
0199 j = j + 1
0200Loop
0201'Repeat the sub-project name at the end column
0202Field_Width_Temp = Field_Width * 4
0203Alignment = "Left"
0204Field_Temp = "Total"
0205strLine_Stored = strLine_Stored & "<TH WIDTH=""" & Round(Field_Width_Temp, 1) & "%"">" & Field_Temp & "</TH>"
0206strLine_Stored = strLine_Stored & "</TR>"
0207If Timecode = 3 Then
0208 'Repeat Header Row as bottom row
0209 strLine_Stored = strLine_Stored & "<TR>"
0210 j = 0
0211 Do While j < ifields
0212 Field_Width_Temp = Field_Width
0213 Alignment = "Center"
0214 Select Case j
0215 Case 0
0216 Field_Width_Temp = Field_Width * 4
0217 Alignment = "Left"
0218 Field_Temp = rsTableControl2.Fields(j).Name
0219 Case Is > 0
0220 Field_Temp = rsTableControl2.Fields(j).Name
0221 End Select
0222 If Field_Temp <> "Not Required" Then
0223 strLine_Stored = strLine_Stored & "<TH WIDTH=""" & Round(Field_Width_Temp, 1) & "%"">" & Field_Temp & "</TH>"
0224 End If
0225 j = j + 1
0226 Loop
0227 'Repeat the sub-project name at the end column
0228 Field_Width_Temp = Field_Width * 4
0229 Alignment = "Left"
0230 Field_Temp = rsTableControl2.Fields(0).Name
0231 strLine_Stored = strLine_Stored & "<TH WIDTH=""" & Round(Field_Width_Temp, 1) & "%"">" & Field_Temp & "</TH>"
0232 strLine_Stored = strLine_Stored & "</TR>"
0233End If
0234'Footer
0235strLine_Stored = strLine_Stored & "</TABLE></CENTER>"
0236If Timecode = 3 Then
0237 If Nz(StrTitle_Year & Right(iStart_Reporting_Month + 100, 2)) < 1308 Then
0238 strLine_Stored = strLine_Stored & "<BR><BR><B><A HREF = ""../Notes_5/Monthly_Reporting_Actual_Detail_" & strFile_Suffix_Previous & ".htm"">Previous Version</A></B>"
0239 End If
0240 'Read Note 1005 for update
0241 strQuery = "SELECT Notes.* FROM Notes WHERE Notes.ID = 1005;"
0242 Set rsTableControl = CurrentDb.OpenRecordset(strQuery)
0243 rsTableControl.MoveFirst
0244 rsTableControl.Edit
0245 'Update Note 1005
0246 'Note Text
0247 rsTableControl.Fields(3) = strLine_Stored
0248 'Note Title
0249 strLine_Stored = "Status: Actual Detail Summary (2007 - " & iReporting_Year + 1 & ")"
0250 rsTableControl.Fields(1) = strLine_Stored
0251 'Set Note Status
0252 rsTableControl.Fields(10) = "Temp"
0253 rsTableControl.Update
0254 'Output the Note regeneration request
0255 DoCmd.RunSQL ("DELETE Notes_To_Regen.* FROM Notes_To_Regen;")
0256 Set rsTableControl = CurrentDb.OpenRecordset("SELECT Notes_To_Regen.* FROM Notes_To_Regen;")
0257 rsTableControl.AddNew
0258 rsTableControl.Fields(0) = 1005
0259 rsTableControl.Update
0260 Archive_Notes_Now = "No"
0261 Regenerate_the_Links = "No"
0262 Regen_Notes_Only = "Yes"
0263 CreateNotesWebPages
0264End If
0265End Sub

Procedures Calling This Procedure (Monthly_Report_Note1005_Update) Procedures Called By This Procedure (Monthly_Report_Note1005_Update) Tables / Queries / Fragments Directly Used By This Procedure (Monthly_Report_Note1005_Update) Go To Start of This Procedure
Go To Top of This Page
Link to VBA Code Control Page



Source Code of: Reference_Code_Bridge
Procedure Type: Public Function
Module: General_Functions
Lines of Code: 68
Go To End of This Procedure

Line-No. / Ref.Code Line
0001Public Function Reference_Code_Bridge(strText, Optional Depth)
0002Dim x As Long
0003Dim Y As Long
0004Dim strCodeRef As String
0005Dim CodeRef As String
0006Dim strText_Local As String
0007Dim strText_End As String
0008Dim qryString As String
0009Dim rsTableToRead As Recordset
0010Dim CodeLocation As String
0011Dim iDepth As Integer
0012Dim strPrefix As String
0013Dim i As Integer
0014If Len(strText) = 0 Then
0015 Reference_Code_Bridge = "Not Found"
0016 Exit Function
0017End If
0018If IsMissing(Depth) Then
0019 iDepth = 2
0020Else
0021 iDepth = Depth
0022End If
0023i = 0
0024strPrefix = ""
0025Do While i < iDepth
0026 strPrefix = strPrefix & "../"
0027 i = i + 1
0028Loop
0029strText_Local = strText
0030x = 1
0031x = InStr(x, strText_Local, "+C")
0032Reference_Code_Bridge = "Not Found"
0033Do While x > 0
0034 Reference_Code_Bridge = "Found"
0035 Y = InStr(x + 1, strText_Local, "C+")
0036 'Watch out for false positives in finding +C
0037 If Y = 0 Then
0038 x = x + 1
0039 Else
0040 If Y - x > 100 Then
0041 x = x + 1
0042 Else
0043 strCodeRef = Mid(strText_Local, x + 2, Y - x - 2)
0044 CodeRef = Trim(strCodeRef)
0045 If Y > Len(strText_Local) - 2 Then
0046 strText_End = ""
0047 Else
0048 strText_End = Mid(strText_Local, Y + 2, Len(strText_Local))
0049 End If
0050 'Determine Code Location
0051 CodeLocation = ""
0052 qryString = "SELECT Code_Table_Bridge.Procedure_Name, Code_Table_Bridge.Code_Location FROM Code_Table_Bridge WHERE (((Code_Table_Bridge.Procedure_Name)=""" & CodeRef & """));"
0053 Set rsTableToRead = CurrentDb.OpenRecordset(qryString)
0054 If Not rsTableToRead.EOF Then
0055 rsTableToRead.MoveFirst
0056 CodeLocation = rsTableToRead.Fields(1).Value
0057 strText_Local = Left(strText_Local, x - 1) & "<A HREF = """ & strPrefix & "Documentation/BridgeDocumentation_Code_" & CodeLocation & ".htm#" & CodeRef & """>" & CodeRef & "</A>" & strText_End
0058 Else
0059 strText_Local = Left(strText_Local, x - 1) & CodeRef & strText_End
0060 x = x + 2
0061 End If
0062 Set rsTableToRead = Nothing
0063 End If
0064 End If
0065 x = InStr(x, strText_Local, "+C")
0066Loop
0067strText = strText_Local
0068End Function

Procedures Calling This Procedure (Reference_Code_Bridge) Tables / Queries / Fragments Directly Used By This Procedure (Reference_Code_Bridge) Go To Start of This Procedure
Go To Top of This Page
Link to VBA Code Control Page



© Theo Todman, June 2007 - Oct 2020. Please address any comments on this page to theo@theotodman.com. File output:
Website Maintenance Dashboard
Return to Top of this Page Return to Theo Todman's Philosophy Page Return to Theo Todman's Home Page