Hex Artifact Content
Not logged in

Artifact 5a0e7535f4c63c3032f1e2731f2a0fe4fcef80d7:

File src/style.c part of check-in [f3807dbd88] - Removed unnecessary items from WWW Configuration, also made RSS Title and Description into generic Project Name and Project Description settings, which will be used elsewhere in the web site. by jnc on 2007-10-10 02:49:29.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 36 2c 32 30 30 37 20 44 2e  (c) 2006,2007 D.
0020: 20 52 69 63 68 61 72 64 20 48 69 70 70 0a 2a 2a   Richard Hipp.**
0030: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d  .** This program
0040: 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61 72   is free softwar
0050: 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64 69 73  e; you can redis
0060: 74 72 69 62 75 74 65 20 69 74 20 61 6e 64 2f 6f  tribute it and/o
0070: 72 0a 2a 2a 20 6d 6f 64 69 66 79 20 69 74 20 75  r.** modify it u
0080: 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f  nder the terms o
0090: 66 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61  f the GNU Genera
00a0: 6c 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63 65  l Public.** Lice
00b0: 6e 73 65 20 76 65 72 73 69 6f 6e 20 32 20 61 73  nse version 2 as
00c0: 20 70 75 62 6c 69 73 68 65 64 20 62 79 20 74 68   published by th
00d0: 65 20 46 72 65 65 20 53 6f 66 74 77 61 72 65 20  e Free Software 
00e0: 46 6f 75 6e 64 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  Foundation..**.*
00f0: 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69  * This program i
0100: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  s distributed in
0110: 20 74 68 65 20 68 6f 70 65 20 74 68 61 74 20 69   the hope that i
0120: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66 75 6c  t will be useful
0130: 2c 0a 2a 2a 20 62 75 74 20 57 49 54 48 4f 55 54  ,.** but WITHOUT
0140: 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20 77   ANY WARRANTY; w
0150: 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65 20  ithout even the 
0160: 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e 74 79  implied warranty
0170: 20 6f 66 0a 2a 2a 20 4d 45 52 43 48 41 4e 54 41   of.** MERCHANTA
0180: 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e 45 53  BILITY or FITNES
0190: 53 20 46 4f 52 20 41 20 50 41 52 54 49 43 55 4c  S FOR A PARTICUL
01a0: 41 52 20 50 55 52 50 4f 53 45 2e 20 20 53 65 65  AR PURPOSE.  See
01b0: 20 74 68 65 20 47 4e 55 0a 2a 2a 20 47 65 6e 65   the GNU.** Gene
01c0: 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e  ral Public Licen
01d0: 73 65 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61  se for more deta
01e0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 59 6f 75 20 73  ils..**.** You s
01f0: 68 6f 75 6c 64 20 68 61 76 65 20 72 65 63 65 69  hould have recei
0200: 76 65 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ved a copy of th
0210: 65 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75  e GNU General Pu
0220: 62 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20  blic.** License 
0230: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 69 73 20  along with this 
0240: 6c 69 62 72 61 72 79 3b 20 69 66 20 6e 6f 74 2c  library; if not,
0250: 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 2a 2a   write to the.**
0260: 20 46 72 65 65 20 53 6f 66 74 77 61 72 65 20 46   Free Software F
0270: 6f 75 6e 64 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c  oundation, Inc.,
0280: 20 35 39 20 54 65 6d 70 6c 65 20 50 6c 61 63 65   59 Temple Place
0290: 20 2d 20 53 75 69 74 65 20 33 33 30 2c 0a 2a 2a   - Suite 330,.**
02a0: 20 42 6f 73 74 6f 6e 2c 20 4d 41 20 20 30 32 31   Boston, MA  021
02b0: 31 31 2d 31 33 30 37 2c 20 55 53 41 2e 0a 2a 2a  11-1307, USA..**
02c0: 0a 2a 2a 20 41 75 74 68 6f 72 20 63 6f 6e 74 61  .** Author conta
02d0: 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a  ct information:.
02e0: 2a 2a 20 20 20 64 72 68 40 68 77 61 63 69 2e 63  **   drh@hwaci.c
02f0: 6f 6d 0a 2a 2a 20 20 20 68 74 74 70 3a 2f 2f 77  om.**   http://w
0300: 77 77 2e 68 77 61 63 69 2e 63 6f 6d 2f 64 72 68  ww.hwaci.com/drh
0310: 2f 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.**.***********
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0370: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f  file contains co
0380: 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
0390: 74 68 65 20 62 61 73 69 63 20 77 65 62 20 70 61  the basic web pa
03a0: 67 65 20 6c 6f 6f 6b 20 61 6e 64 20 66 65 65 6c  ge look and feel
03b0: 2e 0a 2a 2a 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ..**.*/.#include
03c0: 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63   "config.h".#inc
03d0: 6c 75 64 65 20 22 73 74 79 6c 65 2e 68 22 0a 0a  lude "style.h"..
03e0: 0a 2f 2a 0a 2a 2a 20 45 6c 65 6d 65 6e 74 73 20  ./*.** Elements 
03f0: 6f 66 20 74 68 65 20 73 75 62 6d 65 6e 75 20 61  of the submenu a
0400: 72 65 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  re collected int
0410: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
0420: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ** structure and
0430: 20 64 69 73 70 6c 61 79 65 64 20 62 65 6c 6f 77   displayed below
0440: 20 74 68 65 20 6d 61 69 6e 20 6d 65 6e 75 20 62   the main menu b
0450: 79 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 29  y style_header()
0460: 2e 0a 2a 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ..**.** Populate
0470: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
0480: 77 69 74 68 20 63 61 6c 6c 73 20 74 6f 20 73 74  with calls to st
0490: 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d  yle_submenu_elem
04a0: 65 6e 74 28 29 0a 2a 2a 20 70 72 69 6f 72 20 74  ent().** prior t
04b0: 6f 20 63 61 6c 6c 69 6e 67 20 73 74 79 6c 65 5f  o calling style_
04c0: 68 65 61 64 65 72 28 29 2e 0a 2a 2f 0a 73 74 61  header()..*/.sta
04d0: 74 69 63 20 73 74 72 75 63 74 20 53 75 62 6d 65  tic struct Subme
04e0: 6e 75 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  nu {.  const cha
04f0: 72 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 63 6f 6e  r *zLabel;.  con
0500: 73 74 20 63 68 61 72 20 2a 7a 54 69 74 6c 65 3b  st char *zTitle;
0510: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0520: 4c 69 6e 6b 3b 0a 7d 20 61 53 75 62 6d 65 6e 75  Link;.} aSubmenu
0530: 5b 33 30 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74  [30];.static int
0540: 20 6e 53 75 62 6d 65 6e 75 20 3d 20 30 3b 0a 0a   nSubmenu = 0;..
0550: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
0560: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 73  element to the s
0570: 75 62 6d 65 6e 75 0a 2a 2f 0a 76 6f 69 64 20 73  ubmenu.*/.void s
0580: 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65  tyle_submenu_ele
0590: 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 63 68  ment(.  const ch
05a0: 61 72 20 2a 7a 4c 61 62 65 6c 2c 0a 20 20 63 6f  ar *zLabel,.  co
05b0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 69 74 6c 65  nst char *zTitle
05c0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
05d0: 7a 4c 69 6e 6b 0a 29 7b 0a 20 20 61 73 73 65 72  zLink.){.  asser
05e0: 74 28 20 6e 53 75 62 6d 65 6e 75 20 3c 20 73 69  t( nSubmenu < si
05f0: 7a 65 6f 66 28 61 53 75 62 6d 65 6e 75 29 2f 73  zeof(aSubmenu)/s
0600: 69 7a 65 6f 66 28 61 53 75 62 6d 65 6e 75 5b 30  izeof(aSubmenu[0
0610: 5d 29 20 29 3b 0a 20 20 61 53 75 62 6d 65 6e 75  ]) );.  aSubmenu
0620: 5b 6e 53 75 62 6d 65 6e 75 5d 2e 7a 4c 61 62 65  [nSubmenu].zLabe
0630: 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 61 53  l = zLabel;.  aS
0640: 75 62 6d 65 6e 75 5b 6e 53 75 62 6d 65 6e 75 5d  ubmenu[nSubmenu]
0650: 2e 7a 54 69 74 6c 65 20 3d 20 7a 54 69 74 6c 65  .zTitle = zTitle
0660: 3b 0a 20 20 61 53 75 62 6d 65 6e 75 5b 6e 53 75  ;.  aSubmenu[nSu
0670: 62 6d 65 6e 75 5d 2e 7a 4c 69 6e 6b 20 3d 20 7a  bmenu].zLink = z
0680: 4c 69 6e 6b 3b 0a 20 20 6e 53 75 62 6d 65 6e 75  Link;.  nSubmenu
0690: 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  ++;.}../*.** Com
06a0: 70 61 72 65 20 74 77 6f 20 73 75 62 6d 65 6e 75  pare two submenu
06b0: 20 69 74 65 6d 73 20 66 6f 72 20 73 6f 72 74 69   items for sorti
06c0: 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73  ng purposes.*/.s
06d0: 74 61 74 69 63 20 69 6e 74 20 73 75 62 6d 65 6e  tatic int submen
06e0: 75 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76  uCompare(const v
06f0: 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f  oid *a, const vo
0700: 69 64 20 2a 62 29 7b 0a 20 20 63 6f 6e 73 74 20  id *b){.  const 
0710: 73 74 72 75 63 74 20 53 75 62 6d 65 6e 75 20 2a  struct Submenu *
0720: 41 20 3d 20 28 63 6f 6e 73 74 20 73 74 72 75 63  A = (const struc
0730: 74 20 53 75 62 6d 65 6e 75 2a 29 61 3b 0a 20 20  t Submenu*)a;.  
0740: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 53 75 62  const struct Sub
0750: 6d 65 6e 75 20 2a 42 20 3d 20 28 63 6f 6e 73 74  menu *B = (const
0760: 20 73 74 72 75 63 74 20 53 75 62 6d 65 6e 75 2a   struct Submenu*
0770: 29 42 3b 0a 20 20 72 65 74 75 72 6e 20 73 74 72  )B;.  return str
0780: 63 6d 70 28 41 2d 3e 7a 4c 61 62 65 6c 2c 20 42  cmp(A->zLabel, B
0790: 2d 3e 7a 4c 61 62 65 6c 29 3b 0a 7d 0a 0a 2f 2a  ->zLabel);.}../*
07a0: 0a 2a 2a 20 44 72 61 77 20 74 68 65 20 68 65 61  .** Draw the hea
07b0: 64 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 74 79  der..*/.void sty
07c0: 6c 65 5f 68 65 61 64 65 72 28 63 6f 6e 73 74 20  le_header(const 
07d0: 63 68 61 72 20 2a 7a 54 69 74 6c 65 29 7b 0a 20  char *zTitle){. 
07e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f   const char *zLo
07f0: 67 49 6e 4f 75 74 20 3d 20 22 4c 6f 67 6f 75 74  gInOut = "Logout
0800: 22 3b 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 6a  ";.  char *zProj
0810: 65 63 74 44 65 73 63 72 20 3d 20 64 62 5f 67 65  ectDescr = db_ge
0820: 74 28 22 70 72 6f 6a 65 63 74 2d 64 65 73 63 72  t("project-descr
0830: 69 70 74 69 6f 6e 22 2c 20 30 29 3b 0a 20 20 6c  iption", 0);.  l
0840: 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65  ogin_check_crede
0850: 6e 74 69 61 6c 73 28 29 3b 0a 20 20 40 20 3c 68  ntials();.  @ <h
0860: 74 6d 6c 3e 0a 20 20 40 20 3c 68 65 61 64 3e 0a  tml>.  @ <head>.
0870: 20 20 40 20 3c 74 69 74 6c 65 3e 25 73 28 7a 54    @ <title>%s(zT
0880: 69 74 6c 65 29 3c 2f 74 69 74 6c 65 3e 0a 20 20  itle)</title>.  
0890: 40 20 3c 6c 69 6e 6b 20 72 65 6c 3d 22 61 6c 74  @ <link rel="alt
08a0: 65 72 6e 61 74 65 22 20 74 79 70 65 3d 22 61 70  ernate" type="ap
08b0: 70 6c 69 63 61 74 69 6f 6e 2f 72 73 73 2b 78 6d  plication/rss+xm
08c0: 6c 22 20 74 69 74 6c 65 3d 22 52 53 53 20 46 65  l" title="RSS Fe
08d0: 65 64 22 20 68 72 65 66 3d 22 25 73 28 67 2e 7a  ed" href="%s(g.z
08e0: 42 61 73 65 55 52 4c 29 2f 74 69 6d 65 6c 69 6e  BaseURL)/timelin
08f0: 65 2e 72 73 73 22 3e 0a 20 20 40 20 3c 6c 69 6e  e.rss">.  @ <lin
0900: 6b 20 72 65 6c 3d 22 73 74 79 6c 65 73 68 65 65  k rel="styleshee
0910: 74 22 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42  t" href="%s(g.zB
0920: 61 73 65 55 52 4c 29 2f 73 74 79 6c 65 2e 63 73  aseURL)/style.cs
0930: 73 22 20 74 79 70 65 3d 22 74 65 78 74 2f 63 73  s" type="text/cs
0940: 73 22 20 6d 65 64 69 61 3d 22 73 63 72 65 65 6e  s" media="screen
0950: 22 3e 0a 20 20 69 66 28 20 7a 50 72 6f 6a 65 63  ">.  if( zProjec
0960: 74 44 65 73 63 72 20 21 3d 20 30 20 29 7b 0a 20  tDescr != 0 ){. 
0970: 20 20 20 40 20 3c 6d 65 74 61 20 6e 61 6d 65 3d     @ <meta name=
0980: 22 64 65 73 63 72 69 70 74 69 6f 6e 22 20 63 6f  "description" co
0990: 6e 74 65 6e 74 3d 22 25 73 28 7a 50 72 6f 6a 65  ntent="%s(zProje
09a0: 63 74 44 65 73 63 72 29 22 3e 0a 20 20 7d 0a 20  ctDescr)">.  }. 
09b0: 20 40 20 3c 2f 68 65 61 64 3e 0a 20 20 40 20 3c   @ </head>.  @ <
09c0: 62 6f 64 79 3e 0a 20 20 40 20 3c 64 69 76 20 69  body>.  @ <div i
09d0: 64 3d 22 70 61 67 65 2d 74 69 74 6c 65 22 3e 25  d="page-title">%
09e0: 73 28 7a 54 69 74 6c 65 29 3c 2f 64 69 76 3e 0a  s(zTitle)</div>.
09f0: 20 20 40 20 3c 64 69 76 20 69 64 3d 22 6c 6f 67    @ <div id="log
0a00: 69 6e 2d 73 74 61 74 75 73 22 3e 0a 20 20 69 66  in-status">.  if
0a10: 28 20 67 2e 7a 4c 6f 67 69 6e 3d 3d 30 20 29 7b  ( g.zLogin==0 ){
0a20: 0a 20 20 20 20 40 20 6e 6f 74 20 6c 6f 67 67 65  .    @ not logge
0a30: 64 20 69 6e 0a 20 20 20 20 7a 4c 6f 67 49 6e 4f  d in.    zLogInO
0a40: 75 74 20 3d 20 22 4c 6f 67 69 6e 22 3b 0a 20 20  ut = "Login";.  
0a50: 7d 65 6c 73 65 7b 0a 20 20 20 20 40 20 6c 6f 67  }else{.    @ log
0a60: 67 65 64 20 69 6e 20 61 73 20 25 68 28 67 2e 7a  ged in as %h(g.z
0a70: 4c 6f 67 69 6e 29 0a 20 20 7d 0a 20 20 40 20 3c  Login).  }.  @ <
0a80: 2f 64 69 76 3e 0a 20 20 40 20 3c 64 69 76 20 69  /div>.  @ <div i
0a90: 64 3d 22 6d 61 69 6e 2d 6d 65 6e 75 22 3e 0a 20  d="main-menu">. 
0aa0: 20 40 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67   @ <a href="%s(g
0ab0: 2e 7a 42 61 73 65 55 52 4c 29 2f 69 6e 64 65 78  .zBaseURL)/index
0ac0: 22 3e 48 6f 6d 65 3c 2f 61 3e 0a 20 20 69 66 28  ">Home</a>.  if(
0ad0: 20 67 2e 6f 6b 52 65 61 64 20 29 7b 0a 20 20 20   g.okRead ){.   
0ae0: 20 40 20 7c 20 3c 61 20 68 72 65 66 3d 22 25 73   @ | <a href="%s
0af0: 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 6c 65 61  (g.zBaseURL)/lea
0b00: 76 65 73 22 3e 4c 65 61 76 65 73 3c 2f 61 3e 0a  ves">Leaves</a>.
0b10: 20 20 20 20 40 20 7c 20 3c 61 20 68 72 65 66 3d      @ | <a href=
0b20: 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f  "%s(g.zBaseURL)/
0b30: 74 69 6d 65 6c 69 6e 65 22 3e 54 69 6d 65 6c 69  timeline">Timeli
0b40: 6e 65 3c 2f 61 3e 0a 20 20 7d 0a 23 69 66 20 30  ne</a>.  }.#if 0
0b50: 0a 20 20 40 20 7c 20 3c 66 6f 6e 74 20 63 6f 6c  .  @ | <font col
0b60: 6f 72 3d 22 23 38 38 38 38 38 38 22 3e 53 65 61  or="#888888">Sea
0b70: 72 63 68 3c 2f 66 6f 6e 74 3e 0a 20 20 40 20 7c  rch</font>.  @ |
0b80: 20 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 22 23 38   <font color="#8
0b90: 38 38 38 38 38 22 3e 54 69 63 6b 65 74 3c 2f 66  88888">Ticket</f
0ba0: 6f 6e 74 3e 0a 20 20 40 20 7c 20 3c 66 6f 6e 74  ont>.  @ | <font
0bb0: 20 63 6f 6c 6f 72 3d 22 23 38 38 38 38 38 38 22   color="#888888"
0bc0: 3e 52 65 70 6f 72 74 73 3c 2f 66 6f 6e 74 3e 0a  >Reports</font>.
0bd0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 67 2e 6f  #endif.  if( g.o
0be0: 6b 53 65 74 75 70 20 29 7b 0a 20 20 20 20 40 20  kSetup ){.    @ 
0bf0: 7c 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e  | <a href="%s(g.
0c00: 7a 42 61 73 65 55 52 4c 29 2f 73 65 74 75 70 22  zBaseURL)/setup"
0c10: 3e 53 65 74 75 70 3c 2f 61 3e 0a 20 20 7d 0a 20  >Setup</a>.  }. 
0c20: 20 69 66 28 20 21 67 2e 6e 6f 50 73 77 64 20 29   if( !g.noPswd )
0c30: 7b 0a 20 20 20 20 40 20 7c 20 3c 61 20 68 72 65  {.    @ | <a hre
0c40: 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c  f="%s(g.zBaseURL
0c50: 29 2f 6c 6f 67 69 6e 22 3e 25 73 28 7a 4c 6f 67  )/login">%s(zLog
0c60: 49 6e 4f 75 74 29 3c 2f 61 3e 0a 20 20 7d 0a 20  InOut)</a>.  }. 
0c70: 20 40 20 3c 2f 64 69 76 3e 0a 20 20 69 66 28 20   @ </div>.  if( 
0c80: 6e 53 75 62 6d 65 6e 75 3e 30 20 29 7b 0a 20 20  nSubmenu>0 ){.  
0c90: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 40 20 3c    int i;.    @ <
0ca0: 64 69 76 20 69 64 3d 22 73 75 62 2d 6d 65 6e 75  div id="sub-menu
0cb0: 22 3e 0a 20 20 20 20 71 73 6f 72 74 28 61 53 75  ">.    qsort(aSu
0cc0: 62 6d 65 6e 75 2c 20 6e 53 75 62 6d 65 6e 75 2c  bmenu, nSubmenu,
0cd0: 20 73 69 7a 65 6f 66 28 61 53 75 62 6d 65 6e 75   sizeof(aSubmenu
0ce0: 5b 30 5d 29 2c 20 73 75 62 6d 65 6e 75 43 6f 6d  [0]), submenuCom
0cf0: 70 61 72 65 29 3b 0a 20 20 20 20 66 6f 72 28 69  pare);.    for(i
0d00: 3d 30 3b 20 69 3c 6e 53 75 62 6d 65 6e 75 3b 20  =0; i<nSubmenu; 
0d10: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
0d20: 63 74 20 53 75 62 6d 65 6e 75 20 2a 70 20 3d 20  ct Submenu *p = 
0d30: 26 61 53 75 62 6d 65 6e 75 5b 69 5d 3b 0a 20 20  &aSubmenu[i];.  
0d40: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 69 6c 20      char *zTail 
0d50: 3d 20 69 3c 6e 53 75 62 6d 65 6e 75 2d 31 20 3f  = i<nSubmenu-1 ?
0d60: 20 22 20 7c 20 22 20 3a 20 22 22 3b 0a 20 20 20   " | " : "";.   
0d70: 20 20 20 69 66 28 20 70 2d 3e 7a 4c 69 6e 6b 3d     if( p->zLink=
0d80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20  =0 ){.        @ 
0d90: 3c 73 70 61 6e 20 63 6c 61 73 73 3d 22 6c 61 62  <span class="lab
0da0: 65 6c 22 3e 25 68 28 70 2d 3e 7a 4c 61 62 65 6c  el">%h(p->zLabel
0db0: 29 3c 2f 73 70 61 6e 3e 0a 20 20 20 20 20 20 20  )</span>.       
0dc0: 20 40 20 3c 73 70 61 6e 20 63 6c 61 73 73 3d 22   @ <span class="
0dd0: 74 61 69 6c 22 3e 25 73 28 7a 54 61 69 6c 29 3c  tail">%s(zTail)<
0de0: 2f 73 70 61 6e 3e 0a 20 20 20 20 20 20 7d 65 6c  /span>.      }el
0df0: 73 65 7b 0a 20 20 20 20 20 20 20 20 40 20 3c 61  se{.        @ <a
0e00: 20 63 6c 61 73 73 3d 22 6c 61 62 65 6c 22 20 68   class="label" h
0e10: 72 65 66 3d 22 25 54 28 70 2d 3e 7a 4c 69 6e 6b  ref="%T(p->zLink
0e20: 29 22 3e 25 68 28 70 2d 3e 7a 4c 61 62 65 6c 29  )">%h(p->zLabel)
0e30: 3c 2f 61 3e 0a 20 20 20 20 20 20 20 20 40 20 3c  </a>.        @ <
0e40: 73 70 61 6e 20 63 6c 61 73 73 3d 22 74 61 69 6c  span class="tail
0e50: 22 3e 25 73 28 7a 54 61 69 6c 29 3c 2f 73 70 61  ">%s(zTail)</spa
0e60: 6e 3e 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n>.      }.    }
0e70: 0a 20 20 20 20 40 20 3c 2f 64 69 76 3e 0a 20 20  .    @ </div>.  
0e80: 7d 0a 20 20 40 20 3c 64 69 76 20 69 64 3d 22 70  }.  @ <div id="p
0e90: 61 67 65 22 3e 0a 20 20 67 2e 63 67 69 50 61 6e  age">.  g.cgiPan
0ea0: 69 63 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ic = 1;.}../*.**
0eb0: 20 44 72 61 77 20 74 68 65 20 66 6f 6f 74 65 72   Draw the footer
0ec0: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
0ed0: 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 76  f the page..*/.v
0ee0: 6f 69 64 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72  oid style_footer
0ef0: 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 65 6e 64  (void){.  /* end
0f00: 20 74 68 65 20 3c 64 69 76 20 69 64 3d 22 70 61   the <div id="pa
0f10: 67 65 22 3e 20 66 72 6f 6d 20 73 74 79 6c 65 5f  ge"> from style_
0f20: 68 65 61 64 65 72 28 29 20 2a 2f 0a 20 20 40 20  header() */.  @ 
0f30: 3c 2f 64 69 76 3e 0a 20 20 40 20 3c 64 69 76 20  </div>.  @ <div 
0f40: 69 64 3d 22 73 74 79 6c 65 2d 66 6f 6f 74 65 72  id="style-footer
0f50: 22 3e 0a 20 20 40 20 46 6f 73 73 69 6c 20 76 65  ">.  @ Fossil ve
0f60: 72 73 69 6f 6e 20 25 73 28 4d 41 4e 49 46 45 53  rsion %s(MANIFES
0f70: 54 5f 56 45 52 53 49 4f 4e 29 20 25 73 28 4d 41  T_VERSION) %s(MA
0f80: 4e 49 46 45 53 54 5f 44 41 54 45 29 0a 20 20 40  NIFEST_DATE).  @
0f90: 20 3c 2f 64 69 76 3e 0a 7d 0a 0a 2f 2a 0a 2a 2a   </div>.}../*.**
0fa0: 20 57 45 42 50 41 47 45 3a 20 69 6e 64 65 78 0a   WEBPAGE: index.
0fb0: 2a 2a 20 57 45 42 50 41 47 45 3a 20 68 6f 6d 65  ** WEBPAGE: home
0fc0: 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 6e 6f 74  .** WEBPAGE: not
0fd0: 5f 66 6f 75 6e 64 0a 2a 2f 0a 76 6f 69 64 20 70  _found.*/.void p
0fe0: 61 67 65 5f 69 6e 64 65 78 28 76 6f 69 64 29 7b  age_index(void){
0ff0: 0a 20 20 63 68 61 72 20 2a 7a 48 6f 6d 65 20 3d  .  char *zHome =
1000: 20 22 48 6f 6d 65 22 3b 0a 20 20 69 66 28 20 7a   "Home";.  if( z
1010: 48 6f 6d 65 20 29 7b 0a 20 20 20 20 67 2e 7a 45  Home ){.    g.zE
1020: 78 74 72 61 20 3d 20 7a 48 6f 6d 65 3b 0a 20 20  xtra = zHome;.  
1030: 20 20 67 2e 6f 6b 52 64 57 69 6b 69 20 3d 20 31    g.okRdWiki = 1
1040: 3b 0a 20 20 20 20 77 69 6b 69 5f 70 61 67 65 28  ;.    wiki_page(
1050: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1060: 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 4d 61  style_header("Ma
1070: 69 6e 20 54 69 74 6c 65 20 50 61 67 65 22 29 3b  in Title Page");
1080: 0a 20 20 20 20 40 20 4e 6f 20 68 6f 6d 65 70 61  .    @ No homepa
1090: 67 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ge configured fo
10a0: 72 20 74 68 69 73 20 73 65 72 76 65 72 0a 20 20  r this server.  
10b0: 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29    style_footer()
10c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
10d0: 4f 44 4f 3a 20 43 4f 50 49 45 44 20 46 52 4f 4d  ODO: COPIED FROM
10e0: 20 57 49 4b 49 2e 43 2e 2e 2e 20 42 41 44 0a 2a   WIKI.C... BAD.*
10f0: 2f 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  /./*.** Create a
1100: 20 66 61 6b 65 20 72 65 70 6c 69 63 61 74 65 20   fake replicate 
1110: 6f 66 20 74 68 65 20 22 76 66 69 6c 65 22 20 74  of the "vfile" t
1120: 61 62 6c 65 20 61 73 20 61 20 54 45 4d 50 20 74  able as a TEMP t
1130: 61 62 6c 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68  able.** using th
1140: 65 20 6d 61 6e 69 66 65 73 74 20 69 64 65 6e 74  e manifest ident
1150: 69 66 69 65 64 20 62 79 20 6d 61 6e 69 64 2e 0a  ified by manid..
1160: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1170: 74 79 6c 65 5f 63 72 65 61 74 65 5f 66 61 6b 65  tyle_create_fake
1180: 5f 76 66 69 6c 65 28 69 6e 74 20 6d 61 6e 69 64  _vfile(int manid
1190: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
11a0: 74 20 63 68 61 72 20 7a 56 66 69 6c 65 44 65 66  t char zVfileDef
11b0: 5b 5d 20 3d 0a 20 20 20 20 40 20 43 52 45 41 54  [] =.    @ CREAT
11c0: 45 20 54 45 4d 50 20 54 41 42 4c 45 20 76 66 69  E TEMP TABLE vfi
11d0: 6c 65 28 0a 20 20 20 20 40 20 20 20 69 64 20 49  le(.    @   id I
11e0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
11f0: 45 59 2c 20 20 20 20 20 2d 2d 20 49 44 20 6f 66  EY,     -- ID of
1200: 20 74 68 65 20 63 68 65 63 6b 65 64 20 6f 75 74   the checked out
1210: 20 66 69 6c 65 0a 20 20 20 20 40 20 20 20 76 69   file.    @   vi
1220: 64 20 49 4e 54 45 47 45 52 20 52 45 46 45 52 45  d INTEGER REFERE
1230: 4e 43 45 53 20 62 6c 6f 62 2c 20 2d 2d 20 54 68  NCES blob, -- Th
1240: 65 20 76 65 72 73 69 6f 6e 20 74 68 69 73 20 66  e version this f
1250: 69 6c 65 20 69 73 20 70 61 72 74 20 6f 66 2e 0a  ile is part of..
1260: 20 20 20 20 40 20 20 20 63 68 6e 67 65 64 20 49      @   chnged I
1270: 4e 54 20 44 45 46 41 55 4c 54 20 30 2c 20 20 20  NT DEFAULT 0,   
1280: 20 20 20 20 2d 2d 20 30 3a 75 6e 63 68 6e 67 65      -- 0:unchnge
1290: 64 20 31 3a 65 64 69 74 65 64 20 32 3a 6d 2d 63  d 1:edited 2:m-c
12a0: 68 6e 67 20 33 3a 6d 2d 61 64 64 0a 20 20 20 20  hng 3:m-add.    
12b0: 40 20 20 20 64 65 6c 65 74 65 64 20 42 4f 4f 4c  @   deleted BOOL
12c0: 45 41 4e 20 44 45 46 41 55 4c 54 20 30 2c 20 20  EAN DEFAULT 0,  
12d0: 2d 2d 20 54 72 75 65 20 69 66 20 64 65 6c 65 74  -- True if delet
12e0: 65 64 0a 20 20 20 20 40 20 20 20 72 69 64 20 49  ed.    @   rid I
12f0: 4e 54 45 47 45 52 2c 20 20 20 20 20 20 20 20 20  NTEGER,         
1300: 20 20 20 20 20 20 20 2d 2d 20 4f 72 69 67 69 6e         -- Origin
1310: 61 6c 6c 79 20 66 72 6f 6d 20 74 68 69 73 20 72  ally from this r
1320: 65 70 6f 73 69 74 6f 72 79 20 72 65 63 6f 72 64  epository record
1330: 0a 20 20 20 20 40 20 20 20 6d 72 69 64 20 49 4e  .    @   mrid IN
1340: 54 45 47 45 52 2c 20 20 20 20 20 20 20 20 20 20  TEGER,          
1350: 20 20 20 20 20 2d 2d 20 42 61 73 65 64 20 6f 6e       -- Based on
1360: 20 74 68 69 73 20 72 65 63 6f 72 64 20 64 75 65   this record due
1370: 20 74 6f 20 61 20 6d 65 72 67 65 0a 20 20 20 20   to a merge.    
1380: 40 20 20 20 70 61 74 68 6e 61 6d 65 20 54 45 58  @   pathname TEX
1390: 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
13a0: 2d 2d 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65  -- Full pathname
13b0: 0a 20 20 20 20 40 20 20 20 55 4e 49 51 55 45 28  .    @   UNIQUE(
13c0: 70 61 74 68 6e 61 6d 65 2c 76 69 64 29 0a 20 20  pathname,vid).  
13d0: 20 20 40 20 29 3b 0a 20 20 20 20 3b 0a 20 20 64    @ );.    ;.  d
13e0: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 7a 56 66  b_multi_exec(zVf
13f0: 69 6c 65 44 65 66 29 3b 0a 20 20 6c 6f 61 64 5f  ileDef);.  load_
1400: 76 66 69 6c 65 5f 66 72 6f 6d 5f 72 69 64 28 6d  vfile_from_rid(m
1410: 61 6e 69 64 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  anid);.}.../*.**
1420: 20 57 45 42 50 41 47 45 3a 20 73 74 79 6c 65 2e   WEBPAGE: style.
1430: 63 73 73 0a 2a 2f 0a 76 6f 69 64 20 70 61 67 65  css.*/.void page
1440: 5f 73 74 79 6c 65 5f 63 73 73 28 76 6f 69 64 29  _style_css(void)
1450: 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e  {.  Stmt q;.  in
1460: 74 20 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t id = 0;.  int 
1470: 72 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  rid = 0;.  int c
1480: 68 6e 67 65 64 20 3d 20 30 3b 0a 20 20 63 68 61  hnged = 0;.  cha
1490: 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30  r *zPathname = 0
14a0: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20  ;.  char *z;..  
14b0: 63 67 69 5f 73 65 74 5f 63 6f 6e 74 65 6e 74 5f  cgi_set_content_
14c0: 74 79 70 65 28 22 74 65 78 74 2f 63 73 73 22 29  type("text/css")
14d0: 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b  ;..  login_check
14e0: 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a  _credentials();.
14f0: 20 20 69 66 28 20 21 67 2e 6c 6f 63 61 6c 4f 70    if( !g.localOp
1500: 65 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 65  en ){.    int he
1510: 61 64 69 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c  adid = db_int(0,
1520: 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  .       "SELECT 
1530: 63 69 64 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 4f  cid FROM plink O
1540: 52 44 45 52 20 42 59 20 6d 74 69 6d 65 20 44 45  RDER BY mtime DE
1550: 53 43 20 4c 49 4d 49 54 20 31 22 0a 20 20 20 20  SC LIMIT 1".    
1560: 29 3b 0a 20 20 20 20 73 74 79 6c 65 5f 63 72 65  );.    style_cre
1570: 61 74 65 5f 66 61 6b 65 5f 76 66 69 6c 65 28 68  ate_fake_vfile(h
1580: 65 61 64 69 64 29 3b 0a 20 20 7d 0a 0a 20 20 64  eadid);.  }..  d
1590: 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20  b_prepare(&q,.  
15a0: 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 20 72     "SELECT id, r
15b0: 69 64 2c 20 63 68 6e 67 65 64 2c 20 70 61 74 68  id, chnged, path
15c0: 6e 61 6d 65 20 46 52 4f 4d 20 76 66 69 6c 65 22  name FROM vfile"
15d0: 0a 20 20 20 20 20 22 20 57 48 45 52 45 20 28 70  .     " WHERE (p
15e0: 61 74 68 6e 61 6d 65 3d 27 73 74 79 6c 65 2e 63  athname='style.c
15f0: 73 73 27 20 4f 52 20 70 61 74 68 6e 61 6d 65 20  ss' OR pathname 
1600: 4c 49 4b 45 20 27 25 25 2f 73 74 79 6c 65 2e 63  LIKE '%%/style.c
1610: 73 73 27 29 22 0a 20 20 20 20 20 22 20 20 20 41  ss')".     "   A
1620: 4e 44 20 4e 4f 54 20 64 65 6c 65 74 65 64 22 0a  ND NOT deleted".
1630: 20 20 29 3b 0a 20 20 69 66 28 20 64 62 5f 73 74    );.  if( db_st
1640: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
1650: 4f 57 20 29 7b 0a 20 20 20 20 69 64 20 3d 20 64  OW ){.    id = d
1660: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c  b_column_int(&q,
1670: 20 30 29 3b 0a 20 20 20 20 72 69 64 20 3d 20 64   0);.    rid = d
1680: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c  b_column_int(&q,
1690: 20 31 29 3b 0a 20 20 20 20 63 68 6e 67 65 64 20   1);.    chnged 
16a0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  = db_column_int(
16b0: 26 71 2c 20 32 29 3b 0a 20 20 20 20 69 66 28 20  &q, 2);.    if( 
16c0: 63 68 6e 67 65 64 20 7c 7c 20 72 69 64 3d 3d 30  chnged || rid==0
16d0: 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e   ){.      zPathn
16e0: 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ame = db_column_
16f0: 6d 61 6c 6c 6f 63 28 26 71 2c 20 33 29 3b 0a 20  malloc(&q, 3);. 
1700: 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 5f 66 69     }.  }.  db_fi
1710: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 69 66  nalize(&q);.  if
1720: 28 20 69 64 20 29 7b 0a 20 20 20 20 42 6c 6f 62  ( id ){.    Blob
1730: 20 73 72 63 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a   src;.    blob_z
1740: 65 72 6f 28 26 73 72 63 29 3b 0a 20 20 20 20 69  ero(&src);.    i
1750: 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
1760: 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20        zPathname 
1770: 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 2f 25 7a  = mprintf("%s/%z
1780: 22 2c 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 2c  ", g.zLocalRoot,
1790: 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
17a0: 20 20 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f     blob_read_fro
17b0: 6d 5f 66 69 6c 65 28 26 73 72 63 2c 20 7a 50 61  m_file(&src, zPa
17c0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66  thname);.      f
17d0: 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
17e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17f0: 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 72 69 64   content_get(rid
1800: 2c 20 26 73 72 63 29 3b 0a 20 20 20 20 7d 0a 0a  , &src);.    }..
1810: 20 20 20 20 7a 20 3d 20 62 6c 6f 62 5f 73 74 72      z = blob_str
1820: 28 26 73 72 63 29 3b 0a 20 20 20 20 40 20 25 73  (&src);.    @ %s
1830: 28 7a 29 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  (z).  }else{.   
1840: 20 2f 2a 20 4e 6f 20 43 53 53 20 66 69 6c 65 20   /* No CSS file 
1850: 66 6f 75 6e 64 2c 20 75 73 65 20 6f 75 72 20 6f  found, use our o
1860: 77 6e 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20  wn */.    /*.   
1870: 20 2a 2a 20 53 65 6c 65 63 74 6f 72 20 6f 72 64   ** Selector ord
1880: 65 72 3a 20 74 61 67 73 2c 20 69 64 73 2c 20 63  er: tags, ids, c
1890: 6c 61 73 73 65 73 2c 20 6f 74 68 65 72 0a 20 20  lasses, other.  
18a0: 20 20 2a 2a 20 43 6f 6e 74 65 6e 74 20 6f 72 64    ** Content ord
18b0: 65 72 3a 20 6d 61 72 67 69 6e 2c 20 62 6f 72 64  er: margin, bord
18c0: 65 72 73 2c 20 70 61 64 64 69 6e 67 2c 20 66 6f  ers, padding, fo
18d0: 6e 74 73 2c 20 63 6f 6c 6f 72 73 2c 20 6f 74 68  nts, colors, oth
18e0: 65 72 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  er.    ** Note: 
18f0: 4f 6e 63 65 20 74 68 69 6e 67 73 20 61 72 65 20  Once things are 
1900: 66 69 6e 69 61 6c 69 7a 65 20 61 20 62 69 74 20  finialize a bit 
1910: 77 65 20 63 61 6e 20 63 6f 6c 6c 61 70 73 65 20  we can collapse 
1920: 74 68 69 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  this and.    ** 
1930: 20 20 20 20 20 20 6d 61 6b 65 20 69 74 20 6d 75        make it mu
1940: 63 68 20 73 6d 61 6c 6c 65 72 2c 20 69 66 20 6e  ch smaller, if n
1950: 65 63 65 73 73 61 72 79 2e 20 52 69 67 68 74 20  ecessary. Right 
1960: 6e 6f 77 2c 20 69 74 27 73 20 76 65 72 62 6f 73  now, it's verbos
1970: 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 62  e.    **       b
1980: 75 74 20 65 61 73 79 20 74 6f 20 65 64 69 74 2e  ut easy to edit.
1990: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 40 20 62 6f  .    */.    @ bo
19a0: 64 79 20 7b 0a 20 20 20 20 40 20 20 20 6d 61 72  dy {.    @   mar
19b0: 67 69 6e 3a 20 30 70 78 3b 0a 20 20 20 20 40 20  gin: 0px;.    @ 
19c0: 20 20 70 61 64 64 69 6e 67 3a 20 30 70 78 3b 0a    padding: 0px;.
19d0: 20 20 20 20 40 20 20 20 62 61 63 6b 67 72 6f 75      @   backgrou
19e0: 6e 64 2d 63 6f 6c 6f 72 3a 20 77 68 69 74 65 3b  nd-color: white;
19f0: 0a 20 20 20 20 40 20 7d 0a 20 20 20 20 40 20 23  .    @ }.    @ #
1a00: 70 61 67 65 2d 74 69 74 6c 65 20 7b 0a 20 20 20  page-title {.   
1a10: 20 40 20 20 20 70 61 64 64 69 6e 67 3a 20 31 30   @   padding: 10
1a20: 70 78 20 31 30 70 78 20 31 30 70 78 20 31 30 70  px 10px 10px 10p
1a30: 78 3b 0a 20 20 20 20 40 20 20 20 66 6f 6e 74 2d  x;.    @   font-
1a40: 73 69 7a 65 3a 20 31 2e 38 65 6d 3b 0a 20 20 20  size: 1.8em;.   
1a50: 20 40 20 20 20 66 6f 6e 74 2d 77 65 69 67 68 74   @   font-weight
1a60: 3a 20 62 6f 6c 64 3b 0a 20 20 20 20 40 20 20 20  : bold;.    @   
1a70: 62 61 63 6b 67 72 6f 75 6e 64 2d 63 6f 6c 6f 72  background-color
1a80: 3a 20 23 36 61 37 65 63 37 3b 0a 20 20 20 20 40  : #6a7ec7;.    @
1a90: 20 20 20 63 6f 6c 6f 72 3a 20 23 30 61 31 65 36     color: #0a1e6
1aa0: 37 3b 0a 20 20 20 20 40 20 7d 0a 20 20 20 20 40  7;.    @ }.    @
1ab0: 20 23 6c 6f 67 69 6e 2d 73 74 61 74 75 73 20 7b   #login-status {
1ac0: 0a 20 20 20 20 40 20 20 20 70 61 64 64 69 6e 67  .    @   padding
1ad0: 3a 20 30 70 78 20 31 30 70 78 20 31 30 70 78 20  : 0px 10px 10px 
1ae0: 30 70 78 3b 0a 20 20 20 20 40 20 20 20 66 6f 6e  0px;.    @   fon
1af0: 74 2d 73 69 7a 65 3a 20 30 2e 39 65 6d 3b 0a 20  t-size: 0.9em;. 
1b00: 20 20 20 40 20 20 20 74 65 78 74 2d 61 6c 69 67     @   text-alig
1b10: 6e 3a 20 72 69 67 68 74 3b 0a 20 20 20 20 40 20  n: right;.    @ 
1b20: 20 20 62 61 63 6b 67 72 6f 75 6e 64 2d 63 6f 6c    background-col
1b30: 6f 72 3a 20 23 36 61 37 65 63 37 3b 0a 20 20 20  or: #6a7ec7;.   
1b40: 20 40 20 20 20 63 6f 6c 6f 72 3a 20 77 68 69 74   @   color: whit
1b50: 65 3b 0a 20 20 20 20 40 20 20 20 70 6f 73 69 74  e;.    @   posit
1b60: 69 6f 6e 3a 20 61 62 73 6f 6c 75 74 65 3b 0a 20  ion: absolute;. 
1b70: 20 20 20 40 20 20 20 74 6f 70 3a 20 31 30 3b 0a     @   top: 10;.
1b80: 20 20 20 20 40 20 20 20 72 69 67 68 74 3a 20 30      @   right: 0
1b90: 3b 0a 20 20 20 20 40 20 7d 0a 20 20 20 20 40 20  ;.    @ }.    @ 
1ba0: 23 6d 61 69 6e 2d 6d 65 6e 75 20 7b 0a 20 20 20  #main-menu {.   
1bb0: 20 40 20 20 20 70 61 64 64 69 6e 67 3a 20 35 70   @   padding: 5p
1bc0: 78 20 31 30 70 78 20 35 70 78 20 31 30 70 78 3b  x 10px 5px 10px;
1bd0: 0a 20 20 20 20 40 20 20 20 66 6f 6e 74 2d 73 69  .    @   font-si
1be0: 7a 65 3a 20 30 2e 39 65 6d 3b 0a 20 20 20 20 40  ze: 0.9em;.    @
1bf0: 20 20 20 66 6f 6e 74 2d 77 65 69 67 68 74 3a 20     font-weight: 
1c00: 62 6f 6c 64 3b 0a 20 20 20 20 40 20 20 20 74 65  bold;.    @   te
1c10: 78 74 2d 61 6c 69 67 6e 3a 20 63 65 6e 74 65 72  xt-align: center
1c20: 3b 0a 20 20 20 20 40 20 20 20 6c 65 74 74 65 72  ;.    @   letter
1c30: 2d 73 70 61 63 69 6e 67 3a 20 31 70 78 3b 0a 20  -spacing: 1px;. 
1c40: 20 20 20 40 20 20 20 62 61 63 6b 67 72 6f 75 6e     @   backgroun
1c50: 64 2d 63 6f 6c 6f 72 3a 20 23 34 31 34 66 38 34  d-color: #414f84
1c60: 3b 0a 20 20 20 20 40 20 20 20 63 6f 6c 6f 72 3a  ;.    @   color:
1c70: 20 77 68 69 74 65 3b 0a 20 20 20 20 40 20 7d 0a   white;.    @ }.
1c80: 20 20 20 20 40 20 23 73 75 62 2d 6d 65 6e 75 20      @ #sub-menu 
1c90: 7b 0a 20 20 20 20 40 20 20 20 70 61 64 64 69 6e  {.    @   paddin
1ca0: 67 3a 20 33 70 78 20 31 30 70 78 20 33 70 78 20  g: 3px 10px 3px 
1cb0: 30 70 78 3b 0a 20 20 20 20 40 20 20 20 66 6f 6e  0px;.    @   fon
1cc0: 74 2d 73 69 7a 65 3a 20 30 2e 39 65 6d 3b 0a 20  t-size: 0.9em;. 
1cd0: 20 20 20 40 20 20 20 74 65 78 74 2d 61 6c 69 67     @   text-alig
1ce0: 6e 3a 20 63 65 6e 74 65 72 3b 0a 20 20 20 20 40  n: center;.    @
1cf0: 20 20 20 62 61 63 6b 67 72 6f 75 6e 64 2d 63 6f     background-co
1d00: 6c 6f 72 3a 20 23 34 31 34 66 38 34 3b 0a 20 20  lor: #414f84;.  
1d10: 20 20 40 20 20 20 63 6f 6c 6f 72 3a 20 77 68 69    @   color: whi
1d20: 74 65 3b 0a 20 20 20 20 40 20 7d 0a 20 20 20 20  te;.    @ }.    
1d30: 40 20 23 6d 61 69 6e 2d 6d 65 6e 75 20 61 2c 20  @ #main-menu a, 
1d40: 23 6d 61 69 6e 2d 6d 65 6e 75 20 61 3a 76 69 73  #main-menu a:vis
1d50: 69 74 65 64 2c 20 23 73 75 62 2d 6d 65 6e 75 20  ited, #sub-menu 
1d60: 61 2c 20 23 73 75 62 2d 6d 65 6e 75 20 61 3a 76  a, #sub-menu a:v
1d70: 69 73 69 74 65 64 20 7b 0a 20 20 20 20 40 20 20  isited {.    @  
1d80: 20 70 61 64 64 69 6e 67 3a 20 33 70 78 20 31 30   padding: 3px 10
1d90: 70 78 20 33 70 78 20 31 30 70 78 3b 0a 20 20 20  px 3px 10px;.   
1da0: 20 40 20 20 20 63 6f 6c 6f 72 3a 20 77 68 69 74   @   color: whit
1db0: 65 3b 0a 20 20 20 20 40 20 7d 0a 20 20 20 20 40  e;.    @ }.    @
1dc0: 20 23 6d 61 69 6e 2d 6d 65 6e 75 20 61 3a 68 6f   #main-menu a:ho
1dd0: 76 65 72 2c 20 23 73 75 62 2d 6d 65 6e 75 20 61  ver, #sub-menu a
1de0: 3a 68 6f 76 65 72 20 7b 0a 20 20 20 20 40 20 20  :hover {.    @  
1df0: 20 63 6f 6c 6f 72 3a 20 23 34 31 34 66 38 34 3b   color: #414f84;
1e00: 0a 20 20 20 20 40 20 20 20 62 61 63 6b 67 72 6f  .    @   backgro
1e10: 75 6e 64 2d 63 6f 6c 6f 72 3a 20 77 68 69 74 65  und-color: white
1e20: 3b 0a 20 20 20 20 40 20 7d 0a 20 20 20 20 40 20  ;.    @ }.    @ 
1e30: 23 70 61 67 65 20 7b 0a 20 20 20 20 40 20 20 20  #page {.    @   
1e40: 70 61 64 64 69 6e 67 3a 20 31 30 70 78 20 32 30  padding: 10px 20
1e50: 70 78 20 31 30 70 78 20 32 30 70 78 3b 0a 20 20  px 10px 20px;.  
1e60: 20 20 40 20 7d 0a 20 20 20 20 40 20 23 73 74 79    @ }.    @ #sty
1e70: 6c 65 2d 66 6f 6f 74 65 72 20 7b 0a 20 20 20 20  le-footer {.    
1e80: 40 20 20 20 66 6f 6e 74 2d 73 69 7a 65 3a 20 30  @   font-size: 0
1e90: 2e 38 65 6d 3b 0a 20 20 20 20 40 20 20 20 6d 61  .8em;.    @   ma
1ea0: 72 67 69 6e 2d 74 6f 70 3a 20 31 32 70 78 3b 0a  rgin-top: 12px;.
1eb0: 20 20 20 20 40 20 20 20 70 61 64 64 69 6e 67 3a      @   padding:
1ec0: 20 35 70 78 20 31 30 70 78 20 35 70 78 20 31 30   5px 10px 5px 10
1ed0: 70 78 3b 0a 20 20 20 20 40 20 20 20 74 65 78 74  px;.    @   text
1ee0: 2d 61 6c 69 67 6e 3a 20 72 69 67 68 74 3b 0a 20  -align: right;. 
1ef0: 20 20 20 40 20 20 20 62 61 63 6b 67 72 6f 75 6e     @   backgroun
1f00: 64 2d 63 6f 6c 6f 72 3a 20 23 34 31 34 66 38 34  d-color: #414f84
1f10: 3b 0a 20 20 20 20 40 20 20 20 63 6f 6c 6f 72 3a  ;.    @   color:
1f20: 20 77 68 69 74 65 3b 0a 20 20 20 20 40 20 7d 0a   white;.    @ }.
1f30: 20 20 20 20 40 20 74 61 62 6c 65 2e 6c 61 62 65      @ table.labe
1f40: 6c 2d 76 61 6c 75 65 20 74 68 20 7b 0a 20 20 20  l-value th {.   
1f50: 20 40 20 20 20 74 65 78 74 2d 61 6c 69 67 6e 3a   @   text-align:
1f60: 20 72 69 67 68 74 3b 0a 20 20 20 20 40 20 20 20   right;.    @   
1f70: 76 65 72 74 69 63 61 6c 2d 61 6c 69 67 6e 3a 20  vertical-align: 
1f80: 74 6f 70 3b 0a 20 20 20 20 40 20 7d 0a 20 20 20  top;.    @ }.   
1f90: 20 40 20 64 69 76 2e 73 65 63 74 69 6f 6e 2d 74   @ div.section-t
1fa0: 69 74 6c 65 20 7b 0a 20 20 20 20 40 20 20 20 6d  itle {.    @   m
1fb0: 61 72 67 69 6e 2d 62 6f 74 74 6f 6d 3a 20 30 70  argin-bottom: 0p
1fc0: 78 3b 0a 20 20 20 20 40 20 20 20 70 61 64 64 69  x;.    @   paddi
1fd0: 6e 67 3a 20 31 70 78 20 31 70 78 20 31 70 78 20  ng: 1px 1px 1px 
1fe0: 31 70 78 3b 0a 20 20 20 20 40 20 20 20 66 6f 6e  1px;.    @   fon
1ff0: 74 2d 73 69 7a 65 3a 20 31 2e 32 65 6d 3b 0a 20  t-size: 1.2em;. 
2000: 20 20 20 40 20 20 20 66 6f 6e 74 2d 77 65 69 67     @   font-weig
2010: 68 74 3a 20 62 6f 6c 64 3b 0a 20 20 20 20 40 20  ht: bold;.    @ 
2020: 20 20 62 61 63 6b 67 72 6f 75 6e 64 2d 63 6f 6c    background-col
2030: 6f 72 3a 20 23 36 61 37 65 63 37 3b 0a 20 20 20  or: #6a7ec7;.   
2040: 20 40 20 20 20 63 6f 6c 6f 72 3a 20 23 30 61 31   @   color: #0a1
2050: 65 36 37 3b 0a 20 20 20 20 40 20 7d 0a 20 20 7d  e67;.    @ }.  }
2060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47  .}../*.** WEBPAG
2070: 45 3a 20 74 65 73 74 5f 65 6e 76 0a 2a 2f 0a 76  E: test_env.*/.v
2080: 6f 69 64 20 70 61 67 65 5f 74 65 73 74 5f 65 6e  oid page_test_en
2090: 76 28 76 6f 69 64 29 7b 0a 20 20 73 74 79 6c 65  v(void){.  style
20a0: 5f 68 65 61 64 65 72 28 22 45 6e 76 69 72 6f 6e  _header("Environ
20b0: 6d 65 6e 74 20 54 65 73 74 22 29 3b 0a 20 20 63  ment Test");.  c
20c0: 67 69 5f 70 72 69 6e 74 5f 61 6c 6c 28 29 3b 0a  gi_print_all();.
20d0: 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29    style_footer()
20e0: 3b 0a 7d 0a                                      ;.}.