Fossil

Hex Artifact Content
Login

Artifact 65a555d0d4fb846be9b943d0dc36142281bc5722d114f086274bba3726026466:


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 53 69 6d 70 6c 69 66 69 65 64  f the Simplified
00a0: 20 42 53 44 20 4c 69 63 65 6e 73 65 20 28 61 6c   BSD License (al
00b0: 73 6f 0a 2a 2a 20 6b 6e 6f 77 6e 20 61 73 20 74  so.** known as t
00c0: 68 65 20 22 32 2d 43 6c 61 75 73 65 20 4c 69 63  he "2-Clause Lic
00d0: 65 6e 73 65 22 20 6f 72 20 22 46 72 65 65 42 53  ense" or "FreeBS
00e0: 44 20 4c 69 63 65 6e 73 65 22 2e 29 0a 0a 2a 2a  D License".)..**
00f0: 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73   This program is
0100: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
0110: 74 68 65 20 68 6f 70 65 20 74 68 61 74 20 69 74  the hope that it
0120: 20 77 69 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c   will be useful,
0130: 0a 2a 2a 20 62 75 74 20 77 69 74 68 6f 75 74 20  .** but without 
0140: 61 6e 79 20 77 61 72 72 61 6e 74 79 3b 20 77 69  any warranty; wi
0150: 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65 20 69  thout even the i
0160: 6d 70 6c 69 65 64 20 77 61 72 72 61 6e 74 79 20  mplied warranty 
0170: 6f 66 0a 2a 2a 20 6d 65 72 63 68 61 6e 74 61 62  of.** merchantab
0180: 69 6c 69 74 79 20 6f 72 20 66 69 74 6e 65 73 73  ility or fitness
0190: 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
01a0: 72 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a  r purpose..**.**
01b0: 20 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20   Author contact 
01c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20  information:.** 
01d0: 20 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a    drh@hwaci.com.
01e0: 2a 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e  **   http://www.
01f0: 68 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a  hwaci.com/drh/.*
0200: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0250: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c  *.**.** This fil
0260: 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20  e contains code 
0270: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
0280: 20 62 61 73 69 63 20 77 65 62 20 70 61 67 65 20   basic web page 
0290: 6c 6f 6f 6b 20 61 6e 64 20 66 65 65 6c 2e 0a 2a  look and feel..*
02a0: 2a 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 56  *.*/.#include "V
02b0: 45 52 53 49 4f 4e 2e 68 22 0a 23 69 6e 63 6c 75  ERSION.h".#inclu
02c0: 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69  de "config.h".#i
02d0: 6e 63 6c 75 64 65 20 22 73 74 79 6c 65 2e 68 22  nclude "style.h"
02e0: 0a 0a 2f 2a 0a 2a 2a 20 45 6c 65 6d 65 6e 74 73  ../*.** Elements
02f0: 20 6f 66 20 74 68 65 20 73 75 62 6d 65 6e 75 20   of the submenu 
0300: 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e  are collected in
0310: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
0320: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61 6e  .** structure an
0330: 64 20 64 69 73 70 6c 61 79 65 64 20 62 65 6c 6f  d displayed belo
0340: 77 20 74 68 65 20 6d 61 69 6e 20 6d 65 6e 75 2e  w the main menu.
0350: 0a 2a 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20  .**.** Populate 
0360: 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65 20  these structure 
0370: 77 69 74 68 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  with calls to.**
0380: 0a 2a 2a 20 20 20 20 20 20 73 74 79 6c 65 5f 73  .**      style_s
0390: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 29  ubmenu_element()
03a0: 0a 2a 2a 20 20 20 20 20 20 73 74 79 6c 65 5f 73  .**      style_s
03b0: 75 62 6d 65 6e 75 5f 65 6e 74 72 79 28 29 0a 2a  ubmenu_entry().*
03c0: 2a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62  *      style_sub
03d0: 6d 65 6e 75 5f 63 68 65 63 6b 62 6f 78 28 29 0a  menu_checkbox().
03e0: 2a 2a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75  **      style_su
03f0: 62 6d 65 6e 75 5f 62 69 6e 61 72 79 28 29 0a 2a  bmenu_binary().*
0400: 2a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62  *      style_sub
0410: 6d 65 6e 75 5f 6d 75 6c 74 69 63 68 6f 69 63 65  menu_multichoice
0420: 28 29 0a 2a 2a 20 20 20 20 20 20 73 74 79 6c 65  ().**      style
0430: 5f 73 75 62 6d 65 6e 75 5f 73 71 6c 28 29 0a 2a  _submenu_sql().*
0440: 2a 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  *.** prior to ca
0450: 6c 6c 69 6e 67 20 73 74 79 6c 65 5f 66 6f 6f 74  lling style_foot
0460: 65 72 28 29 2e 20 20 54 68 65 20 73 74 79 6c 65  er().  The style
0470: 5f 66 6f 6f 74 65 72 28 29 20 72 6f 75 74 69 6e  _footer() routin
0480: 65 0a 2a 2a 20 77 69 6c 6c 20 67 65 6e 65 72 61  e.** will genera
0490: 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  te the appropria
04a0: 74 65 20 48 54 4d 4c 20 74 65 78 74 20 6a 75 73  te HTML text jus
04b0: 74 20 62 65 6c 6f 77 20 74 68 65 20 6d 61 69 6e  t below the main
04c0: 0a 2a 2a 20 6d 65 6e 75 2e 0a 2a 2f 0a 73 74 61  .** menu..*/.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 20 20 20 20 20 20  r *zLabel;      
0500: 20 20 2f 2a 20 42 75 74 74 6f 6e 20 6c 61 62 65    /* Button labe
0510: 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  l */.  const cha
0520: 72 20 2a 7a 4c 69 6e 6b 3b 20 20 20 20 20 20 20  r *zLink;       
0530: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69    /* Jump to thi
0540: 73 20 6c 69 6e 6b 20 77 68 65 6e 20 62 75 74 74  s link when butt
0550: 6f 6e 20 69 73 20 70 72 65 73 73 65 64 20 2a 2f  on is pressed */
0560: 0a 7d 20 61 53 75 62 6d 65 6e 75 5b 33 30 5d 3b  .} aSubmenu[30];
0570: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 53 75 62  .static int nSub
0580: 6d 65 6e 75 20 3d 20 30 3b 20 20 20 20 20 2f 2a  menu = 0;     /*
0590: 20 4e 75 6d 62 65 72 20 6f 66 20 62 75 74 74 6f   Number of butto
05a0: 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ns */.static str
05b0: 75 63 74 20 53 75 62 6d 65 6e 75 43 74 72 6c 20  uct SubmenuCtrl 
05c0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
05d0: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
05e0: 20 2f 2a 20 46 6f 72 6d 20 71 75 65 72 79 20 70   /* Form query p
05f0: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 63 6f  arameter */.  co
0600: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c  nst char *zLabel
0610: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  ;          /* La
0620: 62 65 6c 2e 20 20 4d 69 67 68 74 20 62 65 20 4e  bel.  Might be N
0630: 55 4c 4c 20 66 6f 72 20 46 46 5f 4d 55 4c 54 49  ULL for FF_MULTI
0640: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
0650: 68 61 72 20 65 54 79 70 65 3b 20 20 20 20 20 20  har eType;      
0660: 20 20 20 2f 2a 20 46 46 5f 45 4e 54 52 59 2c 20     /* FF_ENTRY, 
0670: 46 46 5f 4d 55 4c 54 49 2c 20 46 46 5f 43 48 45  FF_MULTI, FF_CHE
0680: 43 4b 42 4f 58 20 2a 2f 0a 20 20 75 6e 73 69 67  CKBOX */.  unsig
0690: 6e 65 64 20 63 68 61 72 20 65 56 69 73 69 62 6c  ned char eVisibl
06a0: 65 3b 20 20 20 20 20 20 2f 2a 20 53 54 59 4c 45  e;      /* STYLE
06b0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 54 59 4c 45  _NORMAL or STYLE
06c0: 5f 44 49 53 41 42 4c 45 44 20 2a 2f 0a 20 20 73  _DISABLED */.  s
06d0: 68 6f 72 74 20 69 6e 74 20 69 53 69 7a 65 3b 20  hort int iSize; 
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
06f0: 69 64 74 68 20 66 6f 72 20 46 46 5f 45 4e 54 52  idth for FF_ENTR
0700: 59 2e 20 20 43 6f 75 6e 74 20 66 6f 72 20 46 46  Y.  Count for FF
0710: 5f 4d 55 4c 54 49 20 2a 2f 0a 20 20 63 6f 6e 73  _MULTI */.  cons
0720: 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 2a 61  t char *const *a
0730: 7a 43 68 6f 69 63 65 3b 20 2f 2a 20 76 61 6c 75  zChoice; /* valu
0740: 65 2f 64 69 73 70 6c 61 79 20 70 61 69 72 73 20  e/display pairs 
0750: 66 6f 72 20 46 46 5f 4d 55 4c 54 49 20 2a 2f 0a  for FF_MULTI */.
0760: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
0770: 61 6c 73 65 3b 20 20 20 20 20 20 20 20 20 20 2f  alse;          /
0780: 2a 20 46 46 5f 42 49 4e 41 52 59 20 6c 61 62 65  * FF_BINARY labe
0790: 6c 20 77 68 65 6e 20 66 61 6c 73 65 20 2a 2f 0a  l when false */.
07a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4a    const char *zJ
07b0: 53 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  S;             /
07c0: 2a 20 4a 61 76 61 73 63 72 69 70 74 20 74 6f 20  * Javascript to 
07d0: 72 75 6e 20 6f 6e 20 74 6f 67 67 6c 65 20 2a 2f  run on toggle */
07e0: 0a 7d 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b  .} aSubmenuCtrl[
07f0: 32 30 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  20];.static int 
0800: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 20 3d 20 30  nSubmenuCtrl = 0
0810: 3b 0a 23 64 65 66 69 6e 65 20 46 46 5f 45 4e 54  ;.#define FF_ENT
0820: 52 59 20 20 20 20 31 20 20 20 20 20 20 20 20 20  RY    1         
0830: 20 2f 2a 20 54 65 78 74 20 65 6e 74 72 79 20 62   /* Text entry b
0840: 6f 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 46  ox */.#define FF
0850: 5f 4d 55 4c 54 49 20 20 20 20 32 20 20 20 20 20  _MULTI    2     
0860: 20 20 20 20 20 2f 2a 20 43 6f 6d 62 6f 62 6f 78       /* Combobox
0870: 2e 20 20 4d 75 6c 74 69 70 6c 65 20 63 68 6f 69  .  Multiple choi
0880: 63 65 73 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ces. */.#define 
0890: 46 46 5f 42 49 4e 41 52 59 20 20 20 33 20 20 20  FF_BINARY   3   
08a0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f         /* Contro
08b0: 6c 20 66 6f 72 20 62 69 6e 61 72 79 20 71 75 65  l for binary que
08c0: 72 79 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  ry parameter */.
08d0: 23 64 65 66 69 6e 65 20 46 46 5f 43 48 45 43 4b  #define FF_CHECK
08e0: 42 4f 58 20 34 20 20 20 20 20 20 20 20 20 20 2f  BOX 4          /
08f0: 2a 20 43 68 65 63 6b 2d 62 6f 78 20 2a 2f 0a 0a  * Check-box */..
0900: 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a 23 64  #if INTERFACE.#d
0910: 65 66 69 6e 65 20 53 54 59 4c 45 5f 4e 4f 52 4d  efine STYLE_NORM
0920: 41 4c 20 20 20 30 20 20 20 20 20 20 20 2f 2a 20  AL   0       /* 
0930: 4e 6f 72 6d 61 6c 20 64 69 73 70 6c 61 79 20 6f  Normal display o
0940: 66 20 63 6f 6e 74 72 6f 6c 20 2a 2f 0a 23 64 65  f control */.#de
0950: 66 69 6e 65 20 53 54 59 4c 45 5f 44 49 53 41 42  fine STYLE_DISAB
0960: 4c 45 44 20 31 20 20 20 20 20 20 20 2f 2a 20 43  LED 1       /* C
0970: 6f 6e 74 72 6f 6c 20 69 73 20 64 69 73 61 62 6c  ontrol is disabl
0980: 65 64 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ed */.#endif /* 
0990: 49 4e 54 45 52 46 41 43 45 20 2a 2f 0a 0a 2f 2a  INTERFACE */../*
09a0: 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61  .** Remember tha
09b0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
09c0: 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e   been generated.
09d0: 20 20 54 68 65 20 66 6f 6f 74 65 72 20 69 73 20    The footer is 
09e0: 6f 6d 69 74 74 65 64 0a 2a 2a 20 69 66 20 61 6e  omitted.** if an
09f0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 62 65   error occurs be
0a00: 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 2e  fore the header.
0a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
0a20: 65 61 64 65 72 48 61 73 42 65 65 6e 47 65 6e 65  eaderHasBeenGene
0a30: 72 61 74 65 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  rated = 0;../*.*
0a40: 2a 20 72 65 6d 65 6d 62 65 72 2c 20 69 66 20 61  * remember, if a
0a50: 20 73 69 64 65 62 6f 78 20 77 61 73 20 75 73 65   sidebox was use
0a60: 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  d.*/.static int 
0a70: 73 69 64 65 62 6f 78 55 73 65 64 20 3d 20 30 3b  sideboxUsed = 0;
0a80: 0a 0a 2f 2a 0a 2a 2a 20 41 64 2d 75 6e 69 74 20  ../*.** Ad-unit 
0a90: 73 74 79 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  styles..*/.stati
0aa0: 63 20 75 6e 73 69 67 6e 65 64 20 61 64 55 6e 69  c unsigned adUni
0ab0: 74 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 2f 2a 0a  tFlags = 0;../*.
0ac0: 2a 2a 20 53 75 62 6d 65 6e 75 20 64 69 73 61 62  ** Submenu disab
0ad0: 6c 65 20 66 6c 61 67 0a 2a 2f 0a 73 74 61 74 69  le flag.*/.stati
0ae0: 63 20 69 6e 74 20 73 75 62 6d 65 6e 75 45 6e 61  c int submenuEna
0af0: 62 6c 65 20 3d 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20  ble = 1;../*.** 
0b00: 46 6c 61 67 73 20 66 6f 72 20 76 61 72 69 6f 75  Flags for variou
0b10: 73 20 6a 61 76 61 73 63 72 69 70 74 20 66 69 6c  s javascript fil
0b20: 65 73 20 6e 65 65 64 65 64 20 70 72 69 6f 72 20  es needed prior 
0b30: 74 6f 20 3c 2f 62 6f 64 79 3e 0a 2a 2f 0a 73 74  to </body>.*/.st
0b40: 61 74 69 63 20 69 6e 74 20 6e 65 65 64 48 72 65  atic int needHre
0b50: 66 4a 73 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  fJs = 0;      /*
0b60: 20 68 72 65 66 2e 6a 73 20 2a 2f 0a 73 74 61 74   href.js */.stat
0b70: 69 63 20 69 6e 74 20 6e 65 65 64 53 6f 72 74 4a  ic int needSortJ
0b80: 73 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 73  s = 0;      /* s
0b90: 6f 72 74 74 61 62 6c 65 2e 6a 73 20 2a 2f 0a 73  orttable.js */.s
0ba0: 74 61 74 69 63 20 69 6e 74 20 6e 65 65 64 47 72  tatic int needGr
0bb0: 61 70 68 4a 73 20 3d 20 30 3b 20 20 20 20 20 2f  aphJs = 0;     /
0bc0: 2a 20 67 72 61 70 68 2e 6a 73 20 2a 2f 0a 73 74  * graph.js */.st
0bd0: 61 74 69 63 20 69 6e 74 20 6e 65 65 64 43 6f 70  atic int needCop
0be0: 79 42 74 6e 4a 73 20 3d 20 30 3b 20 20 20 2f 2a  yBtnJs = 0;   /*
0bf0: 20 63 6f 70 79 62 74 6e 2e 6a 73 20 2a 2f 0a 73   copybtn.js */.s
0c00: 74 61 74 69 63 20 69 6e 74 20 6e 65 65 64 41 63  tatic int needAc
0c10: 63 6f 72 64 69 6f 6e 4a 73 20 3d 20 30 3b 20 2f  cordionJs = 0; /
0c20: 2a 20 61 63 63 6f 72 64 69 6f 6e 2e 6a 73 20 2a  * accordion.js *
0c30: 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 20 4a  /../*.** Extra J
0c40: 53 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 65  S added to the e
0c50: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  nd of the file..
0c60: 2a 2f 0a 73 74 61 74 69 63 20 42 6c 6f 62 20 62  */.static Blob b
0c70: 6c 6f 62 4f 6e 4c 6f 61 64 20 3d 20 42 4c 4f 42  lobOnLoad = BLOB
0c80: 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 0a 2f  _INITIALIZER;../
0c90: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
0ca0: 64 20 72 65 74 75 72 6e 20 61 20 61 6e 63 68 6f  d return a ancho
0cb0: 72 20 74 61 67 20 6c 69 6b 65 20 74 68 69 73 3a  r tag like this:
0cc0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 3c 61  .**.**        <a
0cd0: 20 68 72 65 66 3d 22 55 52 4c 22 3e 0a 2a 2a 20   href="URL">.** 
0ce0: 20 6f 72 20 20 20 20 3c 61 20 69 64 3d 22 49 44   or    <a id="ID
0cf0: 22 3e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  ">.**.** The for
0d00: 6d 20 6f 66 20 74 68 65 20 61 6e 63 68 6f 72 20  m of the anchor 
0d10: 74 61 67 20 69 73 20 64 65 74 65 72 6d 69 6e 65  tag is determine
0d20: 64 20 62 79 20 74 68 65 20 67 2e 6a 61 76 61 73  d by the g.javas
0d30: 63 72 69 70 74 48 79 70 65 72 6c 69 6e 6b 0a 2a  criptHyperlink.*
0d40: 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 54 68 65  * variable.  The
0d50: 20 68 72 65 66 3d 22 55 52 4c 22 20 66 6f 72 6d   href="URL" form
0d60: 20 69 73 20 75 73 65 64 20 69 66 20 67 2e 6a 61   is used if g.ja
0d70: 76 61 73 63 72 69 70 74 48 79 70 65 72 6c 69 6e  vascriptHyperlin
0d80: 6b 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 49  k is false..** I
0d90: 66 20 67 2e 6a 61 76 61 73 63 72 69 70 74 48 79  f g.javascriptHy
0da0: 70 65 72 6c 69 6e 6b 20 69 73 20 74 72 75 65 20  perlink is true 
0db0: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 69 64 3d 22  then the.** id="
0dc0: 49 44 22 20 66 6f 72 6d 20 69 73 20 75 73 65 64  ID" form is used
0dd0: 20 61 6e 64 20 6a 61 76 61 73 63 72 69 70 74 20   and javascript 
0de0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20  is generated in 
0df0: 74 68 65 20 66 6f 6f 74 65 72 20 74 6f 20 63 61  the footer to ca
0e00: 75 73 65 0a 2a 2a 20 68 72 65 66 20 76 61 6c 75  use.** href valu
0e10: 65 73 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  es to be inserte
0e20: 64 20 61 66 74 65 72 20 74 68 65 20 70 61 67 65  d after the page
0e30: 20 68 61 73 20 6c 6f 61 64 65 64 2e 20 20 49 66   has loaded.  If
0e40: 0a 2a 2a 20 67 2e 70 65 72 6d 2e 48 69 73 74 6f  .** g.perm.Histo
0e50: 72 79 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  ry is false, the
0e60: 6e 20 74 68 65 20 3c 61 20 69 64 3d 22 49 44 22  n the <a id="ID"
0e70: 3e 20 66 6f 72 6d 20 69 73 20 73 74 69 6c 6c 0a  > form is still.
0e80: 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 62 75 74  ** generated but
0e90: 20 74 68 65 20 6a 61 76 61 73 63 72 69 70 74 20   the javascript 
0ea0: 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64  is not generated
0eb0: 20 73 6f 20 74 68 65 20 6c 69 6e 6b 73 20 6e 65   so the links ne
0ec0: 76 65 72 0a 2a 2a 20 61 63 74 69 76 61 74 65 2e  ver.** activate.
0ed0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73  .**.** If the us
0ee0: 65 72 20 6c 61 63 6b 73 20 74 68 65 20 48 79 70  er lacks the Hyp
0ef0: 65 72 6c 69 6e 6b 20 28 68 29 20 70 72 6f 70 65  erlink (h) prope
0f00: 72 74 79 20 61 6e 64 20 74 68 65 20 22 61 75 74  rty and the "aut
0f10: 6f 2d 68 79 70 65 72 6c 69 6e 6b 22 0a 2a 2a 20  o-hyperlink".** 
0f20: 73 65 74 74 69 6e 67 20 69 73 20 74 72 75 65 2c  setting is true,
0f30: 20 74 68 65 6e 20 67 2e 70 65 72 6d 2e 48 79 70   then g.perm.Hyp
0f40: 65 72 6c 69 6e 6b 20 69 73 20 63 68 61 6e 67 65  erlink is change
0f50: 64 20 66 72 6f 6d 20 30 20 74 6f 20 31 20 61 6e  d from 0 to 1 an
0f60: 64 0a 2a 2a 20 67 2e 6a 61 76 61 73 63 72 69 70  d.** g.javascrip
0f70: 74 48 79 70 65 72 6c 69 6e 6b 20 69 73 20 73 65  tHyperlink is se
0f80: 74 20 74 6f 20 31 2e 20 20 54 68 65 20 67 2e 6a  t to 1.  The g.j
0f90: 61 76 61 73 63 72 69 70 74 48 79 70 65 72 6c 69  avascriptHyperli
0fa0: 6e 6b 20 64 65 66 61 75 6c 74 73 0a 2a 2a 20 74  nk defaults.** t
0fb0: 6f 20 30 20 61 6e 64 20 6f 6e 6c 79 20 63 68 61  o 0 and only cha
0fc0: 6e 67 65 73 20 74 6f 20 6f 6e 65 20 69 66 20 74  nges to one if t
0fd0: 68 65 20 75 73 65 72 20 6c 61 63 6b 73 20 74 68  he user lacks th
0fe0: 65 20 48 79 70 65 72 6c 69 6e 6b 20 28 68 29 20  e Hyperlink (h) 
0ff0: 70 72 6f 70 65 72 74 79 0a 2a 2a 20 61 6e 64 20  property.** and 
1000: 74 68 65 20 22 61 75 74 6f 2d 68 79 70 65 72 6c  the "auto-hyperl
1010: 69 6e 6b 22 20 73 65 74 74 69 6e 67 20 69 73 20  ink" setting is 
1020: 65 6e 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  enabled..**.** F
1030: 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 68 72  illing in the hr
1040: 65 66 3d 22 55 52 4c 22 20 75 73 69 6e 67 20 6a  ef="URL" using j
1050: 61 76 61 73 63 72 69 70 74 20 69 73 20 61 20 64  avascript is a d
1060: 65 66 65 6e 73 65 20 61 67 61 69 6e 73 74 20 62  efense against b
1070: 6f 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ots..**.** The n
1080: 61 6d 65 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ame of this rout
1090: 69 6e 65 20 69 73 20 64 65 6c 69 62 65 72 61 74  ine is deliberat
10a0: 65 6c 79 20 6b 65 70 74 20 73 68 6f 72 74 20 73  ely kept short s
10b0: 6f 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a  o that can be.**
10c0: 20 65 61 73 69 6c 79 20 75 73 65 64 20 77 69 74   easily used wit
10d0: 68 69 6e 20 40 2d 6c 69 6e 65 73 2e 20 20 45 78  hin @-lines.  Ex
10e0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
10f0: 20 20 40 20 25 7a 28 68 72 65 66 28 22 25 52 2f    @ %z(href("%R/
1100: 61 72 74 69 66 61 63 74 2f 25 73 22 2c 7a 55 75  artifact/%s",zUu
1110: 69 64 29 29 25 68 28 7a 46 4e 29 3c 2f 61 3e 0a  id))%h(zFN)</a>.
1120: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 25 7a 20 66 6f  **.** Note %z fo
1130: 72 6d 61 74 2e 20 20 54 68 65 20 73 74 72 69 6e  rmat.  The strin
1140: 67 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  g returned by th
1150: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1160: 6c 77 61 79 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  lways.** obtaine
1170: 64 20 66 72 6f 6d 20 66 6f 73 73 69 6c 5f 6d 61  d from fossil_ma
1180: 6c 6c 6f 63 28 29 20 73 6f 20 72 65 6e 64 65 72  lloc() so render
1190: 69 6e 67 20 69 74 20 77 69 74 68 20 25 7a 20 77  ing it with %z w
11a0: 69 6c 6c 20 72 65 63 6c 61 69 6d 0a 2a 2a 20 74  ill reclaim.** t
11b0: 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  hat memory space
11c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
11d0: 65 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73  e three versions
11e0: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
11f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
1200: 20 68 72 65 66 28 29 20 64 6f 65 73 20 61 20 70   href() does a p
1210: 6c 61 69 6e 20 68 79 70 65 72 6c 69 6e 6b 0a 2a  lain hyperlink.*
1220: 2a 20 20 20 20 28 32 29 20 20 20 78 68 72 65 66  *    (2)   xhref
1230: 28 29 20 61 64 64 73 20 65 78 74 72 61 20 61 74  () adds extra at
1240: 74 72 69 62 75 74 65 20 74 65 78 74 0a 2a 2a 20  tribute text.** 
1250: 20 20 20 28 33 29 20 20 20 63 68 72 65 66 28 29     (3)   chref()
1260: 20 61 64 64 73 20 61 20 63 6c 61 73 73 20 6e 61   adds a class na
1270: 6d 65 0a 2a 2a 0a 2a 2a 20 67 2e 70 65 72 6d 2e  me.**.** g.perm.
1280: 48 79 70 65 72 6c 69 6e 6b 20 69 73 20 74 72 75  Hyperlink is tru
1290: 65 20 69 66 20 74 68 65 20 75 73 65 72 20 68 61  e if the user ha
12a0: 73 20 74 68 65 20 48 79 70 65 72 6c 69 6e 6b 20  s the Hyperlink 
12b0: 28 68 29 20 70 72 6f 70 65 72 74 79 2e 0a 2a 2a  (h) property..**
12c0: 20 4d 6f 73 74 20 6c 6f 67 67 65 64 20 69 6e 20   Most logged in 
12d0: 75 73 65 72 73 20 73 68 6f 75 6c 64 20 68 61 76  users should hav
12e0: 65 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 2c  e this property,
12f0: 20 73 69 6e 63 65 20 77 65 20 63 61 6e 20 61 73   since we can as
1300: 73 75 6d 65 0a 2a 2a 20 74 68 61 74 20 61 20 6c  sume.** that a l
1310: 6f 67 67 65 64 20 69 6e 20 75 73 65 72 20 69 73  ogged in user is
1320: 20 6e 6f 74 20 61 20 62 6f 74 2e 20 20 4f 6e 6c   not a bot.  Onl
1330: 79 20 22 6e 6f 62 6f 64 79 22 20 6c 61 63 6b 73  y "nobody" lacks
1340: 20 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e   g.perm.Hyperlin
1350: 6b 2c 0a 2a 2a 20 74 79 70 69 63 61 6c 6c 79 2e  k,.** typically.
1360: 0a 2a 2f 0a 63 68 61 72 20 2a 78 68 72 65 66 28  .*/.char *xhref(
1370: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 74  const char *zExt
1380: 72 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ra, const char *
1390: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
13a0: 20 63 68 61 72 20 2a 7a 55 72 6c 3b 0a 20 20 76   char *zUrl;.  v
13b0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f  a_list ap;.  va_
13c0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
13d0: 74 29 3b 0a 20 20 7a 55 72 6c 20 3d 20 76 6d 70  t);.  zUrl = vmp
13e0: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
13f0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
1400: 3b 0a 20 20 69 66 28 20 67 2e 70 65 72 6d 2e 48  ;.  if( g.perm.H
1410: 79 70 65 72 6c 69 6e 6b 20 26 26 20 21 67 2e 6a  yperlink && !g.j
1420: 61 76 61 73 63 72 69 70 74 48 79 70 65 72 6c 69  avascriptHyperli
1430: 6e 6b 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  nk ){.    char *
1440: 7a 48 55 72 6c 3b 0a 20 20 20 20 69 66 28 20 7a  zHUrl;.    if( z
1450: 45 78 74 72 61 20 29 7b 0a 20 20 20 20 20 20 7a  Extra ){.      z
1460: 48 55 72 6c 20 3d 20 6d 70 72 69 6e 74 66 28 22  HUrl = mprintf("
1470: 3c 61 20 25 73 20 68 72 65 66 3d 5c 22 25 68 5c  <a %s href=\"%h\
1480: 22 3e 22 2c 20 7a 45 78 74 72 61 2c 20 7a 55 72  ">", zExtra, zUr
1490: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
14a0: 20 20 20 20 20 7a 48 55 72 6c 20 3d 20 6d 70 72       zHUrl = mpr
14b0: 69 6e 74 66 28 22 3c 61 20 68 72 65 66 3d 5c 22  intf("<a href=\"
14c0: 25 68 5c 22 3e 22 2c 20 7a 55 72 6c 29 3b 0a 20  %h\">", zUrl);. 
14d0: 20 20 20 7d 0a 20 20 20 20 66 6f 73 73 69 6c 5f     }.    fossil_
14e0: 66 72 65 65 28 7a 55 72 6c 29 3b 0a 20 20 20 20  free(zUrl);.    
14f0: 72 65 74 75 72 6e 20 7a 48 55 72 6c 3b 0a 20 20  return zHUrl;.  
1500: 7d 0a 20 20 6e 65 65 64 48 72 65 66 4a 73 20 3d  }.  needHrefJs =
1510: 20 31 3b 0a 20 20 69 66 28 20 7a 45 78 74 72 61   1;.  if( zExtra
1520: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1530: 6e 20 6d 70 72 69 6e 74 66 28 22 3c 61 20 64 61  n mprintf("<a da
1540: 74 61 2d 68 72 65 66 3d 27 25 7a 27 20 68 72 65  ta-href='%z' hre
1550: 66 3d 27 25 52 2f 68 6f 6e 65 79 70 6f 74 27 3e  f='%R/honeypot'>
1560: 22 2c 20 7a 55 72 6c 29 3b 0a 20 20 7d 65 6c 73  ", zUrl);.  }els
1570: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 70  e{.    return mp
1580: 72 69 6e 74 66 28 22 3c 61 20 25 73 20 64 61 74  rintf("<a %s dat
1590: 61 2d 68 72 65 66 3d 27 25 7a 27 20 68 72 65 66  a-href='%z' href
15a0: 3d 27 25 52 2f 68 6f 6e 65 79 70 6f 74 27 3e 22  ='%R/honeypot'>"
15b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15c0: 20 20 20 20 20 7a 45 78 74 72 61 2c 20 7a 55 72       zExtra, zUr
15d0: 6c 29 3b 0a 20 20 7d 0a 7d 0a 63 68 61 72 20 2a  l);.  }.}.char *
15e0: 63 68 72 65 66 28 63 6f 6e 73 74 20 63 68 61 72  chref(const char
15f0: 20 2a 7a 45 78 74 72 61 2c 20 63 6f 6e 73 74 20   *zExtra, const 
1600: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
1610: 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 72  ..){.  char *zUr
1620: 6c 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  l;.  va_list ap;
1630: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1640: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 55 72 6c  zFormat);.  zUrl
1650: 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72   = vmprintf(zFor
1660: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
1670: 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 67 2e  nd(ap);.  if( g.
1680: 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e 6b 20 26  perm.Hyperlink &
1690: 26 20 21 67 2e 6a 61 76 61 73 63 72 69 70 74 48  & !g.javascriptH
16a0: 79 70 65 72 6c 69 6e 6b 20 29 7b 0a 20 20 20 20  yperlink ){.    
16b0: 63 68 61 72 20 2a 7a 48 55 72 6c 20 3d 20 6d 70  char *zHUrl = mp
16c0: 72 69 6e 74 66 28 22 3c 61 20 63 6c 61 73 73 3d  rintf("<a class=
16d0: 5c 22 25 73 5c 22 20 68 72 65 66 3d 5c 22 25 68  \"%s\" href=\"%h
16e0: 5c 22 3e 22 2c 20 7a 45 78 74 72 61 2c 20 7a 55  \">", zExtra, zU
16f0: 72 6c 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  rl);.    fossil_
1700: 66 72 65 65 28 7a 55 72 6c 29 3b 0a 20 20 20 20  free(zUrl);.    
1710: 72 65 74 75 72 6e 20 7a 48 55 72 6c 3b 0a 20 20  return zHUrl;.  
1720: 7d 0a 20 20 6e 65 65 64 48 72 65 66 4a 73 20 3d  }.  needHrefJs =
1730: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 6d 70 72   1;.  return mpr
1740: 69 6e 74 66 28 22 3c 61 20 63 6c 61 73 73 3d 27  intf("<a class='
1750: 25 73 27 20 64 61 74 61 2d 68 72 65 66 3d 27 25  %s' data-href='%
1760: 7a 27 20 68 72 65 66 3d 27 25 52 2f 68 6f 6e 65  z' href='%R/hone
1770: 79 70 6f 74 27 3e 22 2c 0a 20 20 20 20 20 20 20  ypot'>",.       
1780: 20 20 20 20 20 20 20 20 20 20 7a 45 78 74 72 61            zExtra
1790: 2c 20 7a 55 72 6c 29 3b 0a 7d 0a 63 68 61 72 20  , zUrl);.}.char 
17a0: 2a 68 72 65 66 28 63 6f 6e 73 74 20 63 68 61 72  *href(const char
17b0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
17c0: 0a 20 20 63 68 61 72 20 2a 7a 55 72 6c 3b 0a 20  .  char *zUrl;. 
17d0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76   va_list ap;.  v
17e0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
17f0: 6d 61 74 29 3b 0a 20 20 7a 55 72 6c 20 3d 20 76  mat);.  zUrl = v
1800: 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c  mprintf(zFormat,
1810: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1820: 70 29 3b 0a 20 20 69 66 28 20 67 2e 70 65 72 6d  p);.  if( g.perm
1830: 2e 48 79 70 65 72 6c 69 6e 6b 20 26 26 20 21 67  .Hyperlink && !g
1840: 2e 6a 61 76 61 73 63 72 69 70 74 48 79 70 65 72  .javascriptHyper
1850: 6c 69 6e 6b 20 29 7b 0a 20 20 20 20 63 68 61 72  link ){.    char
1860: 20 2a 7a 48 55 72 6c 20 3d 20 6d 70 72 69 6e 74   *zHUrl = mprint
1870: 66 28 22 3c 61 20 68 72 65 66 3d 5c 22 25 68 5c  f("<a href=\"%h\
1880: 22 3e 22 2c 20 7a 55 72 6c 29 3b 0a 20 20 20 20  ">", zUrl);.    
1890: 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 55 72 6c  fossil_free(zUrl
18a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 48  );.    return zH
18b0: 55 72 6c 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 48  Url;.  }.  needH
18c0: 72 65 66 4a 73 20 3d 20 31 3b 0a 20 20 72 65 74  refJs = 1;.  ret
18d0: 75 72 6e 20 6d 70 72 69 6e 74 66 28 22 3c 61 20  urn mprintf("<a 
18e0: 64 61 74 61 2d 68 72 65 66 3d 27 25 73 27 20 68  data-href='%s' h
18f0: 72 65 66 3d 27 25 52 2f 68 6f 6e 65 79 70 6f 74  ref='%R/honeypot
1900: 27 3e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  '>",.           
1910: 20 20 20 20 20 20 20 7a 55 72 6c 29 3b 0a 7d 0a         zUrl);.}.
1920: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1930: 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d 22 70 6f  <form method="po
1940: 73 74 22 20 61 63 74 69 6f 6e 3d 41 52 47 3e 2e  st" action=ARG>.
1950: 20 20 54 68 65 20 41 52 47 20 76 61 6c 75 65 20    The ARG value 
1960: 69 73 20 69 6e 73 65 72 74 65 64 0a 2a 2a 20 62  is inserted.** b
1970: 79 20 6a 61 76 61 73 63 72 69 70 74 2e 0a 2a 2f  y javascript..*/
1980: 0a 76 6f 69 64 20 66 6f 72 6d 5f 62 65 67 69 6e  .void form_begin
1990: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 74  (const char *zOt
19a0: 68 65 72 41 72 67 73 2c 20 63 6f 6e 73 74 20 63  herArgs, const c
19b0: 68 61 72 20 2a 7a 41 63 74 69 6f 6e 2c 20 2e 2e  har *zAction, ..
19c0: 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e  .){.  char *zLin
19d0: 6b 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  k;.  va_list ap;
19e0: 0a 20 20 69 66 28 20 7a 4f 74 68 65 72 41 72 67  .  if( zOtherArg
19f0: 73 3d 3d 30 20 29 20 7a 4f 74 68 65 72 41 72 67  s==0 ) zOtherArg
1a00: 73 20 3d 20 22 22 3b 0a 20 20 76 61 5f 73 74 61  s = "";.  va_sta
1a10: 72 74 28 61 70 2c 20 7a 41 63 74 69 6f 6e 29 3b  rt(ap, zAction);
1a20: 0a 20 20 7a 4c 69 6e 6b 20 3d 20 76 6d 70 72 69  .  zLink = vmpri
1a30: 6e 74 66 28 7a 41 63 74 69 6f 6e 2c 20 61 70 29  ntf(zAction, ap)
1a40: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
1a50: 20 20 69 66 28 20 67 2e 70 65 72 6d 2e 48 79 70    if( g.perm.Hyp
1a60: 65 72 6c 69 6e 6b 20 26 26 20 21 67 2e 6a 61 76  erlink && !g.jav
1a70: 61 73 63 72 69 70 74 48 79 70 65 72 6c 69 6e 6b  ascriptHyperlink
1a80: 20 29 7b 0a 20 20 20 20 40 20 3c 66 6f 72 6d 20   ){.    @ <form 
1a90: 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22 20 61 63  method="POST" ac
1aa0: 74 69 6f 6e 3d 22 25 7a 28 7a 4c 69 6e 6b 29 22  tion="%z(zLink)"
1ab0: 20 25 73 28 7a 4f 74 68 65 72 41 72 67 73 29 3e   %s(zOtherArgs)>
1ac0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 65  .  }else{.    ne
1ad0: 65 64 48 72 65 66 4a 73 20 3d 20 31 3b 0a 20 20  edHrefJs = 1;.  
1ae0: 20 20 40 20 3c 66 6f 72 6d 20 6d 65 74 68 6f 64    @ <form method
1af0: 3d 22 50 4f 53 54 22 20 64 61 74 61 2d 61 63 74  ="POST" data-act
1b00: 69 6f 6e 3d 27 25 73 28 7a 4c 69 6e 6b 29 27 20  ion='%s(zLink)' 
1b10: 61 63 74 69 6f 6e 3d 27 25 52 2f 6c 6f 67 69 6e  action='%R/login
1b20: 27 20 5c 0a 20 20 20 20 40 20 25 73 28 7a 4f 74  ' \.    @ %s(zOt
1b30: 68 65 72 41 72 67 73 29 3e 0a 20 20 7d 0a 7d 0a  herArgs)>.  }.}.
1b40: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
1b50: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
1b60: 73 75 62 6d 65 6e 75 0a 2a 2f 0a 76 6f 69 64 20  submenu.*/.void 
1b70: 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c  style_submenu_el
1b80: 65 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 63  ement(.  const c
1b90: 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 0a 20 20 63  har *zLabel,.  c
1ba0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e 6b  onst char *zLink
1bb0: 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f  ,.  ....){.  va_
1bc0: 6c 69 73 74 20 61 70 3b 0a 20 20 61 73 73 65 72  list ap;.  asser
1bd0: 74 28 20 6e 53 75 62 6d 65 6e 75 20 3c 20 63 6f  t( nSubmenu < co
1be0: 75 6e 74 28 61 53 75 62 6d 65 6e 75 29 20 29 3b  unt(aSubmenu) );
1bf0: 0a 20 20 61 53 75 62 6d 65 6e 75 5b 6e 53 75 62  .  aSubmenu[nSub
1c00: 6d 65 6e 75 5d 2e 7a 4c 61 62 65 6c 20 3d 20 7a  menu].zLabel = z
1c10: 4c 61 62 65 6c 3b 0a 20 20 76 61 5f 73 74 61 72  Label;.  va_star
1c20: 74 28 61 70 2c 20 7a 4c 69 6e 6b 29 3b 0a 20 20  t(ap, zLink);.  
1c30: 61 53 75 62 6d 65 6e 75 5b 6e 53 75 62 6d 65 6e  aSubmenu[nSubmen
1c40: 75 5d 2e 7a 4c 69 6e 6b 20 3d 20 76 6d 70 72 69  u].zLink = vmpri
1c50: 6e 74 66 28 7a 4c 69 6e 6b 2c 20 61 70 29 3b 0a  ntf(zLink, ap);.
1c60: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
1c70: 6e 53 75 62 6d 65 6e 75 2b 2b 3b 0a 7d 0a 76 6f  nSubmenu++;.}.vo
1c80: 69 64 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75  id style_submenu
1c90: 5f 65 6e 74 72 79 28 0a 20 20 63 6f 6e 73 74 20  _entry(.  const 
1ca0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
1cb0: 20 20 20 2f 2a 20 51 75 65 72 79 20 70 61 72 61     /* Query para
1cc0: 6d 65 74 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20  meter name */.  
1cd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62  const char *zLab
1ce0: 65 6c 2c 20 20 20 20 20 20 2f 2a 20 4c 61 62 65  el,      /* Labe
1cf0: 6c 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 74  l before the ent
1d00: 72 79 20 62 6f 78 20 2a 2f 0a 20 20 69 6e 74 20  ry box */.  int 
1d10: 69 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  iSize,          
1d20: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1d30: 74 68 65 20 65 6e 74 72 79 20 62 6f 78 20 2a 2f  the entry box */
1d40: 0a 20 20 69 6e 74 20 65 56 69 73 69 62 6c 65 20  .  int eVisible 
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1d60: 69 73 69 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  isible or disabl
1d70: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
1d80: 74 28 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c 20  t( nSubmenuCtrl 
1d90: 3c 20 63 6f 75 6e 74 28 61 53 75 62 6d 65 6e 75  < count(aSubmenu
1da0: 43 74 72 6c 29 20 29 3b 0a 20 20 61 53 75 62 6d  Ctrl) );.  aSubm
1db0: 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75  enuCtrl[nSubmenu
1dc0: 43 74 72 6c 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  Ctrl].zName = zN
1dd0: 61 6d 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43  ame;.  aSubmenuC
1de0: 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c  trl[nSubmenuCtrl
1df0: 5d 2e 7a 4c 61 62 65 6c 20 3d 20 7a 4c 61 62 65  ].zLabel = zLabe
1e00: 6c 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72  l;.  aSubmenuCtr
1e10: 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e  l[nSubmenuCtrl].
1e20: 69 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 0a 20  iSize = iSize;. 
1e30: 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53   aSubmenuCtrl[nS
1e40: 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 56 69 73  ubmenuCtrl].eVis
1e50: 69 62 6c 65 20 3d 20 65 56 69 73 69 62 6c 65 3b  ible = eVisible;
1e60: 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b  .  aSubmenuCtrl[
1e70: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 54  nSubmenuCtrl].eT
1e80: 79 70 65 20 3d 20 46 46 5f 45 4e 54 52 59 3b 0a  ype = FF_ENTRY;.
1e90: 20 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c 2b 2b    nSubmenuCtrl++
1ea0: 3b 0a 7d 0a 76 6f 69 64 20 73 74 79 6c 65 5f 73  ;.}.void style_s
1eb0: 75 62 6d 65 6e 75 5f 63 68 65 63 6b 62 6f 78 28  ubmenu_checkbox(
1ec0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ed0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 51  Name,       /* Q
1ee0: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 6e  uery parameter n
1ef0: 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ame */.  const c
1f00: 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20  har *zLabel,    
1f10: 20 20 2f 2a 20 4c 61 62 65 6c 20 74 6f 20 64 69    /* Label to di
1f20: 73 70 6c 61 79 20 61 66 74 65 72 20 74 68 65 20  splay after the 
1f30: 63 68 65 63 6b 62 6f 78 20 2a 2f 0a 20 20 69 6e  checkbox */.  in
1f40: 74 20 65 56 69 73 69 62 6c 65 2c 20 20 20 20 20  t eVisible,     
1f50: 20 20 20 20 20 20 20 2f 2a 20 56 69 73 69 62 6c         /* Visibl
1f60: 65 20 6f 72 20 64 69 73 61 62 6c 65 64 20 2a 2f  e or disabled */
1f70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f80: 4a 53 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  JS          /* O
1f90: 70 74 69 6f 6e 61 6c 20 6a 61 76 61 73 63 72 69  ptional javascri
1fa0: 70 74 20 74 6f 20 72 75 6e 20 6f 6e 20 74 6f 67  pt to run on tog
1fb0: 67 6c 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  gle */.){.  asse
1fc0: 72 74 28 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c  rt( nSubmenuCtrl
1fd0: 20 3c 20 63 6f 75 6e 74 28 61 53 75 62 6d 65 6e   < count(aSubmen
1fe0: 75 43 74 72 6c 29 20 29 3b 0a 20 20 61 53 75 62  uCtrl) );.  aSub
1ff0: 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e  menuCtrl[nSubmen
2000: 75 43 74 72 6c 5d 2e 7a 4e 61 6d 65 20 3d 20 7a  uCtrl].zName = z
2010: 4e 61 6d 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75  Name;.  aSubmenu
2020: 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72  Ctrl[nSubmenuCtr
2030: 6c 5d 2e 7a 4c 61 62 65 6c 20 3d 20 7a 4c 61 62  l].zLabel = zLab
2040: 65 6c 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43 74  el;.  aSubmenuCt
2050: 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d  rl[nSubmenuCtrl]
2060: 2e 65 56 69 73 69 62 6c 65 20 3d 20 65 56 69 73  .eVisible = eVis
2070: 69 62 6c 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75  ible;.  aSubmenu
2080: 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72  Ctrl[nSubmenuCtr
2090: 6c 5d 2e 7a 4a 53 20 3d 20 7a 4a 53 3b 0a 20 20  l].zJS = zJS;.  
20a0: 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75  aSubmenuCtrl[nSu
20b0: 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 54 79 70 65  bmenuCtrl].eType
20c0: 20 3d 20 46 46 5f 43 48 45 43 4b 42 4f 58 3b 0a   = FF_CHECKBOX;.
20d0: 20 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c 2b 2b    nSubmenuCtrl++
20e0: 3b 0a 7d 0a 76 6f 69 64 20 73 74 79 6c 65 5f 73  ;.}.void style_s
20f0: 75 62 6d 65 6e 75 5f 62 69 6e 61 72 79 28 0a 20  ubmenu_binary(. 
2100: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2110: 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 51 75 65  me,       /* Que
2120: 72 79 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d  ry parameter nam
2130: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2140: 72 20 2a 7a 54 72 75 65 2c 20 20 20 20 20 20 20  r *zTrue,       
2150: 2f 2a 20 4c 61 62 65 6c 20 74 6f 20 73 68 6f 77  /* Label to show
2160: 20 77 68 65 6e 20 70 61 72 61 6d 65 74 65 72 20   when parameter 
2170: 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 63 6f 6e  is true */.  con
2180: 73 74 20 63 68 61 72 20 2a 7a 46 61 6c 73 65 2c  st char *zFalse,
2190: 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 74        /* Label t
21a0: 6f 20 73 68 6f 77 20 77 68 65 6e 20 74 68 65 20  o show when the 
21b0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c  parameter is fal
21c0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 56 69 73  se */.  int eVis
21d0: 69 62 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  ible            
21e0: 20 2f 2a 20 56 69 73 69 62 6c 65 20 6f 72 20 64   /* Visible or d
21f0: 69 73 61 62 6c 65 64 20 2a 2f 0a 29 7b 0a 20 20  isabled */.){.  
2200: 61 73 73 65 72 74 28 20 6e 53 75 62 6d 65 6e 75  assert( nSubmenu
2210: 43 74 72 6c 20 3c 20 63 6f 75 6e 74 28 61 53 75  Ctrl < count(aSu
2220: 62 6d 65 6e 75 43 74 72 6c 29 20 29 3b 0a 20 20  bmenuCtrl) );.  
2230: 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75  aSubmenuCtrl[nSu
2240: 62 6d 65 6e 75 43 74 72 6c 5d 2e 7a 4e 61 6d 65  bmenuCtrl].zName
2250: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 61 53 75 62   = zName;.  aSub
2260: 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e  menuCtrl[nSubmen
2270: 75 43 74 72 6c 5d 2e 7a 4c 61 62 65 6c 20 3d 20  uCtrl].zLabel = 
2280: 7a 54 72 75 65 3b 0a 20 20 61 53 75 62 6d 65 6e  zTrue;.  aSubmen
2290: 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74  uCtrl[nSubmenuCt
22a0: 72 6c 5d 2e 7a 46 61 6c 73 65 20 3d 20 7a 46 61  rl].zFalse = zFa
22b0: 6c 73 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43  lse;.  aSubmenuC
22c0: 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c  trl[nSubmenuCtrl
22d0: 5d 2e 65 56 69 73 69 62 6c 65 20 3d 20 65 56 69  ].eVisible = eVi
22e0: 73 69 62 6c 65 3b 0a 20 20 61 53 75 62 6d 65 6e  sible;.  aSubmen
22f0: 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74  uCtrl[nSubmenuCt
2300: 72 6c 5d 2e 65 54 79 70 65 20 3d 20 46 46 5f 42  rl].eType = FF_B
2310: 49 4e 41 52 59 3b 0a 20 20 6e 53 75 62 6d 65 6e  INARY;.  nSubmen
2320: 75 43 74 72 6c 2b 2b 3b 0a 7d 0a 76 6f 69 64 20  uCtrl++;.}.void 
2330: 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 6d 75  style_submenu_mu
2340: 6c 74 69 63 68 6f 69 63 65 28 0a 20 20 63 6f 6e  ltichoice(.  con
2350: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
2360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65            /* Que
2370: 72 79 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d  ry parameter nam
2380: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6f 69  e */.  int nChoi
2390: 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
23a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23b0: 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 6f   options */.  co
23c0: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20  nst char *const 
23d0: 2a 61 7a 43 68 6f 69 63 65 2c 20 2f 2a 20 76 61  *azChoice, /* va
23e0: 6c 75 65 2f 64 69 73 70 6c 61 79 20 70 61 69 72  lue/display pair
23f0: 73 2e 20 20 32 2a 6e 43 68 6f 69 63 65 20 65 6e  s.  2*nChoice en
2400: 74 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65  tries */.  int e
2410: 56 69 73 69 62 6c 65 20 20 20 20 20 20 20 20 20  Visible         
2420: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 73 69 62          /* Visib
2430: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 64 20 2a  le or disabled *
2440: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6e  /.){.  assert( n
2450: 53 75 62 6d 65 6e 75 43 74 72 6c 20 3c 20 63 6f  SubmenuCtrl < co
2460: 75 6e 74 28 61 53 75 62 6d 65 6e 75 43 74 72 6c  unt(aSubmenuCtrl
2470: 29 20 29 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43  ) );.  aSubmenuC
2480: 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c  trl[nSubmenuCtrl
2490: 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
24a0: 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b  .  aSubmenuCtrl[
24b0: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 69 53  nSubmenuCtrl].iS
24c0: 69 7a 65 20 3d 20 6e 43 68 6f 69 63 65 3b 0a 20  ize = nChoice;. 
24d0: 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53   aSubmenuCtrl[nS
24e0: 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 61 7a 43 68  ubmenuCtrl].azCh
24f0: 6f 69 63 65 20 3d 20 61 7a 43 68 6f 69 63 65 3b  oice = azChoice;
2500: 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b  .  aSubmenuCtrl[
2510: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 56  nSubmenuCtrl].eV
2520: 69 73 69 62 6c 65 20 3d 20 65 56 69 73 69 62 6c  isible = eVisibl
2530: 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72  e;.  aSubmenuCtr
2540: 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e  l[nSubmenuCtrl].
2550: 65 54 79 70 65 20 3d 20 46 46 5f 4d 55 4c 54 49  eType = FF_MULTI
2560: 3b 0a 20 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c  ;.  nSubmenuCtrl
2570: 2b 2b 3b 0a 7d 0a 76 6f 69 64 20 73 74 79 6c 65  ++;.}.void style
2580: 5f 73 75 62 6d 65 6e 75 5f 73 71 6c 28 0a 20 20  _submenu_sql(.  
2590: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
25a0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72  e,       /* Quer
25b0: 79 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d 65  y parameter name
25c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
25d0: 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20 2f   *zLabel,      /
25e0: 2a 20 4c 61 62 65 6c 20 6f 6e 20 74 68 65 20 63  * Label on the c
25f0: 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 63 6f 6e 73  ontrol */.  cons
2600: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
2610: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 73       /* Format s
2620: 74 72 69 6e 67 20 66 6f 72 20 53 51 4c 20 63 6f  tring for SQL co
2630: 6d 6d 61 6e 64 20 66 6f 72 20 63 68 6f 69 63 65  mmand for choice
2640: 73 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20  s */.  ...      
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20  /* Arguments to 
2670: 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  the format strin
2680: 67 20 2a 2f 0a 29 7b 0a 20 20 53 74 6d 74 20 71  g */.){.  Stmt q
2690: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
26a0: 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b   int nAlloc = 0;
26b0: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 20 3d 20 30  .  char **az = 0
26c0: 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  ;.  va_list ap;.
26d0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
26e0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 64 62 5f 76  zFormat);.  db_v
26f0: 70 72 65 70 61 72 65 28 26 71 2c 20 30 2c 20 7a  prepare(&q, 0, z
2700: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2710: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 77 68 69  a_end(ap);.  whi
2720: 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  le( SQLITE_ROW==
2730: 64 62 5f 73 74 65 70 28 26 71 29 20 29 7b 0a 20  db_step(&q) ){. 
2740: 20 20 20 69 66 28 20 6e 2b 32 3e 3d 6e 41 6c 6c     if( n+2>=nAll
2750: 6f 63 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c 6c  oc ){.      nAll
2760: 6f 63 20 2b 3d 20 6e 41 6c 6c 6f 63 20 2b 20 32  oc += nAlloc + 2
2770: 30 3b 0a 20 20 20 20 20 20 61 7a 20 3d 20 66 6f  0;.      az = fo
2780: 73 73 69 6c 5f 72 65 61 6c 6c 6f 63 28 61 7a 2c  ssil_realloc(az,
2790: 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e   sizeof(char*)*n
27a0: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 0a 20 20  Alloc);.    }.  
27b0: 20 20 61 7a 5b 6e 2b 2b 5d 20 3d 20 66 6f 73 73    az[n++] = foss
27c0: 69 6c 5f 73 74 72 64 75 70 28 64 62 5f 63 6f 6c  il_strdup(db_col
27d0: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 30 29 29 3b  umn_text(&q,0));
27e0: 0a 20 20 20 20 61 7a 5b 6e 2b 2b 5d 20 3d 20 66  .    az[n++] = f
27f0: 6f 73 73 69 6c 5f 73 74 72 64 75 70 28 64 62 5f  ossil_strdup(db_
2800: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 31  column_text(&q,1
2810: 29 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e  ));.  }.  db_fin
2820: 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 69 66 28  alize(&q);.  if(
2830: 20 6e 3e 30 20 29 7b 0a 20 20 20 20 61 53 75 62   n>0 ){.    aSub
2840: 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e  menuCtrl[nSubmen
2850: 75 43 74 72 6c 5d 2e 7a 4e 61 6d 65 20 3d 20 7a  uCtrl].zName = z
2860: 4e 61 6d 65 3b 0a 20 20 20 20 61 53 75 62 6d 65  Name;.    aSubme
2870: 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43  nuCtrl[nSubmenuC
2880: 74 72 6c 5d 2e 7a 4c 61 62 65 6c 20 3d 20 7a 4c  trl].zLabel = zL
2890: 61 62 65 6c 3b 0a 20 20 20 20 61 53 75 62 6d 65  abel;.    aSubme
28a0: 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43  nuCtrl[nSubmenuC
28b0: 74 72 6c 5d 2e 69 53 69 7a 65 20 3d 20 6e 2f 32  trl].iSize = n/2
28c0: 3b 0a 20 20 20 20 61 53 75 62 6d 65 6e 75 43 74  ;.    aSubmenuCt
28d0: 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d  rl[nSubmenuCtrl]
28e0: 2e 61 7a 43 68 6f 69 63 65 20 3d 20 28 63 6f 6e  .azChoice = (con
28f0: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 2a  st char *const *
2900: 29 61 7a 3b 0a 20 20 20 20 61 53 75 62 6d 65 6e  )az;.    aSubmen
2910: 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74  uCtrl[nSubmenuCt
2920: 72 6c 5d 2e 65 56 69 73 69 62 6c 65 20 3d 20 53  rl].eVisible = S
2930: 54 59 4c 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  TYLE_NORMAL;.   
2940: 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53   aSubmenuCtrl[nS
2950: 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 54 79 70  ubmenuCtrl].eTyp
2960: 65 20 3d 20 46 46 5f 4d 55 4c 54 49 3b 0a 20 20  e = FF_MULTI;.  
2970: 20 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c 2b 2b    nSubmenuCtrl++
2980: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
2990: 69 73 61 62 6c 65 20 6f 72 20 65 6e 61 62 6c 65  isable or enable
29a0: 20 74 68 65 20 73 75 62 6d 65 6e 75 0a 2a 2f 0a   the submenu.*/.
29b0: 76 6f 69 64 20 73 74 79 6c 65 5f 73 75 62 6d 65  void style_subme
29c0: 6e 75 5f 65 6e 61 62 6c 65 28 69 6e 74 20 6f 6e  nu_enable(int on
29d0: 4f 66 66 29 7b 0a 20 20 73 75 62 6d 65 6e 75 45  Off){.  submenuE
29e0: 6e 61 62 6c 65 20 3d 20 6f 6e 4f 66 66 3b 0a 7d  nable = onOff;.}
29f0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  .../*.** Compare
2a00: 20 74 77 6f 20 73 75 62 6d 65 6e 75 20 69 74 65   two submenu ite
2a10: 6d 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70  ms for sorting p
2a20: 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69  urposes.*/.stati
2a30: 63 20 69 6e 74 20 73 75 62 6d 65 6e 75 43 6f 6d  c int submenuCom
2a40: 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20  pare(const void 
2a50: 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  *a, const void *
2a60: 62 29 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  b){.  const stru
2a70: 63 74 20 53 75 62 6d 65 6e 75 20 2a 41 20 3d 20  ct Submenu *A = 
2a80: 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 53 75  (const struct Su
2a90: 62 6d 65 6e 75 2a 29 61 3b 0a 20 20 63 6f 6e 73  bmenu*)a;.  cons
2aa0: 74 20 73 74 72 75 63 74 20 53 75 62 6d 65 6e 75  t struct Submenu
2ab0: 20 2a 42 20 3d 20 28 63 6f 6e 73 74 20 73 74 72   *B = (const str
2ac0: 75 63 74 20 53 75 62 6d 65 6e 75 2a 29 62 3b 0a  uct Submenu*)b;.
2ad0: 20 20 72 65 74 75 72 6e 20 66 6f 73 73 69 6c 5f    return fossil_
2ae0: 73 74 72 63 6d 70 28 41 2d 3e 7a 4c 61 62 65 6c  strcmp(A->zLabel
2af0: 2c 20 42 2d 3e 7a 4c 61 62 65 6c 29 3b 0a 7d 0a  , B->zLabel);.}.
2b00: 0a 2f 2a 20 55 73 65 20 74 68 69 73 20 66 6f 72  ./* Use this for
2b10: 20 74 68 65 20 24 63 75 72 72 65 6e 74 5f 70 61   the $current_pa
2b20: 67 65 20 76 61 72 69 61 62 6c 65 20 69 66 20 69  ge variable if i
2b30: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 20  t is not NULL.  
2b40: 49 66 20 69 74 0a 2a 2a 20 69 73 20 4e 55 4c 4c  If it.** is NULL
2b50: 20 74 68 65 6e 20 75 73 65 20 67 2e 7a 50 61 74   then use g.zPat
2b60: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  h..*/.static cha
2b70: 72 20 2a 6c 6f 63 61 6c 5f 7a 43 75 72 72 65 6e  r *local_zCurren
2b80: 74 50 61 67 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  tPage = 0;../*.*
2b90: 2a 20 53 65 74 20 74 68 65 20 64 65 73 69 72 65  * Set the desire
2ba0: 64 20 24 63 75 72 72 65 6e 74 5f 70 61 67 65 20  d $current_page 
2bb0: 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  to something oth
2bc0: 65 72 20 74 68 61 6e 20 67 2e 7a 50 61 74 68 0a  er than g.zPath.
2bd0: 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 73 65  */.void style_se
2be0: 74 5f 63 75 72 72 65 6e 74 5f 70 61 67 65 28 63  t_current_page(c
2bf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
2c00: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 66 6f 73 73  at, ...){.  foss
2c10: 69 6c 5f 66 72 65 65 28 6c 6f 63 61 6c 5f 7a 43  il_free(local_zC
2c20: 75 72 72 65 6e 74 50 61 67 65 29 3b 0a 20 20 69  urrentPage);.  i
2c30: 66 28 20 7a 46 6f 72 6d 61 74 3d 3d 30 20 29 7b  f( zFormat==0 ){
2c40: 0a 20 20 20 20 6c 6f 63 61 6c 5f 7a 43 75 72 72  .    local_zCurr
2c50: 65 6e 74 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  entPage = 0;.  }
2c60: 65 6c 73 65 7b 0a 20 20 20 20 76 61 5f 6c 69 73  else{.    va_lis
2c70: 74 20 61 70 3b 0a 20 20 20 20 76 61 5f 73 74 61  t ap;.    va_sta
2c80: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
2c90: 0a 20 20 20 20 6c 6f 63 61 6c 5f 7a 43 75 72 72  .    local_zCurr
2ca0: 65 6e 74 50 61 67 65 20 3d 20 76 6d 70 72 69 6e  entPage = vmprin
2cb0: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  tf(zFormat, ap);
2cc0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
2cd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  .  }.}../*.** Cr
2ce0: 65 61 74 65 20 61 20 54 48 31 20 76 61 72 69 61  eate a TH1 varia
2cf0: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
2d00: 68 65 20 55 52 4c 20 66 6f 72 20 74 68 65 20 73  he URL for the s
2d10: 70 65 63 69 66 69 65 64 20 63 6f 6e 66 69 67 0a  pecified config.
2d20: 2a 2a 20 72 65 73 6f 75 72 63 65 2e 20 54 68 65  ** resource. The
2d30: 20 72 65 73 75 6c 74 69 6e 67 20 76 61 72 69 61   resulting varia
2d40: 62 6c 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  ble name will be
2d50: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20   of the form.** 
2d60: 24 5b 7a 56 61 72 50 72 65 66 69 78 5d 5f 75 72  $[zVarPrefix]_ur
2d70: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
2d80: 64 20 75 72 6c 5f 76 61 72 28 0a 20 20 63 6f 6e  d url_var(.  con
2d90: 73 74 20 63 68 61 72 20 2a 7a 56 61 72 50 72 65  st char *zVarPre
2da0: 66 69 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  fix,.  const cha
2db0: 72 20 2a 7a 43 6f 6e 66 69 67 4e 61 6d 65 2c 0a  r *zConfigName,.
2dc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2dd0: 61 67 65 4e 61 6d 65 0a 29 7b 0a 20 20 63 68 61  ageName.){.  cha
2de0: 72 20 2a 7a 56 61 72 4e 61 6d 65 20 3d 20 6d 70  r *zVarName = mp
2df0: 72 69 6e 74 66 28 22 25 73 5f 75 72 6c 22 2c 20  rintf("%s_url", 
2e00: 7a 56 61 72 50 72 65 66 69 78 29 3b 0a 20 20 63  zVarPrefix);.  c
2e10: 68 61 72 20 2a 7a 55 72 6c 20 3d 20 30 3b 20 20  har *zUrl = 0;  
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2e30: 74 79 6c 65 73 68 65 65 74 20 55 52 4c 20 2a 2f  tylesheet URL */
2e40: 0a 20 20 69 6e 74 20 68 61 73 42 75 69 6c 74 69  .  int hasBuilti
2e50: 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
2e60: 2f 2a 20 74 72 75 65 20 66 6f 72 20 62 75 69 6c  /* true for buil
2e70: 74 2d 69 6e 20 70 61 67 65 2d 73 70 65 63 69 66  t-in page-specif
2e80: 69 63 20 43 53 53 20 2a 2f 0a 0a 20 20 69 66 28  ic CSS */..  if(
2e90: 30 3d 3d 73 74 72 63 6d 70 28 22 63 73 73 22 2c  0==strcmp("css",
2ea0: 7a 43 6f 6e 66 69 67 4e 61 6d 65 29 29 7b 0a 20  zConfigName)){. 
2eb0: 20 20 20 2f 2a 20 41 63 63 6f 75 6e 74 20 66 6f     /* Account fo
2ec0: 72 20 70 61 67 65 2d 73 70 65 63 69 66 69 63 20  r page-specific 
2ed0: 43 53 53 2c 20 61 70 70 65 6e 64 69 6e 67 20 61  CSS, appending a
2ee0: 20 2f 7b 7b 67 2e 7a 50 61 74 68 7d 7d 20 74 6f   /{{g.zPath}} to
2ef0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 75 72 6c 20   the.    ** url 
2f00: 6f 6e 6c 79 20 69 66 20 77 65 20 68 61 76 65 20  only if we have 
2f10: 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  a corresponding 
2f20: 62 75 69 6c 74 2d 69 6e 20 70 61 67 65 2d 73 70  built-in page-sp
2f30: 65 63 69 66 69 63 20 43 53 53 0a 20 20 20 20 2a  ecific CSS.    *
2f40: 2a 20 66 69 6c 65 2e 20 44 6f 20 6e 6f 74 20 61  * file. Do not a
2f50: 70 70 65 6e 64 20 69 74 20 74 6f 20 61 6c 6c 20  ppend it to all 
2f60: 70 61 67 65 73 20 62 65 63 61 75 73 65 20 77 65  pages because we
2f70: 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 65 66   would.    ** ef
2f80: 66 65 63 74 69 76 65 6c 79 20 63 61 63 68 65 2d  fectively cache-
2f90: 62 75 73 74 20 61 6c 6c 20 70 61 67 65 73 20 77  bust all pages w
2fa0: 68 69 63 68 20 64 6f 20 6e 6f 74 20 68 61 76 65  hich do not have
2fb0: 0a 20 20 20 20 2a 2a 20 70 61 67 65 2d 73 70 65  .    ** page-spe
2fc0: 63 69 66 69 63 20 43 53 53 2e 20 2a 2f 0a 20 20  cific CSS. */.  
2fd0: 20 20 63 68 61 72 20 2a 20 7a 42 75 69 6c 74 69    char * zBuilti
2fe0: 6e 20 3d 20 6d 70 72 69 6e 74 66 28 22 73 74 79  n = mprintf("sty
2ff0: 6c 65 2e 25 73 2e 63 73 73 22 2c 20 67 2e 7a 50  le.%s.css", g.zP
3000: 61 74 68 29 3b 0a 20 20 20 20 68 61 73 42 75 69  ath);.    hasBui
3010: 6c 74 69 6e 20 3d 20 62 75 69 6c 74 69 6e 5f 66  ltin = builtin_f
3020: 69 6c 65 28 7a 42 75 69 6c 74 69 6e 2c 30 29 21  ile(zBuiltin,0)!
3030: 3d 30 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66  =0;.    fossil_f
3040: 72 65 65 28 7a 42 75 69 6c 74 69 6e 29 3b 0a 20  ree(zBuiltin);. 
3050: 20 7d 0a 20 20 7a 55 72 6c 20 3d 20 6d 70 72 69   }.  zUrl = mpri
3060: 6e 74 66 28 22 25 52 2f 25 73 25 73 25 73 3f 69  ntf("%R/%s%s%s?i
3070: 64 3d 25 78 22 2c 20 7a 50 61 67 65 4e 61 6d 65  d=%x", zPageName
3080: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3090: 20 20 20 68 61 73 42 75 69 6c 74 69 6e 20 3f 20     hasBuiltin ? 
30a0: 22 2f 22 20 3a 20 22 22 2c 20 68 61 73 42 75 69  "/" : "", hasBui
30b0: 6c 74 69 6e 20 3f 20 67 2e 7a 50 61 74 68 20 3a  ltin ? g.zPath :
30c0: 20 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20   "",.           
30d0: 20 20 20 20 20 20 73 6b 69 6e 5f 69 64 28 7a 43        skin_id(zC
30e0: 6f 6e 66 69 67 4e 61 6d 65 29 29 3b 0a 20 20 54  onfigName));.  T
30f0: 68 5f 53 74 6f 72 65 28 7a 56 61 72 4e 61 6d 65  h_Store(zVarName
3100: 2c 20 7a 55 72 6c 29 3b 0a 20 20 66 6f 73 73 69  , zUrl);.  fossi
3110: 6c 5f 66 72 65 65 28 7a 55 72 6c 29 3b 0a 20 20  l_free(zUrl);.  
3120: 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 56 61 72  fossil_free(zVar
3130: 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
3140: 43 72 65 61 74 65 20 61 20 54 48 31 20 76 61 72  Create a TH1 var
3150: 69 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  iable containing
3160: 20 74 68 65 20 55 52 4c 20 66 6f 72 20 74 68 65   the URL for the
3170: 20 73 70 65 63 69 66 69 65 64 20 63 6f 6e 66 69   specified confi
3180: 67 20 69 6d 61 67 65 2e 0a 2a 2a 20 54 68 65 20  g image..** The 
3190: 72 65 73 75 6c 74 69 6e 67 20 76 61 72 69 61 62  resulting variab
31a0: 6c 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  le name will be 
31b0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 24 5b 7a 49  of the form $[zI
31c0: 6d 61 67 65 4e 61 6d 65 5d 5f 69 6d 61 67 65 5f  mageName]_image_
31d0: 75 72 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  url..*/.static v
31e0: 6f 69 64 20 69 6d 61 67 65 5f 75 72 6c 5f 76 61  oid image_url_va
31f0: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  r(const char *zI
3200: 6d 61 67 65 4e 61 6d 65 29 7b 0a 20 20 63 68 61  mageName){.  cha
3210: 72 20 2a 7a 56 61 72 50 72 65 66 69 78 20 3d 20  r *zVarPrefix = 
3220: 6d 70 72 69 6e 74 66 28 22 25 73 5f 69 6d 61 67  mprintf("%s_imag
3230: 65 22 2c 20 7a 49 6d 61 67 65 4e 61 6d 65 29 3b  e", zImageName);
3240: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 69 67  .  char *zConfig
3250: 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22  Name = mprintf("
3260: 25 73 2d 69 6d 61 67 65 22 2c 20 7a 49 6d 61 67  %s-image", zImag
3270: 65 4e 61 6d 65 29 3b 0a 20 20 75 72 6c 5f 76 61  eName);.  url_va
3280: 72 28 7a 56 61 72 50 72 65 66 69 78 2c 20 7a 43  r(zVarPrefix, zC
3290: 6f 6e 66 69 67 4e 61 6d 65 2c 20 7a 49 6d 61 67  onfigName, zImag
32a0: 65 4e 61 6d 65 29 3b 0a 20 20 66 72 65 65 28 7a  eName);.  free(z
32b0: 56 61 72 50 72 65 66 69 78 29 3b 0a 20 20 66 72  VarPrefix);.  fr
32c0: 65 65 28 7a 43 6f 6e 66 69 67 4e 61 6d 65 29 3b  ee(zConfigName);
32d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
32e0: 20 54 45 58 54 20 77 69 74 68 20 61 20 63 6c 69   TEXT with a cli
32f0: 63 6b 2d 74 6f 2d 63 6f 70 79 20 62 75 74 74 6f  ck-to-copy butto
3300: 6e 20 6e 65 78 74 20 74 6f 20 69 74 2e 20 4c 6f  n next to it. Lo
3310: 61 64 73 20 74 68 65 20 63 6f 70 79 62 74 6e 2e  ads the copybtn.
3320: 6a 73 0a 2a 2a 20 4a 61 76 61 73 63 72 69 70 74  js.** Javascript
3330: 20 6d 6f 64 75 6c 65 2c 20 61 6e 64 20 67 65 6e   module, and gen
3340: 65 72 61 74 65 73 20 48 54 4d 4c 20 65 6c 65 6d  erates HTML elem
3350: 65 6e 74 73 20 77 69 74 68 20 74 68 65 20 66 6f  ents with the fo
3360: 6c 6c 6f 77 69 6e 67 20 49 44 73 3a 0a 2a 2a 0a  llowing IDs:.**.
3370: 2a 2a 20 20 20 20 54 41 52 47 45 54 49 44 3a 20  **    TARGETID: 
3380: 20 20 20 20 20 20 54 68 65 20 3c 73 70 61 6e 3e        The <span>
3390: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
33a0: 54 45 58 54 2e 0a 2a 2a 20 20 20 20 63 6f 70 79  TEXT..**    copy
33b0: 2d 54 41 52 47 45 54 49 44 3a 20 20 54 68 65 20  -TARGETID:  The 
33c0: 3c 73 70 61 6e 3e 20 66 6f 72 20 74 68 65 20 63  <span> for the c
33d0: 6f 70 79 20 62 75 74 74 6f 6e 2e 0a 2a 2a 0a 2a  opy button..**.*
33e0: 2a 20 49 66 20 74 68 65 20 46 4c 49 50 50 45 44  * If the FLIPPED
33f0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
3400: 2d 7a 65 72 6f 2c 20 74 68 65 20 63 6f 70 79 20  -zero, the copy 
3410: 62 75 74 74 6f 6e 20 69 73 20 64 69 73 70 6c 61  button is displa
3420: 79 65 64 20 61 66 74 65 72 20 54 45 58 54 2e 0a  yed after TEXT..
3430: 2a 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59 4c 45  **.** The COPYLE
3440: 4e 47 54 48 20 61 72 67 75 6d 65 6e 74 20 64 65  NGTH argument de
3450: 66 69 6e 65 73 20 74 68 65 20 6c 65 6e 67 74 68  fines the length
3460: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
3470: 67 20 6f 66 20 54 45 58 54 20 63 6f 70 69 65 64  g of TEXT copied
3480: 20 74 6f 0a 2a 2a 20 63 6c 69 70 62 6f 61 72 64   to.** clipboard
3490: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 3c 3d 20 30 3a  :.**.**    <= 0:
34a0: 20 20 20 4e 6f 20 6c 69 6d 69 74 20 28 64 65 66     No limit (def
34b0: 61 75 6c 74 20 69 66 20 74 68 65 20 61 72 67 75  ault if the argu
34c0: 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74 65 64 29  ment is omitted)
34d0: 2e 0a 2a 2a 20 20 20 20 3e 3d 20 33 3a 20 20 20  ..**    >= 3:   
34e0: 54 72 75 6e 63 61 74 65 20 54 45 58 54 20 61 66  Truncate TEXT af
34f0: 74 65 72 20 43 4f 50 59 4c 45 4e 47 54 48 20 28  ter COPYLENGTH (
3500: 73 69 6e 67 6c 65 2d 62 79 74 65 29 20 63 68 61  single-byte) cha
3510: 72 61 63 74 65 72 73 2e 0a 2a 2a 20 20 20 20 20  racters..**     
3520: 20 20 31 3a 20 20 20 55 73 65 20 74 68 65 20 22    1:   Use the "
3530: 68 61 73 68 2d 64 69 67 69 74 73 22 20 73 65 74  hash-digits" set
3540: 74 69 6e 67 20 61 73 20 74 68 65 20 6c 69 6d 69  ting as the limi
3550: 74 2e 0a 2a 2a 20 20 20 20 20 20 20 32 3a 20 20  t..**       2:  
3560: 20 55 73 65 20 74 68 65 20 6c 65 6e 67 74 68 20   Use the length 
3570: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
3580: 55 52 4c 73 20 61 73 20 74 68 65 20 6c 69 6d 69  URLs as the limi
3590: 74 20 28 64 65 66 69 6e 65 64 20 61 74 0a 2a 2a  t (defined at.**
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70              comp
35b0: 69 6c 65 2d 74 69 6d 65 20 62 79 20 46 4f 53 53  ile-time by FOSS
35c0: 49 4c 5f 48 41 53 48 5f 44 49 47 49 54 53 5f 55  IL_HASH_DIGITS_U
35d0: 52 4c 2c 20 64 65 66 61 75 6c 74 73 20 74 6f 20  RL, defaults to 
35e0: 31 36 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 74  16)..*/.char *st
35f0: 79 6c 65 5f 63 6f 70 79 5f 62 75 74 74 6f 6e 28  yle_copy_button(
3600: 0a 20 20 69 6e 74 20 62 4f 75 74 70 75 74 43 47  .  int bOutputCG
3610: 49 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  I,         /* Do
3620: 6e 27 74 20 72 65 74 75 72 6e 20 72 65 73 75 6c  n't return resul
3630: 74 2c 20 62 75 74 20 73 65 6e 64 20 74 6f 20 63  t, but send to c
3640: 67 69 5f 70 72 69 6e 74 66 28 29 2e 20 2a 2f 0a  gi_printf(). */.
3650: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
3660: 61 72 67 65 74 49 64 2c 20 20 2f 2a 20 54 68 65  argetId,  /* The
3670: 20 54 41 52 47 45 54 49 44 20 61 72 67 75 6d 65   TARGETID argume
3680: 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 46 6c  nt. */.  int bFl
3690: 69 70 70 65 64 2c 20 20 20 20 20 20 20 20 20 20  ipped,          
36a0: 20 2f 2a 20 54 68 65 20 46 4c 49 50 50 45 44 20   /* The FLIPPED 
36b0: 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69  argument. */.  i
36c0: 6e 74 20 63 63 68 4c 65 6e 67 74 68 2c 20 20 20  nt cchLength,   
36d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43 4f         /* The CO
36e0: 50 59 4c 45 4e 47 54 48 20 61 72 67 75 6d 65 6e  PYLENGTH argumen
36f0: 74 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  t. */.  const ch
3700: 61 72 20 2a 7a 54 65 78 74 46 6d 74 2c 20 20 20  ar *zTextFmt,   
3710: 2f 2a 20 46 6f 72 6d 61 74 74 69 6e 67 20 6f 66  /* Formatting of
3720: 20 74 68 65 20 54 45 58 54 20 61 72 67 75 6d 65   the TEXT argume
3730: 6e 74 20 28 68 74 6d 6c 69 7a 65 64 29 2e 20 2a  nt (htmlized). *
3740: 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20 20 20  /.  ...         
3750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
3760: 6f 72 6d 61 74 74 69 6e 67 20 70 61 72 61 6d 65  ormatting parame
3770: 74 65 72 73 20 6f 66 20 74 68 65 20 54 45 58 54  ters of the TEXT
3780: 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 29 7b   argument. */.){
3790: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
37a0: 20 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a 20 20   char *zText;.  
37b0: 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20  char *zResult = 
37c0: 30 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  0;.  va_start(ap
37d0: 2c 7a 54 65 78 74 46 6d 74 29 3b 0a 20 20 7a 54  ,zTextFmt);.  zT
37e0: 65 78 74 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a  ext = vmprintf(z
37f0: 54 65 78 74 46 6d 74 2f 2a 77 6f 72 6b 73 2d 6c  TextFmt/*works-l
3800: 69 6b 65 3a 3f 2a 2f 2c 61 70 29 3b 0a 20 20 76  ike:?*/,ap);.  v
3810: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
3820: 20 63 63 68 4c 65 6e 67 74 68 3d 3d 31 20 29 20   cchLength==1 ) 
3830: 63 63 68 4c 65 6e 67 74 68 20 3d 20 68 61 73 68  cchLength = hash
3840: 5f 64 69 67 69 74 73 28 30 29 3b 0a 20 20 65 6c  _digits(0);.  el
3850: 73 65 20 69 66 28 20 63 63 68 4c 65 6e 67 74 68  se if( cchLength
3860: 3d 3d 32 20 29 20 63 63 68 4c 65 6e 67 74 68 20  ==2 ) cchLength 
3870: 3d 20 68 61 73 68 5f 64 69 67 69 74 73 28 31 29  = hash_digits(1)
3880: 3b 0a 20 20 69 66 28 20 21 62 46 6c 69 70 70 65  ;.  if( !bFlippe
3890: 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  d ){.    const c
38a0: 68 61 72 20 2a 7a 42 74 6e 46 6d 74 20 3d 0a 20  har *zBtnFmt =. 
38b0: 20 20 20 20 20 22 3c 73 70 61 6e 20 63 6c 61 73       "<span clas
38c0: 73 3d 5c 22 6e 6f 62 72 5c 22 3e 22 0a 20 20 20  s=\"nobr\">".   
38d0: 20 20 20 22 3c 73 70 61 6e 20 22 0a 20 20 20 20     "<span ".    
38e0: 20 20 22 63 6c 61 73 73 3d 5c 22 63 6f 70 79 2d    "class=\"copy-
38f0: 62 75 74 74 6f 6e 5c 22 20 22 0a 20 20 20 20 20  button\" ".     
3900: 20 22 69 64 3d 5c 22 63 6f 70 79 2d 25 68 5c 22   "id=\"copy-%h\"
3910: 20 22 0a 20 20 20 20 20 20 22 64 61 74 61 2d 63   ".      "data-c
3920: 6f 70 79 74 61 72 67 65 74 3d 5c 22 25 68 5c 22  opytarget=\"%h\"
3930: 20 22 0a 20 20 20 20 20 20 22 64 61 74 61 2d 63   ".      "data-c
3940: 6f 70 79 6c 65 6e 67 74 68 3d 5c 22 25 64 5c 22  opylength=\"%d\"
3950: 3e 22 0a 20 20 20 20 20 20 22 3c 2f 73 70 61 6e  >".      "</span
3960: 3e 22 0a 20 20 20 20 20 20 22 3c 73 70 61 6e 20  >".      "<span 
3970: 69 64 3d 5c 22 25 68 5c 22 3e 22 0a 20 20 20 20  id=\"%h\">".    
3980: 20 20 22 25 73 22 0a 20 20 20 20 20 20 22 3c 2f    "%s".      "</
3990: 73 70 61 6e 3e 22 0a 20 20 20 20 20 20 22 3c 2f  span>".      "</
39a0: 73 70 61 6e 3e 22 3b 0a 20 20 20 20 69 66 28 20  span>";.    if( 
39b0: 62 4f 75 74 70 75 74 43 47 49 20 29 7b 0a 20 20  bOutputCGI ){.  
39c0: 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66 28 0a      cgi_printf(.
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39e0: 20 20 7a 42 74 6e 46 6d 74 2f 2a 77 6f 72 6b 73    zBtnFmt/*works
39f0: 2d 6c 69 6b 65 3a 22 25 68 25 68 25 64 25 68 25  -like:"%h%h%d%h%
3a00: 73 22 2a 2f 2c 0a 20 20 20 20 20 20 20 20 20 20  s"*/,.          
3a10: 20 20 20 20 20 20 20 20 7a 54 61 72 67 65 74 49          zTargetI
3a20: 64 2c 7a 54 61 72 67 65 74 49 64 2c 63 63 68 4c  d,zTargetId,cchL
3a30: 65 6e 67 74 68 2c 7a 54 61 72 67 65 74 49 64 2c  ength,zTargetId,
3a40: 7a 54 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73  zText);.    }els
3a50: 65 7b 0a 20 20 20 20 20 20 7a 52 65 73 75 6c 74  e{.      zResult
3a60: 20 3d 20 6d 70 72 69 6e 74 66 28 0a 20 20 20 20   = mprintf(.    
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 42                zB
3a80: 74 6e 46 6d 74 2f 2a 77 6f 72 6b 73 2d 6c 69 6b  tnFmt/*works-lik
3a90: 65 3a 22 25 68 25 68 25 64 25 68 25 73 22 2a 2f  e:"%h%h%d%h%s"*/
3aa0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3ab0: 20 20 20 20 7a 54 61 72 67 65 74 49 64 2c 7a 54      zTargetId,zT
3ac0: 61 72 67 65 74 49 64 2c 63 63 68 4c 65 6e 67 74  argetId,cchLengt
3ad0: 68 2c 7a 54 61 72 67 65 74 49 64 2c 7a 54 65 78  h,zTargetId,zTex
3ae0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t);.    }.  }els
3af0: 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e{.    const cha
3b00: 72 20 2a 7a 42 74 6e 46 6d 74 20 3d 0a 20 20 20  r *zBtnFmt =.   
3b10: 20 20 20 22 3c 73 70 61 6e 20 63 6c 61 73 73 3d     "<span class=
3b20: 5c 22 6e 6f 62 72 5c 22 3e 22 0a 20 20 20 20 20  \"nobr\">".     
3b30: 20 22 3c 73 70 61 6e 20 69 64 3d 5c 22 25 68 5c   "<span id=\"%h\
3b40: 22 3e 22 0a 20 20 20 20 20 20 22 25 73 22 0a 20  ">".      "%s". 
3b50: 20 20 20 20 20 22 3c 2f 73 70 61 6e 3e 22 0a 20       "</span>". 
3b60: 20 20 20 20 20 22 3c 73 70 61 6e 20 22 0a 20 20       "<span ".  
3b70: 20 20 20 20 22 63 6c 61 73 73 3d 5c 22 63 6f 70      "class=\"cop
3b80: 79 2d 62 75 74 74 6f 6e 20 63 6f 70 79 2d 62 75  y-button copy-bu
3b90: 74 74 6f 6e 2d 66 6c 69 70 70 65 64 5c 22 20 22  tton-flipped\" "
3ba0: 0a 20 20 20 20 20 20 22 69 64 3d 5c 22 63 6f 70  .      "id=\"cop
3bb0: 79 2d 25 68 5c 22 20 22 0a 20 20 20 20 20 20 22  y-%h\" ".      "
3bc0: 64 61 74 61 2d 63 6f 70 79 74 61 72 67 65 74 3d  data-copytarget=
3bd0: 5c 22 25 68 5c 22 20 22 0a 20 20 20 20 20 20 22  \"%h\" ".      "
3be0: 64 61 74 61 2d 63 6f 70 79 6c 65 6e 67 74 68 3d  data-copylength=
3bf0: 5c 22 25 64 5c 22 3e 22 0a 20 20 20 20 20 20 22  \"%d\">".      "
3c00: 3c 2f 73 70 61 6e 3e 22 0a 20 20 20 20 20 20 22  </span>".      "
3c10: 3c 2f 73 70 61 6e 3e 22 3b 0a 20 20 20 20 69 66  </span>";.    if
3c20: 28 20 62 4f 75 74 70 75 74 43 47 49 20 29 7b 0a  ( bOutputCGI ){.
3c30: 20 20 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66        cgi_printf
3c40: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
3c50: 20 20 20 20 7a 42 74 6e 46 6d 74 2f 2a 77 6f 72      zBtnFmt/*wor
3c60: 6b 73 2d 6c 69 6b 65 3a 22 25 68 25 73 25 68 25  ks-like:"%h%s%h%
3c70: 68 25 64 22 2a 2f 2c 0a 20 20 20 20 20 20 20 20  h%d"*/,.        
3c80: 20 20 20 20 20 20 20 20 20 20 7a 54 61 72 67 65            zTarge
3c90: 74 49 64 2c 7a 54 65 78 74 2c 7a 54 61 72 67 65  tId,zText,zTarge
3ca0: 74 49 64 2c 7a 54 61 72 67 65 74 49 64 2c 63 63  tId,zTargetId,cc
3cb0: 68 4c 65 6e 67 74 68 29 3b 0a 20 20 20 20 7d 65  hLength);.    }e
3cc0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 52 65 73 75  lse{.      zResu
3cd0: 6c 74 20 3d 20 6d 70 72 69 6e 74 66 28 0a 20 20  lt = mprintf(.  
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cf0: 7a 42 74 6e 46 6d 74 2f 2a 77 6f 72 6b 73 2d 6c  zBtnFmt/*works-l
3d00: 69 6b 65 3a 22 25 68 25 73 25 68 25 68 25 64 22  ike:"%h%s%h%h%d"
3d10: 2a 2f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  */,.            
3d20: 20 20 20 20 20 20 7a 54 61 72 67 65 74 49 64 2c        zTargetId,
3d30: 7a 54 65 78 74 2c 7a 54 61 72 67 65 74 49 64 2c  zText,zTargetId,
3d40: 7a 54 61 72 67 65 74 49 64 2c 63 63 68 4c 65 6e  zTargetId,cchLen
3d50: 67 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gth);.    }.  }.
3d60: 20 20 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20    free(zText);. 
3d70: 20 73 74 79 6c 65 5f 63 6f 70 79 62 75 74 74 6f   style_copybutto
3d80: 6e 5f 63 6f 6e 74 72 6f 6c 28 29 3b 0a 20 20 72  n_control();.  r
3d90: 65 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d  eturn zResult;.}
3da0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
3db0: 20 72 61 6e 64 6f 6d 20 6e 6f 6e 63 65 20 74 68   random nonce th
3dc0: 61 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  at is stored in 
3dd0: 73 74 61 74 69 63 20 73 70 61 63 65 2e 20 20 46  static space.  F
3de0: 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 0a  or a particular.
3df0: 2a 2a 20 72 75 6e 2c 20 74 68 65 20 73 61 6d 65  ** run, the same
3e00: 20 6e 6f 6e 63 65 20 69 73 20 61 6c 77 61 79 73   nonce is always
3e10: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68   returned..*/.ch
3e20: 61 72 20 2a 73 74 79 6c 65 5f 6e 6f 6e 63 65 28  ar *style_nonce(
3e30: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
3e40: 63 68 61 72 20 7a 4e 6f 6e 63 65 5b 35 32 5d 3b  char zNonce[52];
3e50: 0a 20 20 69 66 28 20 7a 4e 6f 6e 63 65 5b 30 5d  .  if( zNonce[0]
3e60: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e 73 69 67  ==0 ){.    unsig
3e70: 6e 65 64 20 63 68 61 72 20 7a 53 65 65 64 5b 32  ned char zSeed[2
3e80: 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  4];.    sqlite3_
3e90: 72 61 6e 64 6f 6d 6e 65 73 73 28 32 34 2c 20 7a  randomness(24, z
3ea0: 53 65 65 64 29 3b 0a 20 20 20 20 65 6e 63 6f 64  Seed);.    encod
3eb0: 65 31 36 28 7a 53 65 65 64 2c 28 75 6e 73 69 67  e16(zSeed,(unsig
3ec0: 6e 65 64 20 63 68 61 72 2a 29 7a 4e 6f 6e 63 65  ned char*)zNonce
3ed0: 2c 32 34 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ,24);.  }.  retu
3ee0: 72 6e 20 7a 4e 6f 6e 63 65 3b 0a 7d 0a 0a 2f 2a  rn zNonce;.}../*
3ef0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
3f00: 65 66 61 75 6c 74 20 43 6f 6e 74 65 6e 74 20 53  efault Content S
3f10: 65 63 75 72 69 74 79 20 50 6f 6c 69 63 79 20 28  ecurity Policy (
3f20: 43 53 50 29 20 73 74 72 69 6e 67 2e 0a 2a 2a 20  CSP) string..** 
3f30: 49 66 20 74 68 65 20 74 6f 48 65 61 64 65 72 20  If the toHeader 
3f40: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
3f50: 2c 20 74 68 65 6e 20 61 6c 73 6f 20 61 64 64 20  , then also add 
3f60: 74 68 65 0a 2a 2a 20 43 53 50 20 74 6f 20 74 68  the.** CSP to th
3f70: 65 20 48 54 54 50 20 72 65 70 6c 79 20 68 65 61  e HTTP reply hea
3f80: 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 43  der..**.** The C
3f90: 53 50 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68  SP comes from th
3fa0: 65 20 22 64 65 66 61 75 6c 74 2d 63 73 70 22 20  e "default-csp" 
3fb0: 73 65 74 74 69 6e 67 20 69 66 20 69 74 20 65 78  setting if it ex
3fc0: 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 73 20 6e  ists and.** is n
3fd0: 6f 6e 2d 65 6d 70 74 79 2e 20 20 49 66 20 74 68  on-empty.  If th
3fe0: 61 74 20 73 65 74 74 69 6e 67 20 69 73 20 61 6e  at setting is an
3ff0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74   empty string, t
4000: 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
4010: 67 0a 2a 2a 20 64 65 66 61 75 6c 74 20 69 73 20  g.** default is 
4020: 75 73 65 64 20 69 6e 73 74 65 61 64 3a 0a 2a 2a  used instead:.**
4030: 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c 74 2d  .**     default-
4040: 73 72 63 20 27 73 65 6c 66 27 20 64 61 74 61 3a  src 'self' data:
4050: 3b 0a 2a 2a 20 20 20 20 20 73 63 72 69 70 74 2d  ;.**     script-
4060: 73 72 63 20 27 73 65 6c 66 27 20 27 6e 6f 6e 63  src 'self' 'nonc
4070: 65 2d 24 6e 6f 6e 63 65 27 3b 0a 2a 2a 20 20 20  e-$nonce';.**   
4080: 20 20 73 74 79 6c 65 2d 73 72 63 20 27 73 65 6c    style-src 'sel
4090: 66 27 20 27 75 6e 73 61 66 65 2d 69 6e 6c 69 6e  f' 'unsafe-inlin
40a0: 65 27 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  e';.**.** The te
40b0: 78 74 20 27 24 6e 6f 6e 63 65 27 20 69 73 20 72  xt '$nonce' is r
40c0: 65 70 6c 61 63 65 64 20 62 79 20 73 74 79 6c 65  eplaced by style
40d0: 5f 6e 6f 6e 63 65 28 29 20 69 66 20 61 6e 64 20  _nonce() if and 
40e0: 77 68 65 72 65 65 76 65 72 20 69 74 0a 2a 2a 20  whereever it.** 
40f0: 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 69 6e  occurs in the in
4100: 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  put string..**.*
4110: 2a 20 54 68 65 20 73 74 72 69 6e 67 20 72 65 74  * The string ret
4120: 75 72 6e 65 64 20 69 73 20 6f 62 74 61 69 6e 65  urned is obtaine
4130: 64 20 66 72 6f 6d 20 66 6f 73 73 69 6c 5f 6d 61  d from fossil_ma
4140: 6c 6c 6f 63 28 29 20 61 6e 64 0a 2a 2a 20 73 68  lloc() and.** sh
4150: 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64  ould be released
4160: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
4170: 2a 2f 0a 63 68 61 72 20 2a 73 74 79 6c 65 5f 63  */.char *style_c
4180: 73 70 28 69 6e 74 20 74 6f 48 65 61 64 65 72 29  sp(int toHeader)
4190: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
41a0: 20 63 68 61 72 20 7a 42 61 63 6b 75 70 43 53 50   char zBackupCSP
41b0: 5b 5d 20 3d 20 0a 20 20 20 22 64 65 66 61 75 6c  [] = .   "defaul
41c0: 74 2d 73 72 63 20 27 73 65 6c 66 27 20 64 61 74  t-src 'self' dat
41d0: 61 3a 3b 20 22 0a 20 20 20 22 73 63 72 69 70 74  a:; ".   "script
41e0: 2d 73 72 63 20 27 73 65 6c 66 27 20 27 6e 6f 6e  -src 'self' 'non
41f0: 63 65 2d 24 6e 6f 6e 63 65 27 3b 20 22 0a 20 20  ce-$nonce'; ".  
4200: 20 22 73 74 79 6c 65 2d 73 72 63 20 27 73 65 6c   "style-src 'sel
4210: 66 27 20 27 75 6e 73 61 66 65 2d 69 6e 6c 69 6e  f' 'unsafe-inlin
4220: 65 27 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  e'";.  const cha
4230: 72 20 2a 7a 46 6f 72 6d 61 74 20 3d 20 64 62 5f  r *zFormat = db_
4240: 67 65 74 28 22 64 65 66 61 75 6c 74 2d 63 73 70  get("default-csp
4250: 22 2c 22 22 29 3b 0a 20 20 42 6c 6f 62 20 63 73  ","");.  Blob cs
4260: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 6e 63  p;.  char *zNonc
4270: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 43 73 70 3b  e;.  char *zCsp;
4280: 0a 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 5b 30  .  if( zFormat[0
4290: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 46 6f 72  ]==0 ){.    zFor
42a0: 6d 61 74 20 3d 20 7a 42 61 63 6b 75 70 43 53 50  mat = zBackupCSP
42b0: 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 69 6e 69  ;.  }.  blob_ini
42c0: 74 28 26 63 73 70 2c 20 30 2c 20 30 29 3b 0a 20  t(&csp, 0, 0);. 
42d0: 20 77 68 69 6c 65 28 20 7a 46 6f 72 6d 61 74 5b   while( zFormat[
42e0: 30 5d 20 26 26 20 28 7a 4e 6f 6e 63 65 20 3d 20  0] && (zNonce = 
42f0: 73 74 72 73 74 72 28 7a 46 6f 72 6d 61 74 2c 22  strstr(zFormat,"
4300: 24 6e 6f 6e 63 65 22 29 29 21 3d 30 20 29 7b 0a  $nonce"))!=0 ){.
4310: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28      blob_append(
4320: 26 63 73 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 28  &csp, zFormat, (
4330: 69 6e 74 29 28 7a 4e 6f 6e 63 65 20 2d 20 7a 46  int)(zNonce - zF
4340: 6f 72 6d 61 74 29 29 3b 0a 20 20 20 20 62 6c 6f  ormat));.    blo
4350: 62 5f 61 70 70 65 6e 64 28 26 63 73 70 2c 20 73  b_append(&csp, s
4360: 74 79 6c 65 5f 6e 6f 6e 63 65 28 29 2c 20 2d 31  tyle_nonce(), -1
4370: 29 3b 0a 20 20 20 20 7a 46 6f 72 6d 61 74 20 3d  );.    zFormat =
4380: 20 7a 4e 6f 6e 63 65 20 2b 20 36 3b 0a 20 20 7d   zNonce + 6;.  }
4390: 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26  .  blob_append(&
43a0: 63 73 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 2d 31  csp, zFormat, -1
43b0: 29 3b 0a 20 20 7a 43 73 70 20 3d 20 62 6c 6f 62  );.  zCsp = blob
43c0: 5f 73 74 72 28 26 63 73 70 29 3b 0a 20 20 69 66  _str(&csp);.  if
43d0: 28 20 74 6f 48 65 61 64 65 72 20 29 7b 0a 20 20  ( toHeader ){.  
43e0: 20 20 63 67 69 5f 70 72 69 6e 74 66 5f 68 65 61    cgi_printf_hea
43f0: 64 65 72 28 22 43 6f 6e 74 65 6e 74 2d 53 65 63  der("Content-Sec
4400: 75 72 69 74 79 2d 50 6f 6c 69 63 79 3a 20 25 73  urity-Policy: %s
4410: 5c 72 5c 6e 22 2c 20 7a 43 73 70 29 3b 0a 20 20  \r\n", zCsp);.  
4420: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 43 73 70 3b  }.  return zCsp;
4430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c  .}../*.** Defaul
4440: 74 20 48 54 4d 4c 20 70 61 67 65 20 68 65 61 64  t HTML page head
4450: 65 72 20 74 65 78 74 20 74 68 72 6f 75 67 68 20  er text through 
4460: 3c 62 6f 64 79 3e 2e 20 20 49 66 20 74 68 65 20  <body>.  If the 
4470: 72 65 70 6f 73 69 74 6f 72 79 2d 73 70 65 63 69  repository-speci
4480: 66 69 63 0a 2a 2a 20 68 65 61 64 65 72 20 74 65  fic.** header te
4490: 6d 70 6c 61 74 65 20 6c 61 63 6b 73 20 61 20 3c  mplate lacks a <
44a0: 62 6f 64 79 3e 20 74 61 67 2c 20 74 68 65 6e 20  body> tag, then 
44b0: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
44c0: 77 69 6e 67 20 69 73 0a 2a 2a 20 70 72 65 70 65  wing is.** prepe
44d0: 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nded..*/.static 
44e0: 63 68 61 72 20 7a 44 66 6c 74 48 65 61 64 65 72  char zDfltHeader
44f0: 5b 5d 20 3d 20 0a 40 20 3c 68 74 6d 6c 3e 0a 40  [] = .@ <html>.@
4500: 20 3c 68 65 61 64 3e 0a 40 20 3c 62 61 73 65 20   <head>.@ <base 
4510: 68 72 65 66 3d 22 24 62 61 73 65 75 72 6c 2f 24  href="$baseurl/$
4520: 63 75 72 72 65 6e 74 5f 70 61 67 65 22 20 2f 3e  current_page" />
4530: 0a 40 20 3c 6d 65 74 61 20 68 74 74 70 2d 65 71  .@ <meta http-eq
4540: 75 69 76 3d 22 43 6f 6e 74 65 6e 74 2d 53 65 63  uiv="Content-Sec
4550: 75 72 69 74 79 2d 50 6f 6c 69 63 79 22 20 63 6f  urity-Policy" co
4560: 6e 74 65 6e 74 3d 22 24 64 65 66 61 75 6c 74 5f  ntent="$default_
4570: 63 73 70 22 20 2f 3e 0a 40 20 3c 6d 65 74 61 20  csp" />.@ <meta 
4580: 6e 61 6d 65 3d 22 76 69 65 77 70 6f 72 74 22 20  name="viewport" 
4590: 63 6f 6e 74 65 6e 74 3d 22 77 69 64 74 68 3d 64  content="width=d
45a0: 65 76 69 63 65 2d 77 69 64 74 68 2c 20 69 6e 69  evice-width, ini
45b0: 74 69 61 6c 2d 73 63 61 6c 65 3d 31 2e 30 22 3e  tial-scale=1.0">
45c0: 0a 40 20 3c 74 69 74 6c 65 3e 24 3c 70 72 6f 6a  .@ <title>$<proj
45d0: 65 63 74 5f 6e 61 6d 65 3e 3a 20 24 3c 74 69 74  ect_name>: $<tit
45e0: 6c 65 3e 3c 2f 74 69 74 6c 65 3e 0a 40 20 3c 6c  le></title>.@ <l
45f0: 69 6e 6b 20 72 65 6c 3d 22 61 6c 74 65 72 6e 61  ink rel="alterna
4600: 74 65 22 20 74 79 70 65 3d 22 61 70 70 6c 69 63  te" type="applic
4610: 61 74 69 6f 6e 2f 72 73 73 2b 78 6d 6c 22 20 74  ation/rss+xml" t
4620: 69 74 6c 65 3d 22 52 53 53 20 46 65 65 64 22 20  itle="RSS Feed" 
4630: 5c 0a 40 20 20 68 72 65 66 3d 22 24 68 6f 6d 65  \.@  href="$home
4640: 2f 74 69 6d 65 6c 69 6e 65 2e 72 73 73 22 20 2f  /timeline.rss" /
4650: 3e 0a 40 20 3c 6c 69 6e 6b 20 72 65 6c 3d 22 73  >.@ <link rel="s
4660: 74 79 6c 65 73 68 65 65 74 22 20 68 72 65 66 3d  tylesheet" href=
4670: 22 24 73 74 79 6c 65 73 68 65 65 74 5f 75 72 6c  "$stylesheet_url
4680: 22 20 74 79 70 65 3d 22 74 65 78 74 2f 63 73 73  " type="text/css
4690: 22 20 2f 3e 0a 40 20 3c 2f 68 65 61 64 3e 0a 40  " />.@ </head>.@
46a0: 20 3c 62 6f 64 79 3e 0a 3b 0a 0a 2f 2a 0a 2a 2a   <body>.;../*.**
46b0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20   Initialize all 
46c0: 74 68 65 20 64 65 66 61 75 6c 74 20 54 48 31 20  the default TH1 
46d0: 76 61 72 69 61 62 6c 65 73 0a 2a 2f 0a 73 74 61  variables.*/.sta
46e0: 74 69 63 20 76 6f 69 64 20 73 74 79 6c 65 5f 69  tic void style_i
46f0: 6e 69 74 5f 74 68 31 5f 76 61 72 73 28 63 6f 6e  nit_th1_vars(con
4700: 73 74 20 63 68 61 72 20 2a 7a 54 69 74 6c 65 29  st char *zTitle)
4710: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
4720: 7a 4e 6f 6e 63 65 20 3d 20 73 74 79 6c 65 5f 6e  zNonce = style_n
4730: 6f 6e 63 65 28 29 3b 0a 20 20 63 68 61 72 20 2a  once();.  char *
4740: 7a 44 66 6c 74 43 73 70 3b 0a 0a 20 20 7a 44 66  zDfltCsp;..  zDf
4750: 6c 74 43 73 70 20 3d 20 73 74 79 6c 65 5f 63 73  ltCsp = style_cs
4760: 70 28 31 29 3b 0a 20 20 2f 2a 0a 20 20 2a 2a 20  p(1);.  /*.  ** 
4770: 44 6f 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65  Do not overwrite
4780: 20 74 68 65 20 54 48 31 20 76 61 72 69 61 62 6c   the TH1 variabl
4790: 65 20 22 64 65 66 61 75 6c 74 5f 63 73 70 22 20  e "default_csp" 
47a0: 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 61 73  if it exists, as
47b0: 20 74 68 69 73 0a 20 20 2a 2a 20 61 6c 6c 6f 77   this.  ** allow
47c0: 73 20 69 74 20 74 6f 20 62 65 20 70 72 6f 70 65  s it to be prope
47d0: 72 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 20 76  rly overridden v
47e0: 69 61 20 74 68 65 20 54 48 31 20 73 65 74 75 70  ia the TH1 setup
47f0: 20 73 63 72 69 70 74 20 28 69 2e 65 2e 20 69 74   script (i.e. it
4800: 0a 20 20 2a 2a 20 69 73 20 65 76 61 6c 75 61 74  .  ** is evaluat
4810: 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65  ed before the he
4820: 61 64 65 72 20 69 73 20 72 65 6e 64 65 72 65 64  ader is rendered
4830: 29 2e 0a 20 20 2a 2f 0a 20 20 54 68 5f 4d 61 79  )..  */.  Th_May
4840: 62 65 53 74 6f 72 65 28 22 64 65 66 61 75 6c 74  beStore("default
4850: 5f 63 73 70 22 2c 20 7a 44 66 6c 74 43 73 70 29  _csp", zDfltCsp)
4860: 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28  ;.  fossil_free(
4870: 7a 44 66 6c 74 43 73 70 29 3b 0a 20 20 54 68 5f  zDfltCsp);.  Th_
4880: 53 74 6f 72 65 28 22 6e 6f 6e 63 65 22 2c 20 7a  Store("nonce", z
4890: 4e 6f 6e 63 65 29 3b 0a 20 20 54 68 5f 53 74 6f  Nonce);.  Th_Sto
48a0: 72 65 28 22 70 72 6f 6a 65 63 74 5f 6e 61 6d 65  re("project_name
48b0: 22 2c 20 64 62 5f 67 65 74 28 22 70 72 6f 6a 65  ", db_get("proje
48c0: 63 74 2d 6e 61 6d 65 22 2c 22 55 6e 6e 61 6d 65  ct-name","Unname
48d0: 64 20 46 6f 73 73 69 6c 20 50 72 6f 6a 65 63 74  d Fossil Project
48e0: 22 29 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28  "));.  Th_Store(
48f0: 22 70 72 6f 6a 65 63 74 5f 64 65 73 63 72 69 70  "project_descrip
4900: 74 69 6f 6e 22 2c 20 64 62 5f 67 65 74 28 22 70  tion", db_get("p
4910: 72 6f 6a 65 63 74 2d 64 65 73 63 72 69 70 74 69  roject-descripti
4920: 6f 6e 22 2c 22 22 29 29 3b 0a 20 20 69 66 28 20  on",""));.  if( 
4930: 7a 54 69 74 6c 65 20 29 20 54 68 5f 53 74 6f 72  zTitle ) Th_Stor
4940: 65 28 22 74 69 74 6c 65 22 2c 20 7a 54 69 74 6c  e("title", zTitl
4950: 65 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28 22  e);.  Th_Store("
4960: 62 61 73 65 75 72 6c 22 2c 20 67 2e 7a 42 61 73  baseurl", g.zBas
4970: 65 55 52 4c 29 3b 0a 20 20 54 68 5f 53 74 6f 72  eURL);.  Th_Stor
4980: 65 28 22 73 65 63 75 72 65 75 72 6c 22 2c 20 66  e("secureurl", f
4990: 6f 73 73 69 6c 5f 77 61 6e 74 73 5f 68 74 74 70  ossil_wants_http
49a0: 73 28 31 29 3f 20 67 2e 7a 48 74 74 70 73 55 52  s(1)? g.zHttpsUR
49b0: 4c 3a 20 67 2e 7a 42 61 73 65 55 52 4c 29 3b 0a  L: g.zBaseURL);.
49c0: 20 20 54 68 5f 53 74 6f 72 65 28 22 68 6f 6d 65    Th_Store("home
49d0: 22 2c 20 67 2e 7a 54 6f 70 29 3b 0a 20 20 54 68  ", g.zTop);.  Th
49e0: 5f 53 74 6f 72 65 28 22 69 6e 64 65 78 5f 70 61  _Store("index_pa
49f0: 67 65 22 2c 20 64 62 5f 67 65 74 28 22 69 6e 64  ge", db_get("ind
4a00: 65 78 2d 70 61 67 65 22 2c 22 2f 68 6f 6d 65 22  ex-page","/home"
4a10: 29 29 3b 0a 20 20 69 66 28 20 6c 6f 63 61 6c 5f  ));.  if( local_
4a20: 7a 43 75 72 72 65 6e 74 50 61 67 65 3d 3d 30 20  zCurrentPage==0 
4a30: 29 20 73 74 79 6c 65 5f 73 65 74 5f 63 75 72 72  ) style_set_curr
4a40: 65 6e 74 5f 70 61 67 65 28 22 25 54 22 2c 20 67  ent_page("%T", g
4a50: 2e 7a 50 61 74 68 29 3b 0a 20 20 54 68 5f 53 74  .zPath);.  Th_St
4a60: 6f 72 65 28 22 63 75 72 72 65 6e 74 5f 70 61 67  ore("current_pag
4a70: 65 22 2c 20 6c 6f 63 61 6c 5f 7a 43 75 72 72 65  e", local_zCurre
4a80: 6e 74 50 61 67 65 29 3b 0a 20 20 54 68 5f 53 74  ntPage);.  Th_St
4a90: 6f 72 65 28 22 63 73 72 66 5f 74 6f 6b 65 6e 22  ore("csrf_token"
4aa0: 2c 20 67 2e 7a 43 73 72 66 54 6f 6b 65 6e 29 3b  , g.zCsrfToken);
4ab0: 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 72 65 6c  .  Th_Store("rel
4ac0: 65 61 73 65 5f 76 65 72 73 69 6f 6e 22 2c 20 52  ease_version", R
4ad0: 45 4c 45 41 53 45 5f 56 45 52 53 49 4f 4e 29 3b  ELEASE_VERSION);
4ae0: 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 6d 61 6e  .  Th_Store("man
4af0: 69 66 65 73 74 5f 76 65 72 73 69 6f 6e 22 2c 20  ifest_version", 
4b00: 4d 41 4e 49 46 45 53 54 5f 56 45 52 53 49 4f 4e  MANIFEST_VERSION
4b10: 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 6d  );.  Th_Store("m
4b20: 61 6e 69 66 65 73 74 5f 64 61 74 65 22 2c 20 4d  anifest_date", M
4b30: 41 4e 49 46 45 53 54 5f 44 41 54 45 29 3b 0a 20  ANIFEST_DATE);. 
4b40: 20 54 68 5f 53 74 6f 72 65 28 22 63 6f 6d 70 69   Th_Store("compi
4b50: 6c 65 72 5f 6e 61 6d 65 22 2c 20 43 4f 4d 50 49  ler_name", COMPI
4b60: 4c 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 75 72 6c  LER_NAME);.  url
4b70: 5f 76 61 72 28 22 73 74 79 6c 65 73 68 65 65 74  _var("stylesheet
4b80: 22 2c 20 22 63 73 73 22 2c 20 22 73 74 79 6c 65  ", "css", "style
4b90: 2e 63 73 73 22 29 3b 0a 20 20 69 6d 61 67 65 5f  .css");.  image_
4ba0: 75 72 6c 5f 76 61 72 28 22 6c 6f 67 6f 22 29 3b  url_var("logo");
4bb0: 0a 20 20 69 6d 61 67 65 5f 75 72 6c 5f 76 61 72  .  image_url_var
4bc0: 28 22 62 61 63 6b 67 72 6f 75 6e 64 22 29 3b 0a  ("background");.
4bd0: 20 20 69 66 28 20 21 6c 6f 67 69 6e 5f 69 73 5f    if( !login_is_
4be0: 6e 6f 62 6f 64 79 28 29 20 29 7b 0a 20 20 20 20  nobody() ){.    
4bf0: 54 68 5f 53 74 6f 72 65 28 22 6c 6f 67 69 6e 22  Th_Store("login"
4c00: 2c 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 7d  , g.zLogin);.  }
4c10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 61 77 20 74  .}../*.** Draw t
4c20: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 76 6f  he header..*/.vo
4c30: 69 64 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28  id style_header(
4c40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 69 74  const char *zTit
4c50: 6c 65 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  leFormat, ...){.
4c60: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
4c70: 63 68 61 72 20 2a 7a 54 69 74 6c 65 3b 0a 20 20  char *zTitle;.  
4c80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 48 65 61  const char *zHea
4c90: 64 65 72 20 3d 20 73 6b 69 6e 5f 67 65 74 28 22  der = skin_get("
4ca0: 68 65 61 64 65 72 22 29 3b 0a 20 20 6c 6f 67 69  header");.  logi
4cb0: 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69  n_check_credenti
4cc0: 61 6c 73 28 29 3b 0a 0a 20 20 76 61 5f 73 74 61  als();..  va_sta
4cd0: 72 74 28 61 70 2c 20 7a 54 69 74 6c 65 46 6f 72  rt(ap, zTitleFor
4ce0: 6d 61 74 29 3b 0a 20 20 7a 54 69 74 6c 65 20 3d  mat);.  zTitle =
4cf0: 20 76 6d 70 72 69 6e 74 66 28 7a 54 69 74 6c 65   vmprintf(zTitle
4d00: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
4d10: 61 5f 65 6e 64 28 61 70 29 3b 0a 0a 20 20 63 67  a_end(ap);..  cg
4d20: 69 5f 64 65 73 74 69 6e 61 74 69 6f 6e 28 43 47  i_destination(CG
4d30: 49 5f 48 45 41 44 45 52 29 3b 0a 0a 20 20 40 20  I_HEADER);..  @ 
4d40: 3c 21 44 4f 43 54 59 50 45 20 68 74 6d 6c 3e 0a  <!DOCTYPE html>.
4d50: 0a 20 20 69 66 28 20 67 2e 74 68 54 72 61 63 65  .  if( g.thTrace
4d60: 20 29 20 54 68 5f 54 72 61 63 65 28 22 42 45 47   ) Th_Trace("BEG
4d70: 49 4e 5f 48 45 41 44 45 52 3c 62 72 20 2f 3e 5c  IN_HEADER<br />\
4d80: 6e 22 2c 20 2d 31 29 3b 0a 0a 20 20 2f 2a 20 47  n", -1);..  /* G
4d90: 65 6e 65 72 61 74 65 20 74 68 65 20 68 65 61 64  enerate the head
4da0: 65 72 20 75 70 20 74 68 72 6f 75 67 68 20 74 68  er up through th
4db0: 65 20 6d 61 69 6e 20 6d 65 6e 75 20 2a 2f 0a 20  e main menu */. 
4dc0: 20 73 74 79 6c 65 5f 69 6e 69 74 5f 74 68 31 5f   style_init_th1_
4dd0: 76 61 72 73 28 7a 54 69 74 6c 65 29 3b 0a 20 20  vars(zTitle);.  
4de0: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c  if( sqlite3_strl
4df0: 69 6b 65 28 22 25 3c 62 6f 64 79 25 22 2c 20 7a  ike("%<body%", z
4e00: 48 65 61 64 65 72 2c 20 30 29 21 3d 30 20 29 7b  Header, 0)!=0 ){
4e10: 0a 20 20 20 20 54 68 5f 52 65 6e 64 65 72 28 7a  .    Th_Render(z
4e20: 44 66 6c 74 48 65 61 64 65 72 29 3b 0a 20 20 7d  DfltHeader);.  }
4e30: 0a 20 20 69 66 28 20 67 2e 74 68 54 72 61 63 65  .  if( g.thTrace
4e40: 20 29 20 54 68 5f 54 72 61 63 65 28 22 42 45 47   ) Th_Trace("BEG
4e50: 49 4e 5f 48 45 41 44 45 52 5f 53 43 52 49 50 54  IN_HEADER_SCRIPT
4e60: 3c 62 72 20 2f 3e 5c 6e 22 2c 20 2d 31 29 3b 0a  <br />\n", -1);.
4e70: 20 20 54 68 5f 52 65 6e 64 65 72 28 7a 48 65 61    Th_Render(zHea
4e80: 64 65 72 29 3b 0a 20 20 69 66 28 20 67 2e 74 68  der);.  if( g.th
4e90: 54 72 61 63 65 20 29 20 54 68 5f 54 72 61 63 65  Trace ) Th_Trace
4ea0: 28 22 45 4e 44 5f 48 45 41 44 45 52 3c 62 72 20  ("END_HEADER<br 
4eb0: 2f 3e 5c 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 68  />\n", -1);.  Th
4ec0: 5f 55 6e 73 74 6f 72 65 28 22 74 69 74 6c 65 22  _Unstore("title"
4ed0: 29 3b 20 20 20 2f 2a 20 41 76 6f 69 64 20 63 6f  );   /* Avoid co
4ee0: 6c 6c 69 73 69 6f 6e 73 20 77 69 74 68 20 74 69  llisions with ti
4ef0: 63 6b 65 74 20 66 69 65 6c 64 20 6e 61 6d 65 73  cket field names
4f00: 20 2a 2f 0a 20 20 63 67 69 5f 64 65 73 74 69 6e   */.  cgi_destin
4f10: 61 74 69 6f 6e 28 43 47 49 5f 42 4f 44 59 29 3b  ation(CGI_BODY);
4f20: 0a 20 20 67 2e 63 67 69 4f 75 74 70 75 74 20 3d  .  g.cgiOutput =
4f30: 20 31 3b 0a 20 20 68 65 61 64 65 72 48 61 73 42   1;.  headerHasB
4f40: 65 65 6e 47 65 6e 65 72 61 74 65 64 20 3d 20 31  eenGenerated = 1
4f50: 3b 0a 20 20 73 69 64 65 62 6f 78 55 73 65 64 20  ;.  sideboxUsed 
4f60: 3d 20 30 3b 0a 20 20 69 66 28 20 67 2e 70 65 72  = 0;.  if( g.per
4f70: 6d 2e 44 65 62 75 67 20 26 26 20 50 28 22 73 68  m.Debug && P("sh
4f80: 6f 77 71 70 22 29 20 29 7b 0a 20 20 20 20 40 20  owqp") ){.    @ 
4f90: 3c 64 69 76 20 63 6c 61 73 73 3d 22 64 65 62 75  <div class="debu
4fa0: 67 22 3e 0a 20 20 20 20 63 67 69 5f 70 72 69 6e  g">.    cgi_prin
4fb0: 74 5f 61 6c 6c 28 30 2c 20 30 29 3b 0a 20 20 20  t_all(0, 0);.   
4fc0: 20 40 20 3c 2f 64 69 76 3e 0a 20 20 7d 0a 7d 0a   @ </div>.  }.}.
4fd0: 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a 2f  .#if INTERFACE./
4fe0: 2a 20 41 6c 6c 6f 77 65 64 20 70 61 72 61 6d 65  * Allowed parame
4ff0: 74 65 72 73 20 66 6f 72 20 73 74 79 6c 65 5f 61  ters for style_a
5000: 64 75 6e 69 74 28 29 20 2a 2f 0a 23 64 65 66 69  dunit() */.#defi
5010: 6e 65 20 41 44 55 4e 49 54 5f 4f 46 46 20 20 20  ne ADUNIT_OFF   
5020: 20 20 20 20 20 30 78 30 30 30 31 20 20 20 20 20       0x0001     
5030: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
5040: 77 20 61 64 73 20 6f 6e 20 74 68 69 73 20 70 61  w ads on this pa
5050: 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41 44  ge */.#define AD
5060: 55 4e 49 54 5f 52 49 47 48 54 5f 4f 4b 20 20 20  UNIT_RIGHT_OK   
5070: 30 78 30 30 30 32 20 20 20 20 20 20 20 2f 2a 20  0x0002       /* 
5080: 52 69 67 68 74 2d 73 69 64 65 20 76 65 72 74 69  Right-side verti
5090: 63 61 6c 20 61 64 73 20 6f 6b 20 68 65 72 65 20  cal ads ok here 
50a0: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
50b0: 20 56 61 72 69 6f 75 73 20 70 61 67 65 20 69 6d   Various page im
50c0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61  plementations ca
50d0: 6e 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 69 6e  n invoke this in
50e0: 74 65 72 66 61 63 65 20 74 6f 20 6c 65 74 20 74  terface to let t
50f0: 68 65 0a 2a 2a 20 73 74 79 6c 65 20 6d 61 6e 61  he.** style mana
5100: 67 65 72 20 6b 6e 6f 77 20 77 68 61 74 20 6b 69  ger know what ki
5110: 6e 64 73 20 6f 66 20 61 64 73 20 61 72 65 20 61  nds of ads are a
5120: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
5130: 68 69 73 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  his page..*/.voi
5140: 64 20 73 74 79 6c 65 5f 61 64 75 6e 69 74 5f 63  d style_adunit_c
5150: 6f 6e 66 69 67 28 75 6e 73 69 67 6e 65 64 20 69  onfig(unsigned i
5160: 6e 74 20 6d 46 6c 61 67 73 29 7b 0a 20 20 61 64  nt mFlags){.  ad
5170: 55 6e 69 74 46 6c 61 67 73 20 3d 20 6d 46 6c 61  UnitFlags = mFla
5180: 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  gs;.}../*.** Ret
5190: 75 72 6e 20 74 68 65 20 74 65 78 74 20 6f 66 20  urn the text of 
51a0: 61 6e 20 61 64 2d 75 6e 69 74 2c 20 69 66 20 6f  an ad-unit, if o
51b0: 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6e  ne should be ren
51c0: 64 65 72 65 64 2e 20 20 52 65 74 75 72 6e 0a 2a  dered.  Return.*
51d0: 2a 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 61 64 2d  * NULL if no ad-
51e0: 75 6e 69 74 20 69 73 20 64 65 73 69 72 65 64 2e  unit is desired.
51f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 2a 70 41 64 46  .**.** The *pAdF
5200: 6c 61 67 20 76 61 6c 75 65 20 6d 69 67 68 74 20  lag value might 
5210: 62 65 20 73 65 74 20 74 6f 20 41 44 55 4e 49 54  be set to ADUNIT
5220: 5f 52 49 47 48 54 5f 4f 4b 20 69 66 20 74 68 69  _RIGHT_OK if thi
5230: 73 20 69 73 0a 2a 2a 20 61 20 72 69 67 68 74 2d  s is.** a right-
5240: 68 61 6e 64 20 76 65 72 74 69 63 61 6c 20 61 64  hand vertical ad
5250: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
5260: 74 20 63 68 61 72 20 2a 73 74 79 6c 65 5f 61 64  t char *style_ad
5270: 75 6e 69 74 5f 74 65 78 74 28 75 6e 73 69 67 6e  unit_text(unsign
5280: 65 64 20 69 6e 74 20 2a 70 41 64 46 6c 61 67 29  ed int *pAdFlag)
5290: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
52a0: 7a 41 64 20 3d 20 30 3b 0a 20 20 2a 70 41 64 46  zAd = 0;.  *pAdF
52b0: 6c 61 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  lag = 0;.  if( a
52c0: 64 55 6e 69 74 46 6c 61 67 73 20 26 20 41 44 55  dUnitFlags & ADU
52d0: 4e 49 54 5f 4f 46 46 20 29 20 72 65 74 75 72 6e  NIT_OFF ) return
52e0: 20 30 3b 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77   0;  /* Disallow
52f0: 20 61 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67   ads on this pag
5300: 65 20 2a 2f 0a 20 20 69 66 28 20 64 62 5f 67 65  e */.  if( db_ge
5310: 74 5f 62 6f 6f 6c 65 61 6e 28 22 61 64 75 6e 69  t_boolean("aduni
5320: 74 2d 64 69 73 61 62 6c 65 22 2c 30 29 20 29 20  t-disable",0) ) 
5330: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
5340: 67 2e 70 65 72 6d 2e 41 64 6d 69 6e 20 26 26 20  g.perm.Admin && 
5350: 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e 28 22  db_get_boolean("
5360: 61 64 75 6e 69 74 2d 6f 6d 69 74 2d 69 66 2d 61  adunit-omit-if-a
5370: 64 6d 69 6e 22 2c 30 29 20 29 7b 0a 20 20 20 20  dmin",0) ){.    
5380: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
5390: 69 66 28 20 21 6c 6f 67 69 6e 5f 69 73 5f 6e 6f  if( !login_is_no
53a0: 62 6f 64 79 28 29 0a 20 20 20 26 26 20 66 6f 73  body().   && fos
53b0: 73 69 6c 5f 73 74 72 63 6d 70 28 67 2e 7a 4c 6f  sil_strcmp(g.zLo
53c0: 67 69 6e 2c 22 61 6e 6f 6e 79 6d 6f 75 73 22 29  gin,"anonymous")
53d0: 21 3d 30 0a 20 20 20 26 26 20 64 62 5f 67 65 74  !=0.   && db_get
53e0: 5f 62 6f 6f 6c 65 61 6e 28 22 61 64 75 6e 69 74  _boolean("adunit
53f0: 2d 6f 6d 69 74 2d 69 66 2d 75 73 65 72 22 2c 30  -omit-if-user",0
5400: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
5410: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  n 0;.  }.  if( (
5420: 61 64 55 6e 69 74 46 6c 61 67 73 20 26 20 41 44  adUnitFlags & AD
5430: 55 4e 49 54 5f 52 49 47 48 54 5f 4f 4b 29 21 3d  UNIT_RIGHT_OK)!=
5440: 30 0a 20 20 20 26 26 20 21 66 6f 73 73 69 6c 5f  0.   && !fossil_
5450: 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 7a  all_whitespace(z
5460: 41 64 20 3d 20 64 62 5f 67 65 74 28 22 61 64 75  Ad = db_get("adu
5470: 6e 69 74 2d 72 69 67 68 74 22 2c 20 30 29 29 0a  nit-right", 0)).
5480: 20 20 20 26 26 20 21 63 67 69 5f 62 6f 64 79 5f     && !cgi_body_
5490: 63 6f 6e 74 61 69 6e 73 28 22 3c 74 61 62 6c 65  contains("<table
54a0: 22 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70 41 64  ").  ){.    *pAd
54b0: 46 6c 61 67 20 3d 20 41 44 55 4e 49 54 5f 52 49  Flag = ADUNIT_RI
54c0: 47 48 54 5f 4f 4b 3b 0a 20 20 20 20 72 65 74 75  GHT_OK;.    retu
54d0: 72 6e 20 7a 41 64 3b 0a 20 20 7d 65 6c 73 65 20  rn zAd;.  }else 
54e0: 69 66 28 20 21 66 6f 73 73 69 6c 5f 61 6c 6c 5f  if( !fossil_all_
54f0: 77 68 69 74 65 73 70 61 63 65 28 7a 41 64 20 3d  whitespace(zAd =
5500: 20 64 62 5f 67 65 74 28 22 61 64 75 6e 69 74 22   db_get("adunit"
5510: 2c 30 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ,0)) ){.    retu
5520: 72 6e 20 7a 41 64 3b 0a 20 20 7d 0a 20 20 72 65  rn zAd;.  }.  re
5530: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
5540: 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   Indicate that t
5550: 68 65 20 74 61 62 6c 65 2d 73 6f 72 74 69 6e 67  he table-sorting
5560: 20 6a 61 76 61 73 63 72 69 70 74 20 69 73 20 6e   javascript is n
5570: 65 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  eeded..*/.void s
5580: 74 79 6c 65 5f 74 61 62 6c 65 5f 73 6f 72 74 65  tyle_table_sorte
5590: 72 28 76 6f 69 64 29 7b 0a 20 20 6e 65 65 64 53  r(void){.  needS
55a0: 6f 72 74 4a 73 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  ortJs = 1;.}../*
55b0: 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
55c0: 74 20 74 68 65 20 61 63 63 6f 72 64 69 6f 6e 20  t the accordion 
55d0: 6a 61 76 61 73 63 72 69 70 74 20 69 73 20 6e 65  javascript is ne
55e0: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 74  eded..*/.void st
55f0: 79 6c 65 5f 61 63 63 6f 72 64 69 6f 6e 28 76 6f  yle_accordion(vo
5600: 69 64 29 7b 0a 20 20 6e 65 65 64 41 63 63 6f 72  id){.  needAccor
5610: 64 69 6f 6e 4a 73 20 3d 20 31 3b 0a 7d 0a 0a 2f  dionJs = 1;.}../
5620: 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
5630: 61 74 20 74 68 65 20 74 69 6d 65 6c 69 6e 65 20  at the timeline 
5640: 67 72 61 70 68 20 6a 61 76 61 73 63 72 69 70 74  graph javascript
5650: 20 69 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 76   is needed..*/.v
5660: 6f 69 64 20 73 74 79 6c 65 5f 67 72 61 70 68 5f  oid style_graph_
5670: 67 65 6e 65 72 61 74 6f 72 28 76 6f 69 64 29 7b  generator(void){
5680: 0a 20 20 6e 65 65 64 47 72 61 70 68 4a 73 20 3d  .  needGraphJs =
5690: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64   1;.}../*.** Ind
56a0: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 63  icate that the c
56b0: 6f 70 79 20 62 75 74 74 6f 6e 20 6a 61 76 61 73  opy button javas
56c0: 63 72 69 70 74 20 69 73 20 6e 65 65 64 65 64 2e  cript is needed.
56d0: 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 63  .*/.void style_c
56e0: 6f 70 79 62 75 74 74 6f 6e 5f 63 6f 6e 74 72 6f  opybutton_contro
56f0: 6c 28 76 6f 69 64 29 7b 0a 20 20 6e 65 65 64 43  l(void){.  needC
5700: 6f 70 79 42 74 6e 4a 73 20 3d 20 31 3b 0a 7d 0a  opyBtnJs = 1;.}.
5710: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
5720: 63 6f 64 65 20 74 6f 20 6c 6f 61 64 20 61 20 73  code to load a s
5730: 69 6e 67 6c 65 20 6a 61 76 61 73 63 72 69 70 74  ingle javascript
5740: 20 66 69 6c 65 0a 2a 2f 0a 76 6f 69 64 20 73 74   file.*/.void st
5750: 79 6c 65 5f 6c 6f 61 64 5f 6f 6e 65 5f 6a 73 5f  yle_load_one_js_
5760: 66 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  file(const char 
5770: 2a 7a 46 69 6c 65 29 7b 0a 20 20 40 20 3c 73 63  *zFile){.  @ <sc
5780: 72 69 70 74 20 73 72 63 3d 27 25 52 2f 62 75 69  ript src='%R/bui
5790: 6c 74 69 6e 2f 25 73 28 7a 46 69 6c 65 29 3f 69  ltin/%s(zFile)?i
57a0: 64 3d 25 53 28 66 6f 73 73 69 6c 5f 65 78 65 5f  d=%S(fossil_exe_
57b0: 69 64 28 29 29 27 3e 3c 2f 73 63 72 69 70 74 3e  id())'></script>
57c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 65 78  .}../*.** All ex
57d0: 74 72 61 20 4a 53 20 66 69 6c 65 73 20 74 6f 20  tra JS files to 
57e0: 6c 6f 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  load..*/.static 
57f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4a 73  const char *azJs
5800: 54 6f 4c 6f 61 64 5b 34 5d 3b 0a 73 74 61 74 69  ToLoad[4];.stati
5810: 63 20 69 6e 74 20 6e 4a 73 54 6f 4c 6f 61 64 20  c int nJsToLoad 
5820: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  = 0;../*.** Regi
5830: 73 74 65 72 20 61 20 6e 65 77 20 4a 53 20 66 69  ster a new JS fi
5840: 6c 65 20 74 6f 20 6c 6f 61 64 20 61 74 20 74 68  le to load at th
5850: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 6f 63  e end of the doc
5860: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
5870: 74 79 6c 65 5f 6c 6f 61 64 5f 6a 73 28 63 6f 6e  tyle_load_js(con
5880: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
5890: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
58a0: 69 3d 30 3b 20 69 3c 6e 4a 73 54 6f 4c 6f 61 64  i=0; i<nJsToLoad
58b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
58c0: 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a 4e  fossil_strcmp(zN
58d0: 61 6d 65 2c 20 61 7a 4a 73 54 6f 4c 6f 61 64 5b  ame, azJsToLoad[
58e0: 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  i])==0 ) return;
58f0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4a 73 54 6f  .  }.  if( nJsTo
5900: 4c 6f 61 64 3e 3d 73 69 7a 65 6f 66 28 61 7a 4a  Load>=sizeof(azJ
5910: 73 54 6f 4c 6f 61 64 29 2f 73 69 7a 65 6f 66 28  sToLoad)/sizeof(
5920: 61 7a 4a 73 54 6f 4c 6f 61 64 5b 30 5d 29 20 29  azJsToLoad[0]) )
5930: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e  {.    fossil_pan
5940: 69 63 28 22 74 6f 6f 20 6d 61 6e 79 20 4a 53 20  ic("too many JS 
5950: 66 69 6c 65 73 22 29 3b 0a 20 20 7d 0a 20 20 61  files");.  }.  a
5960: 7a 4a 73 54 6f 4c 6f 61 64 5b 6e 4a 73 54 6f 4c  zJsToLoad[nJsToL
5970: 6f 61 64 2b 2b 5d 20 3d 20 7a 4e 61 6d 65 3b 0a  oad++] = zName;.
5980: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
5990: 65 20 63 6f 64 65 20 74 6f 20 6c 6f 61 64 20 61  e code to load a
59a0: 6c 6c 20 72 65 71 75 69 72 65 64 20 6a 61 76 61  ll required java
59b0: 73 63 72 69 70 74 20 66 69 6c 65 73 2e 0a 2a 2f  script files..*/
59c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 79  .static void sty
59d0: 6c 65 5f 6c 6f 61 64 5f 61 6c 6c 5f 6a 73 5f 66  le_load_all_js_f
59e0: 69 6c 65 73 28 76 6f 69 64 29 7b 0a 20 20 69 6e  iles(void){.  in
59f0: 74 20 69 3b 0a 20 20 69 66 28 20 6e 65 65 64 48  t i;.  if( needH
5a00: 72 65 66 4a 73 20 29 7b 0a 20 20 20 20 69 6e 74  refJs ){.    int
5a10: 20 6e 44 65 6c 61 79 20 3d 20 64 62 5f 67 65 74   nDelay = db_get
5a20: 5f 69 6e 74 28 22 61 75 74 6f 2d 68 79 70 65 72  _int("auto-hyper
5a30: 6c 69 6e 6b 2d 64 65 6c 61 79 22 2c 30 29 3b 0a  link-delay",0);.
5a40: 20 20 20 20 69 6e 74 20 62 4d 6f 75 73 65 6f 76      int bMouseov
5a50: 65 72 20 3d 20 64 62 5f 67 65 74 5f 62 6f 6f 6c  er = db_get_bool
5a60: 65 61 6e 28 22 61 75 74 6f 2d 68 79 70 65 72 6c  ean("auto-hyperl
5a70: 69 6e 6b 2d 6d 6f 75 73 65 6f 76 65 72 22 2c 30  ink-mouseover",0
5a80: 29 3b 0a 20 20 20 20 40 20 3c 73 63 72 69 70 74  );.    @ <script
5a90: 20 69 64 3d 27 68 72 65 66 2d 64 61 74 61 27 20   id='href-data' 
5aa0: 74 79 70 65 3d 27 61 70 70 6c 69 63 61 74 69 6f  type='applicatio
5ab0: 6e 2f 6a 73 6f 6e 27 3e 5c 0a 20 20 20 20 40 20  n/json'>\.    @ 
5ac0: 7b 22 64 65 6c 61 79 22 3a 25 64 28 6e 44 65 6c  {"delay":%d(nDel
5ad0: 61 79 29 2c 22 6d 6f 75 73 65 6f 76 65 72 22 3a  ay),"mouseover":
5ae0: 25 64 28 62 4d 6f 75 73 65 6f 76 65 72 29 7d 3c  %d(bMouseover)}<
5af0: 2f 73 63 72 69 70 74 3e 0a 20 20 7d 0a 20 20 40  /script>.  }.  @
5b00: 20 3c 73 63 72 69 70 74 20 6e 6f 6e 63 65 3d 22   <script nonce="
5b10: 25 68 28 73 74 79 6c 65 5f 6e 6f 6e 63 65 28 29  %h(style_nonce()
5b20: 29 22 3e 0a 20 20 40 20 66 75 6e 63 74 69 6f 6e  )">.  @ function
5b30: 20 64 65 62 75 67 4d 73 67 28 6d 73 67 29 7b 0a   debugMsg(msg){.
5b40: 20 20 40 20 76 61 72 20 6e 20 3d 20 64 6f 63 75    @ var n = docu
5b50: 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42  ment.getElementB
5b60: 79 49 64 28 22 64 65 62 75 67 4d 73 67 22 29 3b  yId("debugMsg");
5b70: 0a 20 20 40 20 69 66 28 6e 29 7b 6e 2e 74 65 78  .  @ if(n){n.tex
5b80: 74 43 6f 6e 74 65 6e 74 3d 6d 73 67 3b 7d 0a 20  tContent=msg;}. 
5b90: 20 40 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 48   @ }.  if( needH
5ba0: 72 65 66 4a 73 20 29 7b 0a 20 20 20 20 63 67 69  refJs ){.    cgi
5bb0: 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28  _append_content(
5bc0: 62 75 69 6c 74 69 6e 5f 74 65 78 74 28 22 68 72  builtin_text("hr
5bd0: 65 66 2e 6a 73 22 29 2c 2d 31 29 3b 0a 20 20 7d  ef.js"),-1);.  }
5be0: 0a 20 20 69 66 28 20 6e 65 65 64 53 6f 72 74 4a  .  if( needSortJ
5bf0: 73 20 29 7b 0a 20 20 20 20 63 67 69 5f 61 70 70  s ){.    cgi_app
5c00: 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 62 75 69 6c  end_content(buil
5c10: 74 69 6e 5f 74 65 78 74 28 22 73 6f 72 74 74 61  tin_text("sortta
5c20: 62 6c 65 2e 6a 73 22 29 2c 2d 31 29 3b 0a 20 20  ble.js"),-1);.  
5c30: 7d 0a 20 20 69 66 28 20 6e 65 65 64 47 72 61 70  }.  if( needGrap
5c40: 68 4a 73 20 29 7b 0a 20 20 20 20 63 67 69 5f 61  hJs ){.    cgi_a
5c50: 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 62 75  ppend_content(bu
5c60: 69 6c 74 69 6e 5f 74 65 78 74 28 22 67 72 61 70  iltin_text("grap
5c70: 68 2e 6a 73 22 29 2c 2d 31 29 3b 0a 20 20 7d 0a  h.js"),-1);.  }.
5c80: 20 20 69 66 28 20 6e 65 65 64 43 6f 70 79 42 74    if( needCopyBt
5c90: 6e 4a 73 20 29 7b 0a 20 20 20 20 63 67 69 5f 61  nJs ){.    cgi_a
5ca0: 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 62 75  ppend_content(bu
5cb0: 69 6c 74 69 6e 5f 74 65 78 74 28 22 63 6f 70 79  iltin_text("copy
5cc0: 62 74 6e 2e 6a 73 22 29 2c 2d 31 29 3b 0a 20 20  btn.js"),-1);.  
5cd0: 7d 0a 20 20 69 66 28 20 6e 65 65 64 41 63 63 6f  }.  if( needAcco
5ce0: 72 64 69 6f 6e 4a 73 20 29 7b 0a 20 20 20 20 63  rdionJs ){.    c
5cf0: 67 69 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e  gi_append_conten
5d00: 74 28 62 75 69 6c 74 69 6e 5f 74 65 78 74 28 22  t(builtin_text("
5d10: 61 63 63 6f 72 64 69 6f 6e 2e 6a 73 22 29 2c 2d  accordion.js"),-
5d20: 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  1);.  }.  for(i=
5d30: 30 3b 20 69 3c 6e 4a 73 54 6f 4c 6f 61 64 3b 20  0; i<nJsToLoad; 
5d40: 69 2b 2b 29 7b 0a 20 20 20 20 63 67 69 5f 61 70  i++){.    cgi_ap
5d50: 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 62 75 69  pend_content(bui
5d60: 6c 74 69 6e 5f 74 65 78 74 28 61 7a 4a 73 54 6f  ltin_text(azJsTo
5d70: 4c 6f 61 64 5b 69 5d 29 2c 2d 31 29 3b 0a 20 20  Load[i]),-1);.  
5d80: 7d 0a 20 20 69 66 28 20 62 6c 6f 62 5f 73 69 7a  }.  if( blob_siz
5d90: 65 28 26 62 6c 6f 62 4f 6e 4c 6f 61 64 29 3e 30  e(&blobOnLoad)>0
5da0: 20 29 7b 0a 20 20 20 20 40 20 77 69 6e 64 6f 77   ){.    @ window
5db0: 2e 6f 6e 6c 6f 61 64 20 3d 20 66 75 6e 63 74 69  .onload = functi
5dc0: 6f 6e 28 29 7b 0a 20 20 20 20 63 67 69 5f 61 70  on(){.    cgi_ap
5dd0: 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 62 6c 6f  pend_content(blo
5de0: 62 5f 62 75 66 66 65 72 28 26 62 6c 6f 62 4f 6e  b_buffer(&blobOn
5df0: 4c 6f 61 64 29 2c 20 62 6c 6f 62 5f 73 69 7a 65  Load), blob_size
5e00: 28 26 62 6c 6f 62 4f 6e 4c 6f 61 64 29 29 3b 0a  (&blobOnLoad));.
5e10: 20 20 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63      cgi_append_c
5e20: 6f 6e 74 65 6e 74 28 22 5c 6e 7d 5c 6e 22 2c 20  ontent("\n}\n", 
5e30: 2d 31 29 3b 0a 20 20 7d 0a 20 20 40 20 3c 2f 73  -1);.  }.  @ </s
5e40: 63 72 69 70 74 3e 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  cript>.}../*.** 
5e50: 45 78 74 72 61 20 4a 53 20 74 6f 20 72 75 6e 20  Extra JS to run 
5e60: 61 66 74 65 72 20 61 6c 6c 20 63 6f 6e 74 65 6e  after all conten
5e70: 74 20 69 73 20 6c 6f 61 64 65 64 2e 0a 2a 2f 0a  t is loaded..*/.
5e80: 76 6f 69 64 20 73 74 79 6c 65 5f 6a 73 5f 6f 6e  void style_js_on
5e90: 6c 6f 61 64 28 63 6f 6e 73 74 20 63 68 61 72 20  load(const char 
5ea0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
5eb0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
5ec0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
5ed0: 72 6d 61 74 29 3b 0a 20 20 62 6c 6f 62 5f 76 61  rmat);.  blob_va
5ee0: 70 70 65 6e 64 66 28 26 62 6c 6f 62 4f 6e 4c 6f  ppendf(&blobOnLo
5ef0: 61 64 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ad, zFormat, ap)
5f00: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
5f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 61 77 20 74 68  }../*.** Draw th
5f20: 65 20 66 6f 6f 74 65 72 20 61 74 20 74 68 65 20  e footer at the 
5f30: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 70 61  bottom of the pa
5f40: 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c  ge..*/.void styl
5f50: 65 5f 66 6f 6f 74 65 72 28 76 6f 69 64 29 7b 0a  e_footer(void){.
5f60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
5f70: 6f 6f 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20 63  ooter;.  const c
5f80: 68 61 72 20 2a 7a 41 64 20 3d 20 30 3b 0a 20 20  har *zAd = 0;.  
5f90: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 41 64  unsigned int mAd
5fa0: 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 20 20 69 66  Flags = 0;..  if
5fb0: 28 20 21 68 65 61 64 65 72 48 61 73 42 65 65 6e  ( !headerHasBeen
5fc0: 47 65 6e 65 72 61 74 65 64 20 29 20 72 65 74 75  Generated ) retu
5fd0: 72 6e 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63  rn;..  /* Go bac
5fe0: 6b 20 61 6e 64 20 70 75 74 20 74 68 65 20 73 75  k and put the su
5ff0: 62 6d 65 6e 75 20 61 74 20 74 68 65 20 74 6f 70  bmenu at the top
6000: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 57   of the page.  W
6010: 65 20 64 65 6c 61 79 20 74 68 65 0a 20 20 2a 2a  e delay the.  **
6020: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
6030: 20 73 75 62 6d 65 6e 75 20 75 6e 74 69 6c 20 74   submenu until t
6040: 68 65 20 65 6e 64 20 73 6f 20 74 68 61 74 20 77  he end so that w
6050: 65 20 63 61 6e 20 61 64 64 20 65 6c 65 6d 65 6e  e can add elemen
6060: 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73  ts.  ** to the s
6070: 75 62 6d 65 6e 75 20 77 68 69 6c 65 20 67 65 6e  ubmenu while gen
6080: 65 72 61 74 69 6e 67 20 70 61 67 65 20 74 65 78  erating page tex
6090: 74 2e 0a 20 20 2a 2f 0a 20 20 63 67 69 5f 64 65  t..  */.  cgi_de
60a0: 73 74 69 6e 61 74 69 6f 6e 28 43 47 49 5f 48 45  stination(CGI_HE
60b0: 41 44 45 52 29 3b 0a 20 20 69 66 28 20 73 75 62  ADER);.  if( sub
60c0: 6d 65 6e 75 45 6e 61 62 6c 65 20 26 26 20 6e 53  menuEnable && nS
60d0: 75 62 6d 65 6e 75 2b 6e 53 75 62 6d 65 6e 75 43  ubmenu+nSubmenuC
60e0: 74 72 6c 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  trl>0 ){.    int
60f0: 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 53 75 62   i;.    if( nSub
6100: 6d 65 6e 75 43 74 72 6c 20 29 7b 0a 20 20 20 20  menuCtrl ){.    
6110: 20 20 40 20 3c 66 6f 72 6d 20 69 64 3d 27 66 30    @ <form id='f0
6120: 31 27 20 6d 65 74 68 6f 64 3d 27 47 45 54 27 20  1' method='GET' 
6130: 61 63 74 69 6f 6e 3d 27 25 52 2f 25 73 28 67 2e  action='%R/%s(g.
6140: 7a 50 61 74 68 29 27 3e 0a 20 20 20 20 20 20 40  zPath)'>.      @
6150: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 27 68 69   <input type='hi
6160: 64 64 65 6e 27 20 6e 61 6d 65 3d 27 75 64 63 27  dden' name='udc'
6170: 20 76 61 6c 75 65 3d 27 31 27 3e 0a 20 20 20 20   value='1'>.    
6180: 20 20 63 67 69 5f 74 61 67 5f 71 75 65 72 79 5f    cgi_tag_query_
6190: 70 61 72 61 6d 65 74 65 72 28 22 75 64 63 22 29  parameter("udc")
61a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 3c 64  ;.    }.    @ <d
61b0: 69 76 20 63 6c 61 73 73 3d 22 73 75 62 6d 65 6e  iv class="submen
61c0: 75 22 3e 0a 20 20 20 20 69 66 28 20 6e 53 75 62  u">.    if( nSub
61d0: 6d 65 6e 75 3e 30 20 29 7b 0a 20 20 20 20 20 20  menu>0 ){.      
61e0: 71 73 6f 72 74 28 61 53 75 62 6d 65 6e 75 2c 20  qsort(aSubmenu, 
61f0: 6e 53 75 62 6d 65 6e 75 2c 20 73 69 7a 65 6f 66  nSubmenu, sizeof
6200: 28 61 53 75 62 6d 65 6e 75 5b 30 5d 29 2c 20 73  (aSubmenu[0]), s
6210: 75 62 6d 65 6e 75 43 6f 6d 70 61 72 65 29 3b 0a  ubmenuCompare);.
6220: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
6230: 3c 6e 53 75 62 6d 65 6e 75 3b 20 69 2b 2b 29 7b  <nSubmenu; i++){
6240: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
6250: 53 75 62 6d 65 6e 75 20 2a 70 20 3d 20 26 61 53  Submenu *p = &aS
6260: 75 62 6d 65 6e 75 5b 69 5d 3b 0a 20 20 20 20 20  ubmenu[i];.     
6270: 20 20 20 69 66 28 20 70 2d 3e 7a 4c 69 6e 6b 3d     if( p->zLink=
6280: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6290: 40 20 3c 73 70 61 6e 20 63 6c 61 73 73 3d 22 6c  @ <span class="l
62a0: 61 62 65 6c 22 3e 25 68 28 70 2d 3e 7a 4c 61 62  abel">%h(p->zLab
62b0: 65 6c 29 3c 2f 73 70 61 6e 3e 0a 20 20 20 20 20  el)</span>.     
62c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
62d0: 20 20 20 20 40 20 3c 61 20 63 6c 61 73 73 3d 22      @ <a class="
62e0: 6c 61 62 65 6c 22 20 68 72 65 66 3d 22 25 68 28  label" href="%h(
62f0: 70 2d 3e 7a 4c 69 6e 6b 29 22 3e 25 68 28 70 2d  p->zLink)">%h(p-
6300: 3e 7a 4c 61 62 65 6c 29 3c 2f 61 3e 0a 20 20 20  >zLabel)</a>.   
6310: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6320: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
6330: 3b 20 69 3c 6e 53 75 62 6d 65 6e 75 43 74 72 6c  ; i<nSubmenuCtrl
6340: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
6350: 6e 73 74 20 63 68 61 72 20 2a 7a 51 50 4e 20 3d  nst char *zQPN =
6360: 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 69 5d   aSubmenuCtrl[i]
6370: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 63 6f  .zName;.      co
6380: 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 73 61 62  nst char *zDisab
6390: 6c 65 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  led = "";.      
63a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 58 74 72  const char *zXtr
63b0: 61 43 6c 61 73 73 20 3d 20 22 22 3b 0a 20 20 20  aClass = "";.   
63c0: 20 20 20 69 66 28 20 61 53 75 62 6d 65 6e 75 43     if( aSubmenuC
63d0: 74 72 6c 5b 69 5d 2e 65 56 69 73 69 62 6c 65 20  trl[i].eVisible 
63e0: 26 20 53 54 59 4c 45 5f 44 49 53 41 42 4c 45 44  & STYLE_DISABLED
63f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 69 73   ){.        zDis
6400: 61 62 6c 65 64 20 3d 20 22 20 64 69 73 61 62 6c  abled = " disabl
6410: 65 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ed";.      }else
6420: 20 69 66 28 20 7a 51 50 4e 20 29 7b 0a 20 20 20   if( zQPN ){.   
6430: 20 20 20 20 20 63 67 69 5f 74 61 67 5f 71 75 65       cgi_tag_que
6440: 72 79 5f 70 61 72 61 6d 65 74 65 72 28 7a 51 50  ry_parameter(zQP
6450: 4e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  N);.      }.    
6460: 20 20 73 77 69 74 63 68 28 20 61 53 75 62 6d 65    switch( aSubme
6470: 6e 75 43 74 72 6c 5b 69 5d 2e 65 54 79 70 65 20  nuCtrl[i].eType 
6480: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
6490: 46 46 5f 45 4e 54 52 59 3a 0a 20 20 20 20 20 20  FF_ENTRY:.      
64a0: 20 20 20 20 40 20 3c 73 70 61 6e 20 63 6c 61 73      @ <span clas
64b0: 73 3d 27 73 75 62 6d 65 6e 75 63 74 72 6c 25 73  s='submenuctrl%s
64c0: 28 7a 58 74 72 61 43 6c 61 73 73 29 27 3e 5c 0a  (zXtraClass)'>\.
64d0: 20 20 20 20 20 20 20 20 20 20 40 20 26 6e 62 73            @ &nbs
64e0: 70 3b 25 68 28 61 53 75 62 6d 65 6e 75 43 74 72  p;%h(aSubmenuCtr
64f0: 6c 5b 69 5d 2e 7a 4c 61 62 65 6c 29 5c 0a 20 20  l[i].zLabel)\.  
6500: 20 20 20 20 20 20 20 20 40 20 3c 69 6e 70 75 74          @ <input
6510: 20 74 79 70 65 3d 27 74 65 78 74 27 20 6e 61 6d   type='text' nam
6520: 65 3d 27 25 73 28 7a 51 50 4e 29 27 20 76 61 6c  e='%s(zQPN)' val
6530: 75 65 3d 27 25 68 28 50 44 28 7a 51 50 4e 2c 20  ue='%h(PD(zQPN, 
6540: 22 22 29 29 27 20 5c 0a 20 20 20 20 20 20 20 20  ""))' \.        
6550: 20 20 69 66 28 20 61 53 75 62 6d 65 6e 75 43 74    if( aSubmenuCt
6560: 72 6c 5b 69 5d 2e 69 53 69 7a 65 3c 30 20 29 7b  rl[i].iSize<0 ){
6570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 40 20 73  .            @ s
6580: 69 7a 65 3d 27 25 64 28 2d 61 53 75 62 6d 65 6e  ize='%d(-aSubmen
6590: 75 43 74 72 6c 5b 69 5d 2e 69 53 69 7a 65 29 27  uCtrl[i].iSize)'
65a0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   \.          }el
65b0: 73 65 20 69 66 28 20 61 53 75 62 6d 65 6e 75 43  se if( aSubmenuC
65c0: 74 72 6c 5b 69 5d 2e 69 53 69 7a 65 3e 30 20 29  trl[i].iSize>0 )
65d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 40 20  {.            @ 
65e0: 73 69 7a 65 3d 27 25 64 28 61 53 75 62 6d 65 6e  size='%d(aSubmen
65f0: 75 43 74 72 6c 5b 69 5d 2e 69 53 69 7a 65 29 27  uCtrl[i].iSize)'
6600: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 40   \.            @
6610: 20 6d 61 78 6c 65 6e 67 74 68 3d 27 25 64 28 61   maxlength='%d(a
6620: 53 75 62 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 69  SubmenuCtrl[i].i
6630: 53 69 7a 65 29 27 20 5c 0a 20 20 20 20 20 20 20  Size)' \.       
6640: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 40     }.          @
6650: 20 69 64 3d 27 73 75 62 6d 65 6e 75 63 74 72 6c   id='submenuctrl
6660: 2d 25 64 28 69 29 27 25 73 28 7a 44 69 73 61 62  -%d(i)'%s(zDisab
6670: 6c 65 64 29 3e 3c 2f 73 70 61 6e 3e 0a 20 20 20  led)></span>.   
6680: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6690: 20 20 20 20 20 20 63 61 73 65 20 46 46 5f 4d 55        case FF_MU
66a0: 4c 54 49 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  LTI: {.         
66b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
66c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
66d0: 61 6c 20 3d 20 50 28 7a 51 50 4e 29 3b 0a 20 20  al = P(zQPN);.  
66e0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 58 74 72          if( zXtr
66f0: 61 43 6c 61 73 73 5b 30 5d 20 29 7b 0a 20 20 20  aClass[0] ){.   
6700: 20 20 20 20 20 20 20 20 20 40 20 3c 73 70 61 6e           @ <span
6710: 20 63 6c 61 73 73 3d 27 25 73 28 7a 58 74 72 61   class='%s(zXtra
6720: 43 6c 61 73 73 2b 31 29 27 3e 0a 20 20 20 20 20  Class+1)'>.     
6730: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6740: 20 69 66 28 20 61 53 75 62 6d 65 6e 75 43 74 72   if( aSubmenuCtr
6750: 6c 5b 69 5d 2e 7a 4c 61 62 65 6c 20 29 7b 0a 20  l[i].zLabel ){. 
6760: 20 20 20 20 20 20 20 20 20 20 20 40 20 26 6e 62             @ &nb
6770: 73 70 3b 25 68 28 61 53 75 62 6d 65 6e 75 43 74  sp;%h(aSubmenuCt
6780: 72 6c 5b 69 5d 2e 7a 4c 61 62 65 6c 29 5c 0a 20  rl[i].zLabel)\. 
6790: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
67a0: 20 20 20 20 20 40 20 3c 73 65 6c 65 63 74 20 63       @ <select c
67b0: 6c 61 73 73 3d 27 73 75 62 6d 65 6e 75 63 74 72  lass='submenuctr
67c0: 6c 27 20 73 69 7a 65 3d 27 31 27 20 6e 61 6d 65  l' size='1' name
67d0: 3d 27 25 73 28 7a 51 50 4e 29 27 20 5c 0a 20 20  ='%s(zQPN)' \.  
67e0: 20 20 20 20 20 20 20 20 40 20 69 64 3d 27 73 75          @ id='su
67f0: 62 6d 65 6e 75 63 74 72 6c 2d 25 64 28 69 29 27  bmenuctrl-%d(i)'
6800: 25 73 28 7a 44 69 73 61 62 6c 65 64 29 3e 0a 20  %s(zDisabled)>. 
6810: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
6820: 3b 20 6a 3c 61 53 75 62 6d 65 6e 75 43 74 72 6c  ; j<aSubmenuCtrl
6830: 5b 69 5d 2e 69 53 69 7a 65 2a 32 3b 20 6a 2b 3d  [i].iSize*2; j+=
6840: 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2){.            
6850: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 50 56  const char *zQPV
6860: 20 3d 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b   = aSubmenuCtrl[
6870: 69 5d 2e 61 7a 43 68 6f 69 63 65 5b 6a 5d 3b 0a  i].azChoice[j];.
6880: 20 20 20 20 20 20 20 20 20 20 20 20 40 20 3c 6f              @ <o
6890: 70 74 69 6f 6e 20 76 61 6c 75 65 3d 27 25 68 28  ption value='%h(
68a0: 7a 51 50 56 29 27 5c 0a 20 20 20 20 20 20 20 20  zQPV)'\.        
68b0: 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73      if( fossil_s
68c0: 74 72 63 6d 70 28 7a 56 61 6c 2c 20 7a 51 50 56  trcmp(zVal, zQPV
68d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
68e0: 20 20 20 20 20 20 40 20 20 73 65 6c 65 63 74 65        @  selecte
68f0: 64 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  d\.            }
6900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 40 20 3e  .            @ >
6910: 25 68 28 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b  %h(aSubmenuCtrl[
6920: 69 5d 2e 61 7a 43 68 6f 69 63 65 5b 6a 2b 31 5d  i].azChoice[j+1]
6930: 29 3c 2f 6f 70 74 69 6f 6e 3e 0a 20 20 20 20 20  )</option>.     
6940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6950: 20 40 20 3c 2f 73 65 6c 65 63 74 3e 0a 20 20 20   @ </select>.   
6960: 20 20 20 20 20 20 20 69 66 28 20 7a 58 74 72 61         if( zXtra
6970: 43 6c 61 73 73 5b 30 5d 20 29 7b 0a 20 20 20 20  Class[0] ){.    
6980: 20 20 20 20 20 20 20 20 40 20 3c 2f 73 70 61 6e          @ </span
6990: 3e 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  >.          }.  
69a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
69b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
69c0: 20 63 61 73 65 20 46 46 5f 42 49 4e 41 52 59 3a   case FF_BINARY:
69d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
69e0: 20 69 73 54 72 75 65 20 3d 20 50 42 28 7a 51 50   isTrue = PB(zQP
69f0: 4e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 40 20  N);.          @ 
6a00: 3c 73 65 6c 65 63 74 20 63 6c 61 73 73 3d 27 73  <select class='s
6a10: 75 62 6d 65 6e 75 63 74 72 6c 25 73 28 7a 58 74  ubmenuctrl%s(zXt
6a20: 72 61 43 6c 61 73 73 29 27 20 73 69 7a 65 3d 27  raClass)' size='
6a30: 31 27 20 5c 0a 20 20 20 20 20 20 20 20 20 20 40  1' \.          @
6a40: 20 6e 61 6d 65 3d 27 25 73 28 7a 51 50 4e 29 27   name='%s(zQPN)'
6a50: 20 69 64 3d 27 73 75 62 6d 65 6e 75 63 74 72 6c   id='submenuctrl
6a60: 2d 25 64 28 69 29 27 25 73 28 7a 44 69 73 61 62  -%d(i)'%s(zDisab
6a70: 6c 65 64 29 3e 0a 20 20 20 20 20 20 20 20 20 20  led)>.          
6a80: 40 20 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d  @ <option value=
6a90: 27 31 27 5c 0a 20 20 20 20 20 20 20 20 20 20 69  '1'\.          i
6aa0: 66 28 20 69 73 54 72 75 65 20 29 7b 0a 20 20 20  f( isTrue ){.   
6ab0: 20 20 20 20 20 20 20 20 20 40 20 20 73 65 6c 65           @  sele
6ac0: 63 74 65 64 5c 0a 20 20 20 20 20 20 20 20 20 20  cted\.          
6ad0: 7d 0a 20 20 20 20 20 20 20 20 20 20 40 20 3e 25  }.          @ >%
6ae0: 68 28 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 69  h(aSubmenuCtrl[i
6af0: 5d 2e 7a 4c 61 62 65 6c 29 3c 2f 6f 70 74 69 6f  ].zLabel)</optio
6b00: 6e 3e 0a 20 20 20 20 20 20 20 20 20 20 40 20 3c  n>.          @ <
6b10: 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 27 30 27  option value='0'
6b20: 5c 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  \.          if( 
6b30: 21 69 73 54 72 75 65 20 29 7b 0a 20 20 20 20 20  !isTrue ){.     
6b40: 20 20 20 20 20 20 20 40 20 20 73 65 6c 65 63 74         @  select
6b50: 65 64 5c 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ed\.          }.
6b60: 20 20 20 20 20 20 20 20 20 20 40 20 3e 25 68 28            @ >%h(
6b70: 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e  aSubmenuCtrl[i].
6b80: 7a 46 61 6c 73 65 29 3c 2f 6f 70 74 69 6f 6e 3e  zFalse)</option>
6b90: 0a 20 20 20 20 20 20 20 20 20 20 40 20 3c 2f 73  .          @ </s
6ba0: 65 6c 65 63 74 3e 0a 20 20 20 20 20 20 20 20 20  elect>.         
6bb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6bc0: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 46  }.        case F
6bd0: 46 5f 43 48 45 43 4b 42 4f 58 3a 20 7b 0a 20 20  F_CHECKBOX: {.  
6be0: 20 20 20 20 20 20 20 20 40 20 3c 6c 61 62 65 6c          @ <label
6bf0: 20 63 6c 61 73 73 3d 27 73 75 62 6d 65 6e 75 63   class='submenuc
6c00: 74 72 6c 20 73 75 62 6d 65 6e 75 63 6b 62 6f 78  trl submenuckbox
6c10: 25 73 28 7a 58 74 72 61 43 6c 61 73 73 29 27 3e  %s(zXtraClass)'>
6c20: 5c 0a 20 20 20 20 20 20 20 20 20 20 40 20 3c 69  \.          @ <i
6c30: 6e 70 75 74 20 74 79 70 65 3d 27 63 68 65 63 6b  nput type='check
6c40: 62 6f 78 27 20 6e 61 6d 65 3d 27 25 73 28 7a 51  box' name='%s(zQ
6c50: 50 4e 29 27 20 69 64 3d 27 73 75 62 6d 65 6e 75  PN)' id='submenu
6c60: 63 74 72 6c 2d 25 64 28 69 29 27 20 5c 0a 20 20  ctrl-%d(i)' \.  
6c70: 20 20 20 20 20 20 20 20 69 66 28 20 50 42 28 7a          if( PB(z
6c80: 51 50 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  QPN) ){.        
6c90: 20 20 20 20 40 20 63 68 65 63 6b 65 64 20 5c 0a      @ checked \.
6ca0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6cb0: 20 20 20 20 20 20 69 66 28 20 61 53 75 62 6d 65        if( aSubme
6cc0: 6e 75 43 74 72 6c 5b 69 5d 2e 7a 4a 53 20 29 7b  nuCtrl[i].zJS ){
6cd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 40 20 64  .            @ d
6ce0: 61 74 61 2d 63 74 72 6c 3d 27 25 73 28 61 53 75  ata-ctrl='%s(aSu
6cf0: 62 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 7a 4a 53  bmenuCtrl[i].zJS
6d00: 29 27 25 73 28 7a 44 69 73 61 62 6c 65 64 29 3e  )'%s(zDisabled)>
6d10: 5c 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  \.          }els
6d20: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 40  e{.            @
6d30: 20 25 73 28 7a 44 69 73 61 62 6c 65 64 29 3e 5c   %s(zDisabled)>\
6d40: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6d50: 20 20 20 20 20 20 20 40 20 25 68 28 61 53 75 62         @ %h(aSub
6d60: 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 7a 4c 61 62  menuCtrl[i].zLab
6d70: 65 6c 29 3c 2f 6c 61 62 65 6c 3e 0a 20 20 20 20  el)</label>.    
6d80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6d90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6da0: 20 20 20 7d 0a 20 20 20 20 40 20 3c 2f 64 69 76     }.    @ </div
6db0: 3e 0a 20 20 20 20 69 66 28 20 6e 53 75 62 6d 65  >.    if( nSubme
6dc0: 6e 75 43 74 72 6c 20 29 7b 0a 20 20 20 20 20 20  nuCtrl ){.      
6dd0: 63 67 69 5f 71 75 65 72 79 5f 70 61 72 61 6d 65  cgi_query_parame
6de0: 74 65 72 73 5f 74 6f 5f 68 69 64 64 65 6e 28 29  ters_to_hidden()
6df0: 3b 0a 20 20 20 20 20 20 63 67 69 5f 74 61 67 5f  ;.      cgi_tag_
6e00: 71 75 65 72 79 5f 70 61 72 61 6d 65 74 65 72 28  query_parameter(
6e10: 30 29 3b 0a 20 20 20 20 20 20 40 20 3c 2f 66 6f  0);.      @ </fo
6e20: 72 6d 3e 0a 20 20 20 20 20 20 73 74 79 6c 65 5f  rm>.      style_
6e30: 6c 6f 61 64 5f 6f 6e 65 5f 6a 73 5f 66 69 6c 65  load_one_js_file
6e40: 28 22 6d 65 6e 75 2e 6a 73 22 29 3b 0a 20 20 20  ("menu.js");.   
6e50: 20 7d 0a 20 20 7d 0a 0a 20 20 7a 41 64 20 3d 20   }.  }..  zAd = 
6e60: 73 74 79 6c 65 5f 61 64 75 6e 69 74 5f 74 65 78  style_adunit_tex
6e70: 74 28 26 6d 41 64 46 6c 61 67 73 29 3b 0a 20 20  t(&mAdFlags);.  
6e80: 69 66 28 20 28 6d 41 64 46 6c 61 67 73 20 26 20  if( (mAdFlags & 
6e90: 41 44 55 4e 49 54 5f 52 49 47 48 54 5f 4f 4b 29  ADUNIT_RIGHT_OK)
6ea0: 21 3d 30 20 20 29 7b 0a 20 20 20 20 40 20 3c 64  !=0  ){.    @ <d
6eb0: 69 76 20 63 6c 61 73 73 3d 22 63 6f 6e 74 65 6e  iv class="conten
6ec0: 74 20 61 64 75 6e 69 74 5f 72 69 67 68 74 5f 63  t adunit_right_c
6ed0: 6f 6e 74 61 69 6e 65 72 22 3e 0a 20 20 20 20 40  ontainer">.    @
6ee0: 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 61 64 75   <div class="adu
6ef0: 6e 69 74 5f 72 69 67 68 74 22 3e 0a 20 20 20 20  nit_right">.    
6f00: 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65  cgi_append_conte
6f10: 6e 74 28 7a 41 64 2c 20 2d 31 29 3b 0a 20 20 20  nt(zAd, -1);.   
6f20: 20 40 20 3c 2f 64 69 76 3e 0a 20 20 7d 65 6c 73   @ </div>.  }els
6f30: 65 7b 0a 20 20 20 20 69 66 28 20 7a 41 64 20 29  e{.    if( zAd )
6f40: 7b 0a 20 20 20 20 20 20 40 20 3c 64 69 76 20 63  {.      @ <div c
6f50: 6c 61 73 73 3d 22 61 64 75 6e 69 74 5f 62 61 6e  lass="adunit_ban
6f60: 6e 65 72 22 3e 0a 20 20 20 20 20 20 63 67 69 5f  ner">.      cgi_
6f70: 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 7a  append_content(z
6f80: 41 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 40  Ad, -1);.      @
6f90: 20 3c 2f 64 69 76 3e 0a 20 20 20 20 7d 0a 20 20   </div>.    }.  
6fa0: 20 20 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22    @ <div class="
6fb0: 63 6f 6e 74 65 6e 74 22 3e 3c 73 70 61 6e 20 69  content"><span i
6fc0: 64 3d 22 64 65 62 75 67 4d 73 67 22 3e 3c 2f 73  d="debugMsg"></s
6fd0: 70 61 6e 3e 0a 20 20 7d 0a 20 20 63 67 69 5f 64  pan>.  }.  cgi_d
6fe0: 65 73 74 69 6e 61 74 69 6f 6e 28 43 47 49 5f 42  estination(CGI_B
6ff0: 4f 44 59 29 3b 0a 0a 20 20 69 66 28 20 73 69 64  ODY);..  if( sid
7000: 65 62 6f 78 55 73 65 64 20 29 7b 0a 20 20 20 20  eboxUsed ){.    
7010: 2f 2a 20 50 75 74 20 74 68 65 20 66 6f 6f 74 65  /* Put the foote
7020: 72 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  r at the bottom 
7030: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  of the page..   
7040: 20 2a 2a 20 74 68 65 20 61 64 64 69 74 69 6f 6e   ** the addition
7050: 61 6c 20 63 6c 65 61 72 2f 62 6f 74 68 20 69 73  al clear/both is
7060: 20 6e 65 65 64 65 64 20 74 6f 20 65 78 74 65 6e   needed to exten
7070: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 20 20  d the content.  
7080: 20 20 2a 2a 20 70 61 72 74 20 74 6f 20 74 68 65    ** part to the
7090: 20 65 6e 64 20 6f 66 20 61 6e 20 6f 70 74 69 6f   end of an optio
70a0: 6e 61 6c 20 73 69 64 65 62 6f 78 2e 0a 20 20 20  nal sidebox..   
70b0: 20 2a 2f 0a 20 20 20 20 40 20 3c 64 69 76 20 63   */.    @ <div c
70c0: 6c 61 73 73 3d 22 65 6e 64 43 6f 6e 74 65 6e 74  lass="endContent
70d0: 22 3e 3c 2f 64 69 76 3e 0a 20 20 7d 0a 20 20 40  "></div>.  }.  @
70e0: 20 3c 2f 64 69 76 3e 0a 0a 0a 0a 20 20 7a 46 6f   </div>....  zFo
70f0: 6f 74 65 72 20 3d 20 73 6b 69 6e 5f 67 65 74 28  oter = skin_get(
7100: 22 66 6f 6f 74 65 72 22 29 3b 0a 20 20 69 66 28  "footer");.  if(
7110: 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65   sqlite3_strlike
7120: 28 22 25 3c 2f 62 6f 64 79 3e 25 22 2c 20 7a 46  ("%</body>%", zF
7130: 6f 6f 74 65 72 2c 20 30 29 3d 3d 30 20 29 7b 0a  ooter, 0)==0 ){.
7140: 20 20 20 20 73 74 79 6c 65 5f 6c 6f 61 64 5f 61      style_load_a
7150: 6c 6c 5f 6a 73 5f 66 69 6c 65 73 28 29 3b 0a 20  ll_js_files();. 
7160: 20 7d 0a 20 20 69 66 28 20 67 2e 74 68 54 72 61   }.  if( g.thTra
7170: 63 65 20 29 20 54 68 5f 54 72 61 63 65 28 22 42  ce ) Th_Trace("B
7180: 45 47 49 4e 5f 46 4f 4f 54 45 52 3c 62 72 20 2f  EGIN_FOOTER<br /
7190: 3e 5c 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 68 5f  >\n", -1);.  Th_
71a0: 52 65 6e 64 65 72 28 7a 46 6f 6f 74 65 72 29 3b  Render(zFooter);
71b0: 0a 20 20 69 66 28 20 67 2e 74 68 54 72 61 63 65  .  if( g.thTrace
71c0: 20 29 20 54 68 5f 54 72 61 63 65 28 22 45 4e 44   ) Th_Trace("END
71d0: 5f 46 4f 4f 54 45 52 3c 62 72 20 2f 3e 5c 6e 22  _FOOTER<br />\n"
71e0: 2c 20 2d 31 29 3b 0a 0a 20 20 2f 2a 20 52 65 6e  , -1);..  /* Ren
71f0: 64 65 72 20 74 72 61 63 65 20 6c 6f 67 20 69 66  der trace log if
7200: 20 54 48 31 20 74 72 61 63 69 6e 67 20 69 73 20   TH1 tracing is 
7210: 65 6e 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 69 66  enabled. */.  if
7220: 28 20 67 2e 74 68 54 72 61 63 65 20 29 7b 0a 20  ( g.thTrace ){. 
7230: 20 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f     cgi_append_co
7240: 6e 74 65 6e 74 28 22 3c 73 70 61 6e 20 63 6c 61  ntent("<span cla
7250: 73 73 3d 5c 22 74 68 54 72 61 63 65 5c 22 3e 3c  ss=\"thTrace\"><
7260: 68 72 20 2f 3e 5c 6e 22 2c 20 2d 31 29 3b 0a 20  hr />\n", -1);. 
7270: 20 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f     cgi_append_co
7280: 6e 74 65 6e 74 28 62 6c 6f 62 5f 73 74 72 28 26  ntent(blob_str(&
7290: 67 2e 74 68 4c 6f 67 29 2c 20 62 6c 6f 62 5f 73  g.thLog), blob_s
72a0: 69 7a 65 28 26 67 2e 74 68 4c 6f 67 29 29 3b 0a  ize(&g.thLog));.
72b0: 20 20 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63      cgi_append_c
72c0: 6f 6e 74 65 6e 74 28 22 3c 2f 73 70 61 6e 3e 5c  ontent("</span>\
72d0: 6e 22 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20  n", -1);.  }..  
72e0: 2f 2a 20 41 64 64 20 64 6f 63 75 6d 65 6e 74 20  /* Add document 
72f0: 65 6e 64 20 6d 61 72 6b 20 69 66 20 69 74 20 77  end mark if it w
7300: 61 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 66 6f  as not in the fo
7310: 6f 74 65 72 20 2a 2f 0a 20 20 69 66 28 20 73 71  oter */.  if( sq
7320: 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 25  lite3_strlike("%
7330: 3c 2f 62 6f 64 79 3e 25 22 2c 20 7a 46 6f 6f 74  </body>%", zFoot
7340: 65 72 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20  er, 0)!=0 ){.   
7350: 20 73 74 79 6c 65 5f 6c 6f 61 64 5f 61 6c 6c 5f   style_load_all_
7360: 6a 73 5f 66 69 6c 65 73 28 29 3b 0a 20 20 20 20  js_files();.    
7370: 40 20 3c 2f 62 6f 64 79 3e 0a 20 20 20 20 40 20  @ </body>.    @ 
7380: 3c 2f 68 74 6d 6c 3e 0a 20 20 7d 0a 7d 0a 0a 2f  </html>.  }.}../
7390: 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 73 69 64  *.** Begin a sid
73a0: 65 2d 62 6f 78 20 6f 6e 20 74 68 65 20 72 69 67  e-box on the rig
73b0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
73c0: 61 20 70 61 67 65 2e 20 20 54 68 65 20 74 69 74  a page.  The tit
73d0: 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 77 69  le and.** the wi
73e0: 64 74 68 20 6f 66 20 74 68 65 20 62 6f 78 20 61  dth of the box a
73f0: 72 65 20 67 69 76 65 6e 20 61 73 20 61 72 67 75  re given as argu
7400: 6d 65 6e 74 73 2e 20 20 54 68 65 20 77 69 64 74  ments.  The widt
7410: 68 20 69 73 20 75 73 75 61 6c 6c 79 0a 2a 2a 20  h is usually.** 
7420: 61 20 70 65 72 63 65 6e 74 61 67 65 20 6f 66 20  a percentage of 
7430: 74 6f 74 61 6c 20 73 63 72 65 65 6e 20 77 69 64  total screen wid
7440: 74 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c  th..*/.void styl
7450: 65 5f 73 69 64 65 62 6f 78 5f 62 65 67 69 6e 28  e_sidebox_begin(
7460: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 69 74  const char *zTit
7470: 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
7480: 7a 57 69 64 74 68 29 7b 0a 20 20 73 69 64 65 62  zWidth){.  sideb
7490: 6f 78 55 73 65 64 20 3d 20 31 3b 0a 20 20 40 20  oxUsed = 1;.  @ 
74a0: 3c 64 69 76 20 63 6c 61 73 73 3d 22 73 69 64 65  <div class="side
74b0: 62 6f 78 22 20 73 74 79 6c 65 3d 22 77 69 64 74  box" style="widt
74c0: 68 3a 25 73 28 7a 57 69 64 74 68 29 22 3e 0a 20  h:%s(zWidth)">. 
74d0: 20 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 73   @ <div class="s
74e0: 69 64 65 62 6f 78 54 69 74 6c 65 22 3e 25 68 28  ideboxTitle">%h(
74f0: 7a 54 69 74 6c 65 29 3c 2f 64 69 76 3e 0a 7d 0a  zTitle)</div>.}.
7500: 0a 2f 2a 20 45 6e 64 20 74 68 65 20 73 69 64 65  ./* End the side
7510: 2d 62 6f 78 0a 2a 2f 0a 76 6f 69 64 20 73 74 79  -box.*/.void sty
7520: 6c 65 5f 73 69 64 65 62 6f 78 5f 65 6e 64 28 76  le_sidebox_end(v
7530: 6f 69 64 29 7b 0a 20 20 40 20 3c 2f 64 69 76 3e  oid){.  @ </div>
7540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
7550: 20 73 74 72 69 6e 67 20 7a 43 73 73 20 66 6f 72   string zCss for
7560: 20 7a 53 65 6c 65 63 74 6f 72 2e 0a 2a 2a 0a 2a   zSelector..**.*
7570: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
7580: 20 66 6f 75 6e 64 2e 20 20 52 65 74 75 72 6e 20   found.  Return 
7590: 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75  false if not fou
75a0: 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  nd.*/.static int
75b0: 20 63 6f 6e 74 61 69 6e 73 53 65 6c 65 63 74 6f   containsSelecto
75c0: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  r(const char *zC
75d0: 73 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ss, const char *
75e0: 7a 53 65 6c 65 63 74 6f 72 29 7b 0a 20 20 63 6f  zSelector){.  co
75f0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
7600: 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 73 65 6c 65  nt n;.  int sele
7610: 63 74 6f 72 4c 65 6e 20 3d 20 28 69 6e 74 29 73  ctorLen = (int)s
7620: 74 72 6c 65 6e 28 7a 53 65 6c 65 63 74 6f 72 29  trlen(zSelector)
7630: 3b 0a 0a 20 20 66 6f 72 28 7a 3d 7a 43 73 73 3b  ;..  for(z=zCss;
7640: 20 2a 7a 3b 20 7a 2b 3d 73 65 6c 65 63 74 6f 72   *z; z+=selector
7650: 4c 65 6e 29 7b 0a 20 20 20 20 7a 20 3d 20 73 74  Len){.    z = st
7660: 72 73 74 72 28 7a 2c 20 7a 53 65 6c 65 63 74 6f  rstr(z, zSelecto
7670: 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  r);.    if( z==0
7680: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
7690: 20 69 66 28 20 7a 21 3d 7a 43 73 73 20 29 7b 0a   if( z!=zCss ){.
76a0: 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 2d 31 3b        for( n=-1;
76b0: 20 7a 2b 6e 21 3d 7a 43 73 73 20 26 26 20 66 6f   z+n!=zCss && fo
76c0: 73 73 69 6c 5f 69 73 73 70 61 63 65 28 7a 5b 6e  ssil_isspace(z[n
76d0: 5d 29 3b 20 6e 2d 2d 29 3b 0a 20 20 20 20 20 20  ]); n--);.      
76e0: 69 66 28 20 7a 2b 6e 21 3d 7a 43 73 73 20 26 26  if( z+n!=zCss &&
76f0: 20 7a 5b 6e 5d 21 3d 27 2c 27 20 26 26 20 7a 5b   z[n]!=',' && z[
7700: 6e 5d 21 3d 20 27 7d 27 20 26 26 20 7a 5b 6e 5d  n]!= '}' && z[n]
7710: 21 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65  !='/' ) continue
7720: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
7730: 20 6e 3d 73 65 6c 65 63 74 6f 72 4c 65 6e 3b 20   n=selectorLen; 
7740: 7a 5b 6e 5d 20 26 26 20 66 6f 73 73 69 6c 5f 69  z[n] && fossil_i
7750: 73 73 70 61 63 65 28 7a 5b 6e 5d 29 3b 20 6e 2b  sspace(z[n]); n+
7760: 2b 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 5b 6e  + );.    if( z[n
7770: 5d 3d 3d 27 2c 27 20 7c 7c 20 7a 5b 6e 5d 3d 3d  ]==',' || z[n]==
7780: 27 7b 27 20 7c 7c 20 7a 5b 6e 5d 3d 3d 27 2f 27  '{' || z[n]=='/'
7790: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
77a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
77b0: 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74  /*.** COMMAND: t
77c0: 65 73 74 2d 63 6f 6e 74 61 69 6e 73 2d 73 65 6c  est-contains-sel
77d0: 65 63 74 6f 72 0a 2a 2a 0a 2a 2a 20 55 73 61 67  ector.**.** Usag
77e0: 65 3a 20 25 66 6f 73 73 69 6c 20 74 65 73 74 2d  e: %fossil test-
77f0: 63 6f 6e 74 61 69 6e 73 2d 73 65 6c 65 63 74 6f  contains-selecto
7800: 72 20 46 49 4c 45 4e 41 4d 45 20 53 45 4c 45 43  r FILENAME SELEC
7810: 54 4f 52 0a 2a 2a 0a 2a 2a 20 44 65 74 65 72 6d  TOR.**.** Determ
7820: 69 6e 65 20 69 66 20 74 68 65 20 43 53 53 20 73  ine if the CSS s
7830: 74 79 6c 65 73 68 65 65 74 20 46 49 4c 45 4e 41  tylesheet FILENA
7840: 4d 45 20 63 6f 6e 74 61 69 6e 73 20 53 45 4c 45  ME contains SELE
7850: 43 54 4f 52 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  CTOR..**.** Note
7860: 20 74 68 61 74 20 61 73 20 6f 66 20 32 30 32 30   that as of 2020
7870: 2d 30 35 2d 32 38 2c 20 74 68 65 20 64 65 66 61  -05-28, the defa
7880: 75 6c 74 20 72 75 6c 65 73 20 61 72 65 20 61 6c  ult rules are al
7890: 77 61 79 73 20 65 6d 69 74 74 65 64 2c 0a 2a 2a  ways emitted,.**
78a0: 20 73 6f 20 74 68 65 20 63 6f 6e 74 61 69 6e 73   so the contains
78b0: 53 65 6c 65 63 74 6f 72 28 29 20 6c 6f 67 69 63  Selector() logic
78c0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 70   is no longer ap
78d0: 70 6c 69 65 64 20 77 68 65 6e 20 65 6d 69 74 74  plied when emitt
78e0: 69 6e 67 0a 2a 2a 20 73 74 79 6c 65 2e 63 73 73  ing.** style.css
78f0: 2e 20 49 74 20 69 73 20 75 6e 63 6c 65 61 72 20  . It is unclear 
7900: 77 68 65 74 68 65 72 20 74 68 69 73 20 74 65 73  whether this tes
7910: 74 20 63 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 77  t command is now
7920: 20 6f 62 73 6f 6c 65 74 65 0a 2a 2a 20 6f 72 20   obsolete.** or 
7930: 77 68 65 74 68 65 72 20 69 74 20 6d 61 79 20 73  whether it may s
7940: 74 69 6c 6c 20 73 65 72 76 65 20 61 20 70 75 72  till serve a pur
7950: 70 6f 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6f  pose..*/.void co
7960: 6e 74 61 69 6e 73 5f 73 65 6c 65 63 74 6f 72 5f  ntains_selector_
7970: 63 6d 64 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74  cmd(void){.  int
7980: 20 66 6f 75 6e 64 3b 0a 20 20 63 68 61 72 20 2a   found;.  char *
7990: 7a 53 65 6c 65 63 74 6f 72 3b 0a 20 20 42 6c 6f  zSelector;.  Blo
79a0: 62 20 63 73 73 3b 0a 20 20 69 66 28 20 67 2e 61  b css;.  if( g.a
79b0: 72 67 63 21 3d 34 20 29 20 75 73 61 67 65 28 22  rgc!=4 ) usage("
79c0: 46 49 4c 45 4e 41 4d 45 20 53 45 4c 45 43 54 4f  FILENAME SELECTO
79d0: 52 22 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 61 64  R");.  blob_read
79e0: 5f 66 72 6f 6d 5f 66 69 6c 65 28 26 63 73 73 2c  _from_file(&css,
79f0: 20 67 2e 61 72 67 76 5b 32 5d 2c 20 45 78 74 46   g.argv[2], ExtF
7a00: 49 4c 45 29 3b 0a 20 20 7a 53 65 6c 65 63 74 6f  ILE);.  zSelecto
7a10: 72 20 3d 20 67 2e 61 72 67 76 5b 33 5d 3b 0a 20  r = g.argv[3];. 
7a20: 20 66 6f 75 6e 64 20 3d 20 63 6f 6e 74 61 69 6e   found = contain
7a30: 73 53 65 6c 65 63 74 6f 72 28 62 6c 6f 62 5f 73  sSelector(blob_s
7a40: 74 72 28 26 63 73 73 29 2c 20 7a 53 65 6c 65 63  tr(&css), zSelec
7a50: 74 6f 72 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70  tor);.  fossil_p
7a60: 72 69 6e 74 28 22 25 73 20 25 73 5c 6e 22 2c 20  rint("%s %s\n", 
7a70: 7a 53 65 6c 65 63 74 6f 72 2c 20 66 6f 75 6e 64  zSelector, found
7a80: 20 3f 20 22 66 6f 75 6e 64 22 20 3a 20 22 6e 6f   ? "found" : "no
7a90: 74 20 66 6f 75 6e 64 22 29 3b 0a 20 20 62 6c 6f  t found");.  blo
7aa0: 62 5f 72 65 73 65 74 28 26 63 73 73 29 3b 0a 7d  b_reset(&css);.}
7ab0: 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a  ../*.** WEBPAGE:
7ac0: 20 73 63 72 69 70 74 2e 6a 73 0a 2a 2a 0a 2a 2a   script.js.**.**
7ad0: 20 52 65 74 75 72 6e 20 74 68 65 20 22 4a 61 76   Return the "Jav
7ae0: 61 73 63 72 69 70 74 22 20 63 6f 6e 74 65 6e 74  ascript" content
7af0: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
7b00: 20 73 6b 69 6e 20 28 69 66 20 74 68 65 72 65 20   skin (if there 
7b10: 69 73 20 61 6e 79 29 0a 2a 2f 0a 76 6f 69 64 20  is any).*/.void 
7b20: 70 61 67 65 5f 73 63 72 69 70 74 5f 6a 73 28 76  page_script_js(v
7b30: 6f 69 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  oid){.  const ch
7b40: 61 72 20 2a 7a 53 63 72 69 70 74 20 3d 20 73 6b  ar *zScript = sk
7b50: 69 6e 5f 67 65 74 28 22 6a 73 22 29 3b 0a 20 20  in_get("js");.  
7b60: 69 66 28 20 50 28 22 74 65 73 74 22 29 20 29 7b  if( P("test") ){
7b70: 0a 20 20 20 20 2f 2a 20 52 65 6e 64 65 72 20 74  .    /* Render t
7b80: 68 65 20 73 63 72 69 70 74 20 61 73 20 70 6c 61  he script as pla
7b90: 69 6e 2d 74 65 78 74 20 66 6f 72 20 74 65 73 74  in-text for test
7ba0: 69 6e 67 20 70 75 72 70 6f 73 65 73 2c 20 69 66  ing purposes, if
7bb0: 20 74 68 65 20 22 74 65 73 74 22 0a 20 20 20 20   the "test".    
7bc0: 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ** query paramet
7bd0: 65 72 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  er is present */
7be0: 0a 20 20 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e  .    cgi_set_con
7bf0: 74 65 6e 74 5f 74 79 70 65 28 22 74 65 78 74 2f  tent_type("text/
7c00: 70 6c 61 69 6e 22 29 3b 0a 20 20 7d 65 6c 73 65  plain");.  }else
7c10: 7b 0a 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74  {.    /* Default
7c20: 20 62 65 68 61 76 69 6f 72 20 69 73 20 74 6f 20   behavior is to 
7c30: 72 65 74 75 72 6e 20 6a 61 76 61 73 63 72 69 70  return javascrip
7c40: 74 20 2a 2f 0a 20 20 20 20 63 67 69 5f 73 65 74  t */.    cgi_set
7c50: 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 65 28 22 61  _content_type("a
7c60: 70 70 6c 69 63 61 74 69 6f 6e 2f 6a 61 76 61 73  pplication/javas
7c70: 63 72 69 70 74 22 29 3b 0a 20 20 7d 0a 20 20 73  cript");.  }.  s
7c80: 74 79 6c 65 5f 69 6e 69 74 5f 74 68 31 5f 76 61  tyle_init_th1_va
7c90: 72 73 28 30 29 3b 0a 20 20 54 68 5f 52 65 6e 64  rs(0);.  Th_Rend
7ca0: 65 72 28 7a 53 63 72 69 70 74 3f 7a 53 63 72 69  er(zScript?zScri
7cb0: 70 74 3a 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pt:"");.}../*.**
7cc0: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 22   If one of the "
7cd0: 6e 61 6d 65 22 20 6f 72 20 22 70 61 67 65 22 20  name" or "page" 
7ce0: 55 52 4c 20 70 61 72 61 6d 65 74 65 72 73 20 28  URL parameters (
7cf0: 69 6e 20 74 68 61 74 20 6f 72 64 65 72 29 0a 2a  in that order).*
7d00: 2a 20 69 73 20 73 65 74 20 74 68 65 6e 20 74 68  * is set then th
7d10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 6f 6b  is function look
7d20: 73 20 66 6f 72 20 70 61 67 65 2f 70 61 67 65 20  s for page/page 
7d30: 67 72 6f 75 70 2d 73 70 65 63 69 66 69 63 0a 2a  group-specific.*
7d40: 2a 20 43 53 53 20 61 6e 64 20 28 69 66 20 66 6f  * CSS and (if fo
7d50: 75 6e 64 29 20 61 70 70 65 6e 64 73 20 69 74 20  und) appends it 
7d60: 74 6f 20 70 4f 75 74 2c 20 65 6c 73 65 20 69 74  to pOut, else it
7d70: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
7d80: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
7d90: 5f 73 74 79 6c 65 5f 63 73 73 5f 61 70 70 65 6e  _style_css_appen
7da0: 64 5f 70 61 67 65 5f 73 74 79 6c 65 28 42 6c 6f  d_page_style(Blo
7db0: 62 20 2a 70 4f 75 74 29 7b 0a 20 20 63 6f 6e 73  b *pOut){.  cons
7dc0: 74 20 63 68 61 72 20 2a 7a 50 61 67 65 20 3d 20  t char *zPage = 
7dd0: 50 44 28 22 6e 61 6d 65 22 2c 50 28 22 70 61 67  PD("name",P("pag
7de0: 65 22 29 29 3b 0a 20 20 63 68 61 72 20 2a 20 7a  e"));.  char * z
7df0: 46 69 6c 65 3b 0a 20 20 69 6e 74 20 6e 46 69 6c  File;.  int nFil
7e00: 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  e = 0;.  const c
7e10: 68 61 72 20 2a 7a 42 75 69 6c 74 69 6e 3b 0a 0a  har *zBuiltin;..
7e20: 20 20 69 66 28 7a 50 61 67 65 3d 3d 30 20 7c 7c    if(zPage==0 ||
7e30: 20 7a 50 61 67 65 5b 30 5d 3d 3d 30 29 7b 0a 20   zPage[0]==0){. 
7e40: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
7e50: 20 7a 46 69 6c 65 20 3d 20 6d 70 72 69 6e 74 66   zFile = mprintf
7e60: 28 22 73 74 79 6c 65 2e 25 73 2e 63 73 73 22 2c  ("style.%s.css",
7e70: 20 7a 50 61 67 65 29 3b 0a 20 20 7a 42 75 69 6c   zPage);.  zBuil
7e80: 74 69 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  tin = (const cha
7e90: 72 20 2a 29 62 75 69 6c 74 69 6e 5f 66 69 6c 65  r *)builtin_file
7ea0: 28 7a 46 69 6c 65 2c 20 26 6e 46 69 6c 65 29 3b  (zFile, &nFile);
7eb0: 0a 20 20 69 66 28 6e 46 69 6c 65 3e 30 29 7b 0a  .  if(nFile>0){.
7ec0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
7ed0: 28 70 4f 75 74 2c 0a 20 20 20 20 20 20 22 5c 6e  (pOut,.      "\n
7ee0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
7ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 5c 6e 22 0a  ************\n".
7f20: 20 20 20 20 20 20 22 2a 2a 20 53 74 61 72 74 20        "** Start 
7f30: 6f 66 20 70 61 67 65 2d 73 70 65 63 69 66 69 63  of page-specific
7f40: 20 43 53 53 20 66 6f 72 20 70 61 67 65 20 25 73   CSS for page %s
7f50: 2e 2e 2e 5c 6e 22 0a 20 20 20 20 20 20 22 2a 2a  ...\n".      "**
7f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 0a 20  *********/\n",. 
7fa0: 20 20 20 20 20 7a 50 61 67 65 29 3b 0a 20 20 20       zPage);.   
7fb0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 4f 75   blob_append(pOu
7fc0: 74 2c 20 7a 42 75 69 6c 74 69 6e 2c 20 6e 46 69  t, zBuiltin, nFi
7fd0: 6c 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70  le);.    blob_ap
7fe0: 70 65 6e 64 66 28 70 4f 75 74 2c 0a 20 20 20 20  pendf(pOut,.    
7ff0: 20 20 22 5c 6e 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    "\n/**********
8000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8030: 2a 5c 6e 22 0a 20 20 20 20 20 20 22 2a 2a 20 45  *\n".      "** E
8040: 6e 64 20 6f 66 20 70 61 67 65 2d 73 70 65 63 69  nd of page-speci
8050: 66 69 63 20 43 53 53 20 66 6f 72 20 70 61 67 65  fic CSS for page
8060: 20 25 73 2e 5c 6e 22 0a 20 20 20 20 20 20 22 2a   %s.\n".      "*
8070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 0a  **********/\n",.
80b0: 20 20 20 20 20 20 7a 50 61 67 65 29 3b 0a 20 20        zPage);.  
80c0: 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 46    fossil_free(zF
80d0: 69 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ile);.    return
80e0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 50 6f 74 65 6e  ;.  }.  /* Poten
80f0: 74 69 61 6c 20 54 4f 44 4f 3a 20 63 68 65 63 6b  tial TODO: check
8100: 20 66 6f 72 20 61 6c 69 61 73 65 73 2f 70 61 67   for aliases/pag
8110: 65 20 67 72 6f 75 70 73 2e 20 65 2e 67 2e 20 67  e groups. e.g. g
8120: 72 6f 75 70 20 61 6c 6c 0a 20 20 2a 2a 20 2f 66  roup all.  ** /f
8130: 6f 72 75 6d 58 59 5a 20 43 53 53 20 69 6e 74 6f  orumXYZ CSS into
8140: 20 6f 6e 65 20 66 69 6c 65 2c 20 61 6c 6c 20 2f   one file, all /
8150: 73 65 74 75 70 58 59 5a 20 69 6e 74 6f 20 61 6e  setupXYZ into an
8160: 6f 74 68 65 72 2c 20 65 74 63 2e 20 41 73 0a 20  other, etc. As. 
8170: 20 2a 2a 20 6f 66 20 74 68 69 73 20 77 72 69 74   ** of this writ
8180: 69 6e 67 2c 20 64 6f 69 6e 67 20 73 6f 20 77 6f  ing, doing so wo
8190: 75 6c 64 20 6f 6e 6c 79 20 73 68 61 76 65 20 61  uld only shave a
81a0: 20 66 65 77 20 6b 62 20 66 72 6f 6d 0a 20 20 2a   few kb from.  *
81b0: 2a 20 64 65 66 61 75 6c 74 2e 63 73 73 2e 20 2a  * default.css. *
81c0: 2f 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28  /.  fossil_free(
81d0: 7a 46 69 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zFile);.}../*.**
81e0: 20 57 45 42 50 41 47 45 3a 20 73 74 79 6c 65 2e   WEBPAGE: style.
81f0: 63 73 73 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  css.**.** Return
8200: 20 74 68 65 20 73 74 79 6c 65 20 73 68 65 65 74   the style sheet
8210: 2e 0a 2a 2f 0a 76 6f 69 64 20 70 61 67 65 5f 73  ..*/.void page_s
8220: 74 79 6c 65 5f 63 73 73 28 76 6f 69 64 29 7b 0a  tyle_css(void){.
8230: 20 20 42 6c 6f 62 20 63 73 73 20 3d 20 65 6d 70    Blob css = emp
8240: 74 79 5f 62 6c 6f 62 3b 0a 20 20 69 6e 74 20 69  ty_blob;.  int i
8250: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
8260: 20 7a 44 65 66 61 75 6c 74 73 3b 0a 0a 20 20 63   zDefaults;..  c
8270: 67 69 5f 73 65 74 5f 63 6f 6e 74 65 6e 74 5f 74  gi_set_content_t
8280: 79 70 65 28 22 74 65 78 74 2f 63 73 73 22 29 3b  ype("text/css");
8290: 0a 20 20 2f 2a 20 45 6d 69 74 20 61 6c 6c 20 64  .  /* Emit all d
82a0: 65 66 61 75 6c 74 20 72 75 6c 65 73 2e 2e 2e 20  efault rules... 
82b0: 2a 2f 0a 20 20 7a 44 65 66 61 75 6c 74 73 20 3d  */.  zDefaults =
82c0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 62 75   (const char*)bu
82d0: 69 6c 74 69 6e 5f 66 69 6c 65 28 22 64 65 66 61  iltin_file("defa
82e0: 75 6c 74 2e 63 73 73 22 2c 20 26 69 29 3b 0a 20  ult.css", &i);. 
82f0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 63 73   blob_append(&cs
8300: 73 2c 20 7a 44 65 66 61 75 6c 74 73 2c 20 69 29  s, zDefaults, i)
8310: 3b 0a 20 20 2f 2a 20 50 61 67 65 2d 73 70 65 63  ;.  /* Page-spec
8320: 69 66 69 63 20 43 53 53 2c 20 69 66 20 61 6e 79  ific CSS, if any
8330: 2e 2e 2e 20 2a 2f 0a 20 20 70 61 67 65 5f 73 74  ... */.  page_st
8340: 79 6c 65 5f 63 73 73 5f 61 70 70 65 6e 64 5f 70  yle_css_append_p
8350: 61 67 65 5f 73 74 79 6c 65 28 26 63 73 73 29 3b  age_style(&css);
8360: 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26  .  blob_append(&
8370: 63 73 73 2c 0a 20 20 20 20 20 22 5c 6e 2f 2a 2a  css,.     "\n/**
8380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
83a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
83b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 5c 6e 22 0a 20 20 20  *********\n".   
83c0: 20 20 22 2a 2a 20 41 6c 6c 20 43 53 53 20 77 68    "** All CSS wh
83d0: 69 63 68 20 66 6f 6c 6c 6f 77 73 20 69 73 20 73  ich follows is s
83e0: 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 72  upplied by the r
83f0: 65 70 6f 73 69 74 6f 72 79 20 5c 22 73 6b 69 6e  epository \"skin
8400: 5c 22 2e 5c 6e 22 0a 20 20 20 20 20 22 2a 2a 2a  \".\n".     "***
8410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8440: 2a 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 0a 20 20  ********/\n",.  
8450: 20 20 20 2d 31 29 3b 0a 20 20 62 6c 6f 62 5f 61     -1);.  blob_a
8460: 70 70 65 6e 64 28 26 63 73 73 2c 73 6b 69 6e 5f  ppend(&css,skin_
8470: 67 65 74 28 22 63 73 73 22 29 2c 2d 31 29 3b 0a  get("css"),-1);.
8480: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 72    /* Process thr
8490: 6f 75 67 68 20 54 48 31 20 69 6e 20 6f 72 64 65  ough TH1 in orde
84a0: 72 20 74 6f 20 67 69 76 65 20 61 6e 20 6f 70 70  r to give an opp
84b0: 6f 72 74 75 6e 69 74 79 20 74 6f 20 73 75 62 73  ortunity to subs
84c0: 74 69 74 75 74 65 0a 20 20 2a 2a 20 76 61 72 69  titute.  ** vari
84d0: 61 62 6c 65 73 20 73 75 63 68 20 61 73 20 24 62  ables such as $b
84e0: 61 73 65 75 72 6c 2e 0a 20 20 2a 2f 0a 20 20 54  aseurl..  */.  T
84f0: 68 5f 53 74 6f 72 65 28 22 62 61 73 65 75 72 6c  h_Store("baseurl
8500: 22 2c 20 67 2e 7a 42 61 73 65 55 52 4c 29 3b 0a  ", g.zBaseURL);.
8510: 20 20 54 68 5f 53 74 6f 72 65 28 22 73 65 63 75    Th_Store("secu
8520: 72 65 75 72 6c 22 2c 20 66 6f 73 73 69 6c 5f 77  reurl", fossil_w
8530: 61 6e 74 73 5f 68 74 74 70 73 28 31 29 3f 20 67  ants_https(1)? g
8540: 2e 7a 48 74 74 70 73 55 52 4c 3a 20 67 2e 7a 42  .zHttpsURL: g.zB
8550: 61 73 65 55 52 4c 29 3b 0a 20 20 54 68 5f 53 74  aseURL);.  Th_St
8560: 6f 72 65 28 22 68 6f 6d 65 22 2c 20 67 2e 7a 54  ore("home", g.zT
8570: 6f 70 29 3b 0a 20 20 69 6d 61 67 65 5f 75 72 6c  op);.  image_url
8580: 5f 76 61 72 28 22 6c 6f 67 6f 22 29 3b 0a 20 20  _var("logo");.  
8590: 69 6d 61 67 65 5f 75 72 6c 5f 76 61 72 28 22 62  image_url_var("b
85a0: 61 63 6b 67 72 6f 75 6e 64 22 29 3b 0a 20 20 54  ackground");.  T
85b0: 68 5f 52 65 6e 64 65 72 28 62 6c 6f 62 5f 73 74  h_Render(blob_st
85c0: 72 28 26 63 73 73 29 29 3b 0a 0a 20 20 2f 2a 20  r(&css));..  /* 
85d0: 54 65 6c 6c 20 43 47 49 20 74 68 61 74 20 74 68  Tell CGI that th
85e0: 65 20 63 6f 6e 74 65 6e 74 20 72 65 74 75 72 6e  e content return
85f0: 65 64 20 62 79 20 74 68 69 73 20 70 61 67 65 20  ed by this page 
8600: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 61  is considered ca
8610: 63 68 65 61 62 6c 65 20 2a 2f 0a 20 20 67 2e 69  cheable */.  g.i
8620: 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  sConst = 1;.}../
8630: 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 62 75  *.** WEBPAGE: bu
8640: 69 6c 74 69 6e 0a 2a 2a 20 55 52 4c 3a 20 20 62  iltin.** URL:  b
8650: 75 69 6c 74 69 6e 2f 46 49 4c 45 4e 41 4d 45 0a  uiltin/FILENAME.
8660: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
8670: 20 62 75 69 6c 74 2d 69 6e 20 74 65 78 74 20 67   built-in text g
8680: 69 76 65 6e 20 62 79 20 46 49 4c 45 4e 41 4d 45  iven by FILENAME
8690: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
86a0: 69 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 62  internally .** b
86b0: 79 20 6d 61 6e 79 20 46 6f 73 73 69 6c 20 77 65  y many Fossil we
86c0: 62 20 70 61 67 65 73 20 74 6f 20 6c 6f 61 64 20  b pages to load 
86d0: 62 75 69 6c 74 2d 69 6e 20 6a 61 76 61 73 63 72  built-in javascr
86e0: 69 70 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ipt files..**.**
86f0: 20 49 66 20 74 68 65 20 69 64 3d 20 71 75 65 72   If the id= quer
8700: 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  y parameter is p
8710: 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 46 6f 73  resent, then Fos
8720: 73 69 6c 20 61 73 73 75 6d 65 73 20 74 68 61 74  sil assumes that
8730: 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69   the.** result i
8740: 73 20 69 6d 6d 75 74 61 62 6c 65 20 61 6e 64 20  s immutable and 
8750: 73 65 74 73 20 61 20 76 65 72 79 20 6c 61 72 67  sets a very larg
8760: 65 20 63 61 63 68 65 20 72 65 74 65 6e 74 69 6f  e cache retentio
8770: 6e 20 74 69 6d 65 20 28 31 20 79 65 61 72 29 2e  n time (1 year).
8780: 0a 2a 2f 0a 76 6f 69 64 20 70 61 67 65 5f 62 75  .*/.void page_bu
8790: 69 6c 74 69 6e 5f 74 65 78 74 28 76 6f 69 64 29  iltin_text(void)
87a0: 7b 0a 20 20 42 6c 6f 62 20 6f 75 74 3b 0a 20 20  {.  Blob out;.  
87b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
87c0: 65 20 3d 20 50 28 22 6e 61 6d 65 22 29 3b 0a 20  e = P("name");. 
87d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 78   const char *zTx
87e0: 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  t = 0;.  const c
87f0: 68 61 72 20 2a 7a 49 64 20 3d 20 50 28 22 69 64  har *zId = P("id
8800: 22 29 3b 0a 20 20 69 6e 74 20 6e 49 64 3b 0a 20  ");.  int nId;. 
8810: 20 69 66 28 20 7a 4e 61 6d 65 20 29 20 7a 54 78   if( zName ) zTx
8820: 74 20 3d 20 62 75 69 6c 74 69 6e 5f 74 65 78 74  t = builtin_text
8830: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (zName);.  if( z
8840: 54 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 63 67  Txt==0 ){.    cg
8850: 69 5f 73 65 74 5f 73 74 61 74 75 73 28 34 30 34  i_set_status(404
8860: 2c 20 22 4e 6f 74 20 46 6f 75 6e 64 22 29 3b 0a  , "Not Found");.
8870: 20 20 20 20 40 20 46 69 6c 65 20 22 25 68 28 7a      @ File "%h(z
8880: 4e 61 6d 65 29 22 20 6e 6f 74 20 66 6f 75 6e 64  Name)" not found
8890: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
88a0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
88b0: 74 72 67 6c 6f 62 28 22 2a 2e 6a 73 22 2c 20 7a  trglob("*.js", z
88c0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
88d0: 63 67 69 5f 73 65 74 5f 63 6f 6e 74 65 6e 74 5f  cgi_set_content_
88e0: 74 79 70 65 28 22 61 70 70 6c 69 63 61 74 69 6f  type("applicatio
88f0: 6e 2f 6a 61 76 61 73 63 72 69 70 74 22 29 3b 0a  n/javascript");.
8900: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 67 69    }else{.    cgi
8910: 5f 73 65 74 5f 63 6f 6e 74 65 6e 74 5f 74 79 70  _set_content_typ
8920: 65 28 22 74 65 78 74 2f 70 6c 61 69 6e 22 29 3b  e("text/plain");
8930: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 49 64 20 26  .  }.  if( zId &
8940: 26 20 28 6e 49 64 20 3d 20 28 69 6e 74 29 73 74  & (nId = (int)st
8950: 72 6c 65 6e 28 7a 49 64 29 29 3e 3d 38 20 26 26  rlen(zId))>=8 &&
8960: 20 73 74 72 6e 63 6d 70 28 7a 49 64 2c 4d 41 4e   strncmp(zId,MAN
8970: 49 46 45 53 54 5f 55 55 49 44 2c 6e 49 64 29 3d  IFEST_UUID,nId)=
8980: 3d 30 20 29 7b 0a 20 20 20 20 67 2e 69 73 43 6f  =0 ){.    g.isCo
8990: 6e 73 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  nst = 1;.  }else
89a0: 7b 0a 20 20 20 20 65 74 61 67 5f 63 68 65 63 6b  {.    etag_check
89b0: 28 30 2c 30 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f  (0,0);.  }.  blo
89c0: 62 5f 69 6e 69 74 28 26 6f 75 74 2c 20 7a 54 78  b_init(&out, zTx
89d0: 74 2c 20 2d 31 29 3b 0a 20 20 63 67 69 5f 73 65  t, -1);.  cgi_se
89e0: 74 5f 63 6f 6e 74 65 6e 74 28 26 6f 75 74 29 3b  t_content(&out);
89f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 70 6f  .}../*.** All po
8a00: 73 73 69 62 6c 65 20 63 61 70 61 62 69 6c 69 74  ssible capabilit
8a10: 69 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ies.*/.static co
8a20: 6e 73 74 20 63 68 61 72 20 61 6c 6c 43 61 70 5b  nst char allCap[
8a30: 5d 20 3d 20 0a 20 20 22 61 62 63 64 65 66 67 68  ] = .  "abcdefgh
8a40: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
8a50: 79 7a 30 31 32 33 34 35 36 37 38 39 41 42 43 44  yz0123456789ABCD
8a60: 45 46 47 48 49 4a 4b 4c 22 3b 0a 0a 2f 2a 0a 2a  EFGHIJKL";../*.*
8a70: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 75  * Compute the cu
8a80: 72 72 65 6e 74 20 6c 6f 67 69 6e 20 63 61 70 61  rrent login capa
8a90: 62 69 6c 69 74 69 65 73 0a 2a 2f 0a 73 74 61 74  bilities.*/.stat
8aa0: 69 63 20 63 68 61 72 20 2a 66 69 6e 64 5f 63 61  ic char *find_ca
8ab0: 70 61 62 69 6c 69 74 69 65 73 28 63 68 61 72 20  pabilities(char 
8ac0: 2a 7a 43 61 70 29 7b 0a 20 20 69 6e 74 20 69 2c  *zCap){.  int i,
8ad0: 20 6a 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20   j;.  char c;.  
8ae0: 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20  for(i=j=0; (c = 
8af0: 61 6c 6c 43 61 70 5b 6a 5d 29 21 3d 30 3b 20 6a  allCap[j])!=0; j
8b00: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 67  ++){.    if( log
8b10: 69 6e 5f 68 61 73 5f 63 61 70 61 62 69 6c 69 74  in_has_capabilit
8b20: 79 28 26 63 2c 20 31 2c 20 30 29 20 29 20 7a 43  y(&c, 1, 0) ) zC
8b30: 61 70 5b 69 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d  ap[i++] = c;.  }
8b40: 0a 20 20 7a 43 61 70 5b 69 5d 20 3d 20 30 3b 0a  .  zCap[i] = 0;.
8b50: 20 20 72 65 74 75 72 6e 20 7a 43 61 70 3b 0a 7d    return zCap;.}
8b60: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
8b70: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 67 69  the current logi
8b80: 6e 20 63 61 70 61 62 69 6c 69 74 69 65 73 20 74  n capabilities t
8b90: 68 61 74 20 77 65 72 65 0a 2a 2a 20 63 6f 6e 74  hat were.** cont
8ba0: 72 69 62 75 74 65 64 20 62 79 20 41 6e 6f 6e 79  ributed by Anony
8bb0: 6d 6f 75 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63  mous.*/.static c
8bc0: 68 61 72 20 2a 66 69 6e 64 5f 61 6e 6f 6e 5f 63  har *find_anon_c
8bd0: 61 70 61 62 69 6c 69 74 69 65 73 28 63 68 61 72  apabilities(char
8be0: 20 2a 7a 43 61 70 29 7b 0a 20 20 69 6e 74 20 69   *zCap){.  int i
8bf0: 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  , j;.  char c;. 
8c00: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d   for(i=j=0; (c =
8c10: 20 61 6c 6c 43 61 70 5b 6a 5d 29 21 3d 30 3b 20   allCap[j])!=0; 
8c20: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f  j++){.    if( lo
8c30: 67 69 6e 5f 68 61 73 5f 63 61 70 61 62 69 6c 69  gin_has_capabili
8c40: 74 79 28 26 63 2c 20 31 2c 20 4c 4f 47 49 4e 5f  ty(&c, 1, LOGIN_
8c50: 41 4e 4f 4e 29 0a 20 20 20 20 20 20 26 26 20 21  ANON).      && !
8c60: 6c 6f 67 69 6e 5f 68 61 73 5f 63 61 70 61 62 69  login_has_capabi
8c70: 6c 69 74 79 28 26 63 2c 20 31 2c 20 30 29 20 29  lity(&c, 1, 0) )
8c80: 20 7a 43 61 70 5b 69 2b 2b 5d 20 3d 20 63 3b 0a   zCap[i++] = c;.
8c90: 20 20 7d 0a 20 20 7a 43 61 70 5b 69 5d 20 3d 20    }.  zCap[i] = 
8ca0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 43 61 70  0;.  return zCap
8cb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41  ;.}../*.** WEBPA
8cc0: 47 45 3a 20 74 65 73 74 5f 65 6e 76 0a 2a 2a 0a  GE: test_env.**.
8cd0: 2a 2a 20 44 69 73 70 6c 61 79 20 43 47 49 2d 76  ** Display CGI-v
8ce0: 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6f 74 68  ariables and oth
8cf0: 65 72 20 61 73 70 65 63 74 73 20 6f 66 20 74 68  er aspects of th
8d00: 65 20 72 75 6e 2d 74 69 6d 65 0a 2a 2a 20 65 6e  e run-time.** en
8d10: 76 69 72 6f 6e 6d 65 6e 74 2c 20 66 6f 72 20 64  vironment, for d
8d20: 65 62 75 67 67 69 6e 67 20 61 6e 64 20 74 72 6f  ebugging and tro
8d30: 75 62 6c 65 2d 73 68 6f 6f 74 69 6e 67 20 70 75  uble-shooting pu
8d40: 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  rposes..*/.void 
8d50: 70 61 67 65 5f 74 65 73 74 5f 65 6e 76 28 76 6f  page_test_env(vo
8d60: 69 64 29 7b 0a 20 20 77 65 62 70 61 67 65 5f 65  id){.  webpage_e
8d70: 72 72 6f 72 28 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a  rror("");.}../*.
8d80: 2a 2a 20 57 45 42 50 41 47 45 3a 20 68 6f 6e 65  ** WEBPAGE: hone
8d90: 79 70 6f 74 0a 2a 2a 20 54 68 69 73 20 70 61 67  ypot.** This pag
8da0: 65 20 69 73 20 61 20 68 6f 6e 65 79 70 6f 74 20  e is a honeypot 
8db0: 66 6f 72 20 73 70 69 64 65 72 73 20 61 6e 64 20  for spiders and 
8dc0: 62 6f 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 68 6f  bots..*/.void ho
8dd0: 6e 65 79 70 6f 74 5f 70 61 67 65 28 76 6f 69 64  neypot_page(void
8de0: 29 7b 0a 20 20 63 67 69 5f 73 65 74 5f 73 74 61  ){.  cgi_set_sta
8df0: 74 75 73 28 34 30 33 2c 20 22 46 6f 72 62 69 64  tus(403, "Forbid
8e00: 64 65 6e 22 29 3b 0a 20 20 40 20 3c 70 3e 50 6c  den");.  @ <p>Pl
8e10: 65 61 73 65 20 65 6e 61 62 6c 65 20 6a 61 76 61  ease enable java
8e20: 73 63 72 69 70 74 20 6f 72 20 6c 6f 67 20 69 6e  script or log in
8e30: 20 74 6f 20 73 65 65 20 74 68 69 73 20 63 6f 6e   to see this con
8e40: 74 65 6e 74 3c 2f 70 3e 0a 7d 0a 0a 2f 2a 0a 2a  tent</p>.}../*.*
8e50: 2a 20 57 65 62 70 61 67 65 73 20 74 68 61 74 20  * Webpages that 
8e60: 65 6e 63 6f 75 6e 74 65 72 20 61 6e 20 65 72 72  encounter an err
8e70: 6f 72 20 64 75 65 20 74 6f 20 6d 69 73 73 69 6e  or due to missin
8e80: 67 20 6f 72 20 69 6e 63 6f 72 72 65 63 74 0a 2a  g or incorrect.*
8e90: 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  * query paramete
8ea0: 72 73 20 63 61 6e 20 6a 75 6d 70 20 74 6f 20 74  rs can jump to t
8eb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 72  his routine to r
8ec0: 65 6e 64 65 72 20 61 6e 20 65 72 72 6f 72 0a 2a  ender an error.*
8ed0: 2a 20 6d 65 73 73 61 67 65 20 73 63 72 65 65 6e  * message screen
8ee0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 64 6d 69  ..**.** For admi
8ef0: 6e 69 73 74 61 74 6f 72 73 2c 20 6f 72 20 69 66  nistators, or if
8f00: 20 74 68 65 20 74 65 73 74 5f 65 6e 76 5f 65 6e   the test_env_en
8f10: 61 62 6c 65 20 73 65 74 74 69 6e 67 20 69 73 20  able setting is 
8f20: 74 72 75 65 2c 20 74 68 65 6e 0a 2a 2a 20 64 65  true, then.** de
8f30: 74 61 69 6c 73 20 6f 66 20 74 68 65 20 72 65 71  tails of the req
8f40: 75 65 73 74 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  uest environment
8f50: 20 61 72 65 20 64 69 73 70 6c 61 79 65 64 2e 20   are displayed. 
8f60: 20 4f 74 68 65 72 77 69 73 65 2c 20 6a 75 73 74   Otherwise, just
8f70: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 6d 65  .** the error me
8f80: 73 73 61 67 65 20 69 73 20 73 68 6f 77 6e 2e 0a  ssage is shown..
8f90: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 6f 72 6d 61 74  **.** If zFormat
8fa0: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
8fb0: 69 6e 67 2c 20 74 68 65 6e 20 74 68 69 73 20 69  ing, then this i
8fc0: 73 20 74 68 65 20 2f 74 65 73 74 5f 65 6e 76 20  s the /test_env 
8fd0: 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 77 65  page..*/.void we
8fe0: 62 70 61 67 65 5f 65 72 72 6f 72 28 63 6f 6e 73  bpage_error(cons
8ff0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
9000: 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 73 68 6f   ...){.  int sho
9010: 77 41 6c 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45  wAll;.  char *zE
9020: 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73  rr = 0;.  int is
9030: 41 75 74 68 20 3d 20 30 3b 0a 20 20 63 68 61 72  Auth = 0;.  char
9040: 20 7a 43 61 70 5b 31 30 30 5d 3b 0a 0a 20 20 6c   zCap[100];..  l
9050: 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65  ogin_check_crede
9060: 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20  ntials();.  if( 
9070: 67 2e 70 65 72 6d 2e 41 64 6d 69 6e 20 7c 7c 20  g.perm.Admin || 
9080: 67 2e 70 65 72 6d 2e 53 65 74 75 70 20 20 7c 7c  g.perm.Setup  ||
9090: 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e 28   db_get_boolean(
90a0: 22 74 65 73 74 5f 65 6e 76 5f 65 6e 61 62 6c 65  "test_env_enable
90b0: 22 2c 30 29 20 29 7b 0a 20 20 20 20 69 73 41 75  ",0) ){.    isAu
90c0: 74 68 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 63 67  th = 1;.  }.  cg
90d0: 69 5f 6c 6f 61 64 5f 65 6e 76 69 72 6f 6e 6d 65  i_load_environme
90e0: 6e 74 28 29 3b 0a 20 20 69 66 28 20 7a 46 6f 72  nt();.  if( zFor
90f0: 6d 61 74 5b 30 5d 20 29 7b 0a 20 20 20 20 76 61  mat[0] ){.    va
9100: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 76 61  _list ap;.    va
9110: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
9120: 61 74 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20  at);.    zErr = 
9130: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  vmprintf(zFormat
9140: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
9150: 64 28 61 70 29 3b 0a 20 20 20 20 73 74 79 6c 65  d(ap);.    style
9160: 5f 68 65 61 64 65 72 28 22 42 61 64 20 52 65 71  _header("Bad Req
9170: 75 65 73 74 22 29 3b 0a 20 20 20 20 40 20 3c 68  uest");.    @ <h
9180: 31 3e 2f 25 68 28 67 2e 7a 50 61 74 68 29 3a 20  1>/%h(g.zPath): 
9190: 25 68 28 7a 45 72 72 29 3c 2f 68 31 3e 0a 20 20  %h(zErr)</h1>.  
91a0: 20 20 73 68 6f 77 41 6c 6c 20 3d 20 30 3b 0a 20    showAll = 0;. 
91b0: 20 20 20 63 67 69 5f 73 65 74 5f 73 74 61 74 75     cgi_set_statu
91c0: 73 28 35 30 30 2c 20 22 42 61 64 20 52 65 71 75  s(500, "Bad Requ
91d0: 65 73 74 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  est");.  }else i
91e0: 66 28 20 21 69 73 41 75 74 68 20 29 7b 0a 20 20  f( !isAuth ){.  
91f0: 20 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 30    login_needed(0
9200: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
9210: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 79 6c   }else{.    styl
9220: 65 5f 68 65 61 64 65 72 28 22 45 6e 76 69 72 6f  e_header("Enviro
9230: 6e 6d 65 6e 74 20 54 65 73 74 22 29 3b 0a 20 20  nment Test");.  
9240: 20 20 73 68 6f 77 41 6c 6c 20 3d 20 50 42 28 22    showAll = PB("
9250: 73 68 6f 77 61 6c 6c 22 29 3b 0a 20 20 20 20 73  showall");.    s
9260: 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 63 68 65  tyle_submenu_che
9270: 63 6b 62 6f 78 28 22 73 68 6f 77 61 6c 6c 22 2c  ckbox("showall",
9280: 20 22 43 6f 6f 6b 69 65 73 22 2c 20 30 2c 20 30   "Cookies", 0, 0
9290: 29 3b 0a 20 20 20 20 73 74 79 6c 65 5f 73 75 62  );.    style_sub
92a0: 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 53 74  menu_element("St
92b0: 61 74 73 22 2c 20 22 25 52 2f 73 74 61 74 22 29  ats", "%R/stat")
92c0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 41  ;.  }..  if( isA
92d0: 75 74 68 20 29 7b 0a 20 20 23 69 66 20 21 64 65  uth ){.  #if !de
92e0: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20  fined(_WIN32).  
92f0: 20 20 40 20 75 69 64 3d 25 64 28 67 65 74 75 69    @ uid=%d(getui
9300: 64 28 29 29 2c 20 67 69 64 3d 25 64 28 67 65 74  d()), gid=%d(get
9310: 67 69 64 28 29 29 3c 62 72 20 2f 3e 0a 20 20 23  gid())<br />.  #
9320: 65 6e 64 69 66 0a 20 20 20 20 40 20 67 2e 7a 42  endif.    @ g.zB
9330: 61 73 65 55 52 4c 20 3d 20 25 68 28 67 2e 7a 42  aseURL = %h(g.zB
9340: 61 73 65 55 52 4c 29 3c 62 72 20 2f 3e 0a 20 20  aseURL)<br />.  
9350: 20 20 40 20 67 2e 7a 48 74 74 70 73 55 52 4c 20    @ g.zHttpsURL 
9360: 3d 20 25 68 28 67 2e 7a 48 74 74 70 73 55 52 4c  = %h(g.zHttpsURL
9370: 29 3c 62 72 20 2f 3e 0a 20 20 20 20 40 20 67 2e  )<br />.    @ g.
9380: 7a 54 6f 70 20 3d 20 25 68 28 67 2e 7a 54 6f 70  zTop = %h(g.zTop
9390: 29 3c 62 72 20 2f 3e 0a 20 20 20 20 40 20 67 2e  )<br />.    @ g.
93a0: 7a 50 61 74 68 20 3d 20 25 68 28 67 2e 7a 50 61  zPath = %h(g.zPa
93b0: 74 68 29 3c 62 72 20 2f 3e 0a 20 20 20 20 40 20  th)<br />.    @ 
93c0: 67 2e 75 73 65 72 55 69 64 20 3d 20 25 64 28 67  g.userUid = %d(g
93d0: 2e 75 73 65 72 55 69 64 29 3c 62 72 20 2f 3e 0a  .userUid)<br />.
93e0: 20 20 20 20 40 20 67 2e 7a 4c 6f 67 69 6e 20 3d      @ g.zLogin =
93f0: 20 25 68 28 67 2e 7a 4c 6f 67 69 6e 29 3c 62 72   %h(g.zLogin)<br
9400: 20 2f 3e 0a 20 20 20 20 40 20 67 2e 69 73 48 75   />.    @ g.isHu
9410: 6d 61 6e 20 3d 20 25 64 28 67 2e 69 73 48 75 6d  man = %d(g.isHum
9420: 61 6e 29 3c 62 72 20 2f 3e 0a 20 20 20 20 69 66  an)<br />.    if
9430: 28 20 67 2e 6e 52 65 71 75 65 73 74 20 29 7b 0a  ( g.nRequest ){.
9440: 20 20 20 20 20 20 40 20 67 2e 6e 52 65 71 75 65        @ g.nReque
9450: 73 74 20 3d 20 25 64 28 67 2e 6e 52 65 71 75 65  st = %d(g.nReque
9460: 73 74 29 3c 62 72 20 2f 3e 0a 20 20 20 20 7d 0a  st)<br />.    }.
9470: 20 20 20 20 69 66 28 20 67 2e 6e 50 65 6e 64 69      if( g.nPendi
9480: 6e 67 52 65 71 75 65 73 74 3e 31 20 29 7b 0a 20  ngRequest>1 ){. 
9490: 20 20 20 20 20 40 20 67 2e 6e 50 65 6e 64 69 6e       @ g.nPendin
94a0: 67 52 65 71 75 65 73 74 20 3d 20 25 64 28 67 2e  gRequest = %d(g.
94b0: 6e 50 65 6e 64 69 6e 67 52 65 71 75 65 73 74 29  nPendingRequest)
94c0: 3c 62 72 20 2f 3e 0a 20 20 20 20 7d 0a 20 20 20  <br />.    }.   
94d0: 20 40 20 63 61 70 61 62 69 6c 69 74 69 65 73 20   @ capabilities 
94e0: 3d 20 25 73 28 66 69 6e 64 5f 63 61 70 61 62 69  = %s(find_capabi
94f0: 6c 69 74 69 65 73 28 7a 43 61 70 29 29 3c 62 72  lities(zCap))<br
9500: 20 2f 3e 0a 20 20 20 20 69 66 28 20 7a 43 61 70   />.    if( zCap
9510: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 40 20 61  [0] ){.      @ a
9520: 6e 6f 6e 79 6d 6f 75 73 2d 61 64 64 73 20 3d 20  nonymous-adds = 
9530: 25 73 28 66 69 6e 64 5f 61 6e 6f 6e 5f 63 61 70  %s(find_anon_cap
9540: 61 62 69 6c 69 74 69 65 73 28 7a 43 61 70 29 29  abilities(zCap))
9550: 3c 62 72 20 2f 3e 0a 20 20 20 20 7d 0a 20 20 20  <br />.    }.   
9560: 20 40 20 67 2e 7a 52 65 70 6f 73 69 74 6f 72 79   @ g.zRepository
9570: 4e 61 6d 65 20 3d 20 25 68 28 67 2e 7a 52 65 70  Name = %h(g.zRep
9580: 6f 73 69 74 6f 72 79 4e 61 6d 65 29 3c 62 72 20  ositoryName)<br 
9590: 2f 3e 0a 20 20 20 20 40 20 6c 6f 61 64 5f 61 76  />.    @ load_av
95a0: 65 72 61 67 65 28 29 20 3d 20 25 66 28 6c 6f 61  erage() = %f(loa
95b0: 64 5f 61 76 65 72 61 67 65 28 29 29 3c 62 72 20  d_average())<br 
95c0: 2f 3e 0a 20 20 20 20 40 20 63 67 69 5f 63 73 72  />.    @ cgi_csr
95d0: 66 5f 73 61 66 65 28 30 29 20 3d 20 25 64 28 63  f_safe(0) = %d(c
95e0: 67 69 5f 63 73 72 66 5f 73 61 66 65 28 30 29 29  gi_csrf_safe(0))
95f0: 3c 62 72 20 2f 3e 0a 20 20 20 20 40 20 66 6f 73  <br />.    @ fos
9600: 73 69 6c 5f 65 78 65 5f 69 64 28 29 20 3d 20 25  sil_exe_id() = %
9610: 68 28 66 6f 73 73 69 6c 5f 65 78 65 5f 69 64 28  h(fossil_exe_id(
9620: 29 29 3c 62 72 20 2f 3e 0a 20 20 20 20 40 20 3c  ))<br />.    @ <
9630: 68 72 20 2f 3e 0a 20 20 20 20 50 28 22 48 54 54  hr />.    P("HTT
9640: 50 5f 55 53 45 52 5f 41 47 45 4e 54 22 29 3b 0a  P_USER_AGENT");.
9650: 20 20 20 20 63 67 69 5f 70 72 69 6e 74 5f 61 6c      cgi_print_al
9660: 6c 28 73 68 6f 77 41 6c 6c 2c 20 30 29 3b 0a 20  l(showAll, 0);. 
9670: 20 20 20 69 66 28 20 73 68 6f 77 41 6c 6c 20 26     if( showAll &
9680: 26 20 62 6c 6f 62 5f 73 69 7a 65 28 26 67 2e 68  & blob_size(&g.h
9690: 74 74 70 48 65 61 64 65 72 29 3e 30 20 29 7b 0a  ttpHeader)>0 ){.
96a0: 20 20 20 20 20 20 40 20 3c 68 72 20 2f 3e 0a 20        @ <hr />. 
96b0: 20 20 20 20 20 40 20 3c 70 72 65 3e 0a 20 20 20       @ <pre>.   
96c0: 20 20 20 40 20 25 68 28 62 6c 6f 62 5f 73 74 72     @ %h(blob_str
96d0: 28 26 67 2e 68 74 74 70 48 65 61 64 65 72 29 29  (&g.httpHeader))
96e0: 0a 20 20 20 20 20 20 40 20 3c 2f 70 72 65 3e 0a  .      @ </pre>.
96f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 79 6c      }.  }.  styl
9700: 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 20 20 69 66  e_footer();.  if
9710: 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 63 67  ( zErr ){.    cg
9720: 69 5f 72 65 70 6c 79 28 29 3b 0a 20 20 20 20 66  i_reply();.    f
9730: 6f 73 73 69 6c 5f 65 78 69 74 28 31 29 3b 0a 20  ossil_exit(1);. 
9740: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
9750: 72 61 74 65 20 61 20 4e 6f 74 20 59 65 74 20 49  rate a Not Yet I
9760: 6d 70 6c 65 6d 65 6e 74 65 64 20 65 72 72 6f 72  mplemented error
9770: 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 77   page..*/.void w
9780: 65 62 70 61 67 65 5f 6e 6f 74 5f 79 65 74 5f 69  ebpage_not_yet_i
9790: 6d 70 6c 65 6d 65 6e 74 65 64 28 76 6f 69 64 29  mplemented(void)
97a0: 7b 0a 20 20 77 65 62 70 61 67 65 5f 65 72 72 6f  {.  webpage_erro
97b0: 72 28 22 4e 6f 74 20 79 65 74 20 69 6d 70 6c 65  r("Not yet imple
97c0: 6d 65 6e 74 65 64 22 29 3b 0a 7d 0a 0a 2f 2a 0a  mented");.}../*.
97d0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 77 65  ** Generate a we
97e0: 62 70 61 67 65 20 66 6f 72 20 61 20 77 65 62 70  bpage for a webp
97f0: 61 67 65 5f 61 73 73 65 72 74 28 29 2e 0a 2a 2f  age_assert()..*/
9800: 0a 76 6f 69 64 20 77 65 62 70 61 67 65 5f 61 73  .void webpage_as
9810: 73 65 72 74 5f 70 61 67 65 28 63 6f 6e 73 74 20  sert_page(const 
9820: 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74  char *zFile, int
9830: 20 69 4c 69 6e 65 2c 20 63 6f 6e 73 74 20 63 68   iLine, const ch
9840: 61 72 20 2a 7a 45 78 70 72 29 7b 0a 20 20 66 6f  ar *zExpr){.  fo
9850: 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28 22 61 73  ssil_warning("as
9860: 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 61 74  sertion fault at
9870: 20 25 73 3a 25 64 20 2d 20 25 73 22 2c 20 7a 46   %s:%d - %s", zF
9880: 69 6c 65 2c 20 69 4c 69 6e 65 2c 20 7a 45 78 70  ile, iLine, zExp
9890: 72 29 3b 0a 20 20 63 67 69 5f 72 65 73 65 74 5f  r);.  cgi_reset_
98a0: 63 6f 6e 74 65 6e 74 28 29 3b 0a 20 20 77 65 62  content();.  web
98b0: 70 61 67 65 5f 65 72 72 6f 72 28 22 61 73 73 65  page_error("asse
98c0: 72 74 69 6f 6e 20 66 61 75 6c 74 20 61 74 20 25  rtion fault at %
98d0: 73 3a 25 64 20 2d 20 25 73 22 2c 20 7a 46 69 6c  s:%d - %s", zFil
98e0: 65 2c 20 69 4c 69 6e 65 2c 20 7a 45 78 70 72 29  e, iLine, zExpr)
98f0: 3b 0a 7d 0a 0a 23 69 66 20 49 4e 54 45 52 46 41  ;.}..#if INTERFA
9900: 43 45 0a 23 20 64 65 66 69 6e 65 20 77 65 62 70  CE.# define webp
9910: 61 67 65 5f 61 73 73 65 72 74 28 54 29 20 69 66  age_assert(T) if
9920: 28 21 28 54 29 29 7b 77 65 62 70 61 67 65 5f 61  (!(T)){webpage_a
9930: 73 73 65 72 74 5f 70 61 67 65 28 5f 5f 46 49 4c  ssert_page(__FIL
9940: 45 5f 5f 2c 5f 5f 4c 49 4e 45 5f 5f 2c 23 54 29  E__,__LINE__,#T)
9950: 3b 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ;}.#endif../*.**
9960: 20 52 65 74 75 72 6e 73 20 61 20 70 73 65 75 64   Returns a pseud
9970: 6f 2d 72 61 6e 64 6f 6d 20 69 6e 70 75 74 20 66  o-random input f
9980: 69 65 6c 64 20 49 44 2c 20 66 6f 72 20 75 73 65  ield ID, for use
9990: 20 69 6e 20 61 73 73 6f 63 69 61 74 69 6e 67 20   in associating 
99a0: 61 6e 0a 2a 2a 20 49 44 2d 6c 65 73 73 20 69 6e  an.** ID-less in
99b0: 70 75 74 20 66 69 65 6c 64 20 77 69 74 68 20 61  put field with a
99c0: 20 6c 61 62 65 6c 2e 20 54 68 65 20 6d 65 6d 6f   label. The memo
99d0: 72 79 20 69 73 20 6f 77 6e 65 64 20 62 79 20 74  ry is owned by t
99e0: 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 2e 0a 2a 2f  he.** caller..*/
99f0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 20 73  .static char * s
9a00: 74 79 6c 65 5f 6e 65 78 74 5f 69 6e 70 75 74 5f  tyle_next_input_
9a10: 69 64 28 29 7b 0a 20 20 73 74 61 74 69 63 20 69  id(){.  static i
9a20: 6e 74 20 69 6e 70 75 74 49 44 20 3d 20 30 3b 0a  nt inputID = 0;.
9a30: 20 20 2b 2b 69 6e 70 75 74 49 44 3b 0a 20 20 72    ++inputID;.  r
9a40: 65 74 75 72 6e 20 6d 70 72 69 6e 74 66 28 22 69  eturn mprintf("i
9a50: 6e 70 75 74 2d 69 64 2d 25 64 22 2c 20 69 6e 70  nput-id-%d", inp
9a60: 75 74 49 44 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  utID);.}../*.** 
9a70: 4f 75 74 70 75 74 73 20 61 20 6c 61 62 65 6c 65  Outputs a labele
9a80: 64 20 63 68 65 63 6b 62 6f 78 20 65 6c 65 6d 65  d checkbox eleme
9a90: 6e 74 2e 20 7a 57 72 61 70 70 65 72 49 64 20 69  nt. zWrapperId i
9aa0: 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 49 44  s an optional ID
9ab0: 0a 2a 2a 20 76 61 6c 75 65 20 66 6f 72 20 74 68  .** value for th
9ac0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 65 6c 65  e containing ele
9ad0: 6d 65 6e 74 20 28 73 65 65 20 62 65 6c 6f 77 29  ment (see below)
9ae0: 2e 20 7a 46 69 65 6c 64 4e 61 6d 65 20 69 73 20  . zFieldName is 
9af0: 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 65 6c 65 6d  the.** form elem
9b00: 65 6e 74 20 6e 61 6d 65 2e 20 7a 4c 61 62 65 6c  ent name. zLabel
9b10: 20 69 73 20 74 68 65 20 6c 61 62 65 6c 20 66 6f   is the label fo
9b20: 72 20 74 68 65 20 63 68 65 63 6b 62 6f 78 2e 20  r the checkbox. 
9b30: 7a 56 61 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65  zValue is.** the
9b40: 20 6f 70 74 69 6f 6e 61 6c 20 76 61 6c 75 65 20   optional value 
9b50: 66 6f 72 20 74 68 65 20 63 68 65 63 6b 62 6f 78  for the checkbox
9b60: 2e 20 7a 54 69 70 20 69 73 20 61 6e 20 6f 70 74  . zTip is an opt
9b70: 69 6f 6e 61 6c 20 74 6f 6f 6c 74 69 70 2c 0a 2a  ional tooltip,.*
9b80: 2a 20 77 68 69 63 68 20 67 65 74 73 20 73 65 74  * which gets set
9b90: 20 61 73 20 74 68 65 20 22 74 69 74 6c 65 22 20   as the "title" 
9ba0: 61 74 74 72 69 62 75 74 65 20 6f 66 20 74 68 65  attribute of the
9bb0: 20 6f 75 74 65 72 6d 6f 73 74 0a 2a 2a 20 65 6c   outermost.** el
9bc0: 65 6d 65 6e 74 2e 20 49 66 20 69 73 43 68 65 63  ement. If isChec
9bd0: 6b 65 64 20 69 73 20 74 72 75 65 2c 20 74 68 65  ked is true, the
9be0: 20 63 68 65 63 6b 62 6f 78 20 67 65 74 73 20 74   checkbox gets t
9bf0: 68 65 20 22 63 68 65 63 6b 65 64 22 0a 2a 2a 20  he "checked".** 
9c00: 61 74 74 72 69 62 75 74 65 20 73 65 74 2c 20 65  attribute set, e
9c10: 6c 73 65 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2a  lse it is not..*
9c20: 2a 0a 2a 2a 20 52 65 73 75 6c 74 69 6e 67 20 73  *.** Resulting s
9c30: 74 72 75 63 74 75 72 65 3a 0a 2a 2a 0a 2a 2a 20  tructure:.**.** 
9c40: 3c 73 70 61 6e 20 63 6c 61 73 73 3d 27 69 6e 70  <span class='inp
9c50: 75 74 2d 77 69 74 68 2d 6c 61 62 65 6c 27 20 74  ut-with-label' t
9c60: 69 74 6c 65 3d 7b 7b 7a 54 69 70 7d 7d 20 69 64  itle={{zTip}} id
9c70: 3d 7b 7b 7a 57 72 61 70 70 65 72 49 64 7d 7d 3e  ={{zWrapperId}}>
9c80: 0a 2a 2a 20 20 20 3c 69 6e 70 75 74 20 74 79 70  .**   <input typ
9c90: 65 3d 27 63 68 65 63 6b 62 6f 78 27 20 6e 61 6d  e='checkbox' nam
9ca0: 65 3d 7b 7b 7a 46 69 65 6c 64 4e 61 6d 65 7d 7d  e={{zFieldName}}
9cb0: 20 76 61 6c 75 65 3d 7b 7b 7a 56 61 6c 75 65 7d   value={{zValue}
9cc0: 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 64  }.**          id
9cd0: 3d 27 41 20 52 41 4e 44 4f 4d 20 56 41 4c 55 45  ='A RANDOM VALUE
9ce0: 27 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 7b 7b  '.**          {{
9cf0: 69 73 43 68 65 63 6b 65 64 20 3f 20 22 20 63 68  isChecked ? " ch
9d00: 65 63 6b 65 64 20 3a 20 22 22 7d 7d 2f 3e 0a 2a  ecked : ""}}/>.*
9d10: 2a 20 20 20 3c 6c 61 62 65 6c 20 66 6f 72 3d 27  *   <label for='
9d20: 49 44 20 4f 46 20 54 48 45 20 49 4e 50 55 54 20  ID OF THE INPUT 
9d30: 46 49 45 4c 44 27 3e 7b 7b 7a 4c 61 62 65 6c 7d  FIELD'>{{zLabel}
9d40: 7d 3c 2f 6c 61 62 65 6c 3e 0a 2a 2a 20 3c 2f 73  }</label>.** </s
9d50: 70 61 6e 3e 0a 2a 2a 0a 2a 2a 20 7a 4c 61 62 65  pan>.**.** zLabe
9d60: 6c 2c 20 61 6e 64 20 7a 56 61 6c 75 65 20 61 72  l, and zValue ar
9d70: 65 20 72 65 71 75 69 72 65 64 2e 20 7a 46 69 65  e required. zFie
9d80: 6c 64 4e 61 6d 65 2c 20 7a 57 72 61 70 70 65 72  ldName, zWrapper
9d90: 49 64 2c 20 61 6e 64 20 7a 54 69 70 0a 2a 2a 20  Id, and zTip.** 
9da0: 61 72 65 20 6d 61 79 20 62 65 20 4e 55 4c 4c 20  are may be NULL 
9db0: 6f 72 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  or empty..**.** 
9dc0: 42 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  Be sure that the
9dd0: 20 69 6e 70 75 74 2d 77 69 74 68 2d 6c 61 62 65   input-with-labe
9de0: 6c 20 43 53 53 20 63 6c 61 73 73 20 69 73 20 64  l CSS class is d
9df0: 65 66 69 6e 65 64 20 73 65 6e 73 69 62 6c 79 2c  efined sensibly,
9e00: 20 69 6e 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61   in.** particula
9e10: 72 2c 20 68 61 76 69 6e 67 20 69 74 73 20 64 69  r, having its di
9e20: 73 70 6c 61 79 3a 69 6e 6c 69 6e 65 2d 62 6c 6f  splay:inline-blo
9e30: 63 6b 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72  ck is useful for
9e40: 20 61 6c 69 67 6e 6d 65 6e 74 0a 2a 2a 20 70 75   alignment.** pu
9e50: 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  rposes..*/.void 
9e60: 73 74 79 6c 65 5f 6c 61 62 65 6c 65 64 5f 63 68  style_labeled_ch
9e70: 65 63 6b 62 6f 78 28 63 6f 6e 73 74 20 63 68 61  eckbox(const cha
9e80: 72 20 2a 20 7a 57 72 61 70 70 65 72 49 64 2c 0a  r * zWrapperId,.
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
9eb0: 74 20 63 68 61 72 20 2a 7a 46 69 65 6c 64 4e 61  t char *zFieldNa
9ec0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
9ed0: 20 7a 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20   zLabel,.       
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ef0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
9f00: 2a 20 7a 56 61 6c 75 65 2c 20 69 6e 74 20 69 73  * zValue, int is
9f10: 43 68 65 63 6b 65 64 2c 0a 20 20 20 20 20 20 20  Checked,.       
9f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f30: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
9f40: 2a 20 7a 54 69 70 29 7b 0a 20 20 63 68 61 72 20  * zTip){.  char 
9f50: 2a 20 7a 4c 61 62 65 6c 49 44 20 3d 20 73 74 79  * zLabelID = sty
9f60: 6c 65 5f 6e 65 78 74 5f 69 6e 70 75 74 5f 69 64  le_next_input_id
9f70: 28 29 3b 0a 20 20 43 58 28 22 3c 73 70 61 6e 20  ();.  CX("<span 
9f80: 63 6c 61 73 73 3d 27 69 6e 70 75 74 2d 77 69 74  class='input-wit
9f90: 68 2d 6c 61 62 65 6c 27 22 29 3b 0a 20 20 69 66  h-label'");.  if
9fa0: 28 7a 54 69 70 20 26 26 20 2a 7a 54 69 70 29 7b  (zTip && *zTip){
9fb0: 0a 20 20 20 20 43 58 28 22 20 74 69 74 6c 65 3d  .    CX(" title=
9fc0: 27 25 68 27 22 2c 20 7a 54 69 70 29 3b 0a 20 20  '%h'", zTip);.  
9fd0: 7d 0a 20 20 69 66 28 7a 57 72 61 70 70 65 72 49  }.  if(zWrapperI
9fe0: 64 20 26 26 20 2a 7a 57 72 61 70 70 65 72 49 64  d && *zWrapperId
9ff0: 29 7b 0a 20 20 20 20 43 58 28 22 20 69 64 3d 27  ){.    CX(" id='
a000: 25 73 27 22 2c 7a 57 72 61 70 70 65 72 49 64 29  %s'",zWrapperId)
a010: 3b 0a 20 20 7d 0a 20 20 43 58 28 22 3e 3c 69 6e  ;.  }.  CX("><in
a020: 70 75 74 20 74 79 70 65 3d 27 63 68 65 63 6b 62  put type='checkb
a030: 6f 78 27 20 69 64 3d 27 25 73 27 20 22 2c 20 7a  ox' id='%s' ", z
a040: 4c 61 62 65 6c 49 44 29 3b 0a 20 20 69 66 28 7a  LabelID);.  if(z
a050: 46 69 65 6c 64 4e 61 6d 65 20 26 26 20 2a 7a 46  FieldName && *zF
a060: 69 65 6c 64 4e 61 6d 65 29 7b 0a 20 20 20 20 43  ieldName){.    C
a070: 58 28 22 6e 61 6d 65 3d 27 25 73 27 20 22 2c 7a  X("name='%s' ",z
a080: 46 69 65 6c 64 4e 61 6d 65 29 3b 0a 20 20 7d 0a  FieldName);.  }.
a090: 20 20 43 58 28 22 76 61 6c 75 65 3d 27 25 54 27    CX("value='%T'
a0a0: 25 73 2f 3e 22 2c 0a 20 20 20 20 20 7a 56 61 6c  %s/>",.     zVal
a0b0: 75 65 20 3f 20 7a 56 61 6c 75 65 20 3a 20 22 22  ue ? zValue : ""
a0c0: 2c 20 69 73 43 68 65 63 6b 65 64 20 3f 20 22 20  , isChecked ? " 
a0d0: 63 68 65 63 6b 65 64 22 20 3a 20 22 22 29 3b 0a  checked" : "");.
a0e0: 20 20 43 58 28 22 3c 6c 61 62 65 6c 20 66 6f 72    CX("<label for
a0f0: 3d 27 25 73 27 3e 25 68 3c 2f 6c 61 62 65 6c 3e  ='%s'>%h</label>
a100: 3c 2f 73 70 61 6e 3e 22 2c 20 7a 4c 61 62 65 6c  </span>", zLabel
a110: 49 44 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20 66  ID, zLabel);.  f
a120: 6f 73 73 69 6c 5f 66 72 65 65 28 7a 4c 61 62 65  ossil_free(zLabe
a130: 6c 49 44 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  lID);.}../*.** O
a140: 75 74 70 75 74 73 20 61 20 53 45 4c 45 43 54 20  utputs a SELECT 
a150: 6c 69 73 74 20 66 72 6f 6d 20 61 20 63 6f 6d 70  list from a comp
a160: 69 6c 65 2d 74 69 6d 65 20 6c 69 73 74 20 6f 66  ile-time list of
a170: 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 20 54 68   integers..** Th
a180: 65 20 76 61 72 67 73 20 6d 75 73 74 20 62 65 20  e vargs must be 
a190: 61 20 6c 69 73 74 20 6f 66 20 28 63 6f 6e 73 74  a list of (const
a1a0: 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 20 70 61   char *, int) pa
a1b0: 69 72 73 2c 20 74 65 72 6d 69 6e 61 74 65 64 0a  irs, terminated.
a1c0: 2a 2a 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ** with a single
a1d0: 20 4e 55 4c 4c 2e 20 45 61 63 68 20 70 61 69 72   NULL. Each pair
a1e0: 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
a1f0: 61 73 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  as....**.** If t
a200: 68 65 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  he (const char *
a210: 29 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73  ) is NULL, it is
a220: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a230: 6c 69 73 74 2c 20 65 6c 73 65 0a 2a 2a 20 61 20  list, else.** a 
a240: 6e 65 77 20 4f 50 54 49 4f 4e 20 65 6e 74 72 79  new OPTION entry
a250: 20 69 73 20 63 72 65 61 74 65 64 2e 20 49 66 20   is created. If 
a260: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 65 6d  the string is em
a270: 70 74 79 2c 20 74 68 65 0a 2a 2a 20 6c 61 62 65  pty, the.** labe
a280: 6c 20 61 6e 64 20 76 61 6c 75 65 20 6f 66 20 74  l and value of t
a290: 68 65 20 4f 50 54 49 4f 4e 20 69 73 20 74 68 65  he OPTION is the
a2a0: 20 69 6e 74 65 67 65 72 20 70 61 72 74 20 6f 66   integer part of
a2b0: 20 74 68 65 20 70 61 69 72 2e 0a 2a 2a 20 49 66   the pair..** If
a2c0: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6e   the string is n
a2d0: 6f 74 20 65 6d 70 74 79 2c 20 69 74 20 62 65 63  ot empty, it bec
a2e0: 6f 6d 65 73 20 74 68 65 20 6c 61 62 65 6c 20 61  omes the label a
a2f0: 6e 64 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  nd the integer.*
a300: 2a 20 74 68 65 20 76 61 6c 75 65 2e 20 49 66 20  * the value. If 
a310: 74 68 61 74 20 76 61 6c 75 65 20 3d 3d 20 73 65  that value == se
a320: 6c 65 63 74 65 64 56 61 6c 75 65 20 74 68 65 6e  lectedValue then
a330: 20 74 68 61 74 20 4f 50 54 49 4f 4e 0a 2a 2a 20   that OPTION.** 
a340: 65 6c 65 6d 65 6e 74 20 67 65 74 73 20 74 68 65  element gets the
a350: 20 27 73 65 6c 65 63 74 65 64 27 20 61 74 74 72   'selected' attr
a360: 69 62 75 74 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ibute..**.** Not
a370: 65 20 74 68 61 74 20 74 68 65 20 70 61 69 72 73  e that the pairs
a380: 20 61 72 65 20 6e 6f 74 20 69 6e 20 28 69 6e 74   are not in (int
a390: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20  , const char *) 
a3a0: 6f 72 64 65 72 20 62 65 63 61 75 73 65 0a 2a 2a  order because.**
a3b0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 65 6c   there is no wel
a3c0: 6c 2d 6b 6e 6f 77 6e 20 69 6e 74 65 67 65 72 20  l-known integer 
a3d0: 76 61 6c 75 65 20 77 68 69 63 68 20 77 65 20 63  value which we c
a3e0: 61 6e 20 64 65 66 69 6e 69 74 69 76 65 6c 79 20  an definitively 
a3f0: 75 73 65 0a 2a 2a 20 61 73 20 61 20 6c 69 73 74  use.** as a list
a400: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a   terminator..**.
a410: 2a 2a 20 7a 57 72 61 70 70 65 72 49 64 20 69 73  ** zWrapperId is
a420: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 49 44 20   an optional ID 
a430: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f  value for the co
a440: 6e 74 61 69 6e 69 6e 67 20 65 6c 65 6d 65 6e 74  ntaining element
a450: 20 28 73 65 65 0a 2a 2a 20 62 65 6c 6f 77 29 2e   (see.** below).
a460: 0a 2a 2a 0a 2a 2a 20 7a 46 69 65 6c 64 4e 61 6d  .**.** zFieldNam
a470: 65 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 6f  e is the value o
a480: 66 20 74 68 65 20 66 6f 72 6d 20 65 6c 65 6d 65  f the form eleme
a490: 6e 74 27 73 20 6e 61 6d 65 20 61 74 74 72 69 62  nt's name attrib
a4a0: 75 74 65 2e 20 4e 6f 74 65 0a 2a 2a 20 74 68 61  ute. Note.** tha
a4b0: 74 20 66 6f 73 73 69 6c 20 70 72 65 66 65 72 73  t fossil prefers
a4c0: 20 75 6e 64 65 72 73 63 6f 72 65 73 20 6f 76 65   underscores ove
a4d0: 72 20 27 2d 27 20 66 6f 72 20 73 65 70 61 72 61  r '-' for separa
a4e0: 74 6f 72 73 20 69 6e 20 66 6f 72 6d 0a 2a 2a 20  tors in form.** 
a4f0: 65 6c 65 6d 65 6e 74 20 6e 61 6d 65 73 2e 0a 2a  element names..*
a500: 2a 0a 2a 2a 20 7a 4c 61 62 65 6c 20 69 73 20 61  *.** zLabel is a
a510: 6e 20 6f 70 74 69 6f 6e 61 6c 20 73 74 72 69 6e  n optional strin
a520: 67 20 74 6f 20 75 73 65 20 61 73 20 61 20 22 6c  g to use as a "l
a530: 61 62 65 6c 22 20 66 6f 72 20 74 68 65 20 65 6c  abel" for the el
a540: 65 6d 65 6e 74 0a 2a 2a 20 28 73 65 65 20 62 65  ement.** (see be
a550: 6c 6f 77 29 2e 0a 2a 2a 0a 2a 2a 20 7a 54 6f 6f  low)..**.** zToo
a560: 6c 74 69 70 20 69 73 20 61 6e 20 6f 70 74 69 6f  ltip is an optio
a570: 6e 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  nal value for th
a580: 65 20 53 45 4c 45 43 54 27 73 20 74 69 74 6c 65  e SELECT's title
a590: 20 61 74 74 72 69 62 75 74 65 2e 0a 2a 2a 0a 2a   attribute..**.*
a5a0: 2a 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20  * The structure 
a5b0: 6f 66 20 74 68 65 20 65 6d 69 74 74 65 64 20 48  of the emitted H
a5c0: 54 4d 4c 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 3c 73  TML is:.**.** <s
a5d0: 70 61 6e 20 63 6c 61 73 73 3d 27 69 6e 70 75 74  pan class='input
a5e0: 2d 77 69 74 68 2d 6c 61 62 65 6c 27 20 74 69 74  -with-label' tit
a5f0: 6c 65 3d 7b 7b 7a 54 6f 6f 6c 54 69 70 7d 7d 20  le={{zToolTip}} 
a600: 69 64 3d 7b 7b 7a 57 72 61 70 70 65 72 49 64 7d  id={{zWrapperId}
a610: 7d 3e 0a 2a 2a 20 20 20 3c 6c 61 62 65 6c 20 66  }>.**   <label f
a620: 6f 72 3d 27 53 45 4c 45 43 54 20 45 4c 45 4d 45  or='SELECT ELEME
a630: 4e 54 20 49 44 27 3e 7b 7b 7a 4c 61 62 65 6c 7d  NT ID'>{{zLabel}
a640: 7d 3c 2f 6c 61 62 65 6c 3e 0a 2a 2a 20 20 20 3c  }</label>.**   <
a650: 73 65 6c 65 63 74 20 69 64 3d 27 52 41 4e 44 4f  select id='RANDO
a660: 4d 20 49 44 27 20 6e 61 6d 65 3d 7b 7b 7a 46 69  M ID' name={{zFi
a670: 65 6c 64 4e 61 6d 65 7d 7d 3e 2e 2e 2e 3c 2f 73  eldName}}>...</s
a680: 65 6c 65 63 74 3e 0a 2a 2a 20 3c 2f 73 70 61 6e  elect>.** </span
a690: 3e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a  >.**.** Example:
a6a0: 0a 2a 2a 0a 2a 2a 20 73 74 79 6c 65 5f 73 65 6c  .**.** style_sel
a6b0: 65 63 74 5f 6c 69 73 74 5f 69 6e 74 28 22 6d 79  ect_list_int("my
a6c0: 2d 67 72 61 70 65 73 22 2c 20 22 6d 79 5f 67 72  -grapes", "my_gr
a6d0: 61 70 65 73 22 2c 20 22 47 72 61 70 65 73 22 2c  apes", "Grapes",
a6e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
a6f0: 20 20 20 20 20 20 20 20 20 22 53 65 6c 65 63 74           "Select
a700: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 67   the number of g
a710: 72 61 70 65 73 22 2c 0a 2a 2a 20 20 20 20 20 20  rapes",.**      
a720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a730: 20 61 74 6f 69 28 50 44 28 22 6d 79 5f 66 69 65   atoi(PD("my_fie
a740: 6c 64 22 2c 22 30 22 29 29 2c 0a 2a 2a 20 20 20  ld","0")),.**   
a750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a760: 20 20 20 20 22 22 2c 20 31 2c 20 22 32 22 2c 20      "", 1, "2", 
a770: 32 2c 20 22 54 68 72 65 65 22 2c 20 33 2c 0a 2a  2, "Three", 3,.*
a780: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
a790: 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 2a          NULL);.*
a7a0: 2a 20 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65  * .*/.void style
a7b0: 5f 73 65 6c 65 63 74 5f 6c 69 73 74 5f 69 6e 74  _select_list_int
a7c0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 57  (const char * zW
a7d0: 72 61 70 70 65 72 49 64 2c 0a 20 20 20 20 20 20  rapperId,.      
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7f0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
a800: 2a 7a 46 69 65 6c 64 4e 61 6d 65 2c 20 63 6f 6e  *zFieldName, con
a810: 73 74 20 63 68 61 72 20 2a 20 7a 4c 61 62 65 6c  st char * zLabel
a820: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
a840: 73 74 20 63 68 61 72 20 2a 20 7a 54 6f 6f 6c 54  st char * zToolT
a850: 69 70 2c 20 69 6e 74 20 73 65 6c 65 63 74 65 64  ip, int selected
a860: 56 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Val,.           
a870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a880: 2e 2e 2e 20 29 7b 0a 20 20 63 68 61 72 20 2a 20  ... ){.  char * 
a890: 7a 4c 61 62 65 6c 49 44 20 3d 20 73 74 79 6c 65  zLabelID = style
a8a0: 5f 6e 65 78 74 5f 69 6e 70 75 74 5f 69 64 28 29  _next_input_id()
a8b0: 3b 0a 20 20 76 61 5f 6c 69 73 74 20 76 61 72 67  ;.  va_list varg
a8c0: 73 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 76  s;..  va_start(v
a8d0: 61 72 67 73 2c 73 65 6c 65 63 74 65 64 56 61 6c  args,selectedVal
a8e0: 29 3b 0a 20 20 43 58 28 22 3c 73 70 61 6e 20 63  );.  CX("<span c
a8f0: 6c 61 73 73 3d 27 69 6e 70 75 74 2d 77 69 74 68  lass='input-with
a900: 2d 6c 61 62 65 6c 27 22 29 3b 0a 20 20 69 66 28  -label'");.  if(
a910: 7a 54 6f 6f 6c 54 69 70 20 26 26 20 2a 7a 54 6f  zToolTip && *zTo
a920: 6f 6c 54 69 70 29 7b 0a 20 20 20 20 43 58 28 22  olTip){.    CX("
a930: 20 74 69 74 6c 65 3d 27 25 68 27 22 2c 7a 54 6f   title='%h'",zTo
a940: 6f 6c 54 69 70 29 3b 0a 20 20 7d 0a 20 20 69 66  olTip);.  }.  if
a950: 28 7a 57 72 61 70 70 65 72 49 64 20 26 26 20 2a  (zWrapperId && *
a960: 7a 57 72 61 70 70 65 72 49 64 29 7b 0a 20 20 20  zWrapperId){.   
a970: 20 43 58 28 22 20 69 64 3d 27 25 73 27 22 2c 7a   CX(" id='%s'",z
a980: 57 72 61 70 70 65 72 49 64 29 3b 0a 20 20 7d 0a  WrapperId);.  }.
a990: 20 20 43 58 28 22 3e 22 29 3b 0a 20 20 69 66 28    CX(">");.  if(
a9a0: 7a 4c 61 62 65 6c 20 26 26 20 2a 7a 4c 61 62 65  zLabel && *zLabe
a9b0: 6c 29 7b 0a 20 20 20 20 43 58 28 22 3c 6c 61 62  l){.    CX("<lab
a9c0: 65 6c 20 6c 61 62 65 6c 3d 27 25 73 27 3e 25 68  el label='%s'>%h
a9d0: 3c 2f 6c 61 62 65 6c 3e 22 2c 20 7a 4c 61 62 65  </label>", zLabe
a9e0: 6c 49 44 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20  lID, zLabel);.  
a9f0: 7d 0a 20 20 43 58 28 22 3c 73 65 6c 65 63 74 20  }.  CX("<select 
aa00: 6e 61 6d 65 3d 27 25 73 27 20 69 64 3d 27 25 73  name='%s' id='%s
aa10: 27 3e 22 2c 7a 46 69 65 6c 64 4e 61 6d 65 2c 20  '>",zFieldName, 
aa20: 7a 4c 61 62 65 6c 49 44 29 3b 0a 20 20 77 68 69  zLabelID);.  whi
aa30: 6c 65 28 31 29 7b 0a 20 20 20 20 63 6f 6e 73 74  le(1){.    const
aa40: 20 63 68 61 72 20 2a 20 7a 4f 70 74 69 6f 6e 20   char * zOption 
aa50: 3d 20 76 61 5f 61 72 67 28 76 61 72 67 73 2c 63  = va_arg(vargs,c
aa60: 68 61 72 20 2a 29 3b 0a 20 20 20 20 69 6e 74 20  har *);.    int 
aa70: 76 3b 0a 20 20 20 20 69 66 28 4e 55 4c 4c 3d 3d  v;.    if(NULL==
aa80: 7a 4f 70 74 69 6f 6e 29 7b 0a 20 20 20 20 20 20  zOption){.      
aa90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
aaa0: 20 76 20 3d 20 76 61 5f 61 72 67 28 76 61 72 67   v = va_arg(varg
aab0: 73 2c 69 6e 74 29 3b 0a 20 20 20 20 43 58 28 22  s,int);.    CX("
aac0: 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 27 25  <option value='%
aad0: 64 27 25 73 3e 22 2c 0a 20 20 20 20 20 20 20 20  d'%s>",.        
aae0: 20 76 2c 20 76 3d 3d 73 65 6c 65 63 74 65 64 56   v, v==selectedV
aaf0: 61 6c 20 3f 20 22 20 73 65 6c 65 63 74 65 64 22  al ? " selected"
ab00: 20 3a 20 22 22 29 3b 0a 20 20 20 20 69 66 28 2a   : "");.    if(*
ab10: 7a 4f 70 74 69 6f 6e 29 7b 0a 20 20 20 20 20 20  zOption){.      
ab20: 43 58 28 22 25 73 22 2c 20 7a 4f 70 74 69 6f 6e  CX("%s", zOption
ab30: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
ab40: 20 20 20 20 43 58 28 22 25 64 22 2c 76 29 3b 0a      CX("%d",v);.
ab50: 20 20 20 20 7d 0a 20 20 20 20 43 58 28 22 3c 2f      }.    CX("</
ab60: 6f 70 74 69 6f 6e 3e 5c 6e 22 29 3b 0a 20 20 7d  option>\n");.  }
ab70: 0a 20 20 43 58 28 22 3c 2f 73 65 6c 65 63 74 3e  .  CX("</select>
ab80: 5c 6e 22 29 3b 0a 20 20 43 58 28 22 3c 2f 73 70  \n");.  CX("</sp
ab90: 61 6e 3e 5c 6e 22 29 3b 0a 20 20 76 61 5f 65 6e  an>\n");.  va_en
aba0: 64 28 76 61 72 67 73 29 3b 0a 20 20 66 6f 73 73  d(vargs);.  foss
abb0: 69 6c 5f 66 72 65 65 28 7a 4c 61 62 65 6c 49 44  il_free(zLabelID
abc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
abd0: 43 2d 73 74 72 69 6e 67 20 63 6f 75 6e 74 65 72  C-string counter
abe0: 70 61 72 74 20 6f 66 20 73 74 79 6c 65 5f 73 65  part of style_se
abf0: 6c 65 63 74 5f 6c 69 73 74 5f 69 6e 74 28 29 2c  lect_list_int(),
ac00: 20 74 68 69 73 20 76 61 72 69 61 6e 74 0a 2a 2a   this variant.**
ac10: 20 64 69 66 66 65 72 73 20 6f 6e 6c 79 20 69 6e   differs only in
ac20: 20 74 68 61 74 20 69 74 73 20 76 61 72 69 61 64   that its variad
ac30: 69 63 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ic arguments are
ac40: 20 43 2d 73 74 72 69 6e 67 73 20 69 6e 20 70 61   C-strings in pa
ac50: 69 72 73 0a 2a 2a 20 6f 66 20 28 6f 70 74 69 6f  irs.** of (optio
ac60: 6e 4c 61 62 65 6c 2c 20 6f 70 74 69 6f 6e 56 61  nLabel, optionVa
ac70: 6c 75 65 29 2e 20 49 66 20 61 20 67 69 76 65 6e  lue). If a given
ac80: 20 6f 70 74 69 6f 6e 4c 61 62 65 6c 20 69 73 20   optionLabel is 
ac90: 61 6e 20 65 6d 70 74 79 0a 2a 2a 20 73 74 72 69  an empty.** stri
aca0: 6e 67 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ng, the correspo
acb0: 6e 64 69 6e 67 20 6f 70 74 69 6f 6e 56 61 6c 75  nding optionValu
acc0: 65 20 69 73 20 75 73 65 64 20 61 73 20 69 74 73  e is used as its
acd0: 20 6c 61 62 65 6c 2e 20 49 66 20 61 6e 79 0a 2a   label. If any.*
ace0: 2a 20 67 69 76 65 6e 20 76 61 6c 75 65 20 6d 61  * given value ma
acf0: 74 63 68 65 73 20 7a 53 65 6c 65 63 74 65 64 56  tches zSelectedV
ad00: 61 6c 2c 20 74 68 61 74 20 6f 70 74 69 6f 6e 20  al, that option 
ad10: 67 65 74 73 20 70 72 65 73 65 6c 65 63 74 65 64  gets preselected
ad20: 2e 20 49 66 0a 2a 2a 20 6e 6f 20 6f 70 74 69 6f  . If.** no optio
ad30: 6e 73 20 6d 61 74 63 68 20 7a 53 65 6c 65 63 74  ns match zSelect
ad40: 65 64 56 61 6c 20 74 68 65 6e 20 74 68 65 20 66  edVal then the f
ad50: 69 72 73 74 20 65 6e 74 72 79 20 69 73 20 73 65  irst entry is se
ad60: 6c 65 63 74 65 64 20 62 79 0a 2a 2a 20 64 65 66  lected by.** def
ad70: 61 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  ault..**.** Any 
ad80: 6f 66 20 28 7a 57 72 61 70 70 65 72 49 64 2c 20  of (zWrapperId, 
ad90: 7a 54 6f 6f 6c 74 69 70 2c 20 7a 53 65 6c 65 63  zTooltip, zSelec
ada0: 74 65 64 56 61 6c 29 20 6d 61 79 20 62 65 20 4e  tedVal) may be N
adb0: 55 4c 4c 20 6f 72 20 65 6d 70 74 79 2e 0a 2a 2a  ULL or empty..**
adc0: 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  .** Example:.**.
add0: 2a 2a 20 73 74 79 6c 65 5f 73 65 6c 65 63 74 5f  ** style_select_
ade0: 6c 69 73 74 5f 73 74 72 28 22 6d 79 2d 67 72 61  list_str("my-gra
adf0: 70 65 73 22 2c 20 22 6d 79 5f 67 72 61 70 65 73  pes", "my_grapes
ae00: 22 2c 20 22 47 72 61 70 65 73 22 2c 0a 2a 2a 20  ", "Grapes",.** 
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae20: 20 20 20 20 20 22 53 65 6c 65 63 74 20 74 68 65       "Select the
ae30: 20 6e 75 6d 62 65 72 20 6f 66 20 67 72 61 70 65   number of grape
ae40: 73 22 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  s",.**          
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 28 22               P("
ae60: 6d 79 5f 66 69 65 6c 64 22 29 2c 0a 2a 2a 20 20  my_field"),.**  
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae80: 20 20 20 20 20 22 31 22 2c 20 22 4f 6e 65 22 2c       "1", "One",
ae90: 20 22 32 22 2c 20 22 54 77 6f 22 2c 20 22 22 2c   "2", "Two", "",
aea0: 20 22 33 22 2c 0a 2a 2a 20 20 20 20 20 20 20 20   "3",.**        
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
aec0: 55 4c 4c 29 3b 0a 2a 2f 0a 76 6f 69 64 20 73 74  ULL);.*/.void st
aed0: 79 6c 65 5f 73 65 6c 65 63 74 5f 6c 69 73 74 5f  yle_select_list_
aee0: 73 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  str(const char *
aef0: 20 7a 57 72 61 70 70 65 72 49 64 2c 0a 20 20 20   zWrapperId,.   
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
af20: 61 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 2c 20  ar *zFieldName, 
af30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 4c 61  const char * zLa
af40: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  bel,.           
af50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 54 6f  const char * zTo
af70: 6f 6c 54 69 70 2c 20 63 68 61 72 20 63 6f 6e 73  olTip, char cons
af80: 74 20 2a 20 7a 53 65 6c 65 63 74 65 64 56 61 6c  t * zSelectedVal
af90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e               ...
afb0: 20 29 7b 0a 20 20 63 68 61 72 20 2a 20 7a 4c 61   ){.  char * zLa
afc0: 62 65 6c 49 44 20 3d 20 73 74 79 6c 65 5f 6e 65  belID = style_ne
afd0: 78 74 5f 69 6e 70 75 74 5f 69 64 28 29 3b 0a 20  xt_input_id();. 
afe0: 20 76 61 5f 6c 69 73 74 20 76 61 72 67 73 3b 0a   va_list vargs;.
aff0: 0a 20 20 76 61 5f 73 74 61 72 74 28 76 61 72 67  .  va_start(varg
b000: 73 2c 7a 53 65 6c 65 63 74 65 64 56 61 6c 29 3b  s,zSelectedVal);
b010: 0a 20 20 69 66 28 21 7a 53 65 6c 65 63 74 65 64  .  if(!zSelected
b020: 56 61 6c 29 7b 0a 20 20 20 20 7a 53 65 6c 65 63  Val){.    zSelec
b030: 74 65 64 56 61 6c 20 3d 20 5f 5f 46 49 4c 45 5f  tedVal = __FILE_
b040: 5f 2f 2a 73 6f 6d 65 20 73 74 72 69 6e 67 20 77  _/*some string w
b050: 65 27 6c 6c 20 6e 65 76 65 72 20 6d 61 74 63 68  e'll never match
b060: 2a 2f 3b 0a 20 20 7d 0a 20 20 43 58 28 22 3c 73  */;.  }.  CX("<s
b070: 70 61 6e 20 63 6c 61 73 73 3d 27 69 6e 70 75 74  pan class='input
b080: 2d 77 69 74 68 2d 6c 61 62 65 6c 27 22 29 3b 0a  -with-label'");.
b090: 20 20 69 66 28 7a 54 6f 6f 6c 54 69 70 20 26 26    if(zToolTip &&
b0a0: 20 2a 7a 54 6f 6f 6c 54 69 70 29 7b 0a 20 20 20   *zToolTip){.   
b0b0: 20 43 58 28 22 20 74 69 74 6c 65 3d 27 25 68 27   CX(" title='%h'
b0c0: 22 2c 7a 54 6f 6f 6c 54 69 70 29 3b 0a 20 20 7d  ",zToolTip);.  }
b0d0: 0a 20 20 69 66 28 7a 57 72 61 70 70 65 72 49 64  .  if(zWrapperId
b0e0: 20 26 26 20 2a 7a 57 72 61 70 70 65 72 49 64 29   && *zWrapperId)
b0f0: 7b 0a 20 20 20 20 43 58 28 22 20 69 64 3d 27 25  {.    CX(" id='%
b100: 73 27 22 2c 7a 57 72 61 70 70 65 72 49 64 29 3b  s'",zWrapperId);
b110: 0a 20 20 7d 0a 20 20 43 58 28 22 3e 22 29 3b 0a  .  }.  CX(">");.
b120: 20 20 69 66 28 7a 4c 61 62 65 6c 20 26 26 20 2a    if(zLabel && *
b130: 7a 4c 61 62 65 6c 29 7b 0a 20 20 20 20 43 58 28  zLabel){.    CX(
b140: 22 3c 6c 61 62 65 6c 20 66 6f 72 3d 27 25 73 27  "<label for='%s'
b150: 3e 25 68 3c 2f 6c 61 62 65 6c 3e 22 2c 20 7a 4c  >%h</label>", zL
b160: 61 62 65 6c 49 44 2c 20 7a 4c 61 62 65 6c 29 3b  abelID, zLabel);
b170: 0a 20 20 7d 0a 20 20 43 58 28 22 3c 73 65 6c 65  .  }.  CX("<sele
b180: 63 74 20 6e 61 6d 65 3d 27 25 73 27 20 69 64 3d  ct name='%s' id=
b190: 27 25 73 27 3e 22 2c 7a 46 69 65 6c 64 4e 61 6d  '%s'>",zFieldNam
b1a0: 65 2c 20 7a 4c 61 62 65 6c 49 44 29 3b 0a 20 20  e, zLabelID);.  
b1b0: 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 63 6f  while(1){.    co
b1c0: 6e 73 74 20 63 68 61 72 20 2a 20 7a 4c 61 62 65  nst char * zLabe
b1d0: 6c 20 3d 20 76 61 5f 61 72 67 28 76 61 72 67 73  l = va_arg(vargs
b1e0: 2c 63 68 61 72 20 2a 29 3b 0a 20 20 20 20 63 6f  ,char *);.    co
b1f0: 6e 73 74 20 63 68 61 72 20 2a 20 7a 56 61 6c 3b  nst char * zVal;
b200: 0a 20 20 20 20 69 66 28 4e 55 4c 4c 3d 3d 7a 4c  .    if(NULL==zL
b210: 61 62 65 6c 29 7b 0a 20 20 20 20 20 20 62 72 65  abel){.      bre
b220: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 56  ak;.    }.    zV
b230: 61 6c 20 3d 20 76 61 5f 61 72 67 28 76 61 72 67  al = va_arg(varg
b240: 73 2c 63 68 61 72 20 2a 29 3b 0a 20 20 20 20 43  s,char *);.    C
b250: 58 28 22 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65  X("<option value
b260: 3d 27 25 54 27 25 73 3e 22 2c 0a 20 20 20 20 20  ='%T'%s>",.     
b270: 20 20 7a 56 61 6c 2c 20 30 3d 3d 66 6f 73 73 69    zVal, 0==fossi
b280: 6c 5f 73 74 72 63 6d 70 28 7a 56 61 6c 2c 20 7a  l_strcmp(zVal, z
b290: 53 65 6c 65 63 74 65 64 56 61 6c 29 20 3f 20 22  SelectedVal) ? "
b2a0: 20 73 65 6c 65 63 74 65 64 22 20 3a 20 22 22 29   selected" : "")
b2b0: 3b 0a 20 20 20 20 69 66 28 2a 7a 4c 61 62 65 6c  ;.    if(*zLabel
b2c0: 29 7b 0a 20 20 20 20 20 20 43 58 28 22 25 73 22  ){.      CX("%s"
b2d0: 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 7d  , zLabel);.    }
b2e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 43 58 28 22  else{.      CX("
b2f0: 25 68 22 2c 7a 56 61 6c 29 3b 0a 20 20 20 20 7d  %h",zVal);.    }
b300: 0a 20 20 20 20 43 58 28 22 3c 2f 6f 70 74 69 6f  .    CX("</optio
b310: 6e 3e 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 43 58  n>\n");.  }.  CX
b320: 28 22 3c 2f 73 65 6c 65 63 74 3e 5c 6e 22 29 3b  ("</select>\n");
b330: 0a 20 20 43 58 28 22 3c 2f 73 70 61 6e 3e 5c 6e  .  CX("</span>\n
b340: 22 29 3b 0a 20 20 76 61 5f 65 6e 64 28 76 61 72  ");.  va_end(var
b350: 67 73 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72  gs);.  fossil_fr
b360: 65 65 28 7a 4c 61 62 65 6c 49 44 29 3b 0a 7d 0a  ee(zLabelID);.}.
b370: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
b380: 74 20 74 69 6d 65 20 74 68 69 73 20 69 73 20 63  t time this is c
b390: 61 6c 6c 65 64 2c 20 69 74 20 65 6d 69 74 73 20  alled, it emits 
b3a0: 63 6f 64 65 20 74 6f 20 69 6e 73 74 61 6c 6c 20  code to install 
b3b0: 61 6e 64 0a 2a 2a 20 62 6f 6f 74 73 74 72 61 70  and.** bootstrap
b3c0: 20 74 68 65 20 77 69 6e 64 6f 77 2e 66 6f 73 73   the window.foss
b3d0: 69 6c 20 6f 62 6a 65 63 74 2c 20 75 73 69 6e 67  il object, using
b3e0: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66 69   the built-in fi
b3f0: 6c 65 0a 2a 2a 20 66 6f 73 73 69 6c 2e 62 6f 6f  le.** fossil.boo
b400: 74 73 74 72 61 70 2e 6a 73 20 28 6e 6f 74 20 74  tstrap.js (not t
b410: 6f 20 62 65 20 63 6f 6e 66 75 73 65 64 20 77 69  o be confused wi
b420: 74 68 20 62 6f 6f 74 73 74 72 61 70 2e 6a 73 29  th bootstrap.js)
b430: 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 65 71 75 65  ..**.** Subseque
b440: 6e 74 20 63 61 6c 6c 73 20 61 72 65 20 6e 6f 2d  nt calls are no-
b450: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ops..**.** If pa
b460: 73 73 65 64 20 61 20 74 72 75 65 20 76 61 6c 75  ssed a true valu
b470: 65 2c 20 69 74 20 65 6d 69 74 73 20 74 68 65 20  e, it emits the 
b480: 63 6f 6e 74 65 6e 74 73 20 64 69 72 65 63 74 6c  contents directl
b490: 79 20 74 6f 20 74 68 65 20 70 61 67 65 0a 2a 2a  y to the page.**
b4a0: 20 6f 75 74 70 75 74 2c 20 65 6c 73 65 20 69 74   output, else it
b4b0: 20 65 6d 69 74 73 20 61 20 73 63 72 69 70 74 20   emits a script 
b4c0: 74 61 67 20 77 69 74 68 20 61 20 73 72 63 3d 62  tag with a src=b
b4d0: 75 69 6c 74 69 6e 2f 2e 2e 2e 20 74 6f 20 6c 6f  uiltin/... to lo
b4e0: 61 64 0a 2a 2a 20 74 68 65 20 73 63 72 69 70 74  ad.** the script
b4f0: 2e 20 49 74 20 61 6c 77 61 79 73 20 6f 75 74 70  . It always outp
b500: 75 74 73 20 61 20 73 6d 61 6c 6c 20 70 72 65 2d  uts a small pre-
b510: 62 6f 6f 74 73 74 72 61 70 20 65 6c 65 6d 65 6e  bootstrap elemen
b520: 74 20 69 6e 20 69 74 73 0a 2a 2a 20 6f 77 6e 20  t in its.** own 
b530: 73 63 72 69 70 74 20 74 61 67 20 74 6f 20 69 6e  script tag to in
b540: 69 74 69 61 6c 69 7a 65 20 70 61 72 74 73 20 77  itialize parts w
b550: 68 69 63 68 20 6e 65 65 64 20 43 2d 72 75 6e 74  hich need C-runt
b560: 69 6d 65 2d 6c 65 76 65 6c 0a 2a 2a 20 69 6e 66  ime-level.** inf
b570: 6f 72 6d 61 74 69 6f 6e 2c 20 62 65 66 6f 72 65  ormation, before
b580: 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 6d 61 69   loading the mai
b590: 6e 20 66 6f 73 73 69 6c 2e 62 6f 6f 74 73 74 72  n fossil.bootstr
b5a0: 61 70 2e 6a 73 20 65 69 74 68 65 72 0a 2a 2a 20  ap.js either.** 
b5b0: 69 6e 6c 69 6e 65 20 6f 72 20 76 69 61 20 61 20  inline or via a 
b5c0: 3c 73 63 72 69 70 74 20 73 72 63 3d 2e 2e 2e 3e  <script src=...>
b5d0: 2c 20 61 73 20 73 70 65 63 69 66 69 65 64 20 62  , as specified b
b5e0: 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  y the first.** a
b5f0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  rgument..*/.void
b600: 20 73 74 79 6c 65 5f 65 6d 69 74 5f 73 63 72 69   style_emit_scri
b610: 70 74 5f 66 6f 73 73 69 6c 5f 62 6f 6f 74 73 74  pt_fossil_bootst
b620: 72 61 70 28 69 6e 74 20 61 73 49 6e 6c 69 6e 65  rap(int asInline
b630: 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
b640: 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 66 28 30  once = 0;.  if(0
b650: 3d 3d 6f 6e 63 65 2b 2b 29 7b 0a 20 20 20 20 2f  ==once++){.    /
b660: 2a 20 53 65 74 20 75 70 20 74 68 65 20 67 65 6e  * Set up the gen
b670: 65 72 69 63 2f 61 70 70 2d 61 67 6e 6f 73 74 69  eric/app-agnosti
b680: 63 20 70 61 72 74 73 20 6f 66 20 77 69 6e 64 6f  c parts of windo
b690: 77 2e 66 6f 73 73 69 6c 0a 20 20 20 20 2a 2a 20  w.fossil.    ** 
b6a0: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 43 2d  which require C-
b6b0: 6c 65 76 65 6c 20 73 74 61 74 65 2e 2e 2e 20 2a  level state... *
b6c0: 2f 0a 20 20 20 20 73 74 79 6c 65 5f 65 6d 69 74  /.    style_emit
b6d0: 5f 73 63 72 69 70 74 5f 74 61 67 28 30 2c 30 29  _script_tag(0,0)
b6e0: 3b 0a 20 20 20 20 43 58 28 22 28 66 75 6e 63 74  ;.    CX("(funct
b6f0: 69 6f 6e 28 29 7b 5c 6e 22 0a 20 20 20 20 20 20  ion(){\n".      
b700: 20 22 69 66 28 21 77 69 6e 64 6f 77 2e 66 6f 73   "if(!window.fos
b710: 73 69 6c 29 20 77 69 6e 64 6f 77 2e 66 6f 73 73  sil) window.foss
b720: 69 6c 3d 7b 7d 3b 5c 6e 22 0a 20 20 20 20 20 20  il={};\n".      
b730: 20 22 77 69 6e 64 6f 77 2e 66 6f 73 73 69 6c 2e   "window.fossil.
b740: 76 65 72 73 69 6f 6e 20 3d 20 25 21 6a 3b 5c 6e  version = %!j;\n
b750: 22 0a 20 20 20 20 2f 2a 20 66 6f 73 73 69 6c 2e  ".    /* fossil.
b760: 72 6f 6f 74 50 61 74 68 20 69 73 20 74 68 65 20  rootPath is the 
b770: 74 6f 70 2d 6d 6f 73 74 20 43 47 49 2f 73 65 72  top-most CGI/ser
b780: 76 65 72 20 70 61 74 68 2c 0a 20 20 20 20 2a 2a  ver path,.    **
b790: 20 69 6e 63 6c 75 64 69 6e 67 20 61 20 74 72 61   including a tra
b7a0: 69 6c 69 6e 67 20 73 6c 61 73 68 2e 20 2a 2f 0a  iling slash. */.
b7b0: 20 20 20 20 20 20 20 22 77 69 6e 64 6f 77 2e 66         "window.f
b7c0: 6f 73 73 69 6c 2e 72 6f 6f 74 50 61 74 68 20 3d  ossil.rootPath =
b7d0: 20 25 21 6a 2b 27 2f 27 3b 5c 6e 22 2c 0a 20 20   %!j+'/';\n",.  
b7e0: 20 20 20 20 20 67 65 74 5f 76 65 72 73 69 6f 6e       get_version
b7f0: 28 29 2c 20 67 2e 7a 54 6f 70 29 3b 0a 20 20 20  (), g.zTop);.   
b800: 20 2f 2a 20 66 6f 73 73 69 6c 2e 63 6f 6e 66 69   /* fossil.confi
b810: 67 20 3d 20 7b 2e 2e 2e 76 61 72 69 6f 75 73 20  g = {...various 
b820: 63 6f 6e 66 69 67 2d 6c 65 76 65 6c 20 6f 70 74  config-level opt
b830: 69 6f 6e 73 2e 2e 2e 7d 20 2a 2f 0a 20 20 20 20  ions...} */.    
b840: 43 58 28 22 77 69 6e 64 6f 77 2e 66 6f 73 73 69  CX("window.fossi
b850: 6c 2e 63 6f 6e 66 69 67 20 3d 20 7b 22 0a 20 20  l.config = {".  
b860: 20 20 20 20 20 22 68 61 73 68 44 69 67 69 74 73       "hashDigits
b870: 3a 20 25 64 2c 20 68 61 73 68 44 69 67 69 74 73  : %d, hashDigits
b880: 55 72 6c 3a 20 25 64 22 0a 20 20 20 20 20 20 20  Url: %d".       
b890: 22 7d 3b 5c 6e 22 2c 20 68 61 73 68 5f 64 69 67  "};\n", hash_dig
b8a0: 69 74 73 28 30 29 2c 20 68 61 73 68 5f 64 69 67  its(0), hash_dig
b8b0: 69 74 73 28 31 29 29 3b 0a 23 69 66 20 30 0a 20  its(1));.#if 0. 
b8c0: 20 20 20 2f 2a 20 49 73 20 69 74 20 73 61 66 65     /* Is it safe
b8d0: 20 74 6f 20 65 6d 69 74 20 74 68 65 20 43 53 52   to emit the CSR
b8e0: 46 20 74 6f 6b 65 6e 20 68 65 72 65 3f 20 53 6f  F token here? So
b8f0: 6d 65 20 70 61 67 65 73 20 61 64 64 20 69 74 0a  me pages add it.
b900: 20 20 20 20 2a 2a 20 61 73 20 61 20 68 69 64 64      ** as a hidd
b910: 65 6e 20 66 6f 72 6d 20 66 69 65 6c 64 2e 20 2a  en form field. *
b920: 2f 0a 20 20 20 20 69 66 28 67 2e 7a 43 73 72 66  /.    if(g.zCsrf
b930: 54 6f 6b 65 6e 5b 30 5d 21 3d 30 29 7b 0a 20 20  Token[0]!=0){.  
b940: 20 20 20 20 43 58 28 22 77 69 6e 64 6f 77 2e 66      CX("window.f
b950: 6f 73 73 69 6c 2e 63 73 72 66 54 6f 6b 65 6e 20  ossil.csrfToken 
b960: 3d 20 25 21 6a 3b 5c 6e 22 2c 0a 20 20 20 20 20  = %!j;\n",.     
b970: 20 20 20 20 67 2e 7a 43 73 72 66 54 6f 6b 65 6e      g.zCsrfToken
b980: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
b990: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 66 6f      /*.    ** fo
b9a0: 73 73 69 6c 2e 70 61 67 65 20 68 6f 6c 64 73 20  ssil.page holds 
b9b0: 69 6e 66 6f 20 61 62 6f 75 74 20 74 68 65 20 63  info about the c
b9c0: 75 72 72 65 6e 74 20 70 61 67 65 2e 20 54 68 69  urrent page. Thi
b9d0: 73 20 69 73 20 61 6c 73 6f 0a 20 20 20 20 2a 2a  s is also.    **
b9e0: 20 77 68 65 72 65 20 74 68 65 20 63 75 72 72 65   where the curre
b9f0: 6e 74 20 70 61 67 65 20 22 73 68 6f 75 6c 64 22  nt page "should"
ba00: 20 73 74 6f 72 65 20 61 6e 79 20 6f 66 20 69 74   store any of it
ba10: 73 20 6f 77 6e 0a 20 20 20 20 2a 2a 20 70 61 67  s own.    ** pag
ba20: 65 2d 73 70 65 63 69 66 69 63 20 73 74 61 74 65  e-specific state
ba30: 2c 20 61 6e 64 20 69 74 20 69 73 20 72 65 73 65  , and it is rese
ba40: 72 76 65 64 20 66 6f 72 20 74 68 61 74 20 70 75  rved for that pu
ba50: 72 70 6f 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  rpose..    */.  
ba60: 20 20 43 58 28 22 77 69 6e 64 6f 77 2e 66 6f 73    CX("window.fos
ba70: 73 69 6c 2e 70 61 67 65 20 3d 20 7b 22 0a 20 20  sil.page = {".  
ba80: 20 20 20 20 20 22 6e 61 6d 65 3a 5c 22 25 54 5c       "name:\"%T\
ba90: 22 22 0a 20 20 20 20 20 20 20 22 7d 3b 5c 6e 22  "".       "};\n"
baa0: 2c 20 67 2e 7a 50 61 74 68 29 3b 0a 20 20 20 20  , g.zPath);.    
bab0: 43 58 28 22 7d 29 28 29 3b 5c 6e 22 29 3b 0a 20  CX("})();\n");. 
bac0: 20 20 20 2f 2a 20 54 68 65 20 72 65 6d 61 69 6e     /* The remain
bad0: 69 6e 67 20 66 6f 73 73 69 6c 20 6f 62 6a 65 63  ing fossil objec
bae0: 74 20 62 6f 6f 74 73 74 72 61 70 20 63 6f 64 65  t bootstrap code
baf0: 20 69 73 20 6e 6f 74 20 64 65 70 65 6e 64 65 6e   is not dependen
bb00: 74 20 6f 6e 0a 20 20 20 20 2a 2a 20 43 2d 72 75  t on.    ** C-ru
bb10: 6e 74 69 6d 65 20 73 74 61 74 65 2e 2e 2e 20 2a  ntime state... *
bb20: 2f 0a 20 20 20 20 69 66 28 61 73 49 6e 6c 69 6e  /.    if(asInlin
bb30: 65 29 7b 0a 20 20 20 20 20 20 43 58 28 22 25 73  e){.      CX("%s
bb40: 5c 6e 22 2c 20 62 75 69 6c 74 69 6e 5f 74 65 78  \n", builtin_tex
bb50: 74 28 22 66 6f 73 73 69 6c 2e 62 6f 6f 74 73 74  t("fossil.bootst
bb60: 72 61 70 2e 6a 73 22 29 29 3b 0a 20 20 20 20 7d  rap.js"));.    }
bb70: 0a 20 20 20 20 73 74 79 6c 65 5f 65 6d 69 74 5f  .    style_emit_
bb80: 73 63 72 69 70 74 5f 74 61 67 28 31 2c 30 29 3b  script_tag(1,0);
bb90: 0a 20 20 20 20 69 66 28 61 73 49 6e 6c 69 6e 65  .    if(asInline
bba0: 3d 3d 30 29 7b 0a 20 20 20 20 20 20 73 74 79 6c  ==0){.      styl
bbb0: 65 5f 65 6d 69 74 5f 73 63 72 69 70 74 5f 62 75  e_emit_script_bu
bbc0: 69 6c 74 69 6e 28 30 2c 20 22 66 6f 73 73 69 6c  iltin(0, "fossil
bbd0: 2e 62 6f 6f 74 73 74 72 61 70 2e 6a 73 22 29 3b  .bootstrap.js");
bbe0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
bbf0: 0a 2a 2a 20 49 66 20 70 61 73 73 65 64 20 30 20  .** If passed 0 
bc00: 61 73 20 69 74 73 20 66 69 72 73 74 20 61 72 67  as its first arg
bc10: 75 6d 65 6e 74 2c 20 69 74 20 65 6d 69 74 73 20  ument, it emits 
bc20: 61 20 73 63 72 69 70 74 20 6f 70 65 6e 65 72 20  a script opener 
bc30: 74 61 67 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  tag.** with this
bc40: 20 72 65 71 75 65 73 74 27 73 20 6e 6f 6e 63 65   request's nonce
bc50: 2e 20 49 66 20 70 61 73 73 65 64 20 6e 6f 6e 2d  . If passed non-
bc60: 30 20 69 74 20 65 6d 69 74 73 20 61 20 73 63 72  0 it emits a scr
bc70: 69 70 74 0a 2a 2a 20 63 6c 6f 73 69 6e 67 20 74  ipt.** closing t
bc80: 61 67 2e 20 4d 6e 65 6d 6f 6e 69 63 20 66 6f 72  ag. Mnemonic for
bc90: 20 72 65 6d 65 6d 62 65 72 69 6e 67 20 74 68 65   remembering the
bca0: 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20   order in which 
bcb0: 74 6f 20 70 61 73 73 20 30 0a 2a 2a 20 6f 72 20  to pass 0.** or 
bcc0: 31 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  1 as the first a
bcd0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
bce0: 66 75 6e 63 74 69 6f 6e 3a 20 30 20 63 6f 6d 65  function: 0 come
bcf0: 73 20 62 65 66 6f 72 65 20 31 2e 0a 2a 2a 0a 2a  s before 1..**.*
bd00: 2a 20 49 66 20 70 61 73 73 65 64 20 30 20 61 73  * If passed 0 as
bd10: 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75 6d   its first argum
bd20: 65 6e 74 20 61 6e 64 20 61 20 6e 6f 6e 2d 4e 55  ent and a non-NU
bd30: 4c 4c 2f 6e 6f 6e 2d 65 6d 70 74 79 20 7a 53 72  LL/non-empty zSr
bd40: 63 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 6e  c,.** then it in
bd50: 73 74 65 61 64 20 65 6d 69 74 73 3a 0a 2a 2a 0a  stead emits:.**.
bd60: 2a 2a 20 3c 73 63 72 69 70 74 20 73 72 63 3d 27  ** <script src='
bd70: 25 52 2f 7b 7b 7a 53 72 63 7d 7d 27 3e 3c 2f 73  %R/{{zSrc}}'></s
bd80: 63 72 69 70 74 3e 0a 2a 2a 0a 2a 2a 20 7a 53 72  cript>.**.** zSr
bd90: 63 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 75  c is always assu
bda0: 6d 65 64 20 74 6f 20 62 65 20 61 20 72 65 70 6f  med to be a repo
bdb0: 73 69 74 6f 72 79 2d 72 65 6c 61 74 69 76 65 20  sitory-relative 
bdc0: 70 61 74 68 20 77 69 74 68 6f 75 74 0a 2a 2a 20  path without.** 
bdd0: 61 20 6c 65 61 64 69 6e 67 20 73 6c 61 73 68 2c  a leading slash,
bde0: 20 61 6e 64 20 68 61 73 20 25 52 2f 20 70 72 65   and has %R/ pre
bdf0: 70 65 6e 64 65 64 20 74 6f 20 69 74 2e 0a 2a 2a  pended to it..**
be00: 0a 2a 2a 20 4d 65 61 6e 69 6e 67 20 74 68 61 74  .** Meaning that
be10: 20 6e 6f 20 66 6f 6c 6c 6f 77 2d 75 70 20 63 61   no follow-up ca
be20: 6c 6c 20 74 6f 20 70 61 73 73 20 61 20 6e 6f 6e  ll to pass a non
be30: 2d 30 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  -0 first argumen
be40: 74 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 20 74 68  t.** to close th
be50: 65 20 74 61 67 2e 20 7a 53 72 63 20 69 73 20 69  e tag. zSrc is i
be60: 67 6e 6f 72 65 64 20 69 66 20 74 68 65 20 66 69  gnored if the fi
be70: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
be80: 6e 6f 74 0a 2a 2a 20 30 2e 0a 2a 2f 0a 76 6f 69  not.** 0..*/.voi
be90: 64 20 73 74 79 6c 65 5f 65 6d 69 74 5f 73 63 72  d style_emit_scr
bea0: 69 70 74 5f 74 61 67 28 69 6e 74 20 69 73 43 6c  ipt_tag(int isCl
beb0: 6f 73 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  oser, const char
bec0: 20 2a 20 7a 53 72 63 29 7b 0a 20 20 69 66 28 30   * zSrc){.  if(0
bed0: 3d 3d 69 73 43 6c 6f 73 65 72 29 7b 0a 20 20 20  ==isCloser){.   
bee0: 20 69 66 28 7a 53 72 63 21 3d 30 20 26 26 20 7a   if(zSrc!=0 && z
bef0: 53 72 63 5b 30 5d 21 3d 30 29 7b 0a 20 20 20 20  Src[0]!=0){.    
bf00: 20 20 43 58 28 22 3c 73 63 72 69 70 74 20 73 72    CX("<script sr
bf10: 63 3d 27 25 52 2f 25 54 27 3e 3c 2f 73 63 72 69  c='%R/%T'></scri
bf20: 70 74 3e 5c 6e 22 2c 20 7a 53 72 63 29 3b 0a 20  pt>\n", zSrc);. 
bf30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bf40: 43 58 28 22 3c 73 63 72 69 70 74 20 6e 6f 6e 63  CX("<script nonc
bf50: 65 3d 27 25 73 27 3e 22 2c 20 73 74 79 6c 65 5f  e='%s'>", style_
bf60: 6e 6f 6e 63 65 28 29 29 3b 0a 20 20 20 20 7d 0a  nonce());.    }.
bf70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 58 28    }else{.    CX(
bf80: 22 3c 2f 73 63 72 69 70 74 3e 5c 6e 22 29 3b 0a  "</script>\n");.
bf90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6d 69    }.}../*.** Emi
bfa0: 74 73 20 61 20 73 63 72 69 70 74 20 74 61 67 20  ts a script tag 
bfb0: 77 68 69 63 68 20 75 73 65 73 20 63 6f 6e 74 65  which uses conte
bfc0: 6e 74 20 66 72 6f 6d 20 61 20 62 75 69 6c 74 69  nt from a builti
bfd0: 6e 20 73 63 72 69 70 74 20 66 69 6c 65 2e 0a 2a  n script file..*
bfe0: 2a 0a 2a 2a 20 49 66 20 61 73 49 6e 6c 69 6e 65  *.** If asInline
bff0: 20 69 73 20 74 72 75 65 2c 20 69 74 20 69 73 20   is true, it is 
c000: 65 6d 69 74 74 65 64 20 64 69 72 65 63 74 6c 79  emitted directly
c010: 20 61 73 20 61 6e 20 6f 70 65 6e 69 6e 67 20 74   as an opening t
c020: 61 67 2c 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ag, the.** conte
c030: 6e 74 20 6f 66 20 74 68 65 20 7a 4e 61 6d 65 20  nt of the zName 
c040: 62 75 69 6c 74 69 6e 20 66 69 6c 65 2c 20 61 6e  builtin file, an
c050: 64 20 61 20 63 6c 6f 73 69 6e 67 20 74 61 67 2e  d a closing tag.
c060: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
c070: 66 61 6c 73 65 2c 20 61 20 73 63 72 69 70 74 20  false, a script 
c080: 74 61 67 20 6c 6f 61 64 69 6e 67 20 69 74 20 76  tag loading it v
c090: 69 61 0a 2a 2a 20 73 72 63 3d 62 75 69 6c 74 69  ia.** src=builti
c0a0: 6e 2f 7b 7b 7a 4e 61 6d 65 7d 7d 3f 63 61 63 68  n/{{zName}}?cach
c0b0: 65 3d 58 59 5a 20 69 73 20 65 6d 69 74 74 65 64  e=XYZ is emitted
c0c0: 2c 20 77 68 65 72 65 20 58 59 5a 20 69 73 20 61  , where XYZ is a
c0d0: 0a 2a 2a 20 62 75 69 6c 64 2d 74 69 6d 65 2d 64  .** build-time-d
c0e0: 65 70 65 6e 64 65 6e 74 20 63 61 63 68 65 2d 62  ependent cache-b
c0f0: 75 73 74 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a  uster value..*/.
c100: 76 6f 69 64 20 73 74 79 6c 65 5f 65 6d 69 74 5f  void style_emit_
c110: 73 63 72 69 70 74 5f 62 75 69 6c 74 69 6e 28 69  script_builtin(i
c120: 6e 74 20 61 73 49 6e 6c 69 6e 65 2c 20 63 68 61  nt asInline, cha
c130: 72 20 63 6f 6e 73 74 20 2a 20 7a 4e 61 6d 65 29  r const * zName)
c140: 7b 0a 20 20 69 66 28 61 73 49 6e 6c 69 6e 65 29  {.  if(asInline)
c150: 7b 0a 20 20 20 20 73 74 79 6c 65 5f 65 6d 69 74  {.    style_emit
c160: 5f 73 63 72 69 70 74 5f 74 61 67 28 30 2c 30 29  _script_tag(0,0)
c170: 3b 0a 20 20 20 20 43 58 28 22 25 73 22 2c 20 62  ;.    CX("%s", b
c180: 75 69 6c 74 69 6e 5f 74 65 78 74 28 7a 4e 61 6d  uiltin_text(zNam
c190: 65 29 29 3b 0a 20 20 20 20 73 74 79 6c 65 5f 65  e));.    style_e
c1a0: 6d 69 74 5f 73 63 72 69 70 74 5f 74 61 67 28 31  mit_script_tag(1
c1b0: 2c 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ,0);.  }else{.  
c1c0: 20 20 63 68 61 72 20 2a 20 7a 46 75 6c 6c 4e 61    char * zFullNa
c1d0: 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 62 75  me = mprintf("bu
c1e0: 69 6c 74 69 6e 2f 25 73 22 2c 7a 4e 61 6d 65 29  iltin/%s",zName)
c1f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
c200: 20 2a 20 7a 48 61 73 68 20 3d 20 66 6f 73 73 69   * zHash = fossi
c210: 6c 5f 65 78 65 5f 69 64 28 29 3b 0a 20 20 20 20  l_exe_id();.    
c220: 43 58 28 22 3c 73 63 72 69 70 74 20 73 72 63 3d  CX("<script src=
c230: 27 25 52 2f 25 54 3f 63 61 63 68 65 3d 25 2e 38  '%R/%T?cache=%.8
c240: 73 27 3e 3c 2f 73 63 72 69 70 74 3e 5c 6e 22 2c  s'></script>\n",
c250: 0a 20 20 20 20 20 20 20 7a 46 75 6c 6c 4e 61 6d  .       zFullNam
c260: 65 2c 20 7a 48 61 73 68 29 3b 0a 20 20 20 20 66  e, zHash);.    f
c270: 6f 73 73 69 6c 5f 66 72 65 65 28 7a 46 75 6c 6c  ossil_free(zFull
c280: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Name);.  }.}../*
c290: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
c2a0: 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  me this is calle
c2b0: 64 20 69 74 20 65 6d 69 74 73 20 74 68 65 20 4a  d it emits the J
c2c0: 53 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 0a  S code from the.
c2d0: 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 66 69 6c 65  ** built-in file
c2e0: 20 66 6f 73 73 69 6c 2e 66 6f 73 73 69 6c 2e 6a   fossil.fossil.j
c2f0: 73 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  s. Subsequent ca
c300: 6c 6c 73 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  lls are no-ops..
c310: 2a 2a 0a 2a 2a 20 49 66 20 70 61 73 73 65 64 20  **.** If passed 
c320: 61 20 74 72 75 65 20 76 61 6c 75 65 2c 20 69 74  a true value, it
c330: 20 65 6d 69 74 73 20 74 68 65 20 63 6f 6e 74 65   emits the conte
c340: 6e 74 73 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20  nts directly.** 
c350: 74 6f 20 74 68 65 20 70 61 67 65 20 6f 75 74 70  to the page outp
c360: 75 74 2c 20 65 6c 73 65 20 69 74 20 65 6d 69 74  ut, else it emit
c370: 73 20 61 20 73 63 72 69 70 74 20 74 61 67 20 77  s a script tag w
c380: 69 74 68 20 61 0a 2a 2a 20 73 72 63 3d 62 75 69  ith a.** src=bui
c390: 6c 74 69 6e 2f 2e 2e 2e 20 74 6f 20 6c 6f 61 64  ltin/... to load
c3a0: 20 74 68 65 20 73 63 72 69 70 74 2e 0a 2a 2a 0a   the script..**.
c3b0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
c3c0: 73 20 63 6f 64 65 20 72 65 6c 69 65 73 20 6f 6e  s code relies on
c3d0: 20 74 68 61 74 20 6c 6f 61 64 65 64 20 76 69 61   that loaded via
c3e0: 0a 2a 2a 20 73 74 79 6c 65 5f 65 6d 69 74 5f 73  .** style_emit_s
c3f0: 63 72 69 70 74 5f 66 6f 73 73 69 6c 5f 62 6f 6f  cript_fossil_boo
c400: 74 73 74 72 61 70 28 29 20 62 75 74 20 69 74 20  tstrap() but it 
c410: 64 6f 65 73 20 6e 6f 74 20 63 61 6c 6c 20 74 68  does not call th
c420: 61 74 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a  at.** routine..*
c430: 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 65 6d 69  /.void style_emi
c440: 74 5f 73 63 72 69 70 74 5f 66 65 74 63 68 28 69  t_script_fetch(i
c450: 6e 74 20 61 73 49 6e 6c 69 6e 65 29 7b 0a 20 20  nt asInline){.  
c460: 73 74 61 74 69 63 20 69 6e 74 20 6f 6e 63 65 20  static int once 
c470: 3d 20 30 3b 0a 20 20 69 66 28 30 3d 3d 6f 6e 63  = 0;.  if(0==onc
c480: 65 2b 2b 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f  e++){.    style_
c490: 65 6d 69 74 5f 73 63 72 69 70 74 5f 62 75 69 6c  emit_script_buil
c4a0: 74 69 6e 28 61 73 49 6e 6c 69 6e 65 2c 20 22 66  tin(asInline, "f
c4b0: 6f 73 73 69 6c 2e 66 65 74 63 68 2e 6a 73 22 29  ossil.fetch.js")
c4c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
c4d0: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
c4e0: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 69 74 20  is is called it 
c4f0: 65 6d 69 74 73 20 74 68 65 20 4a 53 20 63 6f 64  emits the JS cod
c500: 65 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 62 75  e from the.** bu
c510: 69 6c 74 2d 69 6e 20 66 69 6c 65 20 66 6f 73 73  ilt-in file foss
c520: 69 6c 2e 64 6f 6d 2e 6a 73 2e 20 53 75 62 73 65  il.dom.js. Subse
c530: 71 75 65 6e 74 20 63 61 6c 6c 73 20 61 72 65 20  quent calls are 
c540: 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  no-ops..**.** If
c550: 20 70 61 73 73 65 64 20 61 20 74 72 75 65 20 76   passed a true v
c560: 61 6c 75 65 2c 20 69 74 20 65 6d 69 74 73 20 74  alue, it emits t
c570: 68 65 20 63 6f 6e 74 65 6e 74 73 20 64 69 72 65  he contents dire
c580: 63 74 6c 79 0a 2a 2a 20 74 6f 20 74 68 65 20 70  ctly.** to the p
c590: 61 67 65 20 6f 75 74 70 75 74 2c 20 65 6c 73 65  age output, else
c5a0: 20 69 74 20 65 6d 69 74 73 20 61 20 73 63 72 69   it emits a scri
c5b0: 70 74 20 74 61 67 20 77 69 74 68 20 61 0a 2a 2a  pt tag with a.**
c5c0: 20 73 72 63 3d 62 75 69 6c 74 69 6e 2f 2e 2e 2e   src=builtin/...
c5d0: 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 73 63 72   to load the scr
c5e0: 69 70 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ipt..**.** Note 
c5f0: 74 68 61 74 20 74 68 69 73 20 63 6f 64 65 20 72  that this code r
c600: 65 6c 69 65 73 20 6f 6e 20 74 68 61 74 20 6c 6f  elies on that lo
c610: 61 64 65 64 20 76 69 61 0a 2a 2a 20 73 74 79 6c  aded via.** styl
c620: 65 5f 65 6d 69 74 5f 73 63 72 69 70 74 5f 66 6f  e_emit_script_fo
c630: 73 73 69 6c 5f 62 6f 6f 74 73 74 72 61 70 28 29  ssil_bootstrap()
c640: 2c 20 62 75 74 20 69 74 20 64 6f 65 73 20 6e 6f  , but it does no
c650: 74 20 63 61 6c 6c 20 74 68 61 74 0a 2a 2a 20 72  t call that.** r
c660: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20  outine..*/.void 
c670: 73 74 79 6c 65 5f 65 6d 69 74 5f 73 63 72 69 70  style_emit_scrip
c680: 74 5f 64 6f 6d 28 69 6e 74 20 61 73 49 6e 6c 69  t_dom(int asInli
c690: 6e 65 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  ne){.  static in
c6a0: 74 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 66  t once = 0;.  if
c6b0: 28 30 3d 3d 6f 6e 63 65 2b 2b 29 7b 0a 20 20 20  (0==once++){.   
c6c0: 20 73 74 79 6c 65 5f 65 6d 69 74 5f 73 63 72 69   style_emit_scri
c6d0: 70 74 5f 62 75 69 6c 74 69 6e 28 61 73 49 6e 6c  pt_builtin(asInl
c6e0: 69 6e 65 2c 20 22 66 6f 73 73 69 6c 2e 64 6f 6d  ine, "fossil.dom
c6f0: 2e 6a 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .js");.  }.}../*
c700: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
c710: 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  me this is calle
c720: 64 2c 20 69 74 20 63 61 6c 6c 73 20 73 74 79 6c  d, it calls styl
c730: 65 5f 65 6d 69 74 5f 73 63 72 69 70 74 5f 64 6f  e_emit_script_do
c740: 6d 28 29 2c 0a 2a 2a 20 70 61 73 73 69 6e 67 20  m(),.** passing 
c750: 69 74 20 74 68 65 20 67 69 76 65 6e 20 61 73 49  it the given asI
c760: 6e 6c 69 6e 65 20 76 61 6c 75 65 2c 20 61 6e 64  nline value, and
c770: 20 65 6d 69 74 73 20 74 68 65 20 4a 53 20 63 6f   emits the JS co
c780: 64 65 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 62  de from the.** b
c790: 75 69 6c 74 2d 69 6e 20 66 69 6c 65 20 66 6f 73  uilt-in file fos
c7a0: 73 69 6c 2e 74 61 62 73 2e 6a 73 2e 20 53 75 62  sil.tabs.js. Sub
c7b0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 61 72  sequent calls ar
c7c0: 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20  e no-ops..**.** 
c7d0: 49 66 20 70 61 73 73 65 64 20 61 20 74 72 75 65  If passed a true
c7e0: 20 76 61 6c 75 65 2c 20 69 74 20 65 6d 69 74 73   value, it emits
c7f0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 64 69   the contents di
c800: 72 65 63 74 6c 79 0a 2a 2a 20 74 6f 20 74 68 65  rectly.** to the
c810: 20 70 61 67 65 20 6f 75 74 70 75 74 2c 20 65 6c   page output, el
c820: 73 65 20 69 74 20 65 6d 69 74 73 20 61 20 73 63  se it emits a sc
c830: 72 69 70 74 20 74 61 67 20 77 69 74 68 20 61 0a  ript tag with a.
c840: 2a 2a 20 73 72 63 3d 62 75 69 6c 74 69 6e 2f 2e  ** src=builtin/.
c850: 2e 2e 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 73  .. to load the s
c860: 63 72 69 70 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cript..*/.void s
c870: 74 79 6c 65 5f 65 6d 69 74 5f 73 63 72 69 70 74  tyle_emit_script
c880: 5f 74 61 62 73 28 69 6e 74 20 61 73 49 6e 6c 69  _tabs(int asInli
c890: 6e 65 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  ne){.  static in
c8a0: 74 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 66  t once = 0;.  if
c8b0: 28 30 3d 3d 6f 6e 63 65 2b 2b 29 7b 0a 20 20 20  (0==once++){.   
c8c0: 20 73 74 79 6c 65 5f 65 6d 69 74 5f 73 63 72 69   style_emit_scri
c8d0: 70 74 5f 64 6f 6d 28 61 73 49 6e 6c 69 6e 65 29  pt_dom(asInline)
c8e0: 3b 0a 20 20 20 20 73 74 79 6c 65 5f 65 6d 69 74  ;.    style_emit
c8f0: 5f 73 63 72 69 70 74 5f 62 75 69 6c 74 69 6e 28  _script_builtin(
c900: 61 73 49 6e 6c 69 6e 65 2c 20 22 66 6f 73 73 69  asInline, "fossi
c910: 6c 2e 74 61 62 73 2e 6a 73 22 29 3b 0a 20 20 7d  l.tabs.js");.  }
c920: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  .}../*.** The fi
c930: 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 69 73  rst time this is
c940: 20 63 61 6c 6c 65 64 20 69 74 20 65 6d 69 74 73   called it emits
c950: 20 74 68 65 20 4a 53 20 63 6f 64 65 20 66 72 6f   the JS code fro
c960: 6d 20 74 68 65 0a 2a 2a 20 62 75 69 6c 74 2d 69  m the.** built-i
c970: 6e 20 66 69 6c 65 20 66 6f 73 73 69 6c 2e 63 6f  n file fossil.co
c980: 6e 66 69 72 6d 65 72 2e 6a 73 2e 20 53 75 62 73  nfirmer.js. Subs
c990: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 61 72 65  equent calls are
c9a0: 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 49   no-ops..**.** I
c9b0: 66 20 70 61 73 73 65 64 20 61 20 74 72 75 65 20  f passed a true 
c9c0: 76 61 6c 75 65 2c 20 69 74 20 65 6d 69 74 73 20  value, it emits 
c9d0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 64 69 72  the contents dir
c9e0: 65 63 74 6c 79 0a 2a 2a 20 74 6f 20 74 68 65 20  ectly.** to the 
c9f0: 70 61 67 65 20 6f 75 74 70 75 74 2c 20 65 6c 73  page output, els
ca00: 65 20 69 74 20 65 6d 69 74 73 20 61 20 73 63 72  e it emits a scr
ca10: 69 70 74 20 74 61 67 20 77 69 74 68 20 61 0a 2a  ipt tag with a.*
ca20: 2a 20 73 72 63 3d 62 75 69 6c 74 69 6e 2f 2e 2e  * src=builtin/..
ca30: 2e 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 73 63  . to load the sc
ca40: 72 69 70 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 74  ript..*/.void st
ca50: 79 6c 65 5f 65 6d 69 74 5f 73 63 72 69 70 74 5f  yle_emit_script_
ca60: 63 6f 6e 66 69 72 6d 65 72 28 69 6e 74 20 61 73  confirmer(int as
ca70: 49 6e 6c 69 6e 65 29 7b 0a 20 20 73 74 61 74 69  Inline){.  stati
ca80: 63 20 69 6e 74 20 6f 6e 63 65 20 3d 20 30 3b 0a  c int once = 0;.
ca90: 20 20 69 66 28 30 3d 3d 6f 6e 63 65 2b 2b 29 7b    if(0==once++){
caa0: 0a 20 20 20 20 73 74 79 6c 65 5f 65 6d 69 74 5f  .    style_emit_
cab0: 73 63 72 69 70 74 5f 62 75 69 6c 74 69 6e 28 61  script_builtin(a
cac0: 73 49 6e 6c 69 6e 65 2c 20 22 66 6f 73 73 69 6c  sInline, "fossil
cad0: 2e 63 6f 6e 66 69 72 6d 65 72 2e 6a 73 22 29 3b  .confirmer.js");
cae0: 0a 20 20 7d 0a 7d 0a                             .  }.}.