You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

466 lines
21 KiB

  1. <?php
  2. // Project: Web Reference Database (refbase) <http://www.refbase.net>
  3. // Copyright: Matthias Steffens <mailto:refbase@extracts.de> and the file's
  4. // original author(s).
  5. //
  6. // This code is distributed in the hope that it will be useful,
  7. // but WITHOUT ANY WARRANTY. Please see the GNU General Public
  8. // License for more details.
  9. //
  10. // File: ./index.php
  11. // Repository: $HeadURL: file:///svn/p/refbase/code/branches/bleeding-edge/index.php $
  12. // Author(s): Matthias Steffens <mailto:refbase@extracts.de>
  13. //
  14. // Created: 29-Jul-02, 16:45
  15. // Modified: $Date: 2016-11-06 01:55:25 +0000 (Sun, 06 Nov 2016) $
  16. // $Author: karnesky $
  17. // $Revision: 1413 $
  18. // This script builds the main page.
  19. // It provides login and quick search forms
  20. // as well as links to various search forms.
  21. // Incorporate some include files:
  22. include 'initialize/db.inc.php'; // 'db.inc.php' is included to hide username and password
  23. include 'includes/header.inc.php'; // include header
  24. include 'includes/footer.inc.php'; // include footer
  25. include 'includes/include.inc.php'; // include common functions
  26. include 'initialize/ini.inc.php'; // include common variables
  27. // --------------------------------------------------------------------
  28. // Check for admin tools
  29. if ((file_exists('install.php')||file_exists('update.php')) && $ignoreAdminWarning!=true){
  30. echo "<head><title>Administartion tools detected</title></head><body><h1>Administration tools detected</h2><p>Please finish installing or updating refbase according to the instructions and then remove 'install.php' and 'update.php' from your installation.</p></body>";
  31. exit;
  32. }
  33. // --------------------------------------------------------------------
  34. // START A SESSION:
  35. // call the 'start_session()' function (from 'include.inc.php') which will also read out available session variables:
  36. start_session(true);
  37. // --------------------------------------------------------------------
  38. // Initialize preferred display language:
  39. // (note that 'locales.inc.php' has to be included *after* the call to the 'start_session()' function)
  40. include 'includes/locales.inc.php'; // include the locales
  41. // --------------------------------------------------------------------
  42. // If there's no stored message available:
  43. if (!isset($_SESSION['HeaderString']))
  44. $HeaderString = $loc["Default Welcome Message"]; // Provide the default welcome message
  45. else
  46. {
  47. $HeaderString = $_SESSION['HeaderString']; // extract 'HeaderString' session variable (only necessary if register globals is OFF!)
  48. // Note: though we clear the session variable, the current message is still available to this script via '$HeaderString':
  49. deleteSessionVariable("HeaderString"); // function 'deleteSessionVariable()' is defined in 'include.inc.php'
  50. }
  51. // Extract the view type requested by the user (either 'Mobile', 'Print', 'Web' or ''):
  52. // ('' will produce the default 'Web' output style)
  53. if (isset($_REQUEST['viewType']))
  54. $viewType = $_REQUEST['viewType'];
  55. else
  56. $viewType = "";
  57. // Setup an array of arrays holding URL and title information for all RSS feeds available on this page:
  58. // (appropriate <link...> tags will be included in the HTML header for every URL specified)
  59. $rssURLArray = array();
  60. if (isset($_SESSION['user_permissions']) AND preg_match("/allow_rss_feeds/", $_SESSION['user_permissions'])) // if the 'user_permissions' session variable contains 'allow_rss_feeds'...
  61. {
  62. $showRows = $_SESSION['userRecordsPerPage']; // get the default number of records per page preferred by the current user
  63. $rssURLArray[] = array("href" => generateURL("show.php", $defaultFeedFormat, array("where" => 'serial RLIKE ".+"'), true, $showRows), // function 'generateURL()' is defined in 'include.inc.php', variable '$defaultFeedFormat' is defined in 'ini.inc.php'
  64. "title" => "records added most recently");
  65. $rssURLArray[] = array("href" => generateURL("show.php", $defaultFeedFormat, array("where" => 'created_date = CURDATE()'), true, $showRows),
  66. "title" => "records added today");
  67. $rssURLArray[] = array("href" => generateURL("show.php", $defaultFeedFormat, array("where" => 'modified_date = CURDATE()'), true, $showRows),
  68. "title" => "records edited today");
  69. }
  70. // --------------------------------------------------------------------
  71. // Adjust the width of the right-hand column according to the calling user agent:
  72. // NOTE: strictly, this isn't really necessary but it helps to achieve a similar appearance of the login form on Firefox/Gecko & Safari/WebKit browsers (with all supported GUI languages)
  73. // TODO: figure out a better way (which isn't based on user agent sniffing); the problem could also be avoided by simply stacking <input> fields & their labels on top of each other
  74. if (isset($_SERVER['HTTP_USER_AGENT']) AND preg_match("/AppleWebKit/i", $_SERVER['HTTP_USER_AGENT']))
  75. $rightColumnWidth = "215";
  76. else
  77. $rightColumnWidth = "225";
  78. // Get the total number of records:
  79. $recordCount = getTotalNumberOfRecords(); // function 'getTotalNumberOfRecords()' is defined in 'include.inc.php'
  80. // Show the login status:
  81. showLogin(); // (function 'showLogin()' is defined in 'include.inc.php')
  82. // (4) DISPLAY header:
  83. // call the 'displayHTMLhead()' and 'showPageHeader()' functions (which are defined in 'header.inc.php'):
  84. displayHTMLhead(encodeHTML($officialDatabaseName) . " -- " . $loc["Home"], "index,follow", "Search the " . encodeHTML($officialDatabaseName), "", true, "", $viewType, $rssURLArray);
  85. showPageHeader($HeaderString);
  86. // Define variables holding common drop-down elements, i.e. build properly formatted <option> tag elements:
  87. // - "Browse My Refs" form:
  88. $dropDownFieldNameArray2 = array("author" => $loc["DropDownFieldName_Author"],
  89. "year" => $loc["DropDownFieldName_Year"],
  90. "publication" => $loc["DropDownFieldName_Publication"],
  91. "keywords" => $loc["DropDownFieldName_Keywords"],
  92. "user_keys" => $loc["DropDownFieldName_UserKeys"]);
  93. $dropDownItems2 = buildSelectMenuOptions($dropDownFieldNameArray2, "//", "\t\t\t\t\t", true); // function 'buildSelectMenuOptions()' is defined in 'include.inc.php'
  94. // --------------------------------------------------------------------
  95. ?>
  96. <table align="center" border="0" cellpadding="2" cellspacing="5" width="90%" summary="This table explains features, goals and usage of the <?php echo encodeHTML($officialDatabaseName); ?>">
  97. <tr>
  98. <td colspan="2"><h3><?php echo $loc["RecentChanges"]; ?></h3></td>
  99. <td width="<?php echo $rightColumnWidth; ?>" valign="bottom" rowspan="2">
  100. <?php
  101. if (!isset($_SESSION['loginEmail']))
  102. {
  103. ?>
  104. <div id="userlogin" class="box">
  105. <div class="boxHead">
  106. <h3><?php echo $loc["Login"]; ?>:</h3>
  107. </div>
  108. <div class="boxBody">
  109. <form action="user_login.php" method="POST" name="login">
  110. <fieldset>
  111. <legend><?php echo $loc["Login"]; ?>:</legend>
  112. <input type="hidden" name="referer" value="index.php">
  113. <div id="loginUser">
  114. <div id="loginUserLabel">
  115. <label for="loginEmail"><?php echo $loc["Email"]; ?>:</label>
  116. </div>
  117. <div id="loginUserInput">
  118. <input type="text" id="loginEmail" name="loginEmail">
  119. </div>
  120. </div>
  121. <div id="loginPwd">
  122. <div id="loginPwdLabel">
  123. <label for="loginPassword"><?php echo $loc["Password"]; ?>:</label>
  124. </div>
  125. <div id="loginPwdInput">
  126. <input type="password" id="loginPassword" name="loginPassword">
  127. </div>
  128. </div>
  129. <div id="loginSubmit">
  130. <input type="submit" value="<?php echo $loc["ButtonTitle_Login"]; ?>">
  131. </div><?php
  132. if ($addNewUsers == "everyone")
  133. {
  134. ?>
  135. <div id="register">
  136. <a href="user_details.php" title="<?php echo $loc["registerAccount"]; ?>"><?php echo $loc["Register"]; ?></a>
  137. </div><?php
  138. }
  139. ?>
  140. </fieldset>
  141. </form>
  142. </div>
  143. </div><?php
  144. }
  145. elseif (isset($_SESSION['loginEmail']) AND (isset($_SESSION['user_permissions']) AND preg_match("/allow_user_groups/", $_SESSION['user_permissions']))) // if a user is logged in AND the 'user_permissions' session variable contains 'allow_user_groups', show the 'Show My Groups' form:
  146. {
  147. if (!isset($_SESSION['userGroups']))
  148. $groupSearchDisabled = " disabled"; // disable the 'Show My Groups' form if the session variable holding the user's groups isnt't available
  149. else
  150. $groupSearchDisabled = "";
  151. ?>
  152. <div id="showgroupmain" class="box">
  153. <div class="boxHead">
  154. <h3><?php echo $loc["ShowMyGroup"]; ?>:</h3>
  155. </div>
  156. <div class="boxBody">
  157. <form action="search.php" method="GET" name="groupSearch">
  158. <fieldset>
  159. <legend><?php echo $loc["ShowMyGroup"]; ?>:</legend>
  160. <input type="hidden" name="formType" value="groupSearch">
  161. <input type="hidden" name="showQuery" value="0">
  162. <input type="hidden" name="showLinks" value="1">
  163. <div id="groupSelect">
  164. <label for="groupSearchSelector"><?php echo $loc["My"]; ?>:</label>
  165. <select name="groupSearchSelector"<?php echo $groupSearchDisabled; ?>><?php
  166. if (isset($_SESSION['userGroups']))
  167. {
  168. $optionTags = buildSelectMenuOptions($_SESSION['userGroups'], "/ *; */", "\t\t\t\t\t\t\t\t\t", false); // build properly formatted <option> tag elements from the items listed in the 'userGroups' session variable
  169. echo $optionTags;
  170. }
  171. else
  172. {
  173. ?>
  174. <option>(<?php echo $loc["NoGroupsAvl"]; ?>)</option><?php
  175. }
  176. ?>
  177. </select>
  178. </div>
  179. <div id="groupSubmit">
  180. <input type="submit" value="<?php echo $loc["ButtonTitle_Show"]; ?>"<?php echo $groupSearchDisabled; ?>>
  181. </div>
  182. </fieldset>
  183. </form>
  184. </div>
  185. </div><?php
  186. }
  187. else
  188. {
  189. ?>
  190. &nbsp;<?php
  191. }
  192. ?>
  193. </td>
  194. </tr>
  195. <tr>
  196. <td width="15">&nbsp;</td>
  197. <td>
  198. <?php
  199. // Get the current year & date in order to include them into query URLs:
  200. $CurrentYear = date('Y');
  201. $CurrentDate = date('Y-m-d');
  202. // We'll also need yesterday's date for inclusion into query URLs:
  203. $TimeStampYesterday = mktime(0, 0, 0, date('m'), (date('d') - 1), date('Y'));
  204. $DateYesterday = date('Y-m-d', $TimeStampYesterday);
  205. // Plus, we'll calculate the date that's a week ago (again, for inclusion into query URLs):
  206. $TimeStampLastWeek = mktime(0, 0, 0, date('m'), (date('d') - 7), date('Y'));
  207. $DateLastWeek = date('Y-m-d', $TimeStampLastWeek);
  208. if (isset($_SESSION['loginEmail'])) // if a user is logged in
  209. {
  210. // Get the date & time of the last login for the current user:
  211. if (!empty($lastLogin)) // '$lastLogin' is provided as session variable
  212. {
  213. $lastLoginDate = date('Y-m-d', strtotime($lastLogin));
  214. $lastLoginTime = date('H:i:s', strtotime($lastLogin));
  215. }
  216. else
  217. {
  218. $lastLoginDate = "";
  219. $lastLoginTime = "";
  220. }
  221. }
  222. ?>
  223. <div id="recentlinks">
  224. <ul type="circle" class="moveup">
  225. <li><?php echo $loc["added"]; ?>: <a href="show.php?date=<?php echo $CurrentDate; ?>"><?php echo $loc["today"]; ?></a> | <a href="show.php?date=<?php echo $DateYesterday; ?>"><?php echo $loc["yesterday"]; ?></a> | <a href="show.php?date=<?php echo $DateLastWeek; ?>&amp;range=after"><?php echo $loc["last 7 days"]; ?></a><?php if (isset($_SESSION['loginEmail']) AND !empty($lastLoginDate) AND !empty($lastLoginTime)) { ?> | <a href="show.php?date=<?php echo $lastLoginDate; ?>&amp;time=<?php echo $lastLoginTime; ?>&amp;range=equal_or_after"><?php echo $loc["since last login"]; ?></a><?php } ?></li>
  226. <li><?php echo $loc["edited"]; ?>: <a href="show.php?date=<?php echo $CurrentDate; ?>&amp;when=edited"><?php echo $loc["today"]; ?></a> | <a href="show.php?date=<?php echo $DateYesterday; ?>&amp;when=edited"><?php echo $loc["yesterday"]; ?></a> | <a href="show.php?date=<?php echo $DateLastWeek; ?>&amp;when=edited&amp;range=after"><?php echo $loc["last 7 days"]; ?></a><?php if (isset($_SESSION['loginEmail']) AND !empty($lastLoginDate) AND !empty($lastLoginTime)) { ?> | <a href="show.php?date=<?php echo $lastLoginDate; ?>&amp;time=<?php echo $lastLoginTime; ?>&amp;when=edited&amp;range=equal_or_after"><?php echo $loc["since last login"]; ?></a><?php } ?></li>
  227. <li><?php echo $loc["published in"]; ?>: <a href="show.php?year=<?php echo $CurrentYear; ?>"><?php echo $CurrentYear; ?></a> | <a href="show.php?year=<?php echo ($CurrentYear - 1); ?>"><?php echo ($CurrentYear - 1); ?></a> | <a href="show.php?year=<?php echo ($CurrentYear - 2); ?>"><?php echo ($CurrentYear - 2); ?></a> | <a href="show.php?year=<?php echo ($CurrentYear - 3); ?>"><?php echo ($CurrentYear - 3); ?></a></li>
  228. </ul>
  229. </div>
  230. </td>
  231. </tr><?php
  232. if (isset($_SESSION['user_permissions']) AND preg_match("/allow_browse_view/", $_SESSION['user_permissions'])) // if the 'user_permissions' session variable contains 'allow_browse_view'...
  233. {
  234. ?>
  235. <tr>
  236. <td width="15">&nbsp;</td>
  237. <td>
  238. <?php echo $loc["browse all"]; ?>:
  239. </td>
  240. <td width="<?php echo $rightColumnWidth; ?>" valign="top">
  241. <?php
  242. if (isset($_SESSION['loginEmail']) AND (isset($_SESSION['user_permissions']) AND preg_match("/allow_browse_view/", $_SESSION['user_permissions'])))
  243. {
  244. ?>
  245. <h5><?php echo $loc["BrowseMyRefs"]; ?>:</h5><?php
  246. }
  247. else
  248. {
  249. ?>
  250. &nbsp;<?php
  251. }
  252. ?>
  253. </td>
  254. </tr>
  255. <tr>
  256. <td width="15">&nbsp;</td>
  257. <td>
  258. <ul type="circle" class="moveup">
  259. <li><a href="show.php?submit=Browse&amp;by=author"><?php echo $loc["author"]; ?></a> | <a href="show.php?submit=Browse&amp;by=year"><?php echo $loc["year"]; ?></a> | <a href="show.php?submit=Browse&amp;by=publication"><?php echo $loc["publication"]; ?></a> | <a href="show.php?submit=Browse&amp;by=keywords"><?php echo $loc["keywords"]; ?></a></li>
  260. <li><a href="show.php?submit=Browse&amp;by=location"><?php echo $loc["location"]; ?></a> | <a href="show.php?submit=Browse&amp;by=area"><?php echo $loc["area"]; ?></a> | <a href="show.php?submit=Browse&amp;by=language"><?php echo $loc["language"]; ?></a> | <a href="show.php?submit=Browse&amp;by=type"><?php echo $loc["type"]; ?></a></li>
  261. </ul>
  262. </td>
  263. <td width="<?php echo $rightColumnWidth; ?>" valign="top">
  264. <?php
  265. if (isset($_SESSION['loginEmail']) AND (isset($_SESSION['user_permissions']) AND preg_match("/allow_browse_view/", $_SESSION['user_permissions']))) // if a user is logged in AND the 'user_permissions' session variable contains 'allow_browse_view', show the 'Browse My Refs' form:
  266. {
  267. ?>
  268. <form action="search.php" method="GET">
  269. <input type="hidden" name="formType" value="myRefsBrowse">
  270. <input type="hidden" name="submit" value="Browse">
  271. <input type="hidden" name="showQuery" value="0">
  272. <input type="hidden" name="showLinks" value="1">
  273. <input type="hidden" name="showRows" value="10">
  274. <select name="browseFieldSelector"><?php
  275. $browseMyRefsDropDownItems = preg_replace("/<option([^>]*)>" . $loc["DropDownFieldName_Author"] . "/", "<option\\1 selected>" . $loc["DropDownFieldName_Author"], $dropDownItems2); // select the 'author' menu entry ...
  276. echo $browseMyRefsDropDownItems;
  277. ?>
  278. </select>
  279. <br>
  280. <input type="submit" value="<?php echo $loc["ButtonTitle_Browse"]; ?>">
  281. </form><?php
  282. }
  283. else
  284. {
  285. ?>
  286. &nbsp;<?php
  287. }
  288. ?>
  289. </td>
  290. </tr><?php
  291. }
  292. ?>
  293. <tr>
  294. <td width="15">&nbsp;</td>
  295. <td>
  296. <?php echo $loc["MostRecentPublications"]; ?>:
  297. </td>
  298. <td width="<?php echo $rightColumnWidth; ?>" valign="top" rowspan="2">
  299. <?php
  300. if (isset($_SESSION['loginEmail']) AND (isset($_SESSION['user_permissions']) AND preg_match("/allow_user_queries/", $_SESSION['user_permissions']))) // if a user is logged in AND the 'user_permissions' session variable contains 'allow_user_queries', show the 'Recall My Query' form:
  301. {
  302. if (!isset($_SESSION['userQueries']))
  303. $querySearchDisabled = " disabled"; // disable the 'Recall My Query' form if the session variable holding the user's queries isn't available
  304. else
  305. $querySearchDisabled = "";
  306. ?>
  307. <div id="recallquerymain" class="box">
  308. <div class="boxHead">
  309. <h3><?php echo $loc["RecallMyQuery"]; ?>:</h3>
  310. </div>
  311. <div class="boxBody">
  312. <form action="queries.php" method="GET" name="querySearch">
  313. <fieldset>
  314. <legend><?php echo $loc["RecallMyQuery"]; ?>:</legend>
  315. <input type="hidden" name="formType" value="querySearch">
  316. <input type="hidden" name="showQuery" value="0">
  317. <input type="hidden" name="showLinks" value="1">
  318. <div id="recallSelect">
  319. <label for="querySearchSelector"><?php echo $loc["Query"]; ?>:</label>
  320. <select name="querySearchSelector"<?php echo $querySearchDisabled; ?>><?php
  321. if (isset($_SESSION['userQueries']))
  322. {
  323. $optionTags = buildSelectMenuOptions($_SESSION['userQueries'], "/ *; */", "\t\t\t\t\t\t\t\t\t", false); // build properly formatted <option> tag elements from the items listed in the 'userQueries' session variable
  324. echo $optionTags;
  325. }
  326. else
  327. {
  328. ?>
  329. <option>(<?php echo $loc["NoQueriesAvl"]; ?>)</option><?php
  330. }
  331. ?>
  332. </select>
  333. </div>
  334. <div id="recallSubmit">
  335. <input type="submit" name="submit" value="<?php echo $loc["ButtonTitle_Go"]; ?>"<?php echo $querySearchDisabled; ?>>
  336. <input type="submit" name="submit" value="<?php echo $loc["ButtonTitle_Edit"]; ?>"<?php echo $querySearchDisabled; ?>>
  337. </div>
  338. </fieldset>
  339. </form>
  340. </div>
  341. </div><?php
  342. }
  343. else
  344. {
  345. ?>
  346. &nbsp;<?php
  347. }
  348. ?>
  349. </td>
  350. </tr>
  351. <tr>
  352. <td width="15">&nbsp;</td>
  353. <td>
  354. <div id="includerefs"><?php
  355. // Fetch the most recently added publications (as formatted citations), or link to them:
  356. $recentAdditionsResultTable = "";
  357. // Get all user permissions for the anonymous user (userID = 0):
  358. // NOTE: since function 'fetchDataFromURL()' retrieves citations anonymously (i.e. the
  359. // current user's session is not maintained, see note below), we need to check the
  360. // permissions for the *anonymous* user (userID = 0) here
  361. $anonymousUserPermissionsArray = getPermissions(0, "user", false); // function 'getPermissions()' is defined in 'include.inc.php'
  362. if (isset($_SESSION['user_permissions']) AND ($anonymousUserPermissionsArray["allow_cite"] == "yes")) // if the anonymous user is allowed to output records as citations
  363. {
  364. // NOTE: - as an alternative to the below code block, we could also fetch citations via an AJAX event and let the JavaScript functions in file 'javascript/show.js' ' write the results into the '<div id="includerefs">' section;
  365. // to do so:
  366. // 1. pass the JavaScript file 'javascript/show.js' as the 6th parameter to the 'displayHTMLhead' function (see above)
  367. // 2. call JavaScript function 'showRefs()' via an 'onload' event in the body tag of function 'displayHTMLhead()' in 'includes/header.inc.php': onload="showRefs('records=all&amp;showRows=5&amp;citeOrder=creation-date')"
  368. // TODO: function 'displayHTMLhead()' should get modified so that it only calls the 'onload' event if necessary/requested
  369. //
  370. // - the above alternative works within the user's current session, i.e. the links section will contain any edit or file links (if the user has appropriate permissions);
  371. // however, the below method (which uses function 'fetchDataFromURL()') does NOT maintain the user's current session (and adding the user's current PHPSESSID doesn't seem to work ?:-/)
  372. // Prepare a query that will fetch a HTML table with the most recently added publications (as formatted citations):
  373. $recentAdditionsQueryURL = $databaseBaseURL . "show.php?records=all&submit=Cite&showRows=5&citeOrder=creation-date&client=inc-refbase-1.0&wrapResults=0"; // variable '$databaseBaseURL' is defined in 'ini.inc.php'
  374. $recentAdditionsResultTable = fetchDataFromURL($recentAdditionsQueryURL); // function 'fetchDataFromURL()' is defined in 'include.inc.php'
  375. }
  376. if (!empty($recentAdditionsResultTable))
  377. {
  378. echo $recentAdditionsResultTable;
  379. }
  380. else
  381. {
  382. ?>
  383. <a href="show.php?records=all&amp;citeOrder=creation-date"><?php echo $loc["ShowAll"]; ?></a><?php
  384. }
  385. ?>
  386. </div>
  387. </td>
  388. </tr>
  389. <tr>
  390. <td colspan="3"><h3><?php echo $loc["about"]; ?></h3></td>
  391. </tr>
  392. <tr>
  393. <td width="15">&nbsp;</td>
  394. <td><?php echo $loc["ThisDatabaseIsMaintained"]; ?> <a href="<?php echo $hostInstitutionURL; ?>"><?php echo encodeHTML($hostInstitutionName); ?></a> (<?php echo encodeHTML($hostInstitutionAbbrevName); ?>). <?php echo $loc["You are welcome to send"]; ?> <a href="mailto:<?php echo $feedbackEmail; ?>"><?php echo $loc["feedback address"]; ?></a>. <?php echo $loc["refbaseDesc"]; ?></td>
  395. <td width="<?php echo $rightColumnWidth; ?>" valign="top" align="center"><a href="http://www.refbase.net/"><img src="img/refbase_credit.gif" alt="powered by refbase" width="142" height="51" hspace="0" border="0"></a></td>
  396. </tr>
  397. </table><?php
  398. // --------------------------------------------------------------------
  399. // (5) CLOSE the database connection:
  400. disconnectFromMySQLDatabase(); // function 'disconnectFromMySQLDatabase()' is defined in 'include.inc.php'
  401. // --------------------------------------------------------------------
  402. // DISPLAY THE HTML FOOTER:
  403. // call the 'showPageFooter()' and 'displayHTMLfoot()' functions (which are defined in 'footer.inc.php')
  404. showPageFooter($HeaderString);
  405. displayHTMLfoot();
  406. // --------------------------------------------------------------------
  407. ?>