<?php # # The Interactive M'Cheyne Bible calendar # # Copyright 2002-2012 Ben Edgington # # Version: # 4.0 (11/03/2023) - Update for PHP 8.1 # 3.92(27/03/2016) - Update for import_request_variables obsolescence # 3.91(16/09/2012) - Fixes for leap year handling # 3.9 (21/02/2010) - Rewrite and simplify cookie code # 3.8 (27/06/2009) - Add option to use mobile BibleGateway # 3.7 (26/02/2006) - Add select date control # Change cookie path from "/" to "/mcheyne/" # 3.6 (04/10/2004) - Turn off cacheing - see note below # 3.5 (29/06/2004) - Add RSS links and fix typo # 3.4 (16/04/2004) - Minor changes to improve accessibility # 3.3 (14/04/2004) - Double-buffering of compressed output # 3.2 (16/06/2003) - Obtain Bible and Calendar options from the # server (ie. they are no longer hardcoded here) # 3.1 (13/01/2003) - Remove local links when accessed via AvantGo to # stop it downloading my entire site every day. # 3.0 (08/01/2003) - Use new M'Cheyne data server # 2.2 (30/10/2002) - Don't rely on register_globals for input parameters # 2.1 (24/10/2002) - Add links to RSV and NRSV # 2.0 (22/10/2002) - Complete rewrite in PHP; MySQL backend # 1.1 (19/08/2002) - Add links to the ESV # 1.0 (14/05/2002) - Original version in Perl # # Include the M'Cheyne Server interface class include "data_bpe.inc"; # Use output buffering to allow compression and content-length generation, # but we double-buffer to workaround problems finding the buffer-length of # compressed data in some PHP versions ob_start(); ob_start('ob_gzhandler'); # Detect whether page is being accessed by AvantGo $avantgo = strstr($_SERVER['HTTP_USER_AGENT'], 'AvantGo'); #### Acceptable values and defaults for the parameters #### $cal_default = 'classic'; $bible_default = 'niv'; $tzs = array ( -12 => 'GMT-12', -11 => 'GMT-11', -10 => 'GMT-10', -9 => 'GMT-9', -8 => 'GMT-8', -7 => 'GMT-7', -6 => 'GMT-6', -5 => 'GMT-5', -4 => 'GMT-4', -3 => 'GMT-3', -2 => 'GMT-2', -1 => 'GMT-1', 0 => 'GMT', 1 => 'GMT+1', 2 => 'GMT+2', 3 => 'GMT+3', 4 => 'GMT+4', 5 => 'GMT+5', 6 => 'GMT+6', 7 => 'GMT+7', 8 => 'GMT+8', 9 => 'GMT+9', 10 => 'GMT+10', 11 => 'GMT+11', 12 => 'GMT+12' ); $tz_default = 0; $skins = array ( 'green' => 'Green', 'slate' => 'Slate', 'rich' => 'Rich', 'grey_l' => 'Grey Left', 'grey_r' => 'Grey Right', 'pastel' => 'Pastel', 'plain' => 'Plain', 'none' => 'None' ); $skin_default = 'green'; #### Useful date stuff $months = array ('January' => 0, 'February' => 31, 'March' => 59, 'April' => 90, 'May' => 120, 'June' => 151, 'July' => 181, 'August' => 212, 'September' => 243, 'October' => 273, 'November' => 304, 'December' => 334); #### Explicitly deal with request variables #### # Ie. don't rely on register_globals behaviour. It may be turned off. # This can be tested by inserting "php_flag register_globals off" # in the directory .htaccess file. # 160327 - the following is obsolete #import_request_variables("gp", "req_"); function get_variable($name) { if (isset($_POST[$name])) return $_POST[$name]; if (isset($_GET[$name])) return $_GET[$name]; return null; } $bible = get_variable('bible'); $cal = get_variable('cal'); $tz = get_variable('tz'); $skin = get_variable('skin'); $hide_navig = get_variable('navig'); $hide_prefs = get_variable('hide_prefs'); $hide_blurb = get_variable('hide_blurb'); $day = get_variable('day'); $mobile = get_variable('mobile'); $prev = get_variable('prev'); $next = get_variable('next'); $today = get_variable('today'); $go = get_variable('go'); $month = get_variable('month'); $mday = get_variable('mday'); if ($prev) { $day = ($day == 0) ? 364 : $day - 1; } else if ($next) { $day = ($day == 364) ? 0 : $day + 1; } else if ($today) { $day = -1; } else if ($go) { $day = $month + $mday; } #### Deal with any returned cookie #### if (isset($_COOKIE['MCHEYNEPREFS'])) { $cookie = explode(':',$_COOKIE['MCHEYNEPREFS']); # PUT and GET variables take precedence if (!isset($bible)) { $bible = $cookie[0]; } if (!isset($cal)) { $cal = $cookie[1]; } if (!isset($tz)) { $tz = $cookie[2]; } if (!isset($skin)) { $skin = $cookie[3]; } if (!isset($hide_navig)) { $hide_navig = $cookie[4]; } if (!isset($hide_prefs)) { $hide_prefs = $cookie[5]; } if (!isset($hide_blurb)) { $hide_blurb = $cookie[6]; } if (!isset($mobile)) { $mobile = $cookie[7]; } } #### Check and set parameters #### # Timezone. Casting it as an integer gives most flexibility. if (!(isset($tz) && settype($tz,"integer") && valid($tz,$tzs))) { $tz = $tz_default; } # Calendar version if (!isset($cal)) { $cal = $cal_default; } if ($cal == 'classic') { $title_1 = 'Family'; $title_2 = 'Secret'; } else { $title_1 = 'Family'; $title_2 = 'Private'; } # Bible version if (!isset($bible)) { $bible = $bible_default; } # Skin if (!(isset($skin) && valid($skin,$skins))) { $skin = $skin_default; } # Display options $show_navig = (isset($hide_navig) && $hide_navig == 't') ? FALSE : TRUE; $show_prefs = (isset($hide_prefs) && $hide_prefs == 't') ? FALSE : TRUE; $show_blurb = (isset($hide_blurb) && $hide_blurb == 't') ? FALSE : TRUE; $hide_navig = $show_navig ? '' : 't'; $hide_prefs = $show_prefs ? '' : 't'; $hide_blurb = $show_blurb ? '' : 't'; $path = $_SERVER['PHP_SELF']; # Use mobile BibleGateway? $use_mobile = (isset($mobile) && $mobile == 't') ? TRUE : FALSE; $mobile = $use_mobile ? 't' : ''; #### Get data from the M'Cheyne server #### # This will validate $day or return current $day taking into account $tz $mc = new McheyneData($bible, $cal, $tz, $day, $mobile); # Check server version is new enough $error = false; if ($mc->version < 2.3) { $error = "<p><b>Error!</b> The server version ({$mc->version}) is too old. It must be version 2.3 or newer.</p>"; } # In case either of these were invalid use the values from the server $bible = $mc->bible; $cal = $mc->cal; $day = $mc->day; $leap = (date('Y')%4 == 0 && $day >=59); $t = getdate(strtotime("1 January") + 24*60*60*($day+$leap)); $t_mday = $t['mday']; $t_month = $t['month']; $date = $t_mday.' '.$t_month; $quote = $mc->quote; $ref_1 = $mc->refs[0]; $ref_2 = $mc->refs[1]; $ref_3 = $mc->refs[2]; $ref_4 = $mc->refs[3]; $url_1 = $mc->urls[0]; $url_2 = $mc->urls[1]; $url_3 = $mc->urls[2]; $url_4 = $mc->urls[3]; #### Functions #### function valid($value,$values) { return array_key_exists($value,$values); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" /> <title>Interactive M'Cheyne Bible Calendar</title> <link rel="alternate" type="application/rss+xml" href="rss_feed.php" title="RSS feed for the M'Cheyne Bible calendar"/> <style type="text/css"> <?php if ($skin != 'none') { ?> @import url(skin_<?php echo $skin; ?>.css); <?php } ?> .mcheyne { text-align: center; } .navigate table { margin-left: auto; margin-right: auto; } .button { font-style: italic; } .quote { text-align: center; font-style: italic; } select { display: inline; } <?php if ($show_prefs && ($skin=='grey_l' || $skin=='grey_r')) { ?> .mcheyne { width: 75%; } <?php } else { ?> .mcheyne { width: 100%; } <?php } ?> .left { float: left; } .right { float: right; } .clear { clear: both; } #xml a img { border: 0; } </style> </head> <body> <!-- Main block --> <?php if ($error) { print $error; exit; } ?> <div class="mcheyne"> <h1>M'Cheyne readings for <?php echo $date; ?></h1> <p class="quote"><?php echo $quote; ?></p> <div class="spacer"></div> <div class="refblock"> <div class="refs1"> <span class="title"><?php echo $title_1; ?><span class="nsonly">: </span></span> <span class="refer"><a href="<?php echo $url_1; ?>"><?php echo $ref_1; ?></a><span class="nsonly">, </span></span> <span class="refer"><a href="<?php echo $url_2; ?>"><?php echo $ref_2; ?></a></span> </div> <div class="spacer"></div> <div class="refs2"> <span class="title"><?php echo $title_2; ?><span class="nsonly">: </span></span> <span class="refer"><a href="<?php echo $url_3; ?>"><?php echo $ref_3; ?></a><span class="nsonly">, </span></span> <span class="refer"><a href="<?php echo $url_4; ?>"><?php echo $ref_4; ?></a></span> </div> </div> <div class="spacer"></div> <div class="clear"></div> <!-- Navigate block --> <?php if ($show_navig) { ?> <div class="navigate"> <form method="post" action="<?php echo $path; ?>"> <input type="hidden" name="hide_navig" value="<?php echo $hide_navig; ?>" /> <input type="hidden" name="hide_prefs" value="<?php echo $hide_prefs; ?>" /> <input type="hidden" name="hide_blurb" value="<?php echo $hide_blurb; ?>" /> <input type="hidden" name="mobile" value="<?php echo $mobile; ?>" /> <input type="hidden" name="day" value="<?php echo $day; ?>" /> <input type="hidden" name="tz" value="<?php echo $tz; ?>" /> <input type="hidden" name="bible" value="<?php echo $bible; ?>" /> <input type="hidden" name="cal" value="<?php echo $cal; ?>" /> <input type="hidden" name="skin" value="<?php echo $skin; ?>" /> <table summary="This table contains buttons linking to the previous and next day's readings."><tr> <td class="button" align="left"> <p> <input type="submit" name="prev" value="Prev" /> </p> </td> <td class="button" align="center"> <p> <input type="submit" name="today" value="Today" /> </p> </td> <td class="button" align="right"> <form method="post" action="<?php echo $path; ?>"> <p> <input type="submit" name="next" value="Next" /> </p> </td> </tr> <tr> <td class="button" align="center" colspan="3"> <select id="mday" name="mday"> <?php for ($i=1; $i<=31; $i++) { $j = $i-1; echo "<option value=\"$j\""; if ($i==$t_mday) {echo " selected=\"selected\"";} echo ">$i</option>\n"; } ?> </select> <select id="month" name="month"> <?php foreach ($months as $name => $days) { echo "<option value=\"$days\""; if ($name==$t_month) {echo " selected=\"selected\"";} echo ">$name</option>\n"; } ?> </select> <input type="submit" name="go" value="Go" /> </td> </tr> </table> </form> </div> <?php } ?> </div> <!-- Customise block --> <?php if ($show_prefs) { ?> <hr class="nsonly" /> <div class="prefs"> <form method="post" action="<?php echo $path; ?>"> <div class="pref-1"> <div class="item"> <label for="bible" title="Choose which Bible version to link to.">Bible</label> <select id="bible" name="bible"> <?php select_box($bible,$mc->bibles); ?> </select> </div> <div class="item"> <label for="cal" title="Choose whether to use M'Cheyne's original version, or Carson's slightly modified version.">Calendar</label> <select id="cal" name="cal"> <?php select_box($cal,$mc->cals); ?> </select> </div> <div class="item"> <label for="tz" title="Select which timezone you are in so that the readings change at midnight for you.">Timezone</label> <select id="tz" name="tz"> <?php select_box($tz,$tzs); ?> </select> </div> <div class="item"> <label for="skin" title="Select one of the background themes available.">Skin</label> <select id="skin" name="skin"> <?php select_box($skin,$skins); ?> </select> </div> </div> <div class="pref-2"> <div class="item"> <input type="checkbox" name="hide_navig" value="t" id="hide-navig" <?php if ($hide_navig) { echo "checked=\"checked\"";} ?> /> <label for="hide-navig" title="Hide the controls for moving from day to day." >Hide navigation</label> </div> <div class="item"> <input type="checkbox" name="hide_prefs" value="t" id="hide-prefs" <?php if ($hide_prefs) { echo "checked=\"checked\"";} ?> /> <label for="hide-prefs" title="Hide this panel.">Hide preferences</label> </div> <div class="item"> <input type="checkbox" name="hide_blurb" value="t" id="hide-blurb" <?php if ($hide_blurb) { echo "checked=\"checked\"";} ?> /> <label for="hide-blurb" title="Hide the information panel.">Hide blurb</label> </div> <div class="item"> <input type="checkbox" name="mobile" value="t" id="mobile" <?php if ($use_mobile) { echo "checked=\"checked\"";} ?> /> <label for="mobile" title="Link to the mobile versions where appropriate (BibleGateway, ESV).">Mobile Versions</label> </div> <div class="apply"> <input type="submit" name="Apply" value="Apply" /> </div> </div> </form> <?php if (!$avantgo) { ?> <p><a href="nocookies.php">No cookies</a>? Then <a href="<?php echo "{$path}?tz=$tz&cal=$cal&bible=$bible&skin=$skin&hide_navig=$hide_navig&hide_prefs=$hide_prefs&hide_blurb=$hide_blurb&mobile=$mobile"; ?>">bookmark this link</a>.</p> <?php } ?> </div> <?php } ?> <div class="clear-skin-grey"></div> <!-- Text block --> <?php if ($show_blurb && !$avantgo) { ?> <hr class="nsonly" /> <div class="blurb"> <p>These readings are according to Robert Murray M'Cheyne's daily Bible reading calendar. Click the references to see the Bible texts.</p> <p>See my <a href="index.html">M'Cheyne calendar pages</a> for more information about the calendar and other ways to access it, including RSS options.</p> <p>Please <a href="/mail.php">contact me</a> with any comments, suggestions or bug reports.</p> </div> <?php } ?> <div class="copy"> <hr class="nsonly" /> <?php if (!$show_prefs) { ?> <div class="right"> <form method="post" action="<?php echo $path; ?>"> <input type="hidden" name="hide_navig" value="<?php echo $hide_navig; ?>" /> <input type="hidden" name="hide_prefs" value="" /> <input type="hidden" name="hide_blurb" value="<?php echo $hide_blurb; ?>" /> <input type="hidden" name="tz" value="<?php echo $tz; ?>" /> <input type="hidden" name="bible" value="<?php echo $bible; ?>" /> <input type="hidden" name="cal" value="<?php echo $cal; ?>" /> <input type="hidden" name="skin" value="<?php echo $skin; ?>" /> <input type="hidden" name="day" value="<?php echo $day; ?>" /> <input type="submit" name="Apply" value="Preferences" /> </form> </div> <?php } ?> <div class="left"> <?php # Reduce off-page links when AvantGo comes along if ($avantgo) { echo "<p>© Copyright 2002-2009 Ben Edgington.</p>"; } else { echo "<p>© Copyright 2002-2009 <a href=\"/\">Ben Edgington</a>.</p>"; echo "<p id=\"xml\"><a type=\"application/rss+xml\" href=\"rss_feed.php\"><img src=\"/gifs/xml.gif\" alt=\"XML\"/></a></p>"; } ?> </div> <div class="spacer"></div> </div> </body></html> <?php # End inner (possibly compressed) output buffer ob_end_flush(); #### Generate HTTP headers #### # Save parameters as cookie # New path is "/mcheyne". Expires one year hence setcookie('MCHEYNEPREFS', "$bible:$cal:$tz:$skin:$hide_navig:$hide_prefs:$hide_blurb:$mobile", time()+86400*365, '/mcheyne/', $_SERVER['HTTP_HOST']); # For simplicity, don't allow any cacheing # (I reckon Etags etc. don't gain us anything here) header('Expires: 0'); # Content-Length header('Content-Length: ' . ob_get_length()); # Output the page ob_end_flush(); function select_box($value,$values) { foreach ($values as $name => $label) { echo "<option value=\"$name\""; if ($name==$value) {echo " selected=\"selected\"";} echo ">$label</option>\n"; } } ?>