File Annotation
Not logged in
dbda8d6ce9 2007-07-21       drh: /*
5cd9597428 2007-09-24       jnc: ** Copyright (c) 2006,2007 D. Richard Hipp
dbda8d6ce9 2007-07-21       drh: **
dbda8d6ce9 2007-07-21       drh: ** This program is free software; you can redistribute it and/or
dbda8d6ce9 2007-07-21       drh: ** modify it under the terms of the GNU General Public
dbda8d6ce9 2007-07-21       drh: ** License version 2 as published by the Free Software Foundation.
dbda8d6ce9 2007-07-21       drh: **
dbda8d6ce9 2007-07-21       drh: ** This program is distributed in the hope that it will be useful,
dbda8d6ce9 2007-07-21       drh: ** but WITHOUT ANY WARRANTY; without even the implied warranty of
dbda8d6ce9 2007-07-21       drh: ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dbda8d6ce9 2007-07-21       drh: ** General Public License for more details.
dbda8d6ce9 2007-07-21       drh: **
dbda8d6ce9 2007-07-21       drh: ** You should have received a copy of the GNU General Public
dbda8d6ce9 2007-07-21       drh: ** License along with this library; if not, write to the
dbda8d6ce9 2007-07-21       drh: ** Free Software Foundation, Inc., 59 Temple Place - Suite 330,
dbda8d6ce9 2007-07-21       drh: ** Boston, MA  02111-1307, USA.
dbda8d6ce9 2007-07-21       drh: **
dbda8d6ce9 2007-07-21       drh: ** Author contact information:
dbda8d6ce9 2007-07-21       drh: **   drh@hwaci.com
dbda8d6ce9 2007-07-21       drh: **   http://www.hwaci.com/drh/
dbda8d6ce9 2007-07-21       drh: **
dbda8d6ce9 2007-07-21       drh: *******************************************************************************
dbda8d6ce9 2007-07-21       drh: **
dbda8d6ce9 2007-07-21       drh: ** This file contains code to implement the basic web page look and feel.
dbda8d6ce9 2007-07-21       drh: **
dbda8d6ce9 2007-07-21       drh: */
dbda8d6ce9 2007-07-21       drh: #include "config.h"
dbda8d6ce9 2007-07-21       drh: #include "style.h"
dbda8d6ce9 2007-07-21       drh: 
dbda8d6ce9 2007-07-21       drh: 
dbda8d6ce9 2007-07-21       drh: /*
dbda8d6ce9 2007-07-21       drh: ** Elements of the submenu are collected into the following
dbda8d6ce9 2007-07-21       drh: ** structure and displayed below the main menu by style_header().
dbda8d6ce9 2007-07-21       drh: **
dbda8d6ce9 2007-07-21       drh: ** Populate this structure with calls to style_submenu_element()
dbda8d6ce9 2007-07-21       drh: ** prior to calling style_header().
dbda8d6ce9 2007-07-21       drh: */
dbda8d6ce9 2007-07-21       drh: static struct Submenu {
dbda8d6ce9 2007-07-21       drh:   const char *zLabel;
dbda8d6ce9 2007-07-21       drh:   const char *zTitle;
dbda8d6ce9 2007-07-21       drh:   const char *zLink;
dbda8d6ce9 2007-07-21       drh: } aSubmenu[30];
dbda8d6ce9 2007-07-21       drh: static int nSubmenu = 0;
dbda8d6ce9 2007-07-21       drh: 
dbda8d6ce9 2007-07-21       drh: /*
dbda8d6ce9 2007-07-21       drh: ** Add a new element to the submenu
dbda8d6ce9 2007-07-21       drh: */
dbda8d6ce9 2007-07-21       drh: void style_submenu_element(
dbda8d6ce9 2007-07-21       drh:   const char *zLabel,
dbda8d6ce9 2007-07-21       drh:   const char *zTitle,
5f3ddcc1b8 2007-11-25       drh:   const char *zLink,
5f3ddcc1b8 2007-11-25       drh:   ...
dbda8d6ce9 2007-07-21       drh: ){
5f3ddcc1b8 2007-11-25       drh:   va_list ap;
dbda8d6ce9 2007-07-21       drh:   assert( nSubmenu < sizeof(aSubmenu)/sizeof(aSubmenu[0]) );
dbda8d6ce9 2007-07-21       drh:   aSubmenu[nSubmenu].zLabel = zLabel;
dbda8d6ce9 2007-07-21       drh:   aSubmenu[nSubmenu].zTitle = zTitle;
5f3ddcc1b8 2007-11-25       drh:   va_start(ap, zLink);
5f3ddcc1b8 2007-11-25       drh:   aSubmenu[nSubmenu].zLink = vmprintf(zLink, ap);
5f3ddcc1b8 2007-11-25       drh:   va_end(ap);
dbda8d6ce9 2007-07-21       drh:   nSubmenu++;
dbda8d6ce9 2007-07-21       drh: }
dbda8d6ce9 2007-07-21       drh: 
dbda8d6ce9 2007-07-21       drh: /*
dbda8d6ce9 2007-07-21       drh: ** Compare two submenu items for sorting purposes
dbda8d6ce9 2007-07-21       drh: */
dbda8d6ce9 2007-07-21       drh: static int submenuCompare(const void *a, const void *b){
dbda8d6ce9 2007-07-21       drh:   const struct Submenu *A = (const struct Submenu*)a;
50a58adb76 2007-10-10       drh:   const struct Submenu *B = (const struct Submenu*)b;
dbda8d6ce9 2007-07-21       drh:   return strcmp(A->zLabel, B->zLabel);
dbda8d6ce9 2007-07-21       drh: }
dbda8d6ce9 2007-07-21       drh: 
dbda8d6ce9 2007-07-21       drh: /*
34af72801d 2007-11-23       drh: ** The Subscript interpreter used to render header and footer.
34af72801d 2007-11-23       drh: */
34af72801d 2007-11-23       drh: static struct Subscript *pInterp;
66f4caa379 2007-07-23       drh: 
66f4caa379 2007-07-23       drh: /*
dbda8d6ce9 2007-07-21       drh: ** Draw the header.
dbda8d6ce9 2007-07-21       drh: */
66f4caa379 2007-07-23       drh: void style_header(const char *zTitle){
f0a9e3b523 2007-11-21       drh:   const char *zLogInOut = "Login";
68a202e101 2007-11-21       drh:   const char *zHeader = db_get("header", (char*)zDefaultHeader);
916b6e4b3b 2007-07-21       drh:   login_check_credentials();
555911dff5 2007-11-21       drh: 
f394d84560 2007-11-25       drh:   if( pInterp ) return;
6af8fdc230 2007-12-04       drh:   cgi_destination(CGI_HEADER);
f394d84560 2007-11-25       drh: 
555911dff5 2007-11-21       drh:   /* Generate the header up through the main menu */
34af72801d 2007-11-23       drh:   pInterp = SbS_Create();
34af72801d 2007-11-23       drh:   SbS_Store(pInterp, "project_name",
34af72801d 2007-11-23       drh:                      db_get("project-name","Unnamed Fossil Project"), 0);
34af72801d 2007-11-23       drh:   SbS_Store(pInterp, "title", zTitle, 0);
34af72801d 2007-11-23       drh:   SbS_Store(pInterp, "baseurl", g.zBaseURL, 0);
34af72801d 2007-11-23       drh:   SbS_Store(pInterp, "manifest_version", MANIFEST_VERSION, 0);
34af72801d 2007-11-23       drh:   SbS_Store(pInterp, "manifest_date", MANIFEST_DATE, 0);
555911dff5 2007-11-21       drh:   if( g.zLogin ){
34af72801d 2007-11-23       drh:     SbS_Store(pInterp, "login", g.zLogin, 0);
f0a9e3b523 2007-11-21       drh:     zLogInOut = "Logout";
5ebcedc33e 2007-07-31       dan:   }
34af72801d 2007-11-23       drh:   SbS_Render(pInterp, zHeader);
555911dff5 2007-11-21       drh: 
6af8fdc230 2007-12-04       drh:   /* Generate the main menu */
34af72801d 2007-11-23       drh:   @ <div class="mainmenu">
50a58adb76 2007-10-10       drh:   @ <a href="%s(g.zBaseURL)/home">Home</a>
fd36718ad9 2007-07-31       drh:   if( g.okRead ){
555911dff5 2007-11-21       drh:     @ <a href="%s(g.zBaseURL)/leaves">Leaves</a>
555911dff5 2007-11-21       drh:     @ <a href="%s(g.zBaseURL)/timeline">Timeline</a>
02d1ed6ad2 2008-02-02   stephan:     @ <a href="%s(g.zBaseURL)/tagview">Tags</a>
66f4caa379 2007-07-23       drh:   }
66f4caa379 2007-07-23       drh:   if( g.okRdWiki ){
555911dff5 2007-11-21       drh:     @ <a href="%s(g.zBaseURL)/wiki">Wiki</a>
dbda8d6ce9 2007-07-21       drh:   }
66f4caa379 2007-07-23       drh: #if 0
555911dff5 2007-11-21       drh:   @ <font color="#888888">Search</font>
555911dff5 2007-11-21       drh:   @ <font color="#888888">Ticket</font>
555911dff5 2007-11-21       drh:   @ <font color="#888888">Reports</font>
66f4caa379 2007-07-23       drh: #endif
dbda8d6ce9 2007-07-21       drh:   if( g.okSetup ){
555911dff5 2007-11-21       drh:     @ <a href="%s(g.zBaseURL)/setup">Setup</a>
dbda8d6ce9 2007-07-21       drh:   }
dbda8d6ce9 2007-07-21       drh:   if( !g.noPswd ){
555911dff5 2007-11-21       drh:     @ <a href="%s(g.zBaseURL)/login">%s(zLogInOut)</a>
dbda8d6ce9 2007-07-21       drh:   }
5cd9597428 2007-09-24       jnc:   @ </div>
6af8fdc230 2007-12-04       drh:   cgi_destination(CGI_BODY);
dbda8d6ce9 2007-07-21       drh:   g.cgiPanic = 1;
dbda8d6ce9 2007-07-21       drh: }
dbda8d6ce9 2007-07-21       drh: 
dbda8d6ce9 2007-07-21       drh: /*
dbda8d6ce9 2007-07-21       drh: ** Draw the footer at the bottom of the page.
dbda8d6ce9 2007-07-21       drh: */
dbda8d6ce9 2007-07-21       drh: void style_footer(void){
6af8fdc230 2007-12-04       drh:   const char *zFooter;
6af8fdc230 2007-12-04       drh: 
6af8fdc230 2007-12-04       drh:   if( pInterp==0 ) return;
4f641e7e4e 2007-09-02       drh: 
6af8fdc230 2007-12-04       drh:   /* Go back and put the submenu at the top of the page.  We delay the
6af8fdc230 2007-12-04       drh:   ** creation of the submenu until the end so that we can add elements
6af8fdc230 2007-12-04       drh:   ** to the submenu while generating page text.
6af8fdc230 2007-12-04       drh:   */
555911dff5 2007-11-21       drh:   if( nSubmenu>0 ){
555911dff5 2007-11-21       drh:     int i;
6af8fdc230 2007-12-04       drh:     cgi_destination(CGI_HEADER);
34af72801d 2007-11-23       drh:     @ <div class="submenu">
555911dff5 2007-11-21       drh:     qsort(aSubmenu, nSubmenu, sizeof(aSubmenu[0]), submenuCompare);
555911dff5 2007-11-21       drh:     for(i=0; i<nSubmenu; i++){
555911dff5 2007-11-21       drh:       struct Submenu *p = &aSubmenu[i];
555911dff5 2007-11-21       drh:       if( p->zLink==0 ){
555911dff5 2007-11-21       drh:         @ <span class="label">%h(p->zLabel)</span>
555911dff5 2007-11-21       drh:       }else{
555911dff5 2007-11-21       drh:         @ <a class="label" href="%s(p->zLink)">%h(p->zLabel)</a>
555911dff5 2007-11-21       drh:       }
555911dff5 2007-11-21       drh:     }
555911dff5 2007-11-21       drh:     @ </div>
6af8fdc230 2007-12-04       drh:     cgi_destination(CGI_BODY);
4f641e7e4e 2007-09-02       drh:   }
5cd9597428 2007-09-24       jnc: 
6af8fdc230 2007-12-04       drh:   /* Put the footer at the bottom of the page.
6af8fdc230 2007-12-04       drh:   */
6af8fdc230 2007-12-04       drh:   @ <div class="content">
f394d84560 2007-11-25       drh:   zFooter = db_get("footer", (char*)zDefaultFooter);
50a58adb76 2007-10-10       drh:   @ </div>
34af72801d 2007-11-23       drh:   SbS_Render(pInterp, zFooter);
34af72801d 2007-11-23       drh:   SbS_Destroy(pInterp);
f394d84560 2007-11-25       drh:   pInterp = 0;
dbda8d6ce9 2007-07-21       drh: }
dbda8d6ce9 2007-07-21       drh: 
34af72801d 2007-11-23       drh: /* @-comment: // */
555911dff5 2007-11-21       drh: /*
555911dff5 2007-11-21       drh: ** The default page header.
555911dff5 2007-11-21       drh: */
555911dff5 2007-11-21       drh: const char zDefaultHeader[] =
555911dff5 2007-11-21       drh: @ <html>
555911dff5 2007-11-21       drh: @ <head>
34af72801d 2007-11-23       drh: @ <title>[project_name html]: [title html]</title>
555911dff5 2007-11-21       drh: @ <link rel="alternate" type="application/rss+xml" title="RSS Feed"
555911dff5 2007-11-21       drh: @       href="[baseurl puts]/timeline.rss">
555911dff5 2007-11-21       drh: @ <link rel="stylesheet" href="[baseurl puts]/style.css" type="text/css"
555911dff5 2007-11-21       drh: @       media="screen">
555911dff5 2007-11-21       drh: @ </head>
555911dff5 2007-11-21       drh: @ <body>
34af72801d 2007-11-23       drh: @ <div class="header">
34af72801d 2007-11-23       drh: @   <div class="logo">
34af72801d 2007-11-23       drh: @     <!-- <img src="logo.gif" alt="logo"><br></br> -->
34af72801d 2007-11-23       drh: @     <nobr>[project_name html]</nobr>
34af72801d 2007-11-23       drh: @   </div>
34af72801d 2007-11-23       drh: @   <div class="title">[title html]</div>
34af72801d 2007-11-23       drh: @   <div class="status"><nobr>
334f8e6e2f 2008-02-03   stephan: @     [/login exists enable_output]     Logged in as
334f8e6e2f 2008-02-03   stephan: @      <a href='[baseurl puts]/my'>[0 /login get html]</a>
13732d495d 2007-11-23       drh: @     [/login exists not enable_output] Not logged in
34af72801d 2007-11-23       drh: @     [1 enable_output]
34af72801d 2007-11-23       drh: @   </nobr></div>
34af72801d 2007-11-23       drh: @ </div>
34af72801d 2007-11-23       drh: ;
34af72801d 2007-11-23       drh: 
34af72801d 2007-11-23       drh: /*
34af72801d 2007-11-23       drh: ** The default page footer
34af72801d 2007-11-23       drh: */
34af72801d 2007-11-23       drh: const char zDefaultFooter[] =
34af72801d 2007-11-23       drh: @ <div class="footer">
34af72801d 2007-11-23       drh: @ Fossil version [manifest_version puts] [manifest_date puts]
555911dff5 2007-11-21       drh: @ </div>
34af72801d 2007-11-23       drh: @ </body></html>
555911dff5 2007-11-21       drh: ;
555911dff5 2007-11-21       drh: 
8ffd32c2b7 2007-10-28       drh: /*
8ffd32c2b7 2007-10-28       drh: ** The default Cascading Style Sheet.
8ffd32c2b7 2007-10-28       drh: */
8ffd32c2b7 2007-10-28       drh: const char zDefaultCSS[] =
34af72801d 2007-11-23       drh: @ /* General settings for the entire page */
8ffd32c2b7 2007-10-28       drh: @ body {
34af72801d 2007-11-23       drh: @   margin: 0ex 1ex;
8ffd32c2b7 2007-10-28       drh: @   padding: 0px;
8ffd32c2b7 2007-10-28       drh: @   background-color: white;
34af72801d 2007-11-23       drh: @   font-family: "sans serif";
34af72801d 2007-11-23       drh: @ }
34af72801d 2007-11-23       drh: @
34af72801d 2007-11-23       drh: @ /* The project logo in the upper left-hand corner of each page */
34af72801d 2007-11-23       drh: @ div.logo {
34af72801d 2007-11-23       drh: @   display: table-cell;
34af72801d 2007-11-23       drh: @   text-align: center;
34af72801d 2007-11-23       drh: @   vertical-align: bottom;
34af72801d 2007-11-23       drh: @   font-weight: bold;
34af72801d 2007-11-23       drh: @   color: #558195;
34af72801d 2007-11-23       drh: @ }
34af72801d 2007-11-23       drh: @
34af72801d 2007-11-23       drh: @ /* The page title centered at the top of each page */
34af72801d 2007-11-23       drh: @ div.title {
34af72801d 2007-11-23       drh: @   display: table-cell;
34af72801d 2007-11-23       drh: @   font-size: 2em;
8ffd32c2b7 2007-10-28       drh: @   font-weight: bold;
34af72801d 2007-11-23       drh: @   text-align: center;
34af72801d 2007-11-23       drh: @   color: #558195;
34af72801d 2007-11-23       drh: @   vertical-align: bottom;
34af72801d 2007-11-23       drh: @   width: 100%;
8ffd32c2b7 2007-10-28       drh: @ }
34af72801d 2007-11-23       drh: @
34af72801d 2007-11-23       drh: @ /* The login status message in the top right-hand corner */
34af72801d 2007-11-23       drh: @ div.status {
34af72801d 2007-11-23       drh: @   display: table-cell;
8ffd32c2b7 2007-10-28       drh: @   text-align: right;
34af72801d 2007-11-23       drh: @   vertical-align: bottom;
34af72801d 2007-11-23       drh: @   color: #558195;
34af72801d 2007-11-23       drh: @   font-size: 0.8em;
34af72801d 2007-11-23       drh: @   font-weight: bold;
34af72801d 2007-11-23       drh: @ }
34af72801d 2007-11-23       drh: @
34af72801d 2007-11-23       drh: @ /* The header across the top of the page */
34af72801d 2007-11-23       drh: @ div.header {
34af72801d 2007-11-23       drh: @   display: table;
34af72801d 2007-11-23       drh: @   width: 100%;
8ffd32c2b7 2007-10-28       drh: @ }
34af72801d 2007-11-23       drh: @
34af72801d 2007-11-23       drh: @ /* The main menu bar that appears at the top of the page beneath
34af72801d 2007-11-23       drh: @ ** the header */
34af72801d 2007-11-23       drh: @ div.mainmenu {
8ffd32c2b7 2007-10-28       drh: @   padding: 5px 10px 5px 10px;
8ffd32c2b7 2007-10-28       drh: @   font-size: 0.9em;
8ffd32c2b7 2007-10-28       drh: @   font-weight: bold;
8ffd32c2b7 2007-10-28       drh: @   text-align: center;
8ffd32c2b7 2007-10-28       drh: @   letter-spacing: 1px;
34af72801d 2007-11-23       drh: @   background-color: #558195;
8ffd32c2b7 2007-10-28       drh: @   color: white;
8ffd32c2b7 2007-10-28       drh: @ }
34af72801d 2007-11-23       drh: @
34af72801d 2007-11-23       drh: @ /* The submenu bar that *sometimes* appears below the main menu */
34af72801d 2007-11-23       drh: @ div.submenu {
8ffd32c2b7 2007-10-28       drh: @   padding: 3px 10px 3px 0px;
8ffd32c2b7 2007-10-28       drh: @   font-size: 0.9em;
8ffd32c2b7 2007-10-28       drh: @   text-align: center;
34af72801d 2007-11-23       drh: @   background-color: #456878;
8ffd32c2b7 2007-10-28       drh: @   color: white;
8ffd32c2b7 2007-10-28       drh: @ }
34af72801d 2007-11-23       drh: @ div.mainmenu a, div.mainmenu a:visited, div.submenu a, div.submenu a:visited {
8ffd32c2b7 2007-10-28       drh: @   padding: 3px 10px 3px 10px;
8ffd32c2b7 2007-10-28       drh: @   color: white;
34af72801d 2007-11-23       drh: @   text-decoration: none;
8ffd32c2b7 2007-10-28       drh: @ }
34af72801d 2007-11-23       drh: @ div.mainmenu a:hover, div.submenu a:hover {
34af72801d 2007-11-23       drh: @   color: #558195;
8ffd32c2b7 2007-10-28       drh: @   background-color: white;
8ffd32c2b7 2007-10-28       drh: @ }
34af72801d 2007-11-23       drh: @
34af72801d 2007-11-23       drh: @ /* All page content from the bottom of the menu or submenu down to
34af72801d 2007-11-23       drh: @ ** the footer */
34af72801d 2007-11-23       drh: @ div.content {
34af72801d 2007-11-23       drh: @   padding: 0ex 1ex 0ex 2ex;
34af72801d 2007-11-23       drh: @ }
34af72801d 2007-11-23       drh: @
34af72801d 2007-11-23       drh: @ /* Some pages have section dividers */
34af72801d 2007-11-23       drh: @ div.section {
34af72801d 2007-11-23       drh: @   margin-bottom: 0px;
34af72801d 2007-11-23       drh: @   margin-top: 1em;
34af72801d 2007-11-23       drh: @   padding: 1px 1px 1px 1px;
34af72801d 2007-11-23       drh: @   font-size: 1.2em;
34af72801d 2007-11-23       drh: @   font-weight: bold;
34af72801d 2007-11-23       drh: @   background-color: #558195;
34af72801d 2007-11-23       drh: @   color: white;
34af72801d 2007-11-23       drh: @ }
34af72801d 2007-11-23       drh: @
34af72801d 2007-11-23       drh: @ /* The "Date" that occurs on the left hand side of timelines */
34af72801d 2007-11-23       drh: @ div.divider {
34af72801d 2007-11-23       drh: @   background: #a1c4d4;
34af72801d 2007-11-23       drh: @   border: 2px #558195 solid;
34af72801d 2007-11-23       drh: @   font-size: 1em; font-weight: normal;
34af72801d 2007-11-23       drh: @   padding: .25em;
34af72801d 2007-11-23       drh: @   margin: .2em 0 .2em 0;
34af72801d 2007-11-23       drh: @   float: left;
34af72801d 2007-11-23       drh: @   clear: left;
8ffd32c2b7 2007-10-28       drh: @ }
34af72801d 2007-11-23       drh: @
34af72801d 2007-11-23       drh: @ /* The footer at the very bottom of the page */
34af72801d 2007-11-23       drh: @ div.footer {
8ffd32c2b7 2007-10-28       drh: @   font-size: 0.8em;
8ffd32c2b7 2007-10-28       drh: @   margin-top: 12px;
8ffd32c2b7 2007-10-28       drh: @   padding: 5px 10px 5px 10px;
8ffd32c2b7 2007-10-28       drh: @   text-align: right;
34af72801d 2007-11-23       drh: @   background-color: #558195;
8ffd32c2b7 2007-10-28       drh: @   color: white;
8ffd32c2b7 2007-10-28       drh: @ }
dff17229ff 2007-12-02       drh: @
dff17229ff 2007-12-02       drh: @ /* The label/value pairs on (for example) the vinfo page */
dff17229ff 2007-12-02       drh: @ table.label-value th {
8ffd32c2b7 2007-10-28       drh: @   vertical-align: top;
dff17229ff 2007-12-02       drh: @   text-align: right;
dff17229ff 2007-12-02       drh: @   padding: 0.2ex 2ex;
8ffd32c2b7 2007-10-28       drh: @ }
8ffd32c2b7 2007-10-28       drh: ;
5cd9597428 2007-09-24       jnc: 
dbda8d6ce9 2007-07-21       drh: /*
5cd9597428 2007-09-24       jnc: ** WEBPAGE: style.css
dbda8d6ce9 2007-07-21       drh: */
5cd9597428 2007-09-24       jnc: void page_style_css(void){
50a58adb76 2007-10-10       drh:   char *zCSS = 0;
5cd9597428 2007-09-24       jnc: 
50a58adb76 2007-10-10       drh:   cgi_set_content_type("text/css");
34af72801d 2007-11-23       drh:   zCSS = db_get("css",(char*)zDefaultCSS);
34af72801d 2007-11-23       drh:   cgi_append_content(zCSS, -1);
dbda8d6ce9 2007-07-21       drh: }
dbda8d6ce9 2007-07-21       drh: 
dbda8d6ce9 2007-07-21       drh: /*
dbda8d6ce9 2007-07-21       drh: ** WEBPAGE: test_env
dbda8d6ce9 2007-07-21       drh: */
dbda8d6ce9 2007-07-21       drh: void page_test_env(void){
66f4caa379 2007-07-23       drh:   style_header("Environment Test");
218577e3af 2007-10-11       drh:   @ g.zBaseURL = %h(g.zBaseURL)<br>
1ce716b2ec 2007-10-11       drh:   @ g.zTop = %h(g.zTop)<br>
dbda8d6ce9 2007-07-21       drh:   cgi_print_all();
dbda8d6ce9 2007-07-21       drh:   style_footer();
dbda8d6ce9 2007-07-21       drh: }