Fossil

Hex Artifact Content
Login

Artifact 621260fe88aaf50610d6619702fb7ec96912df6f497ffdcd45d50f332133d535:


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 69 6e 69  lling style_fini
0460: 73 68 5f 70 61 67 65 28 29 2e 20 20 54 68 65 20  sh_page().  The 
0470: 73 74 79 6c 65 5f 66 69 6e 69 73 68 5f 70 61 67  style_finish_pag
0480: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77  e() routine.** w
0490: 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 74 68 65  ill generate the
04a0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 48 54 4d   appropriate HTM
04b0: 4c 20 74 65 78 74 20 6a 75 73 74 20 62 65 6c 6f  L text just belo
04c0: 77 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6d 65  w the main.** me
04d0: 6e 75 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  nu..*/.static st
04e0: 72 75 63 74 20 53 75 62 6d 65 6e 75 20 7b 0a 20  ruct Submenu {. 
04f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61   const char *zLa
0500: 62 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  bel;        /* B
0510: 75 74 74 6f 6e 20 6c 61 62 65 6c 20 2a 2f 0a 20  utton label */. 
0520: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69   const char *zLi
0530: 6e 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  nk;         /* J
0540: 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 69 6e 6b  ump to this link
0550: 20 77 68 65 6e 20 62 75 74 74 6f 6e 20 69 73 20   when button is 
0560: 70 72 65 73 73 65 64 20 2a 2f 0a 7d 20 61 53 75  pressed */.} aSu
0570: 62 6d 65 6e 75 5b 33 30 5d 3b 0a 73 74 61 74 69  bmenu[30];.stati
0580: 63 20 69 6e 74 20 6e 53 75 62 6d 65 6e 75 20 3d  c int nSubmenu =
0590: 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
05a0: 72 20 6f 66 20 62 75 74 74 6f 6e 73 20 2a 2f 0a  r of buttons */.
05b0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 53 75  static struct Su
05c0: 62 6d 65 6e 75 43 74 72 6c 20 7b 0a 20 20 63 6f  bmenuCtrl {.  co
05d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
05e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
05f0: 72 6d 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  rm query paramet
0600: 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  er */.  const ch
0610: 61 72 20 2a 7a 4c 61 62 65 6c 3b 20 20 20 20 20  ar *zLabel;     
0620: 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 2e 20 20       /* Label.  
0630: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f  Might be NULL fo
0640: 72 20 46 46 5f 4d 55 4c 54 49 20 2a 2f 0a 20 20  r FF_MULTI */.  
0650: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 54  unsigned char eT
0660: 79 70 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ype;         /* 
0670: 46 46 5f 45 4e 54 52 59 2c 20 46 46 5f 4d 55 4c  FF_ENTRY, FF_MUL
0680: 54 49 2c 20 46 46 5f 43 48 45 43 4b 42 4f 58 20  TI, FF_CHECKBOX 
0690: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
06a0: 61 72 20 65 56 69 73 69 62 6c 65 3b 20 20 20 20  ar eVisible;    
06b0: 20 20 2f 2a 20 53 54 59 4c 45 5f 4e 4f 52 4d 41    /* STYLE_NORMA
06c0: 4c 20 6f 72 20 53 54 59 4c 45 5f 44 49 53 41 42  L or STYLE_DISAB
06d0: 4c 45 44 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69  LED */.  short i
06e0: 6e 74 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20  nt iSize;       
06f0: 20 20 20 20 20 20 2f 2a 20 57 69 64 74 68 20 66        /* Width f
0700: 6f 72 20 46 46 5f 45 4e 54 52 59 2e 20 20 43 6f  or FF_ENTRY.  Co
0710: 75 6e 74 20 66 6f 72 20 46 46 5f 4d 55 4c 54 49  unt for FF_MULTI
0720: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
0730: 20 2a 63 6f 6e 73 74 20 2a 61 7a 43 68 6f 69 63   *const *azChoic
0740: 65 3b 20 2f 2a 20 76 61 6c 75 65 2f 64 69 73 70  e; /* value/disp
0750: 6c 61 79 20 70 61 69 72 73 20 66 6f 72 20 46 46  lay pairs for FF
0760: 5f 4d 55 4c 54 49 20 2a 2f 0a 20 20 63 6f 6e 73  _MULTI */.  cons
0770: 74 20 63 68 61 72 20 2a 7a 46 61 6c 73 65 3b 20  t char *zFalse; 
0780: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 46 5f 42           /* FF_B
0790: 49 4e 41 52 59 20 6c 61 62 65 6c 20 77 68 65 6e  INARY label when
07a0: 20 66 61 6c 73 65 20 2a 2f 0a 20 20 63 6f 6e 73   false */.  cons
07b0: 74 20 63 68 61 72 20 2a 7a 4a 53 3b 20 20 20 20  t char *zJS;    
07c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 61 76 61           /* Java
07d0: 73 63 72 69 70 74 20 74 6f 20 72 75 6e 20 6f 6e  script to run on
07e0: 20 74 6f 67 67 6c 65 20 2a 2f 0a 7d 20 61 53 75   toggle */.} aSu
07f0: 62 6d 65 6e 75 43 74 72 6c 5b 32 30 5d 3b 0a 73  bmenuCtrl[20];.s
0800: 74 61 74 69 63 20 69 6e 74 20 6e 53 75 62 6d 65  tatic int nSubme
0810: 6e 75 43 74 72 6c 20 3d 20 30 3b 0a 23 64 65 66  nuCtrl = 0;.#def
0820: 69 6e 65 20 46 46 5f 45 4e 54 52 59 20 20 20 20  ine FF_ENTRY    
0830: 31 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  1          /* Te
0840: 78 74 20 65 6e 74 72 79 20 62 6f 78 20 2a 2f 0a  xt entry box */.
0850: 23 64 65 66 69 6e 65 20 46 46 5f 4d 55 4c 54 49  #define FF_MULTI
0860: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 2f      2          /
0870: 2a 20 43 6f 6d 62 6f 62 6f 78 2e 20 20 4d 75 6c  * Combobox.  Mul
0880: 74 69 70 6c 65 20 63 68 6f 69 63 65 73 2e 20 2a  tiple choices. *
0890: 2f 0a 23 64 65 66 69 6e 65 20 46 46 5f 42 49 4e  /.#define FF_BIN
08a0: 41 52 59 20 20 20 33 20 20 20 20 20 20 20 20 20  ARY   3         
08b0: 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 66 6f 72 20   /* Control for 
08c0: 62 69 6e 61 72 79 20 71 75 65 72 79 20 70 61 72  binary query par
08d0: 61 6d 65 74 65 72 20 2a 2f 0a 23 64 65 66 69 6e  ameter */.#defin
08e0: 65 20 46 46 5f 43 48 45 43 4b 42 4f 58 20 34 20  e FF_CHECKBOX 4 
08f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
0900: 6b 2d 62 6f 78 20 2a 2f 0a 0a 23 69 66 20 49 4e  k-box */..#if IN
0910: 54 45 52 46 41 43 45 0a 23 64 65 66 69 6e 65 20  TERFACE.#define 
0920: 53 54 59 4c 45 5f 4e 4f 52 4d 41 4c 20 20 20 30  STYLE_NORMAL   0
0930: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c         /* Normal
0940: 20 64 69 73 70 6c 61 79 20 6f 66 20 63 6f 6e 74   display of cont
0950: 72 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  rol */.#define S
0960: 54 59 4c 45 5f 44 49 53 41 42 4c 45 44 20 31 20  TYLE_DISABLED 1 
0970: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c        /* Control
0980: 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
0990: 23 65 6e 64 69 66 20 2f 2a 20 49 4e 54 45 52 46  #endif /* INTERF
09a0: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ACE */../*.** Re
09b0: 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 20  member that the 
09c0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
09d0: 67 65 6e 65 72 61 74 65 64 2e 20 20 54 68 65 20  generated.  The 
09e0: 66 6f 6f 74 65 72 20 69 73 20 6f 6d 69 74 74 65  footer is omitte
09f0: 64 0a 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f 72  d.** if an error
0a00: 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 74   occurs before t
0a10: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 73 74  he header..*/.st
0a20: 61 74 69 63 20 69 6e 74 20 68 65 61 64 65 72 48  atic int headerH
0a30: 61 73 42 65 65 6e 47 65 6e 65 72 61 74 65 64 20  asBeenGenerated 
0a40: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 72 65 6d 65  = 0;../*.** reme
0a50: 6d 62 65 72 2c 20 69 66 20 61 20 73 69 64 65 62  mber, if a sideb
0a60: 6f 78 20 77 61 73 20 75 73 65 64 0a 2a 2f 0a 73  ox was used.*/.s
0a70: 74 61 74 69 63 20 69 6e 74 20 73 69 64 65 62 6f  tatic int sidebo
0a80: 78 55 73 65 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  xUsed = 0;../*.*
0a90: 2a 20 41 64 2d 75 6e 69 74 20 73 74 79 6c 65 73  * Ad-unit styles
0aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69  ..*/.static unsi
0ab0: 67 6e 65 64 20 61 64 55 6e 69 74 46 6c 61 67 73  gned adUnitFlags
0ac0: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 75 62   = 0;../*.** Sub
0ad0: 6d 65 6e 75 20 64 69 73 61 62 6c 65 20 66 6c 61  menu disable fla
0ae0: 67 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  g.*/.static int 
0af0: 73 75 62 6d 65 6e 75 45 6e 61 62 6c 65 20 3d 20  submenuEnable = 
0b00: 31 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6c 61 67 73 20  1;../*.** Flags 
0b10: 66 6f 72 20 76 61 72 69 6f 75 73 20 6a 61 76 61  for various java
0b20: 73 63 72 69 70 74 20 66 69 6c 65 73 20 6e 65 65  script files nee
0b30: 64 65 64 20 70 72 69 6f 72 20 74 6f 20 3c 2f 62  ded prior to </b
0b40: 6f 64 79 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ody>.*/.static i
0b50: 6e 74 20 6e 65 65 64 48 72 65 66 4a 73 20 3d 20  nt needHrefJs = 
0b60: 30 3b 20 20 20 20 20 20 2f 2a 20 68 72 65 66 2e  0;      /* href.
0b70: 6a 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 74  js */../*.** Ext
0b80: 72 61 20 4a 53 20 61 64 64 65 64 20 74 6f 20 74  ra JS added to t
0b90: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
0ba0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 6c  le..*/.static Bl
0bb0: 6f 62 20 62 6c 6f 62 4f 6e 4c 6f 61 64 20 3d 20  ob blobOnLoad = 
0bc0: 42 4c 4f 42 5f 49 4e 49 54 49 41 4c 49 5a 45 52  BLOB_INITIALIZER
0bd0: 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  ;../*.** Generat
0be0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 61  e and return a a
0bf0: 6e 63 68 6f 72 20 74 61 67 20 6c 69 6b 65 20 74  nchor tag like t
0c00: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
0c10: 20 20 3c 61 20 68 72 65 66 3d 22 55 52 4c 22 3e    <a href="URL">
0c20: 0a 2a 2a 20 20 6f 72 20 20 20 20 3c 61 20 69 64  .**  or    <a id
0c30: 3d 22 49 44 22 3e 0a 2a 2a 0a 2a 2a 20 54 68 65  ="ID">.**.** The
0c40: 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 61 6e 63   form of the anc
0c50: 68 6f 72 20 74 61 67 20 69 73 20 64 65 74 65 72  hor tag is deter
0c60: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 67 2e 6a  mined by the g.j
0c70: 61 76 61 73 63 72 69 70 74 48 79 70 65 72 6c 69  avascriptHyperli
0c80: 6e 6b 0a 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20  nk.** variable. 
0c90: 20 54 68 65 20 68 72 65 66 3d 22 55 52 4c 22 20   The href="URL" 
0ca0: 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66 20  form is used if 
0cb0: 67 2e 6a 61 76 61 73 63 72 69 70 74 48 79 70 65  g.javascriptHype
0cc0: 72 6c 69 6e 6b 20 69 73 20 66 61 6c 73 65 2e 0a  rlink is false..
0cd0: 2a 2a 20 49 66 20 67 2e 6a 61 76 61 73 63 72 69  ** If g.javascri
0ce0: 70 74 48 79 70 65 72 6c 69 6e 6b 20 69 73 20 74  ptHyperlink is t
0cf0: 72 75 65 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  rue then the.** 
0d00: 69 64 3d 22 49 44 22 20 66 6f 72 6d 20 69 73 20  id="ID" form is 
0d10: 75 73 65 64 20 61 6e 64 20 6a 61 76 61 73 63 72  used and javascr
0d20: 69 70 74 20 69 73 20 67 65 6e 65 72 61 74 65 64  ipt is generated
0d30: 20 69 6e 20 74 68 65 20 66 6f 6f 74 65 72 20 74   in the footer t
0d40: 6f 20 63 61 75 73 65 0a 2a 2a 20 68 72 65 66 20  o cause.** href 
0d50: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 69 6e 73  values to be ins
0d60: 65 72 74 65 64 20 61 66 74 65 72 20 74 68 65 20  erted after the 
0d70: 70 61 67 65 20 68 61 73 20 6c 6f 61 64 65 64 2e  page has loaded.
0d80: 20 20 49 66 0a 2a 2a 20 67 2e 70 65 72 6d 2e 48    If.** g.perm.H
0d90: 69 73 74 6f 72 79 20 69 73 20 66 61 6c 73 65 2c  istory is false,
0da0: 20 74 68 65 6e 20 74 68 65 20 3c 61 20 69 64 3d   then the <a id=
0db0: 22 49 44 22 3e 20 66 6f 72 6d 20 69 73 20 73 74  "ID"> form is st
0dc0: 69 6c 6c 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64  ill.** generated
0dd0: 20 62 75 74 20 74 68 65 20 6a 61 76 61 73 63 72   but the javascr
0de0: 69 70 74 20 69 73 20 6e 6f 74 20 67 65 6e 65 72  ipt is not gener
0df0: 61 74 65 64 20 73 6f 20 74 68 65 20 6c 69 6e 6b  ated so the link
0e00: 73 20 6e 65 76 65 72 0a 2a 2a 20 61 63 74 69 76  s never.** activ
0e10: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ate..**.** If th
0e20: 65 20 75 73 65 72 20 6c 61 63 6b 73 20 74 68 65  e user lacks the
0e30: 20 48 79 70 65 72 6c 69 6e 6b 20 28 68 29 20 70   Hyperlink (h) p
0e40: 72 6f 70 65 72 74 79 20 61 6e 64 20 74 68 65 20  roperty and the 
0e50: 22 61 75 74 6f 2d 68 79 70 65 72 6c 69 6e 6b 22  "auto-hyperlink"
0e60: 0a 2a 2a 20 73 65 74 74 69 6e 67 20 69 73 20 74  .** setting is t
0e70: 72 75 65 2c 20 74 68 65 6e 20 67 2e 70 65 72 6d  rue, then g.perm
0e80: 2e 48 79 70 65 72 6c 69 6e 6b 20 69 73 20 63 68  .Hyperlink is ch
0e90: 61 6e 67 65 64 20 66 72 6f 6d 20 30 20 74 6f 20  anged from 0 to 
0ea0: 31 20 61 6e 64 0a 2a 2a 20 67 2e 6a 61 76 61 73  1 and.** g.javas
0eb0: 63 72 69 70 74 48 79 70 65 72 6c 69 6e 6b 20 69  criptHyperlink i
0ec0: 73 20 73 65 74 20 74 6f 20 31 2e 20 20 54 68 65  s set to 1.  The
0ed0: 20 67 2e 6a 61 76 61 73 63 72 69 70 74 48 79 70   g.javascriptHyp
0ee0: 65 72 6c 69 6e 6b 20 64 65 66 61 75 6c 74 73 0a  erlink defaults.
0ef0: 2a 2a 20 74 6f 20 30 20 61 6e 64 20 6f 6e 6c 79  ** to 0 and only
0f00: 20 63 68 61 6e 67 65 73 20 74 6f 20 6f 6e 65 20   changes to one 
0f10: 69 66 20 74 68 65 20 75 73 65 72 20 6c 61 63 6b  if the user lack
0f20: 73 20 74 68 65 20 48 79 70 65 72 6c 69 6e 6b 20  s the Hyperlink 
0f30: 28 68 29 20 70 72 6f 70 65 72 74 79 0a 2a 2a 20  (h) property.** 
0f40: 61 6e 64 20 74 68 65 20 22 61 75 74 6f 2d 68 79  and the "auto-hy
0f50: 70 65 72 6c 69 6e 6b 22 20 73 65 74 74 69 6e 67  perlink" setting
0f60: 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 2a 2a 0a   is enabled..**.
0f70: 2a 2a 20 46 69 6c 6c 69 6e 67 20 69 6e 20 74 68  ** Filling in th
0f80: 65 20 68 72 65 66 3d 22 55 52 4c 22 20 75 73 69  e href="URL" usi
0f90: 6e 67 20 6a 61 76 61 73 63 72 69 70 74 20 69 73  ng javascript is
0fa0: 20 61 20 64 65 66 65 6e 73 65 20 61 67 61 69 6e   a defense again
0fb0: 73 74 20 62 6f 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  st bots..**.** T
0fc0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 69 73 20  he name of this 
0fd0: 72 6f 75 74 69 6e 65 20 69 73 20 64 65 6c 69 62  routine is delib
0fe0: 65 72 61 74 65 6c 79 20 6b 65 70 74 20 73 68 6f  erately kept sho
0ff0: 72 74 20 73 6f 20 74 68 61 74 20 63 61 6e 20 62  rt so that can b
1000: 65 0a 2a 2a 20 65 61 73 69 6c 79 20 75 73 65 64  e.** easily used
1010: 20 77 69 74 68 69 6e 20 40 2d 6c 69 6e 65 73 2e   within @-lines.
1020: 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
1030: 20 20 20 20 20 20 40 20 25 7a 28 68 72 65 66 28        @ %z(href(
1040: 22 25 52 2f 61 72 74 69 66 61 63 74 2f 25 73 22  "%R/artifact/%s"
1050: 2c 7a 55 75 69 64 29 29 25 68 28 7a 46 4e 29 3c  ,zUuid))%h(zFN)<
1060: 2f 61 3e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 25  /a>.**.** Note %
1070: 7a 20 66 6f 72 6d 61 74 2e 20 20 54 68 65 20 73  z format.  The s
1080: 74 72 69 6e 67 20 72 65 74 75 72 6e 65 64 20 62  tring returned b
1090: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
10a0: 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6f 62 74  is always.** obt
10b0: 61 69 6e 65 64 20 66 72 6f 6d 20 66 6f 73 73 69  ained from fossi
10c0: 6c 5f 6d 61 6c 6c 6f 63 28 29 20 73 6f 20 72 65  l_malloc() so re
10d0: 6e 64 65 72 69 6e 67 20 69 74 20 77 69 74 68 20  ndering it with 
10e0: 25 7a 20 77 69 6c 6c 20 72 65 63 6c 61 69 6d 0a  %z will reclaim.
10f0: 2a 2a 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73  ** that memory s
1100: 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  pace..**.** Ther
1110: 65 20 61 72 65 20 74 68 72 65 65 20 76 65 72 73  e are three vers
1120: 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 72 6f 75  ions of this rou
1130: 74 69 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  tine:.**.**    (
1140: 31 29 20 20 20 68 72 65 66 28 29 20 64 6f 65 73  1)   href() does
1150: 20 61 20 70 6c 61 69 6e 20 68 79 70 65 72 6c 69   a plain hyperli
1160: 6e 6b 0a 2a 2a 20 20 20 20 28 32 29 20 20 20 78  nk.**    (2)   x
1170: 68 72 65 66 28 29 20 61 64 64 73 20 65 78 74 72  href() adds extr
1180: 61 20 61 74 74 72 69 62 75 74 65 20 74 65 78 74  a attribute text
1190: 0a 2a 2a 20 20 20 20 28 33 29 20 20 20 63 68 72  .**    (3)   chr
11a0: 65 66 28 29 20 61 64 64 73 20 61 20 63 6c 61 73  ef() adds a clas
11b0: 73 20 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 67 2e 70  s name.**.** g.p
11c0: 65 72 6d 2e 48 79 70 65 72 6c 69 6e 6b 20 69 73  erm.Hyperlink is
11d0: 20 74 72 75 65 20 69 66 20 74 68 65 20 75 73 65   true if the use
11e0: 72 20 68 61 73 20 74 68 65 20 48 79 70 65 72 6c  r has the Hyperl
11f0: 69 6e 6b 20 28 68 29 20 70 72 6f 70 65 72 74 79  ink (h) property
1200: 2e 0a 2a 2a 20 4d 6f 73 74 20 6c 6f 67 67 65 64  ..** Most logged
1210: 20 69 6e 20 75 73 65 72 73 20 73 68 6f 75 6c 64   in users should
1220: 20 68 61 76 65 20 74 68 69 73 20 70 72 6f 70 65   have this prope
1230: 72 74 79 2c 20 73 69 6e 63 65 20 77 65 20 63 61  rty, since we ca
1240: 6e 20 61 73 73 75 6d 65 0a 2a 2a 20 74 68 61 74  n assume.** that
1250: 20 61 20 6c 6f 67 67 65 64 20 69 6e 20 75 73 65   a logged in use
1260: 72 20 69 73 20 6e 6f 74 20 61 20 62 6f 74 2e 20  r is not a bot. 
1270: 20 4f 6e 6c 79 20 22 6e 6f 62 6f 64 79 22 20 6c   Only "nobody" l
1280: 61 63 6b 73 20 67 2e 70 65 72 6d 2e 48 79 70 65  acks g.perm.Hype
1290: 72 6c 69 6e 6b 2c 0a 2a 2a 20 74 79 70 69 63 61  rlink,.** typica
12a0: 6c 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20 2a 78 68  lly..*/.char *xh
12b0: 72 65 66 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ref(const char *
12c0: 7a 45 78 74 72 61 2c 20 63 6f 6e 73 74 20 63 68  zExtra, const ch
12d0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
12e0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 72 6c 3b  ){.  char *zUrl;
12f0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
1300: 20 69 66 28 20 21 67 2e 70 65 72 6d 2e 48 79 70   if( !g.perm.Hyp
1310: 65 72 6c 69 6e 6b 20 29 20 72 65 74 75 72 6e 20  erlink ) return 
1320: 66 6f 73 73 69 6c 5f 73 74 72 64 75 70 28 22 22  fossil_strdup(""
1330: 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  );.  va_start(ap
1340: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 55  , zFormat);.  zU
1350: 72 6c 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a 46  rl = vmprintf(zF
1360: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
1370: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20  _end(ap);.  if( 
1380: 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e 6b  g.perm.Hyperlink
1390: 20 26 26 20 21 67 2e 6a 61 76 61 73 63 72 69 70   && !g.javascrip
13a0: 74 48 79 70 65 72 6c 69 6e 6b 20 29 7b 0a 20 20  tHyperlink ){.  
13b0: 20 20 63 68 61 72 20 2a 7a 48 55 72 6c 3b 0a 20    char *zHUrl;. 
13c0: 20 20 20 69 66 28 20 7a 45 78 74 72 61 20 29 7b     if( zExtra ){
13d0: 0a 20 20 20 20 20 20 7a 48 55 72 6c 20 3d 20 6d  .      zHUrl = m
13e0: 70 72 69 6e 74 66 28 22 3c 61 20 25 73 20 68 72  printf("<a %s hr
13f0: 65 66 3d 5c 22 25 68 5c 22 3e 22 2c 20 7a 45 78  ef=\"%h\">", zEx
1400: 74 72 61 2c 20 7a 55 72 6c 29 3b 0a 20 20 20 20  tra, zUrl);.    
1410: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 48 55  }else{.      zHU
1420: 72 6c 20 3d 20 6d 70 72 69 6e 74 66 28 22 3c 61  rl = mprintf("<a
1430: 20 68 72 65 66 3d 5c 22 25 68 5c 22 3e 22 2c 20   href=\"%h\">", 
1440: 7a 55 72 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zUrl);.    }.   
1450: 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 55 72   fossil_free(zUr
1460: 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 7a  l);.    return z
1470: 48 55 72 6c 3b 0a 20 20 7d 0a 20 20 6e 65 65 64  HUrl;.  }.  need
1480: 48 72 65 66 4a 73 20 3d 20 31 3b 0a 20 20 69 66  HrefJs = 1;.  if
1490: 28 20 7a 45 78 74 72 61 3d 3d 30 20 29 7b 0a 20  ( zExtra==0 ){. 
14a0: 20 20 20 72 65 74 75 72 6e 20 6d 70 72 69 6e 74     return mprint
14b0: 66 28 22 3c 61 20 64 61 74 61 2d 68 72 65 66 3d  f("<a data-href=
14c0: 27 25 7a 27 20 68 72 65 66 3d 27 25 52 2f 68 6f  '%z' href='%R/ho
14d0: 6e 65 79 70 6f 74 27 3e 22 2c 20 7a 55 72 6c 29  neypot'>", zUrl)
14e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
14f0: 65 74 75 72 6e 20 6d 70 72 69 6e 74 66 28 22 3c  eturn mprintf("<
1500: 61 20 25 73 20 64 61 74 61 2d 68 72 65 66 3d 27  a %s data-href='
1510: 25 7a 27 20 68 72 65 66 3d 27 25 52 2f 68 6f 6e  %z' href='%R/hon
1520: 65 79 70 6f 74 27 3e 22 2c 0a 20 20 20 20 20 20  eypot'>",.      
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 78               zEx
1540: 74 72 61 2c 20 7a 55 72 6c 29 3b 0a 20 20 7d 0a  tra, zUrl);.  }.
1550: 7d 0a 63 68 61 72 20 2a 63 68 72 65 66 28 63 6f  }.char *chref(co
1560: 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 74 72 61  nst char *zExtra
1570: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
1580: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63  ormat, ...){.  c
1590: 68 61 72 20 2a 7a 55 72 6c 3b 0a 20 20 76 61 5f  har *zUrl;.  va_
15a0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 21  list ap;.  if( !
15b0: 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e 6b  g.perm.Hyperlink
15c0: 20 29 20 72 65 74 75 72 6e 20 66 6f 73 73 69 6c   ) return fossil
15d0: 5f 73 74 72 64 75 70 28 22 22 29 3b 0a 20 20 76  _strdup("");.  v
15e0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
15f0: 6d 61 74 29 3b 0a 20 20 7a 55 72 6c 20 3d 20 76  mat);.  zUrl = v
1600: 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c  mprintf(zFormat,
1610: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1620: 70 29 3b 0a 20 20 69 66 28 20 67 2e 70 65 72 6d  p);.  if( g.perm
1630: 2e 48 79 70 65 72 6c 69 6e 6b 20 26 26 20 21 67  .Hyperlink && !g
1640: 2e 6a 61 76 61 73 63 72 69 70 74 48 79 70 65 72  .javascriptHyper
1650: 6c 69 6e 6b 20 29 7b 0a 20 20 20 20 63 68 61 72  link ){.    char
1660: 20 2a 7a 48 55 72 6c 20 3d 20 6d 70 72 69 6e 74   *zHUrl = mprint
1670: 66 28 22 3c 61 20 63 6c 61 73 73 3d 5c 22 25 73  f("<a class=\"%s
1680: 5c 22 20 68 72 65 66 3d 5c 22 25 68 5c 22 3e 22  \" href=\"%h\">"
1690: 2c 20 7a 45 78 74 72 61 2c 20 7a 55 72 6c 29 3b  , zExtra, zUrl);
16a0: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 72 65 65  .    fossil_free
16b0: 28 7a 55 72 6c 29 3b 0a 20 20 20 20 72 65 74 75  (zUrl);.    retu
16c0: 72 6e 20 7a 48 55 72 6c 3b 0a 20 20 7d 0a 20 20  rn zHUrl;.  }.  
16d0: 6e 65 65 64 48 72 65 66 4a 73 20 3d 20 31 3b 0a  needHrefJs = 1;.
16e0: 20 20 72 65 74 75 72 6e 20 6d 70 72 69 6e 74 66    return mprintf
16f0: 28 22 3c 61 20 63 6c 61 73 73 3d 27 25 73 27 20  ("<a class='%s' 
1700: 64 61 74 61 2d 68 72 65 66 3d 27 25 7a 27 20 68  data-href='%z' h
1710: 72 65 66 3d 27 25 52 2f 68 6f 6e 65 79 70 6f 74  ref='%R/honeypot
1720: 27 3e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  '>",.           
1730: 20 20 20 20 20 20 7a 45 78 74 72 61 2c 20 7a 55        zExtra, zU
1740: 72 6c 29 3b 0a 7d 0a 63 68 61 72 20 2a 68 72 65  rl);.}.char *hre
1750: 66 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  f(const char *zF
1760: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63  ormat, ...){.  c
1770: 68 61 72 20 2a 7a 55 72 6c 3b 0a 20 20 76 61 5f  har *zUrl;.  va_
1780: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 21  list ap;.  if( !
1790: 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e 6b  g.perm.Hyperlink
17a0: 20 29 20 72 65 74 75 72 6e 20 66 6f 73 73 69 6c   ) return fossil
17b0: 5f 73 74 72 64 75 70 28 22 22 29 3b 0a 20 20 76  _strdup("");.  v
17c0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
17d0: 6d 61 74 29 3b 0a 20 20 7a 55 72 6c 20 3d 20 76  mat);.  zUrl = v
17e0: 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c  mprintf(zFormat,
17f0: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1800: 70 29 3b 0a 20 20 69 66 28 20 67 2e 70 65 72 6d  p);.  if( g.perm
1810: 2e 48 79 70 65 72 6c 69 6e 6b 20 26 26 20 21 67  .Hyperlink && !g
1820: 2e 6a 61 76 61 73 63 72 69 70 74 48 79 70 65 72  .javascriptHyper
1830: 6c 69 6e 6b 20 29 7b 0a 20 20 20 20 63 68 61 72  link ){.    char
1840: 20 2a 7a 48 55 72 6c 20 3d 20 6d 70 72 69 6e 74   *zHUrl = mprint
1850: 66 28 22 3c 61 20 68 72 65 66 3d 5c 22 25 68 5c  f("<a href=\"%h\
1860: 22 3e 22 2c 20 7a 55 72 6c 29 3b 0a 20 20 20 20  ">", zUrl);.    
1870: 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 55 72 6c  fossil_free(zUrl
1880: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 48  );.    return zH
1890: 55 72 6c 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 48  Url;.  }.  needH
18a0: 72 65 66 4a 73 20 3d 20 31 3b 0a 20 20 72 65 74  refJs = 1;.  ret
18b0: 75 72 6e 20 6d 70 72 69 6e 74 66 28 22 3c 61 20  urn mprintf("<a 
18c0: 64 61 74 61 2d 68 72 65 66 3d 27 25 73 27 20 68  data-href='%s' h
18d0: 72 65 66 3d 27 25 52 2f 68 6f 6e 65 79 70 6f 74  ref='%R/honeypot
18e0: 27 3e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  '>",.           
18f0: 20 20 20 20 20 20 20 7a 55 72 6c 29 3b 0a 7d 0a         zUrl);.}.
1900: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1910: 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d 22 70 6f  <form method="po
1920: 73 74 22 20 61 63 74 69 6f 6e 3d 41 52 47 3e 2e  st" action=ARG>.
1930: 20 20 54 68 65 20 41 52 47 20 76 61 6c 75 65 20    The ARG value 
1940: 69 73 20 69 6e 73 65 72 74 65 64 0a 2a 2a 20 62  is inserted.** b
1950: 79 20 6a 61 76 61 73 63 72 69 70 74 2e 0a 2a 2f  y javascript..*/
1960: 0a 76 6f 69 64 20 66 6f 72 6d 5f 62 65 67 69 6e  .void form_begin
1970: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 74  (const char *zOt
1980: 68 65 72 41 72 67 73 2c 20 63 6f 6e 73 74 20 63  herArgs, const c
1990: 68 61 72 20 2a 7a 41 63 74 69 6f 6e 2c 20 2e 2e  har *zAction, ..
19a0: 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e  .){.  char *zLin
19b0: 6b 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  k;.  va_list ap;
19c0: 0a 20 20 69 66 28 20 7a 4f 74 68 65 72 41 72 67  .  if( zOtherArg
19d0: 73 3d 3d 30 20 29 20 7a 4f 74 68 65 72 41 72 67  s==0 ) zOtherArg
19e0: 73 20 3d 20 22 22 3b 0a 20 20 76 61 5f 73 74 61  s = "";.  va_sta
19f0: 72 74 28 61 70 2c 20 7a 41 63 74 69 6f 6e 29 3b  rt(ap, zAction);
1a00: 0a 20 20 7a 4c 69 6e 6b 20 3d 20 76 6d 70 72 69  .  zLink = vmpri
1a10: 6e 74 66 28 7a 41 63 74 69 6f 6e 2c 20 61 70 29  ntf(zAction, ap)
1a20: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
1a30: 20 20 69 66 28 20 67 2e 70 65 72 6d 2e 48 79 70    if( g.perm.Hyp
1a40: 65 72 6c 69 6e 6b 20 26 26 20 21 67 2e 6a 61 76  erlink && !g.jav
1a50: 61 73 63 72 69 70 74 48 79 70 65 72 6c 69 6e 6b  ascriptHyperlink
1a60: 20 29 7b 0a 20 20 20 20 40 20 3c 66 6f 72 6d 20   ){.    @ <form 
1a70: 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22 20 61 63  method="POST" ac
1a80: 74 69 6f 6e 3d 22 25 7a 28 7a 4c 69 6e 6b 29 22  tion="%z(zLink)"
1a90: 20 25 73 28 7a 4f 74 68 65 72 41 72 67 73 29 3e   %s(zOtherArgs)>
1aa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 65  .  }else{.    ne
1ab0: 65 64 48 72 65 66 4a 73 20 3d 20 31 3b 0a 20 20  edHrefJs = 1;.  
1ac0: 20 20 40 20 3c 66 6f 72 6d 20 6d 65 74 68 6f 64    @ <form method
1ad0: 3d 22 50 4f 53 54 22 20 64 61 74 61 2d 61 63 74  ="POST" data-act
1ae0: 69 6f 6e 3d 27 25 73 28 7a 4c 69 6e 6b 29 27 20  ion='%s(zLink)' 
1af0: 61 63 74 69 6f 6e 3d 27 25 52 2f 6c 6f 67 69 6e  action='%R/login
1b00: 27 20 5c 0a 20 20 20 20 40 20 25 73 28 7a 4f 74  ' \.    @ %s(zOt
1b10: 68 65 72 41 72 67 73 29 3e 0a 20 20 7d 0a 7d 0a  herArgs)>.  }.}.
1b20: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
1b30: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
1b40: 73 75 62 6d 65 6e 75 0a 2a 2f 0a 76 6f 69 64 20  submenu.*/.void 
1b50: 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c  style_submenu_el
1b60: 65 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 63  ement(.  const c
1b70: 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 0a 20 20 63  har *zLabel,.  c
1b80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e 6b  onst char *zLink
1b90: 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f  ,.  ....){.  va_
1ba0: 6c 69 73 74 20 61 70 3b 0a 20 20 61 73 73 65 72  list ap;.  asser
1bb0: 74 28 20 6e 53 75 62 6d 65 6e 75 20 3c 20 63 6f  t( nSubmenu < co
1bc0: 75 6e 74 28 61 53 75 62 6d 65 6e 75 29 20 29 3b  unt(aSubmenu) );
1bd0: 0a 20 20 61 53 75 62 6d 65 6e 75 5b 6e 53 75 62  .  aSubmenu[nSub
1be0: 6d 65 6e 75 5d 2e 7a 4c 61 62 65 6c 20 3d 20 7a  menu].zLabel = z
1bf0: 4c 61 62 65 6c 3b 0a 20 20 76 61 5f 73 74 61 72  Label;.  va_star
1c00: 74 28 61 70 2c 20 7a 4c 69 6e 6b 29 3b 0a 20 20  t(ap, zLink);.  
1c10: 61 53 75 62 6d 65 6e 75 5b 6e 53 75 62 6d 65 6e  aSubmenu[nSubmen
1c20: 75 5d 2e 7a 4c 69 6e 6b 20 3d 20 76 6d 70 72 69  u].zLink = vmpri
1c30: 6e 74 66 28 7a 4c 69 6e 6b 2c 20 61 70 29 3b 0a  ntf(zLink, ap);.
1c40: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
1c50: 6e 53 75 62 6d 65 6e 75 2b 2b 3b 0a 7d 0a 76 6f  nSubmenu++;.}.vo
1c60: 69 64 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75  id style_submenu
1c70: 5f 65 6e 74 72 79 28 0a 20 20 63 6f 6e 73 74 20  _entry(.  const 
1c80: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
1c90: 20 20 20 2f 2a 20 51 75 65 72 79 20 70 61 72 61     /* Query para
1ca0: 6d 65 74 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20  meter name */.  
1cb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62  const char *zLab
1cc0: 65 6c 2c 20 20 20 20 20 20 2f 2a 20 4c 61 62 65  el,      /* Labe
1cd0: 6c 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 74  l before the ent
1ce0: 72 79 20 62 6f 78 20 2a 2f 0a 20 20 69 6e 74 20  ry box */.  int 
1cf0: 69 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  iSize,          
1d00: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1d10: 74 68 65 20 65 6e 74 72 79 20 62 6f 78 20 2a 2f  the entry box */
1d20: 0a 20 20 69 6e 74 20 65 56 69 73 69 62 6c 65 20  .  int eVisible 
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1d40: 69 73 69 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  isible or disabl
1d50: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
1d60: 74 28 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c 20  t( nSubmenuCtrl 
1d70: 3c 20 63 6f 75 6e 74 28 61 53 75 62 6d 65 6e 75  < count(aSubmenu
1d80: 43 74 72 6c 29 20 29 3b 0a 20 20 61 53 75 62 6d  Ctrl) );.  aSubm
1d90: 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75  enuCtrl[nSubmenu
1da0: 43 74 72 6c 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  Ctrl].zName = zN
1db0: 61 6d 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43  ame;.  aSubmenuC
1dc0: 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c  trl[nSubmenuCtrl
1dd0: 5d 2e 7a 4c 61 62 65 6c 20 3d 20 7a 4c 61 62 65  ].zLabel = zLabe
1de0: 6c 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72  l;.  aSubmenuCtr
1df0: 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e  l[nSubmenuCtrl].
1e00: 69 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 0a 20  iSize = iSize;. 
1e10: 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53   aSubmenuCtrl[nS
1e20: 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 56 69 73  ubmenuCtrl].eVis
1e30: 69 62 6c 65 20 3d 20 65 56 69 73 69 62 6c 65 3b  ible = eVisible;
1e40: 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b  .  aSubmenuCtrl[
1e50: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 54  nSubmenuCtrl].eT
1e60: 79 70 65 20 3d 20 46 46 5f 45 4e 54 52 59 3b 0a  ype = FF_ENTRY;.
1e70: 20 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c 2b 2b    nSubmenuCtrl++
1e80: 3b 0a 7d 0a 76 6f 69 64 20 73 74 79 6c 65 5f 73  ;.}.void style_s
1e90: 75 62 6d 65 6e 75 5f 63 68 65 63 6b 62 6f 78 28  ubmenu_checkbox(
1ea0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1eb0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 51  Name,       /* Q
1ec0: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 6e  uery parameter n
1ed0: 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ame */.  const c
1ee0: 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20  har *zLabel,    
1ef0: 20 20 2f 2a 20 4c 61 62 65 6c 20 74 6f 20 64 69    /* Label to di
1f00: 73 70 6c 61 79 20 61 66 74 65 72 20 74 68 65 20  splay after the 
1f10: 63 68 65 63 6b 62 6f 78 20 2a 2f 0a 20 20 69 6e  checkbox */.  in
1f20: 74 20 65 56 69 73 69 62 6c 65 2c 20 20 20 20 20  t eVisible,     
1f30: 20 20 20 20 20 20 20 2f 2a 20 56 69 73 69 62 6c         /* Visibl
1f40: 65 20 6f 72 20 64 69 73 61 62 6c 65 64 20 2a 2f  e or disabled */
1f50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f60: 4a 53 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  JS          /* O
1f70: 70 74 69 6f 6e 61 6c 20 6a 61 76 61 73 63 72 69  ptional javascri
1f80: 70 74 20 74 6f 20 72 75 6e 20 6f 6e 20 74 6f 67  pt to run on tog
1f90: 67 6c 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  gle */.){.  asse
1fa0: 72 74 28 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c  rt( nSubmenuCtrl
1fb0: 20 3c 20 63 6f 75 6e 74 28 61 53 75 62 6d 65 6e   < count(aSubmen
1fc0: 75 43 74 72 6c 29 20 29 3b 0a 20 20 61 53 75 62  uCtrl) );.  aSub
1fd0: 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e  menuCtrl[nSubmen
1fe0: 75 43 74 72 6c 5d 2e 7a 4e 61 6d 65 20 3d 20 7a  uCtrl].zName = z
1ff0: 4e 61 6d 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75  Name;.  aSubmenu
2000: 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72  Ctrl[nSubmenuCtr
2010: 6c 5d 2e 7a 4c 61 62 65 6c 20 3d 20 7a 4c 61 62  l].zLabel = zLab
2020: 65 6c 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43 74  el;.  aSubmenuCt
2030: 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d  rl[nSubmenuCtrl]
2040: 2e 65 56 69 73 69 62 6c 65 20 3d 20 65 56 69 73  .eVisible = eVis
2050: 69 62 6c 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75  ible;.  aSubmenu
2060: 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72  Ctrl[nSubmenuCtr
2070: 6c 5d 2e 7a 4a 53 20 3d 20 7a 4a 53 3b 0a 20 20  l].zJS = zJS;.  
2080: 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75  aSubmenuCtrl[nSu
2090: 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 54 79 70 65  bmenuCtrl].eType
20a0: 20 3d 20 46 46 5f 43 48 45 43 4b 42 4f 58 3b 0a   = FF_CHECKBOX;.
20b0: 20 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c 2b 2b    nSubmenuCtrl++
20c0: 3b 0a 7d 0a 76 6f 69 64 20 73 74 79 6c 65 5f 73  ;.}.void style_s
20d0: 75 62 6d 65 6e 75 5f 62 69 6e 61 72 79 28 0a 20  ubmenu_binary(. 
20e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
20f0: 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 51 75 65  me,       /* Que
2100: 72 79 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d  ry parameter nam
2110: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2120: 72 20 2a 7a 54 72 75 65 2c 20 20 20 20 20 20 20  r *zTrue,       
2130: 2f 2a 20 4c 61 62 65 6c 20 74 6f 20 73 68 6f 77  /* Label to show
2140: 20 77 68 65 6e 20 70 61 72 61 6d 65 74 65 72 20   when parameter 
2150: 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 63 6f 6e  is true */.  con
2160: 73 74 20 63 68 61 72 20 2a 7a 46 61 6c 73 65 2c  st char *zFalse,
2170: 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 74        /* Label t
2180: 6f 20 73 68 6f 77 20 77 68 65 6e 20 74 68 65 20  o show when the 
2190: 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c  parameter is fal
21a0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 56 69 73  se */.  int eVis
21b0: 69 62 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  ible            
21c0: 20 2f 2a 20 56 69 73 69 62 6c 65 20 6f 72 20 64   /* Visible or d
21d0: 69 73 61 62 6c 65 64 20 2a 2f 0a 29 7b 0a 20 20  isabled */.){.  
21e0: 61 73 73 65 72 74 28 20 6e 53 75 62 6d 65 6e 75  assert( nSubmenu
21f0: 43 74 72 6c 20 3c 20 63 6f 75 6e 74 28 61 53 75  Ctrl < count(aSu
2200: 62 6d 65 6e 75 43 74 72 6c 29 20 29 3b 0a 20 20  bmenuCtrl) );.  
2210: 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53 75  aSubmenuCtrl[nSu
2220: 62 6d 65 6e 75 43 74 72 6c 5d 2e 7a 4e 61 6d 65  bmenuCtrl].zName
2230: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 61 53 75 62   = zName;.  aSub
2240: 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e  menuCtrl[nSubmen
2250: 75 43 74 72 6c 5d 2e 7a 4c 61 62 65 6c 20 3d 20  uCtrl].zLabel = 
2260: 7a 54 72 75 65 3b 0a 20 20 61 53 75 62 6d 65 6e  zTrue;.  aSubmen
2270: 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74  uCtrl[nSubmenuCt
2280: 72 6c 5d 2e 7a 46 61 6c 73 65 20 3d 20 7a 46 61  rl].zFalse = zFa
2290: 6c 73 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43  lse;.  aSubmenuC
22a0: 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c  trl[nSubmenuCtrl
22b0: 5d 2e 65 56 69 73 69 62 6c 65 20 3d 20 65 56 69  ].eVisible = eVi
22c0: 73 69 62 6c 65 3b 0a 20 20 61 53 75 62 6d 65 6e  sible;.  aSubmen
22d0: 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74  uCtrl[nSubmenuCt
22e0: 72 6c 5d 2e 65 54 79 70 65 20 3d 20 46 46 5f 42  rl].eType = FF_B
22f0: 49 4e 41 52 59 3b 0a 20 20 6e 53 75 62 6d 65 6e  INARY;.  nSubmen
2300: 75 43 74 72 6c 2b 2b 3b 0a 7d 0a 76 6f 69 64 20  uCtrl++;.}.void 
2310: 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 6d 75  style_submenu_mu
2320: 6c 74 69 63 68 6f 69 63 65 28 0a 20 20 63 6f 6e  ltichoice(.  con
2330: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
2340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65            /* Que
2350: 72 79 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d  ry parameter nam
2360: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6f 69  e */.  int nChoi
2370: 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
2380: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2390: 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 6f   options */.  co
23a0: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20  nst char *const 
23b0: 2a 61 7a 43 68 6f 69 63 65 2c 20 2f 2a 20 76 61  *azChoice, /* va
23c0: 6c 75 65 2f 64 69 73 70 6c 61 79 20 70 61 69 72  lue/display pair
23d0: 73 2e 20 20 32 2a 6e 43 68 6f 69 63 65 20 65 6e  s.  2*nChoice en
23e0: 74 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65  tries */.  int e
23f0: 56 69 73 69 62 6c 65 20 20 20 20 20 20 20 20 20  Visible         
2400: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 73 69 62          /* Visib
2410: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 64 20 2a  le or disabled *
2420: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6e  /.){.  assert( n
2430: 53 75 62 6d 65 6e 75 43 74 72 6c 20 3c 20 63 6f  SubmenuCtrl < co
2440: 75 6e 74 28 61 53 75 62 6d 65 6e 75 43 74 72 6c  unt(aSubmenuCtrl
2450: 29 20 29 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43  ) );.  aSubmenuC
2460: 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c  trl[nSubmenuCtrl
2470: 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
2480: 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b  .  aSubmenuCtrl[
2490: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 69 53  nSubmenuCtrl].iS
24a0: 69 7a 65 20 3d 20 6e 43 68 6f 69 63 65 3b 0a 20  ize = nChoice;. 
24b0: 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53   aSubmenuCtrl[nS
24c0: 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 61 7a 43 68  ubmenuCtrl].azCh
24d0: 6f 69 63 65 20 3d 20 61 7a 43 68 6f 69 63 65 3b  oice = azChoice;
24e0: 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b  .  aSubmenuCtrl[
24f0: 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 56  nSubmenuCtrl].eV
2500: 69 73 69 62 6c 65 20 3d 20 65 56 69 73 69 62 6c  isible = eVisibl
2510: 65 3b 0a 20 20 61 53 75 62 6d 65 6e 75 43 74 72  e;.  aSubmenuCtr
2520: 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d 2e  l[nSubmenuCtrl].
2530: 65 54 79 70 65 20 3d 20 46 46 5f 4d 55 4c 54 49  eType = FF_MULTI
2540: 3b 0a 20 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c  ;.  nSubmenuCtrl
2550: 2b 2b 3b 0a 7d 0a 76 6f 69 64 20 73 74 79 6c 65  ++;.}.void style
2560: 5f 73 75 62 6d 65 6e 75 5f 73 71 6c 28 0a 20 20  _submenu_sql(.  
2570: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2580: 65 2c 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72  e,       /* Quer
2590: 79 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d 65  y parameter name
25a0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
25b0: 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20 2f   *zLabel,      /
25c0: 2a 20 4c 61 62 65 6c 20 6f 6e 20 74 68 65 20 63  * Label on the c
25d0: 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 63 6f 6e 73  ontrol */.  cons
25e0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
25f0: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 73       /* Format s
2600: 74 72 69 6e 67 20 66 6f 72 20 53 51 4c 20 63 6f  tring for SQL co
2610: 6d 6d 61 6e 64 20 66 6f 72 20 63 68 6f 69 63 65  mmand for choice
2620: 73 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20  s */.  ...      
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20  /* Arguments to 
2650: 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  the format strin
2660: 67 20 2a 2f 0a 29 7b 0a 20 20 53 74 6d 74 20 71  g */.){.  Stmt q
2670: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
2680: 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b   int nAlloc = 0;
2690: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 20 3d 20 30  .  char **az = 0
26a0: 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  ;.  va_list ap;.
26b0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
26c0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 64 62 5f 76  zFormat);.  db_v
26d0: 70 72 65 70 61 72 65 28 26 71 2c 20 30 2c 20 7a  prepare(&q, 0, z
26e0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
26f0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 77 68 69  a_end(ap);.  whi
2700: 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  le( SQLITE_ROW==
2710: 64 62 5f 73 74 65 70 28 26 71 29 20 29 7b 0a 20  db_step(&q) ){. 
2720: 20 20 20 69 66 28 20 6e 2b 32 3e 3d 6e 41 6c 6c     if( n+2>=nAll
2730: 6f 63 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c 6c  oc ){.      nAll
2740: 6f 63 20 2b 3d 20 6e 41 6c 6c 6f 63 20 2b 20 32  oc += nAlloc + 2
2750: 30 3b 0a 20 20 20 20 20 20 61 7a 20 3d 20 66 6f  0;.      az = fo
2760: 73 73 69 6c 5f 72 65 61 6c 6c 6f 63 28 61 7a 2c  ssil_realloc(az,
2770: 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e   sizeof(char*)*n
2780: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 0a 20 20  Alloc);.    }.  
2790: 20 20 61 7a 5b 6e 2b 2b 5d 20 3d 20 66 6f 73 73    az[n++] = foss
27a0: 69 6c 5f 73 74 72 64 75 70 28 64 62 5f 63 6f 6c  il_strdup(db_col
27b0: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 30 29 29 3b  umn_text(&q,0));
27c0: 0a 20 20 20 20 61 7a 5b 6e 2b 2b 5d 20 3d 20 66  .    az[n++] = f
27d0: 6f 73 73 69 6c 5f 73 74 72 64 75 70 28 64 62 5f  ossil_strdup(db_
27e0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 31  column_text(&q,1
27f0: 29 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e  ));.  }.  db_fin
2800: 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 69 66 28  alize(&q);.  if(
2810: 20 6e 3e 30 20 29 7b 0a 20 20 20 20 61 53 75 62   n>0 ){.    aSub
2820: 6d 65 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e  menuCtrl[nSubmen
2830: 75 43 74 72 6c 5d 2e 7a 4e 61 6d 65 20 3d 20 7a  uCtrl].zName = z
2840: 4e 61 6d 65 3b 0a 20 20 20 20 61 53 75 62 6d 65  Name;.    aSubme
2850: 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43  nuCtrl[nSubmenuC
2860: 74 72 6c 5d 2e 7a 4c 61 62 65 6c 20 3d 20 7a 4c  trl].zLabel = zL
2870: 61 62 65 6c 3b 0a 20 20 20 20 61 53 75 62 6d 65  abel;.    aSubme
2880: 6e 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43  nuCtrl[nSubmenuC
2890: 74 72 6c 5d 2e 69 53 69 7a 65 20 3d 20 6e 2f 32  trl].iSize = n/2
28a0: 3b 0a 20 20 20 20 61 53 75 62 6d 65 6e 75 43 74  ;.    aSubmenuCt
28b0: 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74 72 6c 5d  rl[nSubmenuCtrl]
28c0: 2e 61 7a 43 68 6f 69 63 65 20 3d 20 28 63 6f 6e  .azChoice = (con
28d0: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 2a  st char *const *
28e0: 29 61 7a 3b 0a 20 20 20 20 61 53 75 62 6d 65 6e  )az;.    aSubmen
28f0: 75 43 74 72 6c 5b 6e 53 75 62 6d 65 6e 75 43 74  uCtrl[nSubmenuCt
2900: 72 6c 5d 2e 65 56 69 73 69 62 6c 65 20 3d 20 53  rl].eVisible = S
2910: 54 59 4c 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  TYLE_NORMAL;.   
2920: 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 6e 53   aSubmenuCtrl[nS
2930: 75 62 6d 65 6e 75 43 74 72 6c 5d 2e 65 54 79 70  ubmenuCtrl].eTyp
2940: 65 20 3d 20 46 46 5f 4d 55 4c 54 49 3b 0a 20 20  e = FF_MULTI;.  
2950: 20 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c 2b 2b    nSubmenuCtrl++
2960: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
2970: 69 73 61 62 6c 65 20 6f 72 20 65 6e 61 62 6c 65  isable or enable
2980: 20 74 68 65 20 73 75 62 6d 65 6e 75 0a 2a 2f 0a   the submenu.*/.
2990: 76 6f 69 64 20 73 74 79 6c 65 5f 73 75 62 6d 65  void style_subme
29a0: 6e 75 5f 65 6e 61 62 6c 65 28 69 6e 74 20 6f 6e  nu_enable(int on
29b0: 4f 66 66 29 7b 0a 20 20 73 75 62 6d 65 6e 75 45  Off){.  submenuE
29c0: 6e 61 62 6c 65 20 3d 20 6f 6e 4f 66 66 3b 0a 7d  nable = onOff;.}
29d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  .../*.** Compare
29e0: 20 74 77 6f 20 73 75 62 6d 65 6e 75 20 69 74 65   two submenu ite
29f0: 6d 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70  ms for sorting p
2a00: 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69  urposes.*/.stati
2a10: 63 20 69 6e 74 20 73 75 62 6d 65 6e 75 43 6f 6d  c int submenuCom
2a20: 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20  pare(const void 
2a30: 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  *a, const void *
2a40: 62 29 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  b){.  const stru
2a50: 63 74 20 53 75 62 6d 65 6e 75 20 2a 41 20 3d 20  ct Submenu *A = 
2a60: 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 53 75  (const struct Su
2a70: 62 6d 65 6e 75 2a 29 61 3b 0a 20 20 63 6f 6e 73  bmenu*)a;.  cons
2a80: 74 20 73 74 72 75 63 74 20 53 75 62 6d 65 6e 75  t struct Submenu
2a90: 20 2a 42 20 3d 20 28 63 6f 6e 73 74 20 73 74 72   *B = (const str
2aa0: 75 63 74 20 53 75 62 6d 65 6e 75 2a 29 62 3b 0a  uct Submenu*)b;.
2ab0: 20 20 72 65 74 75 72 6e 20 66 6f 73 73 69 6c 5f    return fossil_
2ac0: 73 74 72 63 6d 70 28 41 2d 3e 7a 4c 61 62 65 6c  strcmp(A->zLabel
2ad0: 2c 20 42 2d 3e 7a 4c 61 62 65 6c 29 3b 0a 7d 0a  , B->zLabel);.}.
2ae0: 0a 2f 2a 20 55 73 65 20 74 68 69 73 20 66 6f 72  ./* Use this for
2af0: 20 74 68 65 20 24 63 75 72 72 65 6e 74 5f 70 61   the $current_pa
2b00: 67 65 20 76 61 72 69 61 62 6c 65 20 69 66 20 69  ge variable if i
2b10: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 20  t is not NULL.  
2b20: 49 66 20 69 74 0a 2a 2a 20 69 73 20 4e 55 4c 4c  If it.** is NULL
2b30: 20 74 68 65 6e 20 75 73 65 20 67 2e 7a 50 61 74   then use g.zPat
2b40: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  h..*/.static cha
2b50: 72 20 2a 6c 6f 63 61 6c 5f 7a 43 75 72 72 65 6e  r *local_zCurren
2b60: 74 50 61 67 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  tPage = 0;../*.*
2b70: 2a 20 53 65 74 20 74 68 65 20 64 65 73 69 72 65  * Set the desire
2b80: 64 20 24 63 75 72 72 65 6e 74 5f 70 61 67 65 20  d $current_page 
2b90: 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  to something oth
2ba0: 65 72 20 74 68 61 6e 20 67 2e 7a 50 61 74 68 0a  er than g.zPath.
2bb0: 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 73 65  */.void style_se
2bc0: 74 5f 63 75 72 72 65 6e 74 5f 70 61 67 65 28 63  t_current_page(c
2bd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
2be0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 66 6f 73 73  at, ...){.  foss
2bf0: 69 6c 5f 66 72 65 65 28 6c 6f 63 61 6c 5f 7a 43  il_free(local_zC
2c00: 75 72 72 65 6e 74 50 61 67 65 29 3b 0a 20 20 69  urrentPage);.  i
2c10: 66 28 20 7a 46 6f 72 6d 61 74 3d 3d 30 20 29 7b  f( zFormat==0 ){
2c20: 0a 20 20 20 20 6c 6f 63 61 6c 5f 7a 43 75 72 72  .    local_zCurr
2c30: 65 6e 74 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  entPage = 0;.  }
2c40: 65 6c 73 65 7b 0a 20 20 20 20 76 61 5f 6c 69 73  else{.    va_lis
2c50: 74 20 61 70 3b 0a 20 20 20 20 76 61 5f 73 74 61  t ap;.    va_sta
2c60: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
2c70: 0a 20 20 20 20 6c 6f 63 61 6c 5f 7a 43 75 72 72  .    local_zCurr
2c80: 65 6e 74 50 61 67 65 20 3d 20 76 6d 70 72 69 6e  entPage = vmprin
2c90: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  tf(zFormat, ap);
2ca0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
2cb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  .  }.}../*.** Cr
2cc0: 65 61 74 65 20 61 20 54 48 31 20 76 61 72 69 61  eate a TH1 varia
2cd0: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
2ce0: 68 65 20 55 52 4c 20 66 6f 72 20 74 68 65 20 73  he URL for the s
2cf0: 70 65 63 69 66 69 65 64 20 63 6f 6e 66 69 67 0a  pecified config.
2d00: 2a 2a 20 72 65 73 6f 75 72 63 65 2e 20 54 68 65  ** resource. The
2d10: 20 72 65 73 75 6c 74 69 6e 67 20 76 61 72 69 61   resulting varia
2d20: 62 6c 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  ble name will be
2d30: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20   of the form.** 
2d40: 24 5b 7a 56 61 72 50 72 65 66 69 78 5d 5f 75 72  $[zVarPrefix]_ur
2d50: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
2d60: 64 20 75 72 6c 5f 76 61 72 28 0a 20 20 63 6f 6e  d url_var(.  con
2d70: 73 74 20 63 68 61 72 20 2a 7a 56 61 72 50 72 65  st char *zVarPre
2d80: 66 69 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  fix,.  const cha
2d90: 72 20 2a 7a 43 6f 6e 66 69 67 4e 61 6d 65 2c 0a  r *zConfigName,.
2da0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2db0: 61 67 65 4e 61 6d 65 0a 29 7b 0a 20 20 63 68 61  ageName.){.  cha
2dc0: 72 20 2a 7a 56 61 72 4e 61 6d 65 20 3d 20 6d 70  r *zVarName = mp
2dd0: 72 69 6e 74 66 28 22 25 73 5f 75 72 6c 22 2c 20  rintf("%s_url", 
2de0: 7a 56 61 72 50 72 65 66 69 78 29 3b 0a 20 20 63  zVarPrefix);.  c
2df0: 68 61 72 20 2a 7a 55 72 6c 20 3d 20 30 3b 20 20  har *zUrl = 0;  
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2e10: 74 79 6c 65 73 68 65 65 74 20 55 52 4c 20 2a 2f  tylesheet URL */
2e20: 0a 20 20 69 6e 74 20 68 61 73 42 75 69 6c 74 69  .  int hasBuilti
2e30: 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
2e40: 2f 2a 20 74 72 75 65 20 66 6f 72 20 62 75 69 6c  /* true for buil
2e50: 74 2d 69 6e 20 70 61 67 65 2d 73 70 65 63 69 66  t-in page-specif
2e60: 69 63 20 43 53 53 20 2a 2f 0a 0a 20 20 69 66 28  ic CSS */..  if(
2e70: 30 3d 3d 73 74 72 63 6d 70 28 22 63 73 73 22 2c  0==strcmp("css",
2e80: 7a 43 6f 6e 66 69 67 4e 61 6d 65 29 29 7b 0a 20  zConfigName)){. 
2e90: 20 20 20 2f 2a 20 41 63 63 6f 75 6e 74 20 66 6f     /* Account fo
2ea0: 72 20 70 61 67 65 2d 73 70 65 63 69 66 69 63 20  r page-specific 
2eb0: 43 53 53 2c 20 61 70 70 65 6e 64 69 6e 67 20 61  CSS, appending a
2ec0: 20 2f 7b 7b 67 2e 7a 50 61 74 68 7d 7d 20 74 6f   /{{g.zPath}} to
2ed0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 75 72 6c 20   the.    ** url 
2ee0: 6f 6e 6c 79 20 69 66 20 77 65 20 68 61 76 65 20  only if we have 
2ef0: 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  a corresponding 
2f00: 62 75 69 6c 74 2d 69 6e 20 70 61 67 65 2d 73 70  built-in page-sp
2f10: 65 63 69 66 69 63 20 43 53 53 0a 20 20 20 20 2a  ecific CSS.    *
2f20: 2a 20 66 69 6c 65 2e 20 44 6f 20 6e 6f 74 20 61  * file. Do not a
2f30: 70 70 65 6e 64 20 69 74 20 74 6f 20 61 6c 6c 20  ppend it to all 
2f40: 70 61 67 65 73 20 62 65 63 61 75 73 65 20 77 65  pages because we
2f50: 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 65 66   would.    ** ef
2f60: 66 65 63 74 69 76 65 6c 79 20 63 61 63 68 65 2d  fectively cache-
2f70: 62 75 73 74 20 61 6c 6c 20 70 61 67 65 73 20 77  bust all pages w
2f80: 68 69 63 68 20 64 6f 20 6e 6f 74 20 68 61 76 65  hich do not have
2f90: 0a 20 20 20 20 2a 2a 20 70 61 67 65 2d 73 70 65  .    ** page-spe
2fa0: 63 69 66 69 63 20 43 53 53 2e 20 2a 2f 0a 20 20  cific CSS. */.  
2fb0: 20 20 63 68 61 72 20 2a 20 7a 42 75 69 6c 74 69    char * zBuilti
2fc0: 6e 20 3d 20 6d 70 72 69 6e 74 66 28 22 73 74 79  n = mprintf("sty
2fd0: 6c 65 2e 25 73 2e 63 73 73 22 2c 20 67 2e 7a 50  le.%s.css", g.zP
2fe0: 61 74 68 29 3b 0a 20 20 20 20 68 61 73 42 75 69  ath);.    hasBui
2ff0: 6c 74 69 6e 20 3d 20 62 75 69 6c 74 69 6e 5f 66  ltin = builtin_f
3000: 69 6c 65 28 7a 42 75 69 6c 74 69 6e 2c 30 29 21  ile(zBuiltin,0)!
3010: 3d 30 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66  =0;.    fossil_f
3020: 72 65 65 28 7a 42 75 69 6c 74 69 6e 29 3b 0a 20  ree(zBuiltin);. 
3030: 20 7d 0a 20 20 7a 55 72 6c 20 3d 20 6d 70 72 69   }.  zUrl = mpri
3040: 6e 74 66 28 22 25 52 2f 25 73 25 73 25 73 3f 69  ntf("%R/%s%s%s?i
3050: 64 3d 25 78 22 2c 20 7a 50 61 67 65 4e 61 6d 65  d=%x", zPageName
3060: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3070: 20 20 20 68 61 73 42 75 69 6c 74 69 6e 20 3f 20     hasBuiltin ? 
3080: 22 2f 22 20 3a 20 22 22 2c 20 68 61 73 42 75 69  "/" : "", hasBui
3090: 6c 74 69 6e 20 3f 20 67 2e 7a 50 61 74 68 20 3a  ltin ? g.zPath :
30a0: 20 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20   "",.           
30b0: 20 20 20 20 20 20 73 6b 69 6e 5f 69 64 28 7a 43        skin_id(zC
30c0: 6f 6e 66 69 67 4e 61 6d 65 29 29 3b 0a 20 20 54  onfigName));.  T
30d0: 68 5f 53 74 6f 72 65 28 7a 56 61 72 4e 61 6d 65  h_Store(zVarName
30e0: 2c 20 7a 55 72 6c 29 3b 0a 20 20 66 6f 73 73 69  , zUrl);.  fossi
30f0: 6c 5f 66 72 65 65 28 7a 55 72 6c 29 3b 0a 20 20  l_free(zUrl);.  
3100: 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 56 61 72  fossil_free(zVar
3110: 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
3120: 43 72 65 61 74 65 20 61 20 54 48 31 20 76 61 72  Create a TH1 var
3130: 69 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  iable containing
3140: 20 74 68 65 20 55 52 4c 20 66 6f 72 20 74 68 65   the URL for the
3150: 20 73 70 65 63 69 66 69 65 64 20 63 6f 6e 66 69   specified confi
3160: 67 20 69 6d 61 67 65 2e 0a 2a 2a 20 54 68 65 20  g image..** The 
3170: 72 65 73 75 6c 74 69 6e 67 20 76 61 72 69 61 62  resulting variab
3180: 6c 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  le name will be 
3190: 6f 66 20 74 68 65 20 66 6f 72 6d 20 24 5b 7a 49  of the form $[zI
31a0: 6d 61 67 65 4e 61 6d 65 5d 5f 69 6d 61 67 65 5f  mageName]_image_
31b0: 75 72 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  url..*/.static v
31c0: 6f 69 64 20 69 6d 61 67 65 5f 75 72 6c 5f 76 61  oid image_url_va
31d0: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  r(const char *zI
31e0: 6d 61 67 65 4e 61 6d 65 29 7b 0a 20 20 63 68 61  mageName){.  cha
31f0: 72 20 2a 7a 56 61 72 50 72 65 66 69 78 20 3d 20  r *zVarPrefix = 
3200: 6d 70 72 69 6e 74 66 28 22 25 73 5f 69 6d 61 67  mprintf("%s_imag
3210: 65 22 2c 20 7a 49 6d 61 67 65 4e 61 6d 65 29 3b  e", zImageName);
3220: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 69 67  .  char *zConfig
3230: 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22  Name = mprintf("
3240: 25 73 2d 69 6d 61 67 65 22 2c 20 7a 49 6d 61 67  %s-image", zImag
3250: 65 4e 61 6d 65 29 3b 0a 20 20 75 72 6c 5f 76 61  eName);.  url_va
3260: 72 28 7a 56 61 72 50 72 65 66 69 78 2c 20 7a 43  r(zVarPrefix, zC
3270: 6f 6e 66 69 67 4e 61 6d 65 2c 20 7a 49 6d 61 67  onfigName, zImag
3280: 65 4e 61 6d 65 29 3b 0a 20 20 66 72 65 65 28 7a  eName);.  free(z
3290: 56 61 72 50 72 65 66 69 78 29 3b 0a 20 20 66 72  VarPrefix);.  fr
32a0: 65 65 28 7a 43 6f 6e 66 69 67 4e 61 6d 65 29 3b  ee(zConfigName);
32b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
32c0: 20 54 45 58 54 20 77 69 74 68 20 61 20 63 6c 69   TEXT with a cli
32d0: 63 6b 2d 74 6f 2d 63 6f 70 79 20 62 75 74 74 6f  ck-to-copy butto
32e0: 6e 20 6e 65 78 74 20 74 6f 20 69 74 2e 20 4c 6f  n next to it. Lo
32f0: 61 64 73 20 74 68 65 20 63 6f 70 79 62 74 6e 2e  ads the copybtn.
3300: 6a 73 0a 2a 2a 20 4a 61 76 61 73 63 72 69 70 74  js.** Javascript
3310: 20 6d 6f 64 75 6c 65 2c 20 61 6e 64 20 67 65 6e   module, and gen
3320: 65 72 61 74 65 73 20 48 54 4d 4c 20 65 6c 65 6d  erates HTML elem
3330: 65 6e 74 73 20 77 69 74 68 20 74 68 65 20 66 6f  ents with the fo
3340: 6c 6c 6f 77 69 6e 67 20 49 44 73 3a 0a 2a 2a 0a  llowing IDs:.**.
3350: 2a 2a 20 20 20 20 54 41 52 47 45 54 49 44 3a 20  **    TARGETID: 
3360: 20 20 20 20 20 20 54 68 65 20 3c 73 70 61 6e 3e        The <span>
3370: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
3380: 54 45 58 54 2e 0a 2a 2a 20 20 20 20 63 6f 70 79  TEXT..**    copy
3390: 2d 54 41 52 47 45 54 49 44 3a 20 20 54 68 65 20  -TARGETID:  The 
33a0: 3c 73 70 61 6e 3e 20 66 6f 72 20 74 68 65 20 63  <span> for the c
33b0: 6f 70 79 20 62 75 74 74 6f 6e 2e 0a 2a 2a 0a 2a  opy button..**.*
33c0: 2a 20 49 66 20 74 68 65 20 46 4c 49 50 50 45 44  * If the FLIPPED
33d0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
33e0: 2d 7a 65 72 6f 2c 20 74 68 65 20 63 6f 70 79 20  -zero, the copy 
33f0: 62 75 74 74 6f 6e 20 69 73 20 64 69 73 70 6c 61  button is displa
3400: 79 65 64 20 61 66 74 65 72 20 54 45 58 54 2e 0a  yed after TEXT..
3410: 2a 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59 4c 45  **.** The COPYLE
3420: 4e 47 54 48 20 61 72 67 75 6d 65 6e 74 20 64 65  NGTH argument de
3430: 66 69 6e 65 73 20 74 68 65 20 6c 65 6e 67 74 68  fines the length
3440: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
3450: 67 20 6f 66 20 54 45 58 54 20 63 6f 70 69 65 64  g of TEXT copied
3460: 20 74 6f 0a 2a 2a 20 63 6c 69 70 62 6f 61 72 64   to.** clipboard
3470: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 3c 3d 20 30 3a  :.**.**    <= 0:
3480: 20 20 20 4e 6f 20 6c 69 6d 69 74 20 28 64 65 66     No limit (def
3490: 61 75 6c 74 20 69 66 20 74 68 65 20 61 72 67 75  ault if the argu
34a0: 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74 65 64 29  ment is omitted)
34b0: 2e 0a 2a 2a 20 20 20 20 3e 3d 20 33 3a 20 20 20  ..**    >= 3:   
34c0: 54 72 75 6e 63 61 74 65 20 54 45 58 54 20 61 66  Truncate TEXT af
34d0: 74 65 72 20 43 4f 50 59 4c 45 4e 47 54 48 20 28  ter COPYLENGTH (
34e0: 73 69 6e 67 6c 65 2d 62 79 74 65 29 20 63 68 61  single-byte) cha
34f0: 72 61 63 74 65 72 73 2e 0a 2a 2a 20 20 20 20 20  racters..**     
3500: 20 20 31 3a 20 20 20 55 73 65 20 74 68 65 20 22    1:   Use the "
3510: 68 61 73 68 2d 64 69 67 69 74 73 22 20 73 65 74  hash-digits" set
3520: 74 69 6e 67 20 61 73 20 74 68 65 20 6c 69 6d 69  ting as the limi
3530: 74 2e 0a 2a 2a 20 20 20 20 20 20 20 32 3a 20 20  t..**       2:  
3540: 20 55 73 65 20 74 68 65 20 6c 65 6e 67 74 68 20   Use the length 
3550: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
3560: 55 52 4c 73 20 61 73 20 74 68 65 20 6c 69 6d 69  URLs as the limi
3570: 74 20 28 64 65 66 69 6e 65 64 20 61 74 0a 2a 2a  t (defined at.**
3580: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70              comp
3590: 69 6c 65 2d 74 69 6d 65 20 62 79 20 46 4f 53 53  ile-time by FOSS
35a0: 49 4c 5f 48 41 53 48 5f 44 49 47 49 54 53 5f 55  IL_HASH_DIGITS_U
35b0: 52 4c 2c 20 64 65 66 61 75 6c 74 73 20 74 6f 20  RL, defaults to 
35c0: 31 36 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 74  16)..*/.char *st
35d0: 79 6c 65 5f 63 6f 70 79 5f 62 75 74 74 6f 6e 28  yle_copy_button(
35e0: 0a 20 20 69 6e 74 20 62 4f 75 74 70 75 74 43 47  .  int bOutputCG
35f0: 49 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  I,         /* Do
3600: 6e 27 74 20 72 65 74 75 72 6e 20 72 65 73 75 6c  n't return resul
3610: 74 2c 20 62 75 74 20 73 65 6e 64 20 74 6f 20 63  t, but send to c
3620: 67 69 5f 70 72 69 6e 74 66 28 29 2e 20 2a 2f 0a  gi_printf(). */.
3630: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
3640: 61 72 67 65 74 49 64 2c 20 20 2f 2a 20 54 68 65  argetId,  /* The
3650: 20 54 41 52 47 45 54 49 44 20 61 72 67 75 6d 65   TARGETID argume
3660: 6e 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 46 6c  nt. */.  int bFl
3670: 69 70 70 65 64 2c 20 20 20 20 20 20 20 20 20 20  ipped,          
3680: 20 2f 2a 20 54 68 65 20 46 4c 49 50 50 45 44 20   /* The FLIPPED 
3690: 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69  argument. */.  i
36a0: 6e 74 20 63 63 68 4c 65 6e 67 74 68 2c 20 20 20  nt cchLength,   
36b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43 4f         /* The CO
36c0: 50 59 4c 45 4e 47 54 48 20 61 72 67 75 6d 65 6e  PYLENGTH argumen
36d0: 74 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  t. */.  const ch
36e0: 61 72 20 2a 7a 54 65 78 74 46 6d 74 2c 20 20 20  ar *zTextFmt,   
36f0: 2f 2a 20 46 6f 72 6d 61 74 74 69 6e 67 20 6f 66  /* Formatting of
3700: 20 74 68 65 20 54 45 58 54 20 61 72 67 75 6d 65   the TEXT argume
3710: 6e 74 20 28 68 74 6d 6c 69 7a 65 64 29 2e 20 2a  nt (htmlized). *
3720: 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20 20 20  /.  ...         
3730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
3740: 6f 72 6d 61 74 74 69 6e 67 20 70 61 72 61 6d 65  ormatting parame
3750: 74 65 72 73 20 6f 66 20 74 68 65 20 54 45 58 54  ters of the TEXT
3760: 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 29 7b   argument. */.){
3770: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
3780: 20 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a 20 20   char *zText;.  
3790: 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20  char *zResult = 
37a0: 30 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  0;.  va_start(ap
37b0: 2c 7a 54 65 78 74 46 6d 74 29 3b 0a 20 20 7a 54  ,zTextFmt);.  zT
37c0: 65 78 74 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a  ext = vmprintf(z
37d0: 54 65 78 74 46 6d 74 2f 2a 77 6f 72 6b 73 2d 6c  TextFmt/*works-l
37e0: 69 6b 65 3a 3f 2a 2f 2c 61 70 29 3b 0a 20 20 76  ike:?*/,ap);.  v
37f0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
3800: 20 63 63 68 4c 65 6e 67 74 68 3d 3d 31 20 29 20   cchLength==1 ) 
3810: 63 63 68 4c 65 6e 67 74 68 20 3d 20 68 61 73 68  cchLength = hash
3820: 5f 64 69 67 69 74 73 28 30 29 3b 0a 20 20 65 6c  _digits(0);.  el
3830: 73 65 20 69 66 28 20 63 63 68 4c 65 6e 67 74 68  se if( cchLength
3840: 3d 3d 32 20 29 20 63 63 68 4c 65 6e 67 74 68 20  ==2 ) cchLength 
3850: 3d 20 68 61 73 68 5f 64 69 67 69 74 73 28 31 29  = hash_digits(1)
3860: 3b 0a 20 20 69 66 28 20 21 62 46 6c 69 70 70 65  ;.  if( !bFlippe
3870: 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  d ){.    const c
3880: 68 61 72 20 2a 7a 42 74 6e 46 6d 74 20 3d 0a 20  har *zBtnFmt =. 
3890: 20 20 20 20 20 22 3c 73 70 61 6e 20 63 6c 61 73       "<span clas
38a0: 73 3d 5c 22 6e 6f 62 72 5c 22 3e 22 0a 20 20 20  s=\"nobr\">".   
38b0: 20 20 20 22 3c 73 70 61 6e 20 22 0a 20 20 20 20     "<span ".    
38c0: 20 20 22 63 6c 61 73 73 3d 5c 22 63 6f 70 79 2d    "class=\"copy-
38d0: 62 75 74 74 6f 6e 5c 22 20 22 0a 20 20 20 20 20  button\" ".     
38e0: 20 22 69 64 3d 5c 22 63 6f 70 79 2d 25 68 5c 22   "id=\"copy-%h\"
38f0: 20 22 0a 20 20 20 20 20 20 22 64 61 74 61 2d 63   ".      "data-c
3900: 6f 70 79 74 61 72 67 65 74 3d 5c 22 25 68 5c 22  opytarget=\"%h\"
3910: 20 22 0a 20 20 20 20 20 20 22 64 61 74 61 2d 63   ".      "data-c
3920: 6f 70 79 6c 65 6e 67 74 68 3d 5c 22 25 64 5c 22  opylength=\"%d\"
3930: 3e 22 0a 20 20 20 20 20 20 22 3c 2f 73 70 61 6e  >".      "</span
3940: 3e 22 0a 20 20 20 20 20 20 22 3c 73 70 61 6e 20  >".      "<span 
3950: 69 64 3d 5c 22 25 68 5c 22 3e 22 0a 20 20 20 20  id=\"%h\">".    
3960: 20 20 22 25 73 22 0a 20 20 20 20 20 20 22 3c 2f    "%s".      "</
3970: 73 70 61 6e 3e 22 0a 20 20 20 20 20 20 22 3c 2f  span>".      "</
3980: 73 70 61 6e 3e 22 3b 0a 20 20 20 20 69 66 28 20  span>";.    if( 
3990: 62 4f 75 74 70 75 74 43 47 49 20 29 7b 0a 20 20  bOutputCGI ){.  
39a0: 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66 28 0a      cgi_printf(.
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39c0: 20 20 7a 42 74 6e 46 6d 74 2f 2a 77 6f 72 6b 73    zBtnFmt/*works
39d0: 2d 6c 69 6b 65 3a 22 25 68 25 68 25 64 25 68 25  -like:"%h%h%d%h%
39e0: 73 22 2a 2f 2c 0a 20 20 20 20 20 20 20 20 20 20  s"*/,.          
39f0: 20 20 20 20 20 20 20 20 7a 54 61 72 67 65 74 49          zTargetI
3a00: 64 2c 7a 54 61 72 67 65 74 49 64 2c 63 63 68 4c  d,zTargetId,cchL
3a10: 65 6e 67 74 68 2c 7a 54 61 72 67 65 74 49 64 2c  ength,zTargetId,
3a20: 7a 54 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73  zText);.    }els
3a30: 65 7b 0a 20 20 20 20 20 20 7a 52 65 73 75 6c 74  e{.      zResult
3a40: 20 3d 20 6d 70 72 69 6e 74 66 28 0a 20 20 20 20   = mprintf(.    
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 42                zB
3a60: 74 6e 46 6d 74 2f 2a 77 6f 72 6b 73 2d 6c 69 6b  tnFmt/*works-lik
3a70: 65 3a 22 25 68 25 68 25 64 25 68 25 73 22 2a 2f  e:"%h%h%d%h%s"*/
3a80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3a90: 20 20 20 20 7a 54 61 72 67 65 74 49 64 2c 7a 54      zTargetId,zT
3aa0: 61 72 67 65 74 49 64 2c 63 63 68 4c 65 6e 67 74  argetId,cchLengt
3ab0: 68 2c 7a 54 61 72 67 65 74 49 64 2c 7a 54 65 78  h,zTargetId,zTex
3ac0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t);.    }.  }els
3ad0: 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e{.    const cha
3ae0: 72 20 2a 7a 42 74 6e 46 6d 74 20 3d 0a 20 20 20  r *zBtnFmt =.   
3af0: 20 20 20 22 3c 73 70 61 6e 20 63 6c 61 73 73 3d     "<span class=
3b00: 5c 22 6e 6f 62 72 5c 22 3e 22 0a 20 20 20 20 20  \"nobr\">".     
3b10: 20 22 3c 73 70 61 6e 20 69 64 3d 5c 22 25 68 5c   "<span id=\"%h\
3b20: 22 3e 22 0a 20 20 20 20 20 20 22 25 73 22 0a 20  ">".      "%s". 
3b30: 20 20 20 20 20 22 3c 2f 73 70 61 6e 3e 22 0a 20       "</span>". 
3b40: 20 20 20 20 20 22 3c 73 70 61 6e 20 22 0a 20 20       "<span ".  
3b50: 20 20 20 20 22 63 6c 61 73 73 3d 5c 22 63 6f 70      "class=\"cop
3b60: 79 2d 62 75 74 74 6f 6e 20 63 6f 70 79 2d 62 75  y-button copy-bu
3b70: 74 74 6f 6e 2d 66 6c 69 70 70 65 64 5c 22 20 22  tton-flipped\" "
3b80: 0a 20 20 20 20 20 20 22 69 64 3d 5c 22 63 6f 70  .      "id=\"cop
3b90: 79 2d 25 68 5c 22 20 22 0a 20 20 20 20 20 20 22  y-%h\" ".      "
3ba0: 64 61 74 61 2d 63 6f 70 79 74 61 72 67 65 74 3d  data-copytarget=
3bb0: 5c 22 25 68 5c 22 20 22 0a 20 20 20 20 20 20 22  \"%h\" ".      "
3bc0: 64 61 74 61 2d 63 6f 70 79 6c 65 6e 67 74 68 3d  data-copylength=
3bd0: 5c 22 25 64 5c 22 3e 22 0a 20 20 20 20 20 20 22  \"%d\">".      "
3be0: 3c 2f 73 70 61 6e 3e 22 0a 20 20 20 20 20 20 22  </span>".      "
3bf0: 3c 2f 73 70 61 6e 3e 22 3b 0a 20 20 20 20 69 66  </span>";.    if
3c00: 28 20 62 4f 75 74 70 75 74 43 47 49 20 29 7b 0a  ( bOutputCGI ){.
3c10: 20 20 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66        cgi_printf
3c20: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
3c30: 20 20 20 20 7a 42 74 6e 46 6d 74 2f 2a 77 6f 72      zBtnFmt/*wor
3c40: 6b 73 2d 6c 69 6b 65 3a 22 25 68 25 73 25 68 25  ks-like:"%h%s%h%
3c50: 68 25 64 22 2a 2f 2c 0a 20 20 20 20 20 20 20 20  h%d"*/,.        
3c60: 20 20 20 20 20 20 20 20 20 20 7a 54 61 72 67 65            zTarge
3c70: 74 49 64 2c 7a 54 65 78 74 2c 7a 54 61 72 67 65  tId,zText,zTarge
3c80: 74 49 64 2c 7a 54 61 72 67 65 74 49 64 2c 63 63  tId,zTargetId,cc
3c90: 68 4c 65 6e 67 74 68 29 3b 0a 20 20 20 20 7d 65  hLength);.    }e
3ca0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 52 65 73 75  lse{.      zResu
3cb0: 6c 74 20 3d 20 6d 70 72 69 6e 74 66 28 0a 20 20  lt = mprintf(.  
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cd0: 7a 42 74 6e 46 6d 74 2f 2a 77 6f 72 6b 73 2d 6c  zBtnFmt/*works-l
3ce0: 69 6b 65 3a 22 25 68 25 73 25 68 25 68 25 64 22  ike:"%h%s%h%h%d"
3cf0: 2a 2f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  */,.            
3d00: 20 20 20 20 20 20 7a 54 61 72 67 65 74 49 64 2c        zTargetId,
3d10: 7a 54 65 78 74 2c 7a 54 61 72 67 65 74 49 64 2c  zText,zTargetId,
3d20: 7a 54 61 72 67 65 74 49 64 2c 63 63 68 4c 65 6e  zTargetId,cchLen
3d30: 67 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gth);.    }.  }.
3d40: 20 20 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20    free(zText);. 
3d50: 20 62 75 69 6c 74 69 6e 5f 72 65 71 75 65 73 74   builtin_request
3d60: 5f 6a 73 28 22 63 6f 70 79 62 74 6e 2e 6a 73 22  _js("copybtn.js"
3d70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 73  );.  return zRes
3d80: 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ult;.}../*.** Re
3d90: 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 6e 6f  turn a random no
3da0: 6e 63 65 20 74 68 61 74 20 69 73 20 73 74 6f 72  nce that is stor
3db0: 65 64 20 69 6e 20 73 74 61 74 69 63 20 73 70 61  ed in static spa
3dc0: 63 65 2e 20 20 46 6f 72 20 61 20 70 61 72 74 69  ce.  For a parti
3dd0: 63 75 6c 61 72 0a 2a 2a 20 72 75 6e 2c 20 74 68  cular.** run, th
3de0: 65 20 73 61 6d 65 20 6e 6f 6e 63 65 20 69 73 20  e same nonce is 
3df0: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 65 64 2e  always returned.
3e00: 0a 2a 2f 0a 63 68 61 72 20 2a 73 74 79 6c 65 5f  .*/.char *style_
3e10: 6e 6f 6e 63 65 28 76 6f 69 64 29 7b 0a 20 20 73  nonce(void){.  s
3e20: 74 61 74 69 63 20 63 68 61 72 20 7a 4e 6f 6e 63  tatic char zNonc
3e30: 65 5b 35 32 5d 3b 0a 20 20 69 66 28 20 7a 4e 6f  e[52];.  if( zNo
3e40: 6e 63 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  nce[0]==0 ){.   
3e50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
3e60: 53 65 65 64 5b 32 34 5d 3b 0a 20 20 20 20 73 71  Seed[24];.    sq
3e70: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
3e80: 28 32 34 2c 20 7a 53 65 65 64 29 3b 0a 20 20 20  (24, zSeed);.   
3e90: 20 65 6e 63 6f 64 65 31 36 28 7a 53 65 65 64 2c   encode16(zSeed,
3ea0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
3eb0: 7a 4e 6f 6e 63 65 2c 32 34 29 3b 0a 20 20 7d 0a  zNonce,24);.  }.
3ec0: 20 20 72 65 74 75 72 6e 20 7a 4e 6f 6e 63 65 3b    return zNonce;
3ed0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3ee0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 43 6f 6e   the default Con
3ef0: 74 65 6e 74 20 53 65 63 75 72 69 74 79 20 50 6f  tent Security Po
3f00: 6c 69 63 79 20 28 43 53 50 29 20 73 74 72 69 6e  licy (CSP) strin
3f10: 67 2e 0a 2a 2a 20 49 66 20 74 68 65 20 74 6f 48  g..** If the toH
3f20: 65 61 64 65 72 20 61 72 67 75 6d 65 6e 74 20 69  eader argument i
3f30: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6c 73  s true, then als
3f40: 6f 20 61 64 64 20 74 68 65 0a 2a 2a 20 43 53 50  o add the.** CSP
3f50: 20 74 6f 20 74 68 65 20 48 54 54 50 20 72 65 70   to the HTTP rep
3f60: 6c 79 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  ly header..**.**
3f70: 20 54 68 65 20 43 53 50 20 63 6f 6d 65 73 20 66   The CSP comes f
3f80: 72 6f 6d 20 74 68 65 20 22 64 65 66 61 75 6c 74  rom the "default
3f90: 2d 63 73 70 22 20 73 65 74 74 69 6e 67 20 69 66  -csp" setting if
3fa0: 20 69 74 20 65 78 69 73 74 73 20 61 6e 64 0a 2a   it exists and.*
3fb0: 2a 20 69 73 20 6e 6f 6e 2d 65 6d 70 74 79 2e 20  * is non-empty. 
3fc0: 20 49 66 20 74 68 61 74 20 73 65 74 74 69 6e 67   If that setting
3fd0: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
3fe0: 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 66 6f  ing, then the fo
3ff0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 64 65 66 61 75  llowing.** defau
4000: 6c 74 20 69 73 20 75 73 65 64 20 69 6e 73 74 65  lt is used inste
4010: 61 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 65  ad:.**.**     de
4020: 66 61 75 6c 74 2d 73 72 63 20 27 73 65 6c 66 27  fault-src 'self'
4030: 20 64 61 74 61 3a 3b 0a 2a 2a 20 20 20 20 20 73   data:;.**     s
4040: 63 72 69 70 74 2d 73 72 63 20 27 73 65 6c 66 27  cript-src 'self'
4050: 20 27 6e 6f 6e 63 65 2d 24 6e 6f 6e 63 65 27 3b   'nonce-$nonce';
4060: 0a 2a 2a 20 20 20 20 20 73 74 79 6c 65 2d 73 72  .**     style-sr
4070: 63 20 27 73 65 6c 66 27 20 27 75 6e 73 61 66 65  c 'self' 'unsafe
4080: 2d 69 6e 6c 69 6e 65 27 3b 0a 2a 2a 0a 2a 2a 20  -inline';.**.** 
4090: 54 68 65 20 74 65 78 74 20 27 24 6e 6f 6e 63 65  The text '$nonce
40a0: 27 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  ' is replaced by
40b0: 20 73 74 79 6c 65 5f 6e 6f 6e 63 65 28 29 20 69   style_nonce() i
40c0: 66 20 61 6e 64 20 77 68 65 72 65 65 76 65 72 20  f and whereever 
40d0: 69 74 0a 2a 2a 20 6f 63 63 75 72 73 20 69 6e 20  it.** occurs in 
40e0: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
40f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 72 69  ..**.** The stri
4100: 6e 67 20 72 65 74 75 72 6e 65 64 20 69 73 20 6f  ng returned is o
4110: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 66 6f 73  btained from fos
4120: 73 69 6c 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  sil_malloc() and
4130: 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 72 65  .** should be re
4140: 6c 65 61 73 65 64 20 62 79 20 74 68 65 20 63 61  leased by the ca
4150: 6c 6c 65 72 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  ller..*/.char *s
4160: 74 79 6c 65 5f 63 73 70 28 69 6e 74 20 74 6f 48  tyle_csp(int toH
4170: 65 61 64 65 72 29 7b 0a 20 20 73 74 61 74 69 63  eader){.  static
4180: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 42 61 63   const char zBac
4190: 6b 75 70 43 53 50 5b 5d 20 3d 20 0a 20 20 20 22  kupCSP[] = .   "
41a0: 64 65 66 61 75 6c 74 2d 73 72 63 20 27 73 65 6c  default-src 'sel
41b0: 66 27 20 64 61 74 61 3a 3b 20 22 0a 20 20 20 22  f' data:; ".   "
41c0: 73 63 72 69 70 74 2d 73 72 63 20 27 73 65 6c 66  script-src 'self
41d0: 27 20 27 6e 6f 6e 63 65 2d 24 6e 6f 6e 63 65 27  ' 'nonce-$nonce'
41e0: 3b 20 22 0a 20 20 20 22 73 74 79 6c 65 2d 73 72  ; ".   "style-sr
41f0: 63 20 27 73 65 6c 66 27 20 27 75 6e 73 61 66 65  c 'self' 'unsafe
4200: 2d 69 6e 6c 69 6e 65 27 22 3b 0a 20 20 63 6f 6e  -inline'";.  con
4210: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
4220: 20 3d 20 64 62 5f 67 65 74 28 22 64 65 66 61 75   = db_get("defau
4230: 6c 74 2d 63 73 70 22 2c 22 22 29 3b 0a 20 20 42  lt-csp","");.  B
4240: 6c 6f 62 20 63 73 70 3b 0a 20 20 63 68 61 72 20  lob csp;.  char 
4250: 2a 7a 4e 6f 6e 63 65 3b 0a 20 20 63 68 61 72 20  *zNonce;.  char 
4260: 2a 7a 43 73 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  *zCsp;.  int i;.
4270: 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 5b 30 5d    if( zFormat[0]
4280: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 46 6f 72 6d  ==0 ){.    zForm
4290: 61 74 20 3d 20 7a 42 61 63 6b 75 70 43 53 50 3b  at = zBackupCSP;
42a0: 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 69 6e 69 74  .  }.  blob_init
42b0: 28 26 63 73 70 2c 20 30 2c 20 30 29 3b 0a 20 20  (&csp, 0, 0);.  
42c0: 77 68 69 6c 65 28 20 7a 46 6f 72 6d 61 74 5b 30  while( zFormat[0
42d0: 5d 20 26 26 20 28 7a 4e 6f 6e 63 65 20 3d 20 73  ] && (zNonce = s
42e0: 74 72 73 74 72 28 7a 46 6f 72 6d 61 74 2c 22 24  trstr(zFormat,"$
42f0: 6e 6f 6e 63 65 22 29 29 21 3d 30 20 29 7b 0a 20  nonce"))!=0 ){. 
4300: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26     blob_append(&
4310: 63 73 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 28 69  csp, zFormat, (i
4320: 6e 74 29 28 7a 4e 6f 6e 63 65 20 2d 20 7a 46 6f  nt)(zNonce - zFo
4330: 72 6d 61 74 29 29 3b 0a 20 20 20 20 62 6c 6f 62  rmat));.    blob
4340: 5f 61 70 70 65 6e 64 28 26 63 73 70 2c 20 73 74  _append(&csp, st
4350: 79 6c 65 5f 6e 6f 6e 63 65 28 29 2c 20 2d 31 29  yle_nonce(), -1)
4360: 3b 0a 20 20 20 20 7a 46 6f 72 6d 61 74 20 3d 20  ;.    zFormat = 
4370: 7a 4e 6f 6e 63 65 20 2b 20 36 3b 0a 20 20 7d 0a  zNonce + 6;.  }.
4380: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 63    blob_append(&c
4390: 73 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 2d 31 29  sp, zFormat, -1)
43a0: 3b 0a 20 20 7a 43 73 70 20 3d 20 62 6c 6f 62 5f  ;.  zCsp = blob_
43b0: 73 74 72 28 26 63 73 70 29 3b 0a 20 20 2f 2a 20  str(&csp);.  /* 
43c0: 4e 6f 20 77 68 69 74 65 73 70 61 63 65 20 6f 74  No whitespace ot
43d0: 68 65 72 20 74 68 61 6e 20 61 63 74 75 61 6c 20  her than actual 
43e0: 73 70 61 63 65 20 63 68 61 72 61 63 74 65 72 73  space characters
43f0: 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20   allowed in the 
4400: 43 53 50 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2e  CSP.  ** string.
4410: 20 20 53 65 65 20 68 74 74 70 73 3a 2f 2f 66 6f    See https://fo
4420: 73 73 69 6c 2d 73 63 6d 2e 6f 72 67 2f 66 6f 72  ssil-scm.org/for
4430: 75 6d 2f 66 6f 72 75 6d 70 6f 73 74 2f 64 32 39  um/forumpost/d29
4440: 65 33 61 66 34 33 63 20 2a 2f 0a 20 20 66 6f 72  e3af43c */.  for
4450: 28 69 3d 30 3b 20 7a 43 73 70 5b 69 5d 3b 20 69  (i=0; zCsp[i]; i
4460: 2b 2b 29 7b 20 69 66 28 20 66 6f 73 73 69 6c 5f  ++){ if( fossil_
4470: 69 73 73 70 61 63 65 28 7a 43 73 70 5b 69 5d 29  isspace(zCsp[i])
4480: 20 29 20 7a 43 73 70 5b 69 5d 20 3d 20 27 20 27   ) zCsp[i] = ' '
4490: 3b 20 7d 0a 20 20 69 66 28 20 74 6f 48 65 61 64  ; }.  if( toHead
44a0: 65 72 20 29 7b 0a 20 20 20 20 63 67 69 5f 70 72  er ){.    cgi_pr
44b0: 69 6e 74 66 5f 68 65 61 64 65 72 28 22 43 6f 6e  intf_header("Con
44c0: 74 65 6e 74 2d 53 65 63 75 72 69 74 79 2d 50 6f  tent-Security-Po
44d0: 6c 69 63 79 3a 20 25 73 5c 72 5c 6e 22 2c 20 7a  licy: %s\r\n", z
44e0: 43 73 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Csp);.  }.  retu
44f0: 72 6e 20 7a 43 73 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zCsp;.}../*.*
4500: 2a 20 44 65 66 61 75 6c 74 20 48 54 4d 4c 20 70  * Default HTML p
4510: 61 67 65 20 68 65 61 64 65 72 20 74 65 78 74 20  age header text 
4520: 74 68 72 6f 75 67 68 20 3c 62 6f 64 79 3e 2e 20  through <body>. 
4530: 20 49 66 20 74 68 65 20 72 65 70 6f 73 69 74 6f   If the reposito
4540: 72 79 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 68  ry-specific.** h
4550: 65 61 64 65 72 20 74 65 6d 70 6c 61 74 65 20 6c  eader template l
4560: 61 63 6b 73 20 61 20 3c 62 6f 64 79 3e 20 74 61  acks a <body> ta
4570: 67 2c 20 74 68 65 6e 20 61 6c 6c 20 6f 66 20 74  g, then all of t
4580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 0a  he following is.
4590: 2a 2a 20 70 72 65 70 65 6e 64 65 64 2e 0a 2a 2f  ** prepended..*/
45a0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
45b0: 61 72 20 7a 44 66 6c 74 48 65 61 64 65 72 5b 5d  ar zDfltHeader[]
45c0: 20 3d 20 0a 40 20 3c 68 74 6d 6c 3e 0a 40 20 3c   = .@ <html>.@ <
45d0: 68 65 61 64 3e 0a 40 20 3c 62 61 73 65 20 68 72  head>.@ <base hr
45e0: 65 66 3d 22 24 62 61 73 65 75 72 6c 2f 24 63 75  ef="$baseurl/$cu
45f0: 72 72 65 6e 74 5f 70 61 67 65 22 20 2f 3e 0a 40  rrent_page" />.@
4600: 20 3c 6d 65 74 61 20 63 68 61 72 73 65 74 3d 22   <meta charset="
4610: 55 54 46 2d 38 22 3e 0a 40 20 3c 6d 65 74 61 20  UTF-8">.@ <meta 
4620: 68 74 74 70 2d 65 71 75 69 76 3d 22 43 6f 6e 74  http-equiv="Cont
4630: 65 6e 74 2d 53 65 63 75 72 69 74 79 2d 50 6f 6c  ent-Security-Pol
4640: 69 63 79 22 20 63 6f 6e 74 65 6e 74 3d 22 24 64  icy" content="$d
4650: 65 66 61 75 6c 74 5f 63 73 70 22 20 2f 3e 0a 40  efault_csp" />.@
4660: 20 3c 6d 65 74 61 20 6e 61 6d 65 3d 22 76 69 65   <meta name="vie
4670: 77 70 6f 72 74 22 20 63 6f 6e 74 65 6e 74 3d 22  wport" content="
4680: 77 69 64 74 68 3d 64 65 76 69 63 65 2d 77 69 64  width=device-wid
4690: 74 68 2c 20 69 6e 69 74 69 61 6c 2d 73 63 61 6c  th, initial-scal
46a0: 65 3d 31 2e 30 22 3e 0a 40 20 3c 74 69 74 6c 65  e=1.0">.@ <title
46b0: 3e 24 3c 70 72 6f 6a 65 63 74 5f 6e 61 6d 65 3e  >$<project_name>
46c0: 3a 20 24 3c 74 69 74 6c 65 3e 3c 2f 74 69 74 6c  : $<title></titl
46d0: 65 3e 0a 40 20 3c 6c 69 6e 6b 20 72 65 6c 3d 22  e>.@ <link rel="
46e0: 61 6c 74 65 72 6e 61 74 65 22 20 74 79 70 65 3d  alternate" type=
46f0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 72 73 73  "application/rss
4700: 2b 78 6d 6c 22 20 74 69 74 6c 65 3d 22 52 53 53  +xml" title="RSS
4710: 20 46 65 65 64 22 20 5c 0a 40 20 20 68 72 65 66   Feed" \.@  href
4720: 3d 22 24 68 6f 6d 65 2f 74 69 6d 65 6c 69 6e 65  ="$home/timeline
4730: 2e 72 73 73 22 20 2f 3e 0a 40 20 3c 6c 69 6e 6b  .rss" />.@ <link
4740: 20 72 65 6c 3d 22 73 74 79 6c 65 73 68 65 65 74   rel="stylesheet
4750: 22 20 68 72 65 66 3d 22 24 73 74 79 6c 65 73 68  " href="$stylesh
4760: 65 65 74 5f 75 72 6c 22 20 74 79 70 65 3d 22 74  eet_url" type="t
4770: 65 78 74 2f 63 73 73 22 20 2f 3e 0a 40 20 3c 2f  ext/css" />.@ </
4780: 68 65 61 64 3e 0a 40 20 3c 62 6f 64 79 20 63 6c  head>.@ <body cl
4790: 61 73 73 3d 22 24 63 75 72 72 65 6e 74 5f 66 65  ass="$current_fe
47a0: 61 74 75 72 65 22 3e 0a 3b 0a 0a 2f 2a 0a 2a 2a  ature">.;../*.**
47b0: 20 52 65 74 75 72 6e 73 20 74 68 65 20 64 65 66   Returns the def
47c0: 61 75 6c 74 20 70 61 67 65 20 68 65 61 64 65 72  ault page header
47d0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
47e0: 2a 67 65 74 5f 64 65 66 61 75 6c 74 5f 68 65 61  *get_default_hea
47f0: 64 65 72 28 29 7b 0a 20 20 72 65 74 75 72 6e 20  der(){.  return 
4800: 7a 44 66 6c 74 48 65 61 64 65 72 3b 0a 7d 0a 0a  zDfltHeader;.}..
4810: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 55 52  /*.** Given a UR
4820: 4c 20 70 61 74 68 2c 20 65 78 74 72 61 63 74 20  L path, extract 
4830: 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e  the first elemen
4840: 74 20 61 73 20 61 20 22 66 65 61 74 75 72 65 22  t as a "feature"
4850: 20 6e 61 6d 65 2c 0a 2a 2a 20 75 73 65 64 20 61   name,.** used a
4860: 73 20 74 68 65 20 3c 62 6f 64 79 20 63 6c 61 73  s the <body clas
4870: 73 3d 22 46 45 41 54 55 52 45 22 3e 20 76 61 6c  s="FEATURE"> val
4880: 75 65 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74  ue by default, t
4890: 68 6f 75 67 68 0a 2a 2a 20 6c 61 74 65 72 2d 72  hough.** later-r
48a0: 75 6e 6e 69 6e 67 20 63 6f 64 65 20 6d 61 79 20  unning code may 
48b0: 6f 76 65 72 72 69 64 65 20 74 68 69 73 2c 20 74  override this, t
48c0: 79 70 69 63 61 6c 6c 79 20 74 6f 20 67 72 6f 75  ypically to grou
48d0: 70 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 46 6f  p multiple.** Fo
48e0: 73 73 69 6c 20 55 49 20 55 52 4c 73 20 69 6e 74  ssil UI URLs int
48f0: 6f 20 61 20 73 69 6e 67 6c 65 20 22 66 65 61 74  o a single "feat
4900: 75 72 65 22 20 73 6f 20 79 6f 75 20 63 61 6e 20  ure" so you can 
4910: 68 61 76 65 20 70 65 72 2d 66 65 61 74 75 72 65  have per-feature
4920: 0a 2a 2a 20 43 53 53 20 72 75 6c 65 73 2e 0a 2a  .** CSS rules..*
4930: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
4940: 2c 20 22 62 6f 64 79 2e 66 6f 72 75 6d 20 64 69  , "body.forum di
4950: 76 2e 6d 61 72 6b 64 6f 77 6e 20 62 6c 6f 63 6b  v.markdown block
4960: 71 75 6f 74 65 22 20 74 61 72 67 65 74 73 20 6f  quote" targets o
4970: 6e 6c 79 0a 2a 2a 20 62 6c 6f 63 6b 20 71 75 6f  nly.** block quo
4980: 74 65 73 20 6d 61 64 65 20 69 6e 20 66 6f 72 75  tes made in foru
4990: 6d 20 70 6f 73 74 73 2c 20 6c 65 61 76 69 6e 67  m posts, leaving
49a0: 20 6f 74 68 65 72 20 4d 61 72 6b 64 6f 77 6e 20   other Markdown 
49b0: 71 75 6f 74 65 73 0a 2a 2a 20 61 6c 6f 6e 65 2e  quotes.** alone.
49c0: 20 20 42 65 63 61 75 73 65 20 66 65 61 74 75 72    Because featur
49d0: 65 20 63 6c 61 73 73 20 22 66 6f 72 75 6d 22 20  e class "forum" 
49e0: 67 72 6f 75 70 73 20 2f 66 6f 72 75 6d 6d 61 69  groups /forummai
49f0: 6e 2c 20 2f 66 6f 72 75 6d 70 6f 73 74 2c 0a 2a  n, /forumpost,.*
4a00: 2a 20 61 6e 64 20 2f 66 6f 72 75 6d 65 32 2c 20  * and /forume2, 
4a10: 69 74 20 77 6f 72 6b 73 20 61 63 72 6f 73 73 20  it works across 
4a20: 61 6c 6c 20 72 65 6e 64 65 72 69 6e 67 73 20 6f  all renderings o
4a30: 66 20 4d 61 72 6b 64 6f 77 6e 20 74 6f 20 48 54  f Markdown to HT
4a40: 4d 4c 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ML.** within the
4a50: 20 46 6f 73 73 69 6c 20 66 6f 72 75 6d 20 66 65   Fossil forum fe
4a60: 61 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ature..*/.static
4a70: 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 66 65 61   const char* fea
4a80: 74 75 72 65 5f 66 72 6f 6d 5f 70 61 67 65 5f 70  ture_from_page_p
4a90: 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ath(const char *
4aa0: 7a 50 61 74 68 29 0a 7b 0a 20 20 63 6f 6e 73 74  zPath).{.  const
4ab0: 20 63 68 61 72 2a 20 7a 53 6c 61 73 68 20 3d 20   char* zSlash = 
4ac0: 73 74 72 63 68 72 28 7a 50 61 74 68 2c 20 27 2f  strchr(zPath, '/
4ad0: 27 29 3b 0a 20 20 69 66 20 28 7a 53 6c 61 73 68  ');.  if (zSlash
4ae0: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 66  ) {.    return f
4af0: 6f 73 73 69 6c 5f 73 74 72 6e 64 75 70 28 7a 50  ossil_strndup(zP
4b00: 61 74 68 2c 20 7a 53 6c 61 73 68 20 2d 20 7a 50  ath, zSlash - zP
4b10: 61 74 68 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  ath);.  } else {
4b20: 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 50 61 74  .    return zPat
4b30: 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  h;.  }.}../*.** 
4b40: 4f 76 65 72 72 69 64 65 20 74 68 65 20 76 61 6c  Override the val
4b50: 75 65 20 6f 66 20 74 68 65 20 54 48 31 20 76 61  ue of the TH1 va
4b60: 72 69 61 62 6c 65 20 63 75 72 72 65 6e 74 5f 66  riable current_f
4b70: 65 61 74 75 72 65 2c 20 69 74 73 20 64 65 66 61  eature, its defa
4b80: 75 6c 74 0a 2a 2a 20 73 65 74 20 62 79 20 66 65  ult.** set by fe
4b90: 61 74 75 72 65 5f 66 72 6f 6d 5f 70 61 67 65 5f  ature_from_page_
4ba0: 70 61 74 68 28 29 2e 20 20 57 65 20 64 6f 20 6e  path().  We do n
4bb0: 6f 74 20 63 61 6c 6c 20 74 68 69 73 20 66 72 6f  ot call this fro
4bc0: 6d 0a 2a 2a 20 73 74 79 6c 65 5f 69 6e 69 74 5f  m.** style_init_
4bd0: 74 68 31 5f 76 61 72 73 28 29 20 62 65 63 61 75  th1_vars() becau
4be0: 73 65 20 74 68 61 74 20 75 73 65 73 20 54 68 5f  se that uses Th_
4bf0: 4d 61 79 62 65 53 74 6f 72 65 28 29 20 69 6e 73  MaybeStore() ins
4c00: 74 65 61 64 20 74 6f 0a 2a 2a 20 61 6c 6c 6f 77  tead to.** allow
4c10: 20 77 65 62 70 61 67 65 20 69 6d 70 6c 65 6d 65   webpage impleme
4c20: 6e 74 61 74 69 6f 6e 73 20 74 6f 20 63 61 6c 6c  ntations to call
4c30: 20 74 68 69 73 20 62 65 66 6f 72 65 20 73 74 79   this before sty
4c40: 6c 65 5f 68 65 61 64 65 72 28 29 0a 2a 2a 20 74  le_header().** t
4c50: 6f 20 6f 76 65 72 72 69 64 65 20 74 68 61 74 20  o override that 
4c60: 22 6d 61 79 62 65 22 20 64 65 66 61 75 6c 74 20  "maybe" default 
4c70: 77 69 74 68 20 73 6f 6d 65 74 68 69 6e 67 20 62  with something b
4c80: 65 74 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  etter..*/.void s
4c90: 74 79 6c 65 5f 73 65 74 5f 63 75 72 72 65 6e 74  tyle_set_current
4ca0: 5f 66 65 61 74 75 72 65 28 63 6f 6e 73 74 20 63  _feature(const c
4cb0: 68 61 72 2a 20 7a 46 65 61 74 75 72 65 29 0a 7b  har* zFeature).{
4cc0: 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 63 75 72  .  Th_Store("cur
4cd0: 72 65 6e 74 5f 66 65 61 74 75 72 65 22 2c 20 7a  rent_feature", z
4ce0: 46 65 61 74 75 72 65 29 3b 0a 7d 0a 0a 2f 2a 0a  Feature);.}../*.
4cf0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6c  ** Initialize al
4d00: 6c 20 74 68 65 20 64 65 66 61 75 6c 74 20 54 48  l the default TH
4d10: 31 20 76 61 72 69 61 62 6c 65 73 0a 2a 2f 0a 73  1 variables.*/.s
4d20: 74 61 74 69 63 20 76 6f 69 64 20 73 74 79 6c 65  tatic void style
4d30: 5f 69 6e 69 74 5f 74 68 31 5f 76 61 72 73 28 63  _init_th1_vars(c
4d40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 69 74 6c  onst char *zTitl
4d50: 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  e){.  const char
4d60: 20 2a 7a 4e 6f 6e 63 65 20 3d 20 73 74 79 6c 65   *zNonce = style
4d70: 5f 6e 6f 6e 63 65 28 29 3b 0a 20 20 63 68 61 72  _nonce();.  char
4d80: 20 2a 7a 44 66 6c 74 43 73 70 3b 0a 0a 20 20 7a   *zDfltCsp;..  z
4d90: 44 66 6c 74 43 73 70 20 3d 20 73 74 79 6c 65 5f  DfltCsp = style_
4da0: 63 73 70 28 31 29 3b 0a 20 20 2f 2a 0a 20 20 2a  csp(1);.  /*.  *
4db0: 2a 20 44 6f 20 6e 6f 74 20 6f 76 65 72 77 72 69  * Do not overwri
4dc0: 74 65 20 74 68 65 20 54 48 31 20 76 61 72 69 61  te the TH1 varia
4dd0: 62 6c 65 20 22 64 65 66 61 75 6c 74 5f 63 73 70  ble "default_csp
4de0: 22 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20  " if it exists, 
4df0: 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 61 6c 6c  as this.  ** all
4e00: 6f 77 73 20 69 74 20 74 6f 20 62 65 20 70 72 6f  ows it to be pro
4e10: 70 65 72 6c 79 20 6f 76 65 72 72 69 64 64 65 6e  perly overridden
4e20: 20 76 69 61 20 74 68 65 20 54 48 31 20 73 65 74   via the TH1 set
4e30: 75 70 20 73 63 72 69 70 74 20 28 69 2e 65 2e 20  up script (i.e. 
4e40: 69 74 0a 20 20 2a 2a 20 69 73 20 65 76 61 6c 75  it.  ** is evalu
4e50: 61 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  ated before the 
4e60: 68 65 61 64 65 72 20 69 73 20 72 65 6e 64 65 72  header is render
4e70: 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 54 68 5f 4d  ed)..  */.  Th_M
4e80: 61 79 62 65 53 74 6f 72 65 28 22 64 65 66 61 75  aybeStore("defau
4e90: 6c 74 5f 63 73 70 22 2c 20 7a 44 66 6c 74 43 73  lt_csp", zDfltCs
4ea0: 70 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65  p);.  fossil_fre
4eb0: 65 28 7a 44 66 6c 74 43 73 70 29 3b 0a 20 20 54  e(zDfltCsp);.  T
4ec0: 68 5f 53 74 6f 72 65 28 22 6e 6f 6e 63 65 22 2c  h_Store("nonce",
4ed0: 20 7a 4e 6f 6e 63 65 29 3b 0a 20 20 54 68 5f 53   zNonce);.  Th_S
4ee0: 74 6f 72 65 28 22 70 72 6f 6a 65 63 74 5f 6e 61  tore("project_na
4ef0: 6d 65 22 2c 20 64 62 5f 67 65 74 28 22 70 72 6f  me", db_get("pro
4f00: 6a 65 63 74 2d 6e 61 6d 65 22 2c 22 55 6e 6e 61  ject-name","Unna
4f10: 6d 65 64 20 46 6f 73 73 69 6c 20 50 72 6f 6a 65  med Fossil Proje
4f20: 63 74 22 29 29 3b 0a 20 20 54 68 5f 53 74 6f 72  ct"));.  Th_Stor
4f30: 65 28 22 70 72 6f 6a 65 63 74 5f 64 65 73 63 72  e("project_descr
4f40: 69 70 74 69 6f 6e 22 2c 20 64 62 5f 67 65 74 28  iption", db_get(
4f50: 22 70 72 6f 6a 65 63 74 2d 64 65 73 63 72 69 70  "project-descrip
4f60: 74 69 6f 6e 22 2c 22 22 29 29 3b 0a 20 20 69 66  tion",""));.  if
4f70: 28 20 7a 54 69 74 6c 65 20 29 20 54 68 5f 53 74  ( zTitle ) Th_St
4f80: 6f 72 65 28 22 74 69 74 6c 65 22 2c 20 7a 54 69  ore("title", zTi
4f90: 74 6c 65 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65  tle);.  Th_Store
4fa0: 28 22 62 61 73 65 75 72 6c 22 2c 20 67 2e 7a 42  ("baseurl", g.zB
4fb0: 61 73 65 55 52 4c 29 3b 0a 20 20 54 68 5f 53 74  aseURL);.  Th_St
4fc0: 6f 72 65 28 22 73 65 63 75 72 65 75 72 6c 22 2c  ore("secureurl",
4fd0: 20 66 6f 73 73 69 6c 5f 77 61 6e 74 73 5f 68 74   fossil_wants_ht
4fe0: 74 70 73 28 31 29 3f 20 67 2e 7a 48 74 74 70 73  tps(1)? g.zHttps
4ff0: 55 52 4c 3a 20 67 2e 7a 42 61 73 65 55 52 4c 29  URL: g.zBaseURL)
5000: 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 68 6f  ;.  Th_Store("ho
5010: 6d 65 22 2c 20 67 2e 7a 54 6f 70 29 3b 0a 20 20  me", g.zTop);.  
5020: 54 68 5f 53 74 6f 72 65 28 22 69 6e 64 65 78 5f  Th_Store("index_
5030: 70 61 67 65 22 2c 20 64 62 5f 67 65 74 28 22 69  page", db_get("i
5040: 6e 64 65 78 2d 70 61 67 65 22 2c 22 2f 68 6f 6d  ndex-page","/hom
5050: 65 22 29 29 3b 0a 20 20 69 66 28 20 6c 6f 63 61  e"));.  if( loca
5060: 6c 5f 7a 43 75 72 72 65 6e 74 50 61 67 65 3d 3d  l_zCurrentPage==
5070: 30 20 29 20 73 74 79 6c 65 5f 73 65 74 5f 63 75  0 ) style_set_cu
5080: 72 72 65 6e 74 5f 70 61 67 65 28 22 25 54 22 2c  rrent_page("%T",
5090: 20 67 2e 7a 50 61 74 68 29 3b 0a 20 20 54 68 5f   g.zPath);.  Th_
50a0: 53 74 6f 72 65 28 22 63 75 72 72 65 6e 74 5f 70  Store("current_p
50b0: 61 67 65 22 2c 20 6c 6f 63 61 6c 5f 7a 43 75 72  age", local_zCur
50c0: 72 65 6e 74 50 61 67 65 29 3b 0a 20 20 54 68 5f  rentPage);.  Th_
50d0: 53 74 6f 72 65 28 22 63 73 72 66 5f 74 6f 6b 65  Store("csrf_toke
50e0: 6e 22 2c 20 67 2e 7a 43 73 72 66 54 6f 6b 65 6e  n", g.zCsrfToken
50f0: 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 72  );.  Th_Store("r
5100: 65 6c 65 61 73 65 5f 76 65 72 73 69 6f 6e 22 2c  elease_version",
5110: 20 52 45 4c 45 41 53 45 5f 56 45 52 53 49 4f 4e   RELEASE_VERSION
5120: 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 6d  );.  Th_Store("m
5130: 61 6e 69 66 65 73 74 5f 76 65 72 73 69 6f 6e 22  anifest_version"
5140: 2c 20 4d 41 4e 49 46 45 53 54 5f 56 45 52 53 49  , MANIFEST_VERSI
5150: 4f 4e 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65 28  ON);.  Th_Store(
5160: 22 6d 61 6e 69 66 65 73 74 5f 64 61 74 65 22 2c  "manifest_date",
5170: 20 4d 41 4e 49 46 45 53 54 5f 44 41 54 45 29 3b   MANIFEST_DATE);
5180: 0a 20 20 54 68 5f 53 74 6f 72 65 28 22 63 6f 6d  .  Th_Store("com
5190: 70 69 6c 65 72 5f 6e 61 6d 65 22 2c 20 43 4f 4d  piler_name", COM
51a0: 50 49 4c 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 75  PILER_NAME);.  u
51b0: 72 6c 5f 76 61 72 28 22 73 74 79 6c 65 73 68 65  rl_var("styleshe
51c0: 65 74 22 2c 20 22 63 73 73 22 2c 20 22 73 74 79  et", "css", "sty
51d0: 6c 65 2e 63 73 73 22 29 3b 0a 20 20 69 6d 61 67  le.css");.  imag
51e0: 65 5f 75 72 6c 5f 76 61 72 28 22 6c 6f 67 6f 22  e_url_var("logo"
51f0: 29 3b 0a 20 20 69 6d 61 67 65 5f 75 72 6c 5f 76  );.  image_url_v
5200: 61 72 28 22 62 61 63 6b 67 72 6f 75 6e 64 22 29  ar("background")
5210: 3b 0a 20 20 69 66 28 20 21 6c 6f 67 69 6e 5f 69  ;.  if( !login_i
5220: 73 5f 6e 6f 62 6f 64 79 28 29 20 29 7b 0a 20 20  s_nobody() ){.  
5230: 20 20 54 68 5f 53 74 6f 72 65 28 22 6c 6f 67 69    Th_Store("logi
5240: 6e 22 2c 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20  n", g.zLogin);. 
5250: 20 7d 0a 20 20 54 68 5f 4d 61 79 62 65 53 74 6f   }.  Th_MaybeSto
5260: 72 65 28 22 63 75 72 72 65 6e 74 5f 66 65 61 74  re("current_feat
5270: 75 72 65 22 2c 20 66 65 61 74 75 72 65 5f 66 72  ure", feature_fr
5280: 6f 6d 5f 70 61 67 65 5f 70 61 74 68 28 6c 6f 63  om_page_path(loc
5290: 61 6c 5f 7a 43 75 72 72 65 6e 74 50 61 67 65 29  al_zCurrentPage)
52a0: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 61   );.}../*.** Dra
52b0: 77 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2f  w the header..*/
52c0: 0a 76 6f 69 64 20 73 74 79 6c 65 5f 68 65 61 64  .void style_head
52d0: 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
52e0: 54 69 74 6c 65 46 6f 72 6d 61 74 2c 20 2e 2e 2e  TitleFormat, ...
52f0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
5300: 0a 20 20 63 68 61 72 20 2a 7a 54 69 74 6c 65 3b  .  char *zTitle;
5310: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5320: 48 65 61 64 65 72 20 3d 20 73 6b 69 6e 5f 67 65  Header = skin_ge
5330: 74 28 22 68 65 61 64 65 72 22 29 3b 0a 20 20 6c  t("header");.  l
5340: 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65  ogin_check_crede
5350: 6e 74 69 61 6c 73 28 29 3b 0a 0a 20 20 76 61 5f  ntials();..  va_
5360: 73 74 61 72 74 28 61 70 2c 20 7a 54 69 74 6c 65  start(ap, zTitle
5370: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 54 69 74 6c  Format);.  zTitl
5380: 65 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a 54 69  e = vmprintf(zTi
5390: 74 6c 65 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  tleFormat, ap);.
53a0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 0a 20    va_end(ap);.. 
53b0: 20 63 67 69 5f 64 65 73 74 69 6e 61 74 69 6f 6e   cgi_destination
53c0: 28 43 47 49 5f 48 45 41 44 45 52 29 3b 0a 0a 20  (CGI_HEADER);.. 
53d0: 20 40 20 3c 21 44 4f 43 54 59 50 45 20 68 74 6d   @ <!DOCTYPE htm
53e0: 6c 3e 0a 0a 20 20 69 66 28 20 67 2e 74 68 54 72  l>..  if( g.thTr
53f0: 61 63 65 20 29 20 54 68 5f 54 72 61 63 65 28 22  ace ) Th_Trace("
5400: 42 45 47 49 4e 5f 48 45 41 44 45 52 3c 62 72 20  BEGIN_HEADER<br 
5410: 2f 3e 5c 6e 22 2c 20 2d 31 29 3b 0a 0a 20 20 2f  />\n", -1);..  /
5420: 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 68  * Generate the h
5430: 65 61 64 65 72 20 75 70 20 74 68 72 6f 75 67 68  eader up through
5440: 20 74 68 65 20 6d 61 69 6e 20 6d 65 6e 75 20 2a   the main menu *
5450: 2f 0a 20 20 73 74 79 6c 65 5f 69 6e 69 74 5f 74  /.  style_init_t
5460: 68 31 5f 76 61 72 73 28 7a 54 69 74 6c 65 29 3b  h1_vars(zTitle);
5470: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
5480: 74 72 6c 69 6b 65 28 22 25 3c 62 6f 64 79 25 22  trlike("%<body%"
5490: 2c 20 7a 48 65 61 64 65 72 2c 20 30 29 21 3d 30  , zHeader, 0)!=0
54a0: 20 29 7b 0a 20 20 20 20 54 68 5f 52 65 6e 64 65   ){.    Th_Rende
54b0: 72 28 7a 44 66 6c 74 48 65 61 64 65 72 29 3b 0a  r(zDfltHeader);.
54c0: 20 20 7d 0a 20 20 69 66 28 20 67 2e 74 68 54 72    }.  if( g.thTr
54d0: 61 63 65 20 29 20 54 68 5f 54 72 61 63 65 28 22  ace ) Th_Trace("
54e0: 42 45 47 49 4e 5f 48 45 41 44 45 52 5f 53 43 52  BEGIN_HEADER_SCR
54f0: 49 50 54 3c 62 72 20 2f 3e 5c 6e 22 2c 20 2d 31  IPT<br />\n", -1
5500: 29 3b 0a 20 20 54 68 5f 52 65 6e 64 65 72 28 7a  );.  Th_Render(z
5510: 48 65 61 64 65 72 29 3b 0a 20 20 69 66 28 20 67  Header);.  if( g
5520: 2e 74 68 54 72 61 63 65 20 29 20 54 68 5f 54 72  .thTrace ) Th_Tr
5530: 61 63 65 28 22 45 4e 44 5f 48 45 41 44 45 52 3c  ace("END_HEADER<
5540: 62 72 20 2f 3e 5c 6e 22 2c 20 2d 31 29 3b 0a 20  br />\n", -1);. 
5550: 20 54 68 5f 55 6e 73 74 6f 72 65 28 22 74 69 74   Th_Unstore("tit
5560: 6c 65 22 29 3b 20 20 20 2f 2a 20 41 76 6f 69 64  le");   /* Avoid
5570: 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 69 74 68   collisions with
5580: 20 74 69 63 6b 65 74 20 66 69 65 6c 64 20 6e 61   ticket field na
5590: 6d 65 73 20 2a 2f 0a 20 20 63 67 69 5f 64 65 73  mes */.  cgi_des
55a0: 74 69 6e 61 74 69 6f 6e 28 43 47 49 5f 42 4f 44  tination(CGI_BOD
55b0: 59 29 3b 0a 20 20 67 2e 63 67 69 4f 75 74 70 75  Y);.  g.cgiOutpu
55c0: 74 20 3d 20 31 3b 0a 20 20 68 65 61 64 65 72 48  t = 1;.  headerH
55d0: 61 73 42 65 65 6e 47 65 6e 65 72 61 74 65 64 20  asBeenGenerated 
55e0: 3d 20 31 3b 0a 20 20 73 69 64 65 62 6f 78 55 73  = 1;.  sideboxUs
55f0: 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 67 2e  ed = 0;.  if( g.
5600: 70 65 72 6d 2e 44 65 62 75 67 20 26 26 20 50 28  perm.Debug && P(
5610: 22 73 68 6f 77 71 70 22 29 20 29 7b 0a 20 20 20  "showqp") ){.   
5620: 20 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 64   @ <div class="d
5630: 65 62 75 67 22 3e 0a 20 20 20 20 63 67 69 5f 70  ebug">.    cgi_p
5640: 72 69 6e 74 5f 61 6c 6c 28 30 2c 20 30 29 3b 0a  rint_all(0, 0);.
5650: 20 20 20 20 40 20 3c 2f 64 69 76 3e 0a 20 20 7d      @ </div>.  }
5660: 0a 7d 0a 0a 23 69 66 20 49 4e 54 45 52 46 41 43  .}..#if INTERFAC
5670: 45 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 70 61 72  E./* Allowed par
5680: 61 6d 65 74 65 72 73 20 66 6f 72 20 73 74 79 6c  ameters for styl
5690: 65 5f 61 64 75 6e 69 74 28 29 20 2a 2f 0a 23 64  e_adunit() */.#d
56a0: 65 66 69 6e 65 20 41 44 55 4e 49 54 5f 4f 46 46  efine ADUNIT_OFF
56b0: 20 20 20 20 20 20 20 20 30 78 30 30 30 31 20 20          0x0001  
56c0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
56d0: 6c 6c 6f 77 20 61 64 73 20 6f 6e 20 74 68 69 73  llow ads on this
56e0: 20 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65   page */.#define
56f0: 20 41 44 55 4e 49 54 5f 52 49 47 48 54 5f 4f 4b   ADUNIT_RIGHT_OK
5700: 20 20 20 30 78 30 30 30 32 20 20 20 20 20 20 20     0x0002       
5710: 2f 2a 20 52 69 67 68 74 2d 73 69 64 65 20 76 65  /* Right-side ve
5720: 72 74 69 63 61 6c 20 61 64 73 20 6f 6b 20 68 65  rtical ads ok he
5730: 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  re */.#endif../*
5740: 0a 2a 2a 20 56 61 72 69 6f 75 73 20 70 61 67 65  .** Various page
5750: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
5760: 20 63 61 6e 20 69 6e 76 6f 6b 65 20 74 68 69 73   can invoke this
5770: 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 6c 65   interface to le
5780: 74 20 74 68 65 0a 2a 2a 20 73 74 79 6c 65 20 6d  t the.** style m
5790: 61 6e 61 67 65 72 20 6b 6e 6f 77 20 77 68 61 74  anager know what
57a0: 20 6b 69 6e 64 73 20 6f 66 20 61 64 73 20 61 72   kinds of ads ar
57b0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  e appropriate fo
57c0: 72 20 74 68 69 73 20 70 61 67 65 2e 0a 2a 2f 0a  r this page..*/.
57d0: 76 6f 69 64 20 73 74 79 6c 65 5f 61 64 75 6e 69  void style_aduni
57e0: 74 5f 63 6f 6e 66 69 67 28 75 6e 73 69 67 6e 65  t_config(unsigne
57f0: 64 20 69 6e 74 20 6d 46 6c 61 67 73 29 7b 0a 20  d int mFlags){. 
5800: 20 61 64 55 6e 69 74 46 6c 61 67 73 20 3d 20 6d   adUnitFlags = m
5810: 46 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Flags;.}../*.** 
5820: 52 65 74 75 72 6e 20 74 68 65 20 74 65 78 74 20  Return the text 
5830: 6f 66 20 61 6e 20 61 64 2d 75 6e 69 74 2c 20 69  of an ad-unit, i
5840: 66 20 6f 6e 65 20 73 68 6f 75 6c 64 20 62 65 20  f one should be 
5850: 72 65 6e 64 65 72 65 64 2e 20 20 52 65 74 75 72  rendered.  Retur
5860: 6e 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20 6e 6f 20  n.** NULL if no 
5870: 61 64 2d 75 6e 69 74 20 69 73 20 64 65 73 69 72  ad-unit is desir
5880: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 2a 70  ed..**.** The *p
5890: 41 64 46 6c 61 67 20 76 61 6c 75 65 20 6d 69 67  AdFlag value mig
58a0: 68 74 20 62 65 20 73 65 74 20 74 6f 20 41 44 55  ht be set to ADU
58b0: 4e 49 54 5f 52 49 47 48 54 5f 4f 4b 20 69 66 20  NIT_RIGHT_OK if 
58c0: 74 68 69 73 20 69 73 0a 2a 2a 20 61 20 72 69 67  this is.** a rig
58d0: 68 74 2d 68 61 6e 64 20 76 65 72 74 69 63 61 6c  ht-hand vertical
58e0: 20 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63   ad..*/.static c
58f0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 79 6c 65  onst char *style
5900: 5f 61 64 75 6e 69 74 5f 74 65 78 74 28 75 6e 73  _adunit_text(uns
5910: 69 67 6e 65 64 20 69 6e 74 20 2a 70 41 64 46 6c  igned int *pAdFl
5920: 61 67 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ag){.  const cha
5930: 72 20 2a 7a 41 64 20 3d 20 30 3b 0a 20 20 2a 70  r *zAd = 0;.  *p
5940: 41 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 69 66  AdFlag = 0;.  if
5950: 28 20 61 64 55 6e 69 74 46 6c 61 67 73 20 26 20  ( adUnitFlags & 
5960: 41 44 55 4e 49 54 5f 4f 46 46 20 29 20 72 65 74  ADUNIT_OFF ) ret
5970: 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 61 6c  urn 0;  /* Disal
5980: 6c 6f 77 20 61 64 73 20 6f 6e 20 74 68 69 73 20  low ads on this 
5990: 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 64 62  page */.  if( db
59a0: 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e 28 22 61 64  _get_boolean("ad
59b0: 75 6e 69 74 2d 64 69 73 61 62 6c 65 22 2c 30 29  unit-disable",0)
59c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
59d0: 66 28 20 67 2e 70 65 72 6d 2e 41 64 6d 69 6e 20  f( g.perm.Admin 
59e0: 26 26 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61  && db_get_boolea
59f0: 6e 28 22 61 64 75 6e 69 74 2d 6f 6d 69 74 2d 69  n("adunit-omit-i
5a00: 66 2d 61 64 6d 69 6e 22 2c 30 29 20 29 7b 0a 20  f-admin",0) ){. 
5a10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5a20: 0a 20 20 69 66 28 20 21 6c 6f 67 69 6e 5f 69 73  .  if( !login_is
5a30: 5f 6e 6f 62 6f 64 79 28 29 0a 20 20 20 26 26 20  _nobody().   && 
5a40: 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 67 2e  fossil_strcmp(g.
5a50: 7a 4c 6f 67 69 6e 2c 22 61 6e 6f 6e 79 6d 6f 75  zLogin,"anonymou
5a60: 73 22 29 21 3d 30 0a 20 20 20 26 26 20 64 62 5f  s")!=0.   && db_
5a70: 67 65 74 5f 62 6f 6f 6c 65 61 6e 28 22 61 64 75  get_boolean("adu
5a80: 6e 69 74 2d 6f 6d 69 74 2d 69 66 2d 75 73 65 72  nit-omit-if-user
5a90: 22 2c 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  ",0).  ){.    re
5aa0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
5ab0: 28 20 28 61 64 55 6e 69 74 46 6c 61 67 73 20 26  ( (adUnitFlags &
5ac0: 20 41 44 55 4e 49 54 5f 52 49 47 48 54 5f 4f 4b   ADUNIT_RIGHT_OK
5ad0: 29 21 3d 30 0a 20 20 20 26 26 20 21 66 6f 73 73  )!=0.   && !foss
5ae0: 69 6c 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61 63  il_all_whitespac
5af0: 65 28 7a 41 64 20 3d 20 64 62 5f 67 65 74 28 22  e(zAd = db_get("
5b00: 61 64 75 6e 69 74 2d 72 69 67 68 74 22 2c 20 30  adunit-right", 0
5b10: 29 29 0a 20 20 20 26 26 20 21 63 67 69 5f 62 6f  )).   && !cgi_bo
5b20: 64 79 5f 63 6f 6e 74 61 69 6e 73 28 22 3c 74 61  dy_contains("<ta
5b30: 62 6c 65 22 29 0a 20 20 29 7b 0a 20 20 20 20 2a  ble").  ){.    *
5b40: 70 41 64 46 6c 61 67 20 3d 20 41 44 55 4e 49 54  pAdFlag = ADUNIT
5b50: 5f 52 49 47 48 54 5f 4f 4b 3b 0a 20 20 20 20 72  _RIGHT_OK;.    r
5b60: 65 74 75 72 6e 20 7a 41 64 3b 0a 20 20 7d 65 6c  eturn zAd;.  }el
5b70: 73 65 20 69 66 28 20 21 66 6f 73 73 69 6c 5f 61  se if( !fossil_a
5b80: 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 7a 41  ll_whitespace(zA
5b90: 64 20 3d 20 64 62 5f 67 65 74 28 22 61 64 75 6e  d = db_get("adun
5ba0: 69 74 22 2c 30 29 29 20 29 7b 0a 20 20 20 20 72  it",0)) ){.    r
5bb0: 65 74 75 72 6e 20 7a 41 64 3b 0a 20 20 7d 0a 20  eturn zAd;.  }. 
5bc0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5bd0: 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
5be0: 74 20 74 68 65 20 74 61 62 6c 65 2d 73 6f 72 74  t the table-sort
5bf0: 69 6e 67 20 6a 61 76 61 73 63 72 69 70 74 20 69  ing javascript i
5c00: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69  s needed..*/.voi
5c10: 64 20 73 74 79 6c 65 5f 74 61 62 6c 65 5f 73 6f  d style_table_so
5c20: 72 74 65 72 28 76 6f 69 64 29 7b 0a 20 20 62 75  rter(void){.  bu
5c30: 69 6c 74 69 6e 5f 72 65 71 75 65 73 74 5f 6a 73  iltin_request_js
5c40: 28 22 73 6f 72 74 74 61 62 6c 65 2e 6a 73 22 29  ("sorttable.js")
5c50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
5c60: 61 74 65 20 63 6f 64 65 20 74 6f 20 6c 6f 61 64  ate code to load
5c70: 20 61 6c 6c 20 72 65 71 75 69 72 65 64 20 6a 61   all required ja
5c80: 76 61 73 63 72 69 70 74 20 66 69 6c 65 73 2e 0a  vascript files..
5c90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
5ca0: 74 79 6c 65 5f 6c 6f 61 64 5f 61 6c 6c 5f 6a 73  tyle_load_all_js
5cb0: 5f 66 69 6c 65 73 28 76 6f 69 64 29 7b 0a 20 20  _files(void){.  
5cc0: 69 66 28 20 6e 65 65 64 48 72 65 66 4a 73 20 26  if( needHrefJs &
5cd0: 26 20 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69  & g.perm.Hyperli
5ce0: 6e 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44  nk ){.    int nD
5cf0: 65 6c 61 79 20 3d 20 64 62 5f 67 65 74 5f 69 6e  elay = db_get_in
5d00: 74 28 22 61 75 74 6f 2d 68 79 70 65 72 6c 69 6e  t("auto-hyperlin
5d10: 6b 2d 64 65 6c 61 79 22 2c 30 29 3b 0a 20 20 20  k-delay",0);.   
5d20: 20 69 6e 74 20 62 4d 6f 75 73 65 6f 76 65 72 20   int bMouseover 
5d30: 3d 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e  = db_get_boolean
5d40: 28 22 61 75 74 6f 2d 68 79 70 65 72 6c 69 6e 6b  ("auto-hyperlink
5d50: 2d 6d 6f 75 73 65 6f 76 65 72 22 2c 30 29 3b 0a  -mouseover",0);.
5d60: 20 20 20 20 40 20 3c 73 63 72 69 70 74 20 69 64      @ <script id
5d70: 3d 27 68 72 65 66 2d 64 61 74 61 27 20 74 79 70  ='href-data' typ
5d80: 65 3d 27 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6a  e='application/j
5d90: 73 6f 6e 27 3e 5c 0a 20 20 20 20 40 20 7b 22 64  son'>\.    @ {"d
5da0: 65 6c 61 79 22 3a 25 64 28 6e 44 65 6c 61 79 29  elay":%d(nDelay)
5db0: 2c 22 6d 6f 75 73 65 6f 76 65 72 22 3a 25 64 28  ,"mouseover":%d(
5dc0: 62 4d 6f 75 73 65 6f 76 65 72 29 7d 3c 2f 73 63  bMouseover)}</sc
5dd0: 72 69 70 74 3e 0a 20 20 7d 0a 20 20 40 20 3c 73  ript>.  }.  @ <s
5de0: 63 72 69 70 74 20 6e 6f 6e 63 65 3d 22 25 68 28  cript nonce="%h(
5df0: 73 74 79 6c 65 5f 6e 6f 6e 63 65 28 29 29 22 3e  style_nonce())">
5e00: 2f 2a 20 73 74 79 6c 65 2e 63 3a 25 64 28 5f 5f  /* style.c:%d(__
5e10: 4c 49 4e 45 5f 5f 29 20 2a 2f 0a 20 20 40 20 66  LINE__) */.  @ f
5e20: 75 6e 63 74 69 6f 6e 20 64 65 62 75 67 4d 73 67  unction debugMsg
5e30: 28 6d 73 67 29 7b 0a 20 20 40 20 76 61 72 20 6e  (msg){.  @ var n
5e40: 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45   = document.getE
5e50: 6c 65 6d 65 6e 74 42 79 49 64 28 22 64 65 62 75  lementById("debu
5e60: 67 4d 73 67 22 29 3b 0a 20 20 40 20 69 66 28 6e  gMsg");.  @ if(n
5e70: 29 7b 6e 2e 74 65 78 74 43 6f 6e 74 65 6e 74 3d  ){n.textContent=
5e80: 6d 73 67 3b 7d 0a 20 20 40 20 7d 0a 20 20 69 66  msg;}.  @ }.  if
5e90: 28 20 6e 65 65 64 48 72 65 66 4a 73 20 26 26 20  ( needHrefJs && 
5ea0: 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69 6e 6b  g.perm.Hyperlink
5eb0: 20 29 7b 0a 20 20 20 20 40 20 2f 2a 20 68 72 65   ){.    @ /* hre
5ec0: 66 2e 6a 73 20 2a 2f 0a 20 20 20 20 63 67 69 5f  f.js */.    cgi_
5ed0: 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 62  append_content(b
5ee0: 75 69 6c 74 69 6e 5f 74 65 78 74 28 22 68 72 65  uiltin_text("hre
5ef0: 66 2e 6a 73 22 29 2c 2d 31 29 3b 0a 20 20 7d 0a  f.js"),-1);.  }.
5f00: 20 20 69 66 28 20 62 6c 6f 62 5f 73 69 7a 65 28    if( blob_size(
5f10: 26 62 6c 6f 62 4f 6e 4c 6f 61 64 29 3e 30 20 29  &blobOnLoad)>0 )
5f20: 7b 0a 20 20 20 20 40 20 77 69 6e 64 6f 77 2e 6f  {.    @ window.o
5f30: 6e 6c 6f 61 64 20 3d 20 66 75 6e 63 74 69 6f 6e  nload = function
5f40: 28 29 7b 0a 20 20 20 20 63 67 69 5f 61 70 70 65  (){.    cgi_appe
5f50: 6e 64 5f 63 6f 6e 74 65 6e 74 28 62 6c 6f 62 5f  nd_content(blob_
5f60: 62 75 66 66 65 72 28 26 62 6c 6f 62 4f 6e 4c 6f  buffer(&blobOnLo
5f70: 61 64 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26  ad), blob_size(&
5f80: 62 6c 6f 62 4f 6e 4c 6f 61 64 29 29 3b 0a 20 20  blobOnLoad));.  
5f90: 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f 6e    cgi_append_con
5fa0: 74 65 6e 74 28 22 5c 6e 7d 5c 6e 22 2c 20 2d 31  tent("\n}\n", -1
5fb0: 29 3b 0a 20 20 7d 0a 20 20 40 20 3c 2f 73 63 72  );.  }.  @ </scr
5fc0: 69 70 74 3e 0a 20 20 62 75 69 6c 74 69 6e 5f 66  ipt>.  builtin_f
5fd0: 75 6c 66 69 6c 6c 5f 6a 73 5f 72 65 71 75 65 73  ulfill_js_reques
5fe0: 74 73 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ts();.}../*.** I
5ff0: 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69  nvoke this routi
6000: 6e 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20  ne after all of 
6010: 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
6020: 61 20 77 65 62 70 61 67 65 20 68 61 73 20 62 65  a webpage has be
6030: 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2e  en.** generated.
6040: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
6050: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
6060: 6f 6e 63 65 20 66 6f 72 20 65 76 65 72 79 20 77  once for every w
6070: 65 62 70 61 67 65 2c 20 61 74 0a 2a 2a 20 6f 72  ebpage, at.** or
6080: 20 6e 65 61 72 20 74 68 65 20 65 6e 64 20 6f 66   near the end of
6090: 20 70 61 67 65 20 67 65 6e 65 72 61 74 69 6f 6e   page generation
60a0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
60b0: 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  does the followi
60c0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 50  ng:.**.**   *  P
60d0: 6f 70 75 6c 61 74 65 73 20 74 68 65 20 68 65 61  opulates the hea
60e0: 64 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 2c  der of the page,
60f0: 20 69 6e 63 6c 75 64 69 6e 67 20 73 65 74 74 69   including setti
6100: 6e 67 20 75 70 20 61 70 70 72 6f 70 72 69 61 74  ng up appropriat
6110: 65 0a 2a 2a 20 20 20 20 20 20 73 75 62 6d 65 6e  e.**      submen
6120: 75 20 65 6c 65 6d 65 6e 74 73 2e 20 20 54 68 65  u elements.  The
6130: 20 68 65 61 64 65 72 20 67 65 6e 65 72 61 74 69   header generati
6140: 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75  on is deferred u
6150: 6e 74 69 6c 20 74 68 69 73 20 70 6f 69 6e 74 0a  ntil this point.
6160: 2a 2a 20 20 20 20 20 20 73 6f 20 74 68 61 74 20  **      so that 
6170: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 6c 6c  we know that all
6180: 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65   style_submenu_e
6190: 6c 65 6d 65 6e 74 28 29 20 61 6e 64 20 73 69 6d  lement() and sim
61a0: 69 6c 61 72 20 68 61 76 65 0a 2a 2a 20 20 20 20  ilar have.**    
61b0: 20 20 62 65 65 6e 20 72 65 63 65 69 76 65 64 2e    been received.
61c0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 46 69 6e 61  .**.**   *  Fina
61d0: 6c 69 7a 65 73 20 74 68 65 20 70 61 67 65 20 63  lizes the page c
61e0: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  ontent..**.**   
61f0: 2a 20 20 41 70 70 65 6e 64 73 20 74 68 65 20 66  *  Appends the f
6200: 6f 6f 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ooter..**.** The
6210: 20 7a 50 61 67 65 54 79 70 65 20 61 72 67 75 6d   zPageType argum
6220: 65 6e 74 20 69 73 20 61 20 63 6c 61 73 73 20 6e  ent is a class n
6230: 61 6d 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  ame inserted in 
6240: 74 68 65 20 3c 64 69 76 3e 20 74 68 61 74 0a 2a  the <div> that.*
6250: 2a 20 73 75 72 72 6f 75 6e 64 73 20 74 68 65 20  * surrounds the 
6260: 70 61 67 65 20 63 6f 6e 74 65 6e 74 2e 20 20 43  page content.  C
6270: 53 53 20 63 61 6e 20 75 73 65 20 74 68 69 73 20  SS can use this 
6280: 74 6f 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  to have differen
6290: 74 20 73 74 79 6c 65 73 0a 2a 2a 20 61 63 63 6f  t styles.** acco
62a0: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67  rding to the pag
62b0: 65 20 74 79 70 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e type..*/.void 
62c0: 73 74 79 6c 65 5f 66 69 6e 69 73 68 5f 70 61 67  style_finish_pag
62d0: 65 28 63 6f 6e 73 74 20 63 68 61 72 2a 20 7a 50  e(const char* zP
62e0: 61 67 65 54 79 70 65 29 7b 0a 20 20 63 6f 6e 73  ageType){.  cons
62f0: 74 20 63 68 61 72 20 2a 7a 46 6f 6f 74 65 72 3b  t char *zFooter;
6300: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6310: 41 64 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e  Ad = 0;.  unsign
6320: 65 64 20 69 6e 74 20 6d 41 64 46 6c 61 67 73 20  ed int mAdFlags 
6330: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 21 68 65 61  = 0;..  if( !hea
6340: 64 65 72 48 61 73 42 65 65 6e 47 65 6e 65 72 61  derHasBeenGenera
6350: 74 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ted ) return;.. 
6360: 20 2f 2a 20 47 6f 20 62 61 63 6b 20 61 6e 64 20   /* Go back and 
6370: 70 75 74 20 74 68 65 20 73 75 62 6d 65 6e 75 20  put the submenu 
6380: 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
6390: 65 20 70 61 67 65 2e 20 20 57 65 20 64 65 6c 61  e page.  We dela
63a0: 79 20 74 68 65 0a 20 20 2a 2a 20 63 72 65 61 74  y the.  ** creat
63b0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 6d 65  ion of the subme
63c0: 6e 75 20 75 6e 74 69 6c 20 74 68 65 20 65 6e 64  nu until the end
63d0: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
63e0: 61 64 64 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a  add elements.  *
63f0: 2a 20 74 6f 20 74 68 65 20 73 75 62 6d 65 6e 75  * to the submenu
6400: 20 77 68 69 6c 65 20 67 65 6e 65 72 61 74 69 6e   while generatin
6410: 67 20 70 61 67 65 20 74 65 78 74 2e 0a 20 20 2a  g page text..  *
6420: 2f 0a 20 20 63 67 69 5f 64 65 73 74 69 6e 61 74  /.  cgi_destinat
6430: 69 6f 6e 28 43 47 49 5f 48 45 41 44 45 52 29 3b  ion(CGI_HEADER);
6440: 0a 20 20 69 66 28 20 73 75 62 6d 65 6e 75 45 6e  .  if( submenuEn
6450: 61 62 6c 65 20 26 26 20 6e 53 75 62 6d 65 6e 75  able && nSubmenu
6460: 2b 6e 53 75 62 6d 65 6e 75 43 74 72 6c 3e 30 20  +nSubmenuCtrl>0 
6470: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
6480: 20 20 69 66 28 20 6e 53 75 62 6d 65 6e 75 43 74    if( nSubmenuCt
6490: 72 6c 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 66  rl ){.      @ <f
64a0: 6f 72 6d 20 69 64 3d 27 66 30 31 27 20 6d 65 74  orm id='f01' met
64b0: 68 6f 64 3d 27 47 45 54 27 20 61 63 74 69 6f 6e  hod='GET' action
64c0: 3d 27 25 52 2f 25 73 28 67 2e 7a 50 61 74 68 29  ='%R/%s(g.zPath)
64d0: 27 3e 0a 20 20 20 20 20 20 40 20 3c 69 6e 70 75  '>.      @ <inpu
64e0: 74 20 74 79 70 65 3d 27 68 69 64 64 65 6e 27 20  t type='hidden' 
64f0: 6e 61 6d 65 3d 27 75 64 63 27 20 76 61 6c 75 65  name='udc' value
6500: 3d 27 31 27 3e 0a 20 20 20 20 20 20 63 67 69 5f  ='1'>.      cgi_
6510: 74 61 67 5f 71 75 65 72 79 5f 70 61 72 61 6d 65  tag_query_parame
6520: 74 65 72 28 22 75 64 63 22 29 3b 0a 20 20 20 20  ter("udc");.    
6530: 7d 0a 20 20 20 20 40 20 3c 64 69 76 20 63 6c 61  }.    @ <div cla
6540: 73 73 3d 22 73 75 62 6d 65 6e 75 22 3e 0a 20 20  ss="submenu">.  
6550: 20 20 69 66 28 20 6e 53 75 62 6d 65 6e 75 3e 30    if( nSubmenu>0
6560: 20 29 7b 0a 20 20 20 20 20 20 71 73 6f 72 74 28   ){.      qsort(
6570: 61 53 75 62 6d 65 6e 75 2c 20 6e 53 75 62 6d 65  aSubmenu, nSubme
6580: 6e 75 2c 20 73 69 7a 65 6f 66 28 61 53 75 62 6d  nu, sizeof(aSubm
6590: 65 6e 75 5b 30 5d 29 2c 20 73 75 62 6d 65 6e 75  enu[0]), submenu
65a0: 43 6f 6d 70 61 72 65 29 3b 0a 20 20 20 20 20 20  Compare);.      
65b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 6d  for(i=0; i<nSubm
65c0: 65 6e 75 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  enu; i++){.     
65d0: 20 20 20 73 74 72 75 63 74 20 53 75 62 6d 65 6e     struct Submen
65e0: 75 20 2a 70 20 3d 20 26 61 53 75 62 6d 65 6e 75  u *p = &aSubmenu
65f0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
6600: 20 70 2d 3e 7a 4c 69 6e 6b 3d 3d 30 20 29 7b 0a   p->zLink==0 ){.
6610: 20 20 20 20 20 20 20 20 20 20 40 20 3c 73 70 61            @ <spa
6620: 6e 20 63 6c 61 73 73 3d 22 6c 61 62 65 6c 22 3e  n class="label">
6630: 25 68 28 70 2d 3e 7a 4c 61 62 65 6c 29 3c 2f 73  %h(p->zLabel)</s
6640: 70 61 6e 3e 0a 20 20 20 20 20 20 20 20 7d 65 6c  pan>.        }el
6650: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 40 20  se{.          @ 
6660: 3c 61 20 63 6c 61 73 73 3d 22 6c 61 62 65 6c 22  <a class="label"
6670: 20 68 72 65 66 3d 22 25 68 28 70 2d 3e 7a 4c 69   href="%h(p->zLi
6680: 6e 6b 29 22 3e 25 68 28 70 2d 3e 7a 4c 61 62 65  nk)">%h(p->zLabe
6690: 6c 29 3c 2f 61 3e 0a 20 20 20 20 20 20 20 20 7d  l)</a>.        }
66a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
66b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
66c0: 75 62 6d 65 6e 75 43 74 72 6c 3b 20 69 2b 2b 29  ubmenuCtrl; i++)
66d0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
66e0: 61 72 20 2a 7a 51 50 4e 20 3d 20 61 53 75 62 6d  ar *zQPN = aSubm
66f0: 65 6e 75 43 74 72 6c 5b 69 5d 2e 7a 4e 61 6d 65  enuCtrl[i].zName
6700: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
6710: 61 72 20 2a 7a 44 69 73 61 62 6c 65 64 20 3d 20  ar *zDisabled = 
6720: 22 22 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  "";.      const 
6730: 63 68 61 72 20 2a 7a 58 74 72 61 43 6c 61 73 73  char *zXtraClass
6740: 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28   = "";.      if(
6750: 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 69 5d   aSubmenuCtrl[i]
6760: 2e 65 56 69 73 69 62 6c 65 20 26 20 53 54 59 4c  .eVisible & STYL
6770: 45 5f 44 49 53 41 42 4c 45 44 20 29 7b 0a 20 20  E_DISABLED ){.  
6780: 20 20 20 20 20 20 7a 44 69 73 61 62 6c 65 64 20        zDisabled 
6790: 3d 20 22 20 64 69 73 61 62 6c 65 64 22 3b 0a 20  = " disabled";. 
67a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
67b0: 51 50 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  QPN ){.        c
67c0: 67 69 5f 74 61 67 5f 71 75 65 72 79 5f 70 61 72  gi_tag_query_par
67d0: 61 6d 65 74 65 72 28 7a 51 50 4e 29 3b 0a 20 20  ameter(zQPN);.  
67e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 77 69 74      }.      swit
67f0: 63 68 28 20 61 53 75 62 6d 65 6e 75 43 74 72 6c  ch( aSubmenuCtrl
6800: 5b 69 5d 2e 65 54 79 70 65 20 29 7b 0a 20 20 20  [i].eType ){.   
6810: 20 20 20 20 20 63 61 73 65 20 46 46 5f 45 4e 54       case FF_ENT
6820: 52 59 3a 0a 20 20 20 20 20 20 20 20 20 20 40 20  RY:.          @ 
6830: 3c 73 70 61 6e 20 63 6c 61 73 73 3d 27 73 75 62  <span class='sub
6840: 6d 65 6e 75 63 74 72 6c 25 73 28 7a 58 74 72 61  menuctrl%s(zXtra
6850: 43 6c 61 73 73 29 27 3e 5c 0a 20 20 20 20 20 20  Class)'>\.      
6860: 20 20 20 20 40 20 26 6e 62 73 70 3b 25 68 28 61      @ &nbsp;%h(a
6870: 53 75 62 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 7a  SubmenuCtrl[i].z
6880: 4c 61 62 65 6c 29 5c 0a 20 20 20 20 20 20 20 20  Label)\.        
6890: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
68a0: 27 74 65 78 74 27 20 6e 61 6d 65 3d 27 25 73 28  'text' name='%s(
68b0: 7a 51 50 4e 29 27 20 76 61 6c 75 65 3d 27 25 68  zQPN)' value='%h
68c0: 28 50 44 28 7a 51 50 4e 2c 20 22 22 29 29 27 20  (PD(zQPN, ""))' 
68d0: 5c 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  \.          if( 
68e0: 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e  aSubmenuCtrl[i].
68f0: 69 53 69 7a 65 3c 30 20 29 7b 0a 20 20 20 20 20  iSize<0 ){.     
6900: 20 20 20 20 20 20 20 40 20 73 69 7a 65 3d 27 25         @ size='%
6910: 64 28 2d 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b  d(-aSubmenuCtrl[
6920: 69 5d 2e 69 53 69 7a 65 29 27 20 5c 0a 20 20 20  i].iSize)' \.   
6930: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
6940: 20 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 69 5d   aSubmenuCtrl[i]
6950: 2e 69 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  .iSize>0 ){.    
6960: 20 20 20 20 20 20 20 20 40 20 73 69 7a 65 3d 27          @ size='
6970: 25 64 28 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b  %d(aSubmenuCtrl[
6980: 69 5d 2e 69 53 69 7a 65 29 27 20 5c 0a 20 20 20  i].iSize)' \.   
6990: 20 20 20 20 20 20 20 20 20 40 20 6d 61 78 6c 65           @ maxle
69a0: 6e 67 74 68 3d 27 25 64 28 61 53 75 62 6d 65 6e  ngth='%d(aSubmen
69b0: 75 43 74 72 6c 5b 69 5d 2e 69 53 69 7a 65 29 27  uCtrl[i].iSize)'
69c0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   \.          }. 
69d0: 20 20 20 20 20 20 20 20 20 40 20 69 64 3d 27 73           @ id='s
69e0: 75 62 6d 65 6e 75 63 74 72 6c 2d 25 64 28 69 29  ubmenuctrl-%d(i)
69f0: 27 25 73 28 7a 44 69 73 61 62 6c 65 64 29 3e 3c  '%s(zDisabled)><
6a00: 2f 73 70 61 6e 3e 0a 20 20 20 20 20 20 20 20 20  /span>.         
6a10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6a20: 63 61 73 65 20 46 46 5f 4d 55 4c 54 49 3a 20 7b  case FF_MULTI: {
6a30: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a  .          int j
6a40: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
6a50: 74 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 50  t char *zVal = P
6a60: 28 7a 51 50 4e 29 3b 0a 20 20 20 20 20 20 20 20  (zQPN);.        
6a70: 20 20 69 66 28 20 7a 58 74 72 61 43 6c 61 73 73    if( zXtraClass
6a80: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [0] ){.         
6a90: 20 20 20 40 20 3c 73 70 61 6e 20 63 6c 61 73 73     @ <span class
6aa0: 3d 27 25 73 28 7a 58 74 72 61 43 6c 61 73 73 2b  ='%s(zXtraClass+
6ab0: 31 29 27 3e 0a 20 20 20 20 20 20 20 20 20 20 7d  1)'>.          }
6ac0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
6ad0: 53 75 62 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 7a  SubmenuCtrl[i].z
6ae0: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  Label ){.       
6af0: 20 20 20 20 20 40 20 26 6e 62 73 70 3b 25 68 28       @ &nbsp;%h(
6b00: 61 53 75 62 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e  aSubmenuCtrl[i].
6b10: 7a 4c 61 62 65 6c 29 5c 0a 20 20 20 20 20 20 20  zLabel)\.       
6b20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 40     }.          @
6b30: 20 3c 73 65 6c 65 63 74 20 63 6c 61 73 73 3d 27   <select class='
6b40: 73 75 62 6d 65 6e 75 63 74 72 6c 27 20 73 69 7a  submenuctrl' siz
6b50: 65 3d 27 31 27 20 6e 61 6d 65 3d 27 25 73 28 7a  e='1' name='%s(z
6b60: 51 50 4e 29 27 20 5c 0a 20 20 20 20 20 20 20 20  QPN)' \.        
6b70: 20 20 40 20 69 64 3d 27 73 75 62 6d 65 6e 75 63    @ id='submenuc
6b80: 74 72 6c 2d 25 64 28 69 29 27 25 73 28 7a 44 69  trl-%d(i)'%s(zDi
6b90: 73 61 62 6c 65 64 29 3e 0a 20 20 20 20 20 20 20  sabled)>.       
6ba0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 61 53     for(j=0; j<aS
6bb0: 75 62 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 69 53  ubmenuCtrl[i].iS
6bc0: 69 7a 65 2a 32 3b 20 6a 2b 3d 32 29 7b 0a 20 20  ize*2; j+=2){.  
6bd0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
6be0: 63 68 61 72 20 2a 7a 51 50 56 20 3d 20 61 53 75  char *zQPV = aSu
6bf0: 62 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 61 7a 43  bmenuCtrl[i].azC
6c00: 68 6f 69 63 65 5b 6a 5d 3b 0a 20 20 20 20 20 20  hoice[j];.      
6c10: 20 20 20 20 20 20 40 20 3c 6f 70 74 69 6f 6e 20        @ <option 
6c20: 76 61 6c 75 65 3d 27 25 68 28 7a 51 50 56 29 27  value='%h(zQPV)'
6c30: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  \.            if
6c40: 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28  ( fossil_strcmp(
6c50: 7a 56 61 6c 2c 20 7a 51 50 56 29 3d 3d 30 20 29  zVal, zQPV)==0 )
6c60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6c70: 40 20 20 73 65 6c 65 63 74 65 64 5c 0a 20 20 20  @  selected\.   
6c80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6c90: 20 20 20 20 20 20 20 40 20 3e 25 68 28 61 53 75         @ >%h(aSu
6ca0: 62 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 61 7a 43  bmenuCtrl[i].azC
6cb0: 68 6f 69 63 65 5b 6a 2b 31 5d 29 3c 2f 6f 70 74  hoice[j+1])</opt
6cc0: 69 6f 6e 3e 0a 20 20 20 20 20 20 20 20 20 20 7d  ion>.          }
6cd0: 0a 20 20 20 20 20 20 20 20 20 20 40 20 3c 2f 73  .          @ </s
6ce0: 65 6c 65 63 74 3e 0a 20 20 20 20 20 20 20 20 20  elect>.         
6cf0: 20 69 66 28 20 7a 58 74 72 61 43 6c 61 73 73 5b   if( zXtraClass[
6d00: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0] ){.          
6d10: 20 20 40 20 3c 2f 73 70 61 6e 3e 0a 20 20 20 20    @ </span>.    
6d20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6d30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
6d40: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
6d50: 46 46 5f 42 49 4e 41 52 59 3a 20 7b 0a 20 20 20  FF_BINARY: {.   
6d60: 20 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75         int isTru
6d70: 65 20 3d 20 50 42 28 7a 51 50 4e 29 3b 0a 20 20  e = PB(zQPN);.  
6d80: 20 20 20 20 20 20 20 20 40 20 3c 73 65 6c 65 63          @ <selec
6d90: 74 20 63 6c 61 73 73 3d 27 73 75 62 6d 65 6e 75  t class='submenu
6da0: 63 74 72 6c 25 73 28 7a 58 74 72 61 43 6c 61 73  ctrl%s(zXtraClas
6db0: 73 29 27 20 73 69 7a 65 3d 27 31 27 20 5c 0a 20  s)' size='1' \. 
6dc0: 20 20 20 20 20 20 20 20 20 40 20 6e 61 6d 65 3d           @ name=
6dd0: 27 25 73 28 7a 51 50 4e 29 27 20 69 64 3d 27 73  '%s(zQPN)' id='s
6de0: 75 62 6d 65 6e 75 63 74 72 6c 2d 25 64 28 69 29  ubmenuctrl-%d(i)
6df0: 27 25 73 28 7a 44 69 73 61 62 6c 65 64 29 3e 0a  '%s(zDisabled)>.
6e00: 20 20 20 20 20 20 20 20 20 20 40 20 3c 6f 70 74            @ <opt
6e10: 69 6f 6e 20 76 61 6c 75 65 3d 27 31 27 5c 0a 20  ion value='1'\. 
6e20: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 54           if( isT
6e30: 72 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rue ){.         
6e40: 20 20 20 40 20 20 73 65 6c 65 63 74 65 64 5c 0a     @  selected\.
6e50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6e60: 20 20 20 20 20 20 40 20 3e 25 68 28 61 53 75 62        @ >%h(aSub
6e70: 6d 65 6e 75 43 74 72 6c 5b 69 5d 2e 7a 4c 61 62  menuCtrl[i].zLab
6e80: 65 6c 29 3c 2f 6f 70 74 69 6f 6e 3e 0a 20 20 20  el)</option>.   
6e90: 20 20 20 20 20 20 20 40 20 3c 6f 70 74 69 6f 6e         @ <option
6ea0: 20 76 61 6c 75 65 3d 27 30 27 5c 0a 20 20 20 20   value='0'\.    
6eb0: 20 20 20 20 20 20 69 66 28 20 21 69 73 54 72 75        if( !isTru
6ec0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
6ed0: 20 40 20 20 73 65 6c 65 63 74 65 64 5c 0a 20 20   @  selected\.  
6ee0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6ef0: 20 20 20 20 40 20 3e 25 68 28 61 53 75 62 6d 65      @ >%h(aSubme
6f00: 6e 75 43 74 72 6c 5b 69 5d 2e 7a 46 61 6c 73 65  nuCtrl[i].zFalse
6f10: 29 3c 2f 6f 70 74 69 6f 6e 3e 0a 20 20 20 20 20  )</option>.     
6f20: 20 20 20 20 20 40 20 3c 2f 73 65 6c 65 63 74 3e       @ </select>
6f30: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
6f40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6f50: 20 20 20 20 63 61 73 65 20 46 46 5f 43 48 45 43      case FF_CHEC
6f60: 4b 42 4f 58 3a 20 7b 0a 20 20 20 20 20 20 20 20  KBOX: {.        
6f70: 20 20 40 20 3c 6c 61 62 65 6c 20 63 6c 61 73 73    @ <label class
6f80: 3d 27 73 75 62 6d 65 6e 75 63 74 72 6c 20 73 75  ='submenuctrl su
6f90: 62 6d 65 6e 75 63 6b 62 6f 78 25 73 28 7a 58 74  bmenuckbox%s(zXt
6fa0: 72 61 43 6c 61 73 73 29 27 3e 5c 0a 20 20 20 20  raClass)'>\.    
6fb0: 20 20 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74        @ <input t
6fc0: 79 70 65 3d 27 63 68 65 63 6b 62 6f 78 27 20 6e  ype='checkbox' n
6fd0: 61 6d 65 3d 27 25 73 28 7a 51 50 4e 29 27 20 69  ame='%s(zQPN)' i
6fe0: 64 3d 27 73 75 62 6d 65 6e 75 63 74 72 6c 2d 25  d='submenuctrl-%
6ff0: 64 28 69 29 27 20 5c 0a 20 20 20 20 20 20 20 20  d(i)' \.        
7000: 20 20 69 66 28 20 50 42 28 7a 51 50 4e 29 20 29    if( PB(zQPN) )
7010: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 40 20  {.            @ 
7020: 63 68 65 63 6b 65 64 20 5c 0a 20 20 20 20 20 20  checked \.      
7030: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7040: 69 66 28 20 61 53 75 62 6d 65 6e 75 43 74 72 6c  if( aSubmenuCtrl
7050: 5b 69 5d 2e 7a 4a 53 20 29 7b 0a 20 20 20 20 20  [i].zJS ){.     
7060: 20 20 20 20 20 20 20 40 20 64 61 74 61 2d 63 74         @ data-ct
7070: 72 6c 3d 27 25 73 28 61 53 75 62 6d 65 6e 75 43  rl='%s(aSubmenuC
7080: 74 72 6c 5b 69 5d 2e 7a 4a 53 29 27 25 73 28 7a  trl[i].zJS)'%s(z
7090: 44 69 73 61 62 6c 65 64 29 3e 5c 0a 20 20 20 20  Disabled)>\.    
70a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
70b0: 20 20 20 20 20 20 20 20 20 40 20 25 73 28 7a 44           @ %s(zD
70c0: 69 73 61 62 6c 65 64 29 3e 5c 0a 20 20 20 20 20  isabled)>\.     
70d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
70e0: 20 40 20 25 68 28 61 53 75 62 6d 65 6e 75 43 74   @ %h(aSubmenuCt
70f0: 72 6c 5b 69 5d 2e 7a 4c 61 62 65 6c 29 3c 2f 6c  rl[i].zLabel)</l
7100: 61 62 65 6c 3e 0a 20 20 20 20 20 20 20 20 20 20  abel>.          
7110: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
7120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7130: 20 20 20 40 20 3c 2f 64 69 76 3e 0a 20 20 20 20     @ </div>.    
7140: 69 66 28 20 6e 53 75 62 6d 65 6e 75 43 74 72 6c  if( nSubmenuCtrl
7150: 20 29 7b 0a 20 20 20 20 20 20 63 67 69 5f 71 75   ){.      cgi_qu
7160: 65 72 79 5f 70 61 72 61 6d 65 74 65 72 73 5f 74  ery_parameters_t
7170: 6f 5f 68 69 64 64 65 6e 28 29 3b 0a 20 20 20 20  o_hidden();.    
7180: 20 20 63 67 69 5f 74 61 67 5f 71 75 65 72 79 5f    cgi_tag_query_
7190: 70 61 72 61 6d 65 74 65 72 28 30 29 3b 0a 20 20  parameter(0);.  
71a0: 20 20 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20      @ </form>.  
71b0: 20 20 20 20 62 75 69 6c 74 69 6e 5f 72 65 71 75      builtin_requ
71c0: 65 73 74 5f 6a 73 28 22 6d 65 6e 75 2e 6a 73 22  est_js("menu.js"
71d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
71e0: 7a 41 64 20 3d 20 73 74 79 6c 65 5f 61 64 75 6e  zAd = style_adun
71f0: 69 74 5f 74 65 78 74 28 26 6d 41 64 46 6c 61 67  it_text(&mAdFlag
7200: 73 29 3b 0a 20 20 69 66 28 20 28 6d 41 64 46 6c  s);.  if( (mAdFl
7210: 61 67 73 20 26 20 41 44 55 4e 49 54 5f 52 49 47  ags & ADUNIT_RIG
7220: 48 54 5f 4f 4b 29 21 3d 30 20 20 29 7b 0a 20 20  HT_OK)!=0  ){.  
7230: 20 20 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22    @ <div class="
7240: 63 6f 6e 74 65 6e 74 20 61 64 75 6e 69 74 5f 72  content adunit_r
7250: 69 67 68 74 5f 63 6f 6e 74 61 69 6e 65 72 22 3e  ight_container">
7260: 0a 20 20 20 20 40 20 3c 64 69 76 20 63 6c 61 73  .    @ <div clas
7270: 73 3d 22 61 64 75 6e 69 74 5f 72 69 67 68 74 22  s="adunit_right"
7280: 3e 0a 20 20 20 20 63 67 69 5f 61 70 70 65 6e 64  >.    cgi_append
7290: 5f 63 6f 6e 74 65 6e 74 28 7a 41 64 2c 20 2d 31  _content(zAd, -1
72a0: 29 3b 0a 20 20 20 20 40 20 3c 2f 64 69 76 3e 0a  );.    @ </div>.
72b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 41 64 20    }else if( zAd 
72c0: 29 7b 0a 20 20 20 20 40 20 3c 64 69 76 20 63 6c  ){.    @ <div cl
72d0: 61 73 73 3d 22 61 64 75 6e 69 74 5f 62 61 6e 6e  ass="adunit_bann
72e0: 65 72 22 3e 0a 20 20 20 20 63 67 69 5f 61 70 70  er">.    cgi_app
72f0: 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 7a 41 64 2c  end_content(zAd,
7300: 20 2d 31 29 3b 0a 20 20 20 20 40 20 3c 2f 64 69   -1);.    @ </di
7310: 76 3e 0a 20 20 7d 0a 0a 20 20 40 20 3c 64 69 76  v>.  }..  @ <div
7320: 20 63 6c 61 73 73 3d 22 63 6f 6e 74 65 6e 74 20   class="content 
7330: 25 73 28 7a 50 61 67 65 54 79 70 65 29 22 3e 3c  %s(zPageType)"><
7340: 73 70 61 6e 20 69 64 3d 22 64 65 62 75 67 4d 73  span id="debugMs
7350: 67 22 3e 3c 2f 73 70 61 6e 3e 0a 20 20 63 67 69  g"></span>.  cgi
7360: 5f 64 65 73 74 69 6e 61 74 69 6f 6e 28 43 47 49  _destination(CGI
7370: 5f 42 4f 44 59 29 3b 0a 0a 20 20 69 66 28 20 73  _BODY);..  if( s
7380: 69 64 65 62 6f 78 55 73 65 64 20 29 7b 0a 20 20  ideboxUsed ){.  
7390: 20 20 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22    @ <div class="
73a0: 65 6e 64 43 6f 6e 74 65 6e 74 22 3e 3c 2f 64 69  endContent"></di
73b0: 76 3e 0a 20 20 7d 0a 20 20 40 20 3c 2f 64 69 76  v>.  }.  @ </div
73c0: 3e 0a 0a 20 20 2f 2a 20 50 75 74 20 74 68 65 20  >..  /* Put the 
73d0: 66 6f 6f 74 65 72 20 61 74 20 74 68 65 20 62 6f  footer at the bo
73e0: 74 74 6f 6d 20 6f 66 20 74 68 65 20 70 61 67 65  ttom of the page
73f0: 2e 20 2a 2f 0a 20 20 7a 46 6f 6f 74 65 72 20 3d  . */.  zFooter =
7400: 20 73 6b 69 6e 5f 67 65 74 28 22 66 6f 6f 74 65   skin_get("foote
7410: 72 22 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  r");.  if( sqlit
7420: 65 33 5f 73 74 72 6c 69 6b 65 28 22 25 3c 2f 62  e3_strlike("%</b
7430: 6f 64 79 3e 25 22 2c 20 7a 46 6f 6f 74 65 72 2c  ody>%", zFooter,
7440: 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74   0)==0 ){.    st
7450: 79 6c 65 5f 6c 6f 61 64 5f 61 6c 6c 5f 6a 73 5f  yle_load_all_js_
7460: 66 69 6c 65 73 28 29 3b 0a 20 20 7d 0a 20 20 69  files();.  }.  i
7470: 66 28 20 67 2e 74 68 54 72 61 63 65 20 29 20 54  f( g.thTrace ) T
7480: 68 5f 54 72 61 63 65 28 22 42 45 47 49 4e 5f 46  h_Trace("BEGIN_F
7490: 4f 4f 54 45 52 3c 62 72 20 2f 3e 5c 6e 22 2c 20  OOTER<br />\n", 
74a0: 2d 31 29 3b 0a 20 20 54 68 5f 52 65 6e 64 65 72  -1);.  Th_Render
74b0: 28 7a 46 6f 6f 74 65 72 29 3b 0a 20 20 69 66 28  (zFooter);.  if(
74c0: 20 67 2e 74 68 54 72 61 63 65 20 29 20 54 68 5f   g.thTrace ) Th_
74d0: 54 72 61 63 65 28 22 45 4e 44 5f 46 4f 4f 54 45  Trace("END_FOOTE
74e0: 52 3c 62 72 20 2f 3e 5c 6e 22 2c 20 2d 31 29 3b  R<br />\n", -1);
74f0: 0a 0a 20 20 2f 2a 20 52 65 6e 64 65 72 20 74 72  ..  /* Render tr
7500: 61 63 65 20 6c 6f 67 20 69 66 20 54 48 31 20 74  ace log if TH1 t
7510: 72 61 63 69 6e 67 20 69 73 20 65 6e 61 62 6c 65  racing is enable
7520: 64 2e 20 2a 2f 0a 20 20 69 66 28 20 67 2e 74 68  d. */.  if( g.th
7530: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 63 67 69  Trace ){.    cgi
7540: 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28  _append_content(
7550: 22 3c 73 70 61 6e 20 63 6c 61 73 73 3d 5c 22 74  "<span class=\"t
7560: 68 54 72 61 63 65 5c 22 3e 3c 68 72 20 2f 3e 5c  hTrace\"><hr />\
7570: 6e 22 2c 20 2d 31 29 3b 0a 20 20 20 20 63 67 69  n", -1);.    cgi
7580: 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74 28  _append_content(
7590: 62 6c 6f 62 5f 73 74 72 28 26 67 2e 74 68 4c 6f  blob_str(&g.thLo
75a0: 67 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 67  g), blob_size(&g
75b0: 2e 74 68 4c 6f 67 29 29 3b 0a 20 20 20 20 63 67  .thLog));.    cg
75c0: 69 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 6e 74  i_append_content
75d0: 28 22 3c 2f 73 70 61 6e 3e 5c 6e 22 2c 20 2d 31  ("</span>\n", -1
75e0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  );.  }..  /* Add
75f0: 20 64 6f 63 75 6d 65 6e 74 20 65 6e 64 20 6d 61   document end ma
7600: 72 6b 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74  rk if it was not
7610: 20 69 6e 20 74 68 65 20 66 6f 6f 74 65 72 20 2a   in the footer *
7620: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
7630: 73 74 72 6c 69 6b 65 28 22 25 3c 2f 62 6f 64 79  strlike("%</body
7640: 3e 25 22 2c 20 7a 46 6f 6f 74 65 72 2c 20 30 29  >%", zFooter, 0)
7650: 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 79 6c 65  !=0 ){.    style
7660: 5f 6c 6f 61 64 5f 61 6c 6c 5f 6a 73 5f 66 69 6c  _load_all_js_fil
7670: 65 73 28 29 3b 0a 20 20 20 20 40 20 3c 2f 62 6f  es();.    @ </bo
7680: 64 79 3e 0a 20 20 20 20 40 20 3c 2f 68 74 6d 6c  dy>.    @ </html
7690: 3e 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  >.  }.}../*.** B
76a0: 65 67 69 6e 20 61 20 73 69 64 65 2d 62 6f 78 20  egin a side-box 
76b0: 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
76c0: 64 20 73 69 64 65 20 6f 66 20 61 20 70 61 67 65  d side of a page
76d0: 2e 20 20 54 68 65 20 74 69 74 6c 65 20 61 6e 64  .  The title and
76e0: 0a 2a 2a 20 74 68 65 20 77 69 64 74 68 20 6f 66  .** the width of
76f0: 20 74 68 65 20 62 6f 78 20 61 72 65 20 67 69 76   the box are giv
7700: 65 6e 20 61 73 20 61 72 67 75 6d 65 6e 74 73 2e  en as arguments.
7710: 20 20 54 68 65 20 77 69 64 74 68 20 69 73 20 75    The width is u
7720: 73 75 61 6c 6c 79 0a 2a 2a 20 61 20 70 65 72 63  sually.** a perc
7730: 65 6e 74 61 67 65 20 6f 66 20 74 6f 74 61 6c 20  entage of total 
7740: 73 63 72 65 65 6e 20 77 69 64 74 68 2e 0a 2a 2f  screen width..*/
7750: 0a 76 6f 69 64 20 73 74 79 6c 65 5f 73 69 64 65  .void style_side
7760: 62 6f 78 5f 62 65 67 69 6e 28 63 6f 6e 73 74 20  box_begin(const 
7770: 63 68 61 72 20 2a 7a 54 69 74 6c 65 2c 20 63 6f  char *zTitle, co
7780: 6e 73 74 20 63 68 61 72 20 2a 7a 57 69 64 74 68  nst char *zWidth
7790: 29 7b 0a 20 20 73 69 64 65 62 6f 78 55 73 65 64  ){.  sideboxUsed
77a0: 20 3d 20 31 3b 0a 20 20 40 20 3c 64 69 76 20 63   = 1;.  @ <div c
77b0: 6c 61 73 73 3d 22 73 69 64 65 62 6f 78 22 20 73  lass="sidebox" s
77c0: 74 79 6c 65 3d 22 77 69 64 74 68 3a 25 73 28 7a  tyle="width:%s(z
77d0: 57 69 64 74 68 29 22 3e 0a 20 20 40 20 3c 64 69  Width)">.  @ <di
77e0: 76 20 63 6c 61 73 73 3d 22 73 69 64 65 62 6f 78  v class="sidebox
77f0: 54 69 74 6c 65 22 3e 25 68 28 7a 54 69 74 6c 65  Title">%h(zTitle
7800: 29 3c 2f 64 69 76 3e 0a 7d 0a 0a 2f 2a 20 45 6e  )</div>.}../* En
7810: 64 20 74 68 65 20 73 69 64 65 2d 62 6f 78 0a 2a  d the side-box.*
7820: 2f 0a 76 6f 69 64 20 73 74 79 6c 65 5f 73 69 64  /.void style_sid
7830: 65 62 6f 78 5f 65 6e 64 28 76 6f 69 64 29 7b 0a  ebox_end(void){.
7840: 20 20 40 20 3c 2f 64 69 76 3e 0a 7d 0a 0a 2f 2a    @ </div>.}../*
7850: 0a 2a 2a 20 53 65 61 72 63 68 20 73 74 72 69 6e  .** Search strin
7860: 67 20 7a 43 73 73 20 66 6f 72 20 7a 53 65 6c 65  g zCss for zSele
7870: 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ctor..**.** Retu
7880: 72 6e 20 74 72 75 65 20 69 66 20 66 6f 75 6e 64  rn true if found
7890: 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
78a0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 0a 2a 2f 0a  if not found.*/.
78b0: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 74 61  static int conta
78c0: 69 6e 73 53 65 6c 65 63 74 6f 72 28 63 6f 6e 73  insSelector(cons
78d0: 74 20 63 68 61 72 20 2a 7a 43 73 73 2c 20 63 6f  t char *zCss, co
78e0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 6c 65 63  nst char *zSelec
78f0: 74 6f 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  tor){.  const ch
7900: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a  ar *z;.  int n;.
7910: 20 20 69 6e 74 20 73 65 6c 65 63 74 6f 72 4c 65    int selectorLe
7920: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
7930: 7a 53 65 6c 65 63 74 6f 72 29 3b 0a 0a 20 20 66  zSelector);..  f
7940: 6f 72 28 7a 3d 7a 43 73 73 3b 20 2a 7a 3b 20 7a  or(z=zCss; *z; z
7950: 2b 3d 73 65 6c 65 63 74 6f 72 4c 65 6e 29 7b 0a  +=selectorLen){.
7960: 20 20 20 20 7a 20 3d 20 73 74 72 73 74 72 28 7a      z = strstr(z
7970: 2c 20 7a 53 65 6c 65 63 74 6f 72 29 3b 0a 20 20  , zSelector);.  
7980: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
7990: 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 7a  urn 0;.    if( z
79a0: 21 3d 7a 43 73 73 20 29 7b 0a 20 20 20 20 20 20  !=zCss ){.      
79b0: 66 6f 72 28 20 6e 3d 2d 31 3b 20 7a 2b 6e 21 3d  for( n=-1; z+n!=
79c0: 7a 43 73 73 20 26 26 20 66 6f 73 73 69 6c 5f 69  zCss && fossil_i
79d0: 73 73 70 61 63 65 28 7a 5b 6e 5d 29 3b 20 6e 2d  sspace(z[n]); n-
79e0: 2d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 2b  -);.      if( z+
79f0: 6e 21 3d 7a 43 73 73 20 26 26 20 7a 5b 6e 5d 21  n!=zCss && z[n]!
7a00: 3d 27 2c 27 20 26 26 20 7a 5b 6e 5d 21 3d 20 27  =',' && z[n]!= '
7a10: 7d 27 20 26 26 20 7a 5b 6e 5d 21 3d 27 2f 27 20  }' && z[n]!='/' 
7a20: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7a30: 7d 0a 20 20 20 20 66 6f 72 28 20 6e 3d 73 65 6c  }.    for( n=sel
7a40: 65 63 74 6f 72 4c 65 6e 3b 20 7a 5b 6e 5d 20 26  ectorLen; z[n] &
7a50: 26 20 66 6f 73 73 69 6c 5f 69 73 73 70 61 63 65  & fossil_isspace
7a60: 28 7a 5b 6e 5d 29 3b 20 6e 2b 2b 20 29 3b 0a 20  (z[n]); n++ );. 
7a70: 20 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d 27 2c 27     if( z[n]==','
7a80: 20 7c 7c 20 7a 5b 6e 5d 3d 3d 27 7b 27 20 7c 7c   || z[n]=='{' ||
7a90: 20 7a 5b 6e 5d 3d 3d 27 2f 27 20 29 20 72 65 74   z[n]=='/' ) ret
7aa0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
7ab0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
7ac0: 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 63 6f  COMMAND: test-co
7ad0: 6e 74 61 69 6e 73 2d 73 65 6c 65 63 74 6f 72 0a  ntains-selector.
7ae0: 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f  **.** Usage: %fo
7af0: 73 73 69 6c 20 74 65 73 74 2d 63 6f 6e 74 61 69  ssil test-contai
7b00: 6e 73 2d 73 65 6c 65 63 74 6f 72 20 46 49 4c 45  ns-selector FILE
7b10: 4e 41 4d 45 20 53 45 4c 45 43 54 4f 52 0a 2a 2a  NAME SELECTOR.**
7b20: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66  .** Determine if
7b30: 20 74 68 65 20 43 53 53 20 73 74 79 6c 65 73 68   the CSS stylesh
7b40: 65 65 74 20 46 49 4c 45 4e 41 4d 45 20 63 6f 6e  eet FILENAME con
7b50: 74 61 69 6e 73 20 53 45 4c 45 43 54 4f 52 2e 0a  tains SELECTOR..
7b60: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
7b70: 61 73 20 6f 66 20 32 30 32 30 2d 30 35 2d 32 38  as of 2020-05-28
7b80: 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20 72 75  , the default ru
7b90: 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73 20 65  les are always e
7ba0: 6d 69 74 74 65 64 2c 0a 2a 2a 20 73 6f 20 74 68  mitted,.** so th
7bb0: 65 20 63 6f 6e 74 61 69 6e 73 53 65 6c 65 63 74  e containsSelect
7bc0: 6f 72 28 29 20 6c 6f 67 69 63 20 69 73 20 6e 6f  or() logic is no
7bd0: 20 6c 6f 6e 67 65 72 20 61 70 70 6c 69 65 64 20   longer applied 
7be0: 77 68 65 6e 20 65 6d 69 74 74 69 6e 67 0a 2a 2a  when emitting.**
7bf0: 20 73 74 79 6c 65 2e 63 73 73 2e 20 49 74 20 69   style.css. It i
7c00: 73 20 75 6e 63 6c 65 61 72 20 77 68 65 74 68 65  s unclear whethe
7c10: 72 20 74 68 69 73 20 74 65 73 74 20 63 6f 6d 6d  r this test comm
7c20: 61 6e 64 20 69 73 20 6e 6f 77 20 6f 62 73 6f 6c  and is now obsol
7c30: 65 74 65 0a 2a 2a 20 6f 72 20 77 68 65 74 68 65  ete.** or whethe
7c40: 72 20 69 74 20 6d 61 79 20 73 74 69 6c 6c 20 73  r it may still s
7c50: 65 72 76 65 20 61 20 70 75 72 70 6f 73 65 2e 0a  erve a purpose..
7c60: 2a 2f 0a 76 6f 69 64 20 63 6f 6e 74 61 69 6e 73  */.void contains
7c70: 5f 73 65 6c 65 63 74 6f 72 5f 63 6d 64 28 76 6f  _selector_cmd(vo
7c80: 69 64 29 7b 0a 20 20 69 6e 74 20 66 6f 75 6e 64  id){.  int found
7c90: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 6c 65 63  ;.  char *zSelec
7ca0: 74 6f 72 3b 0a 20 20 42 6c 6f 62 20 63 73 73 3b  tor;.  Blob css;
7cb0: 0a 20 20 69 66 28 20 67 2e 61 72 67 63 21 3d 34  .  if( g.argc!=4
7cc0: 20 29 20 75 73 61 67 65 28 22 46 49 4c 45 4e 41   ) usage("FILENA
7cd0: 4d 45 20 53 45 4c 45 43 54 4f 52 22 29 3b 0a 20  ME SELECTOR");. 
7ce0: 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f   blob_read_from_
7cf0: 66 69 6c 65 28 26 63 73 73 2c 20 67 2e 61 72 67  file(&css, g.arg
7d00: 76 5b 32 5d 2c 20 45 78 74 46 49 4c 45 29 3b 0a  v[2], ExtFILE);.
7d10: 20 20 7a 53 65 6c 65 63 74 6f 72 20 3d 20 67 2e    zSelector = g.
7d20: 61 72 67 76 5b 33 5d 3b 0a 20 20 66 6f 75 6e 64  argv[3];.  found
7d30: 20 3d 20 63 6f 6e 74 61 69 6e 73 53 65 6c 65 63   = containsSelec
7d40: 74 6f 72 28 62 6c 6f 62 5f 73 74 72 28 26 63 73  tor(blob_str(&cs
7d50: 73 29 2c 20 7a 53 65 6c 65 63 74 6f 72 29 3b 0a  s), zSelector);.
7d60: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
7d70: 25 73 20 25 73 5c 6e 22 2c 20 7a 53 65 6c 65 63  %s %s\n", zSelec
7d80: 74 6f 72 2c 20 66 6f 75 6e 64 20 3f 20 22 66 6f  tor, found ? "fo
7d90: 75 6e 64 22 20 3a 20 22 6e 6f 74 20 66 6f 75 6e  und" : "not foun
7da0: 64 22 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65  d");.  blob_rese
7db0: 74 28 26 63 73 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  t(&css);.}../*.*
7dc0: 2a 20 57 45 42 50 41 47 45 3a 20 73 63 72 69 70  * WEBPAGE: scrip
7dd0: 74 2e 6a 73 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  t.js.**.** Retur
7de0: 6e 20 74 68 65 20 22 4a 61 76 61 73 63 72 69 70  n the "Javascrip
7df0: 74 22 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74  t" content for t
7e00: 68 65 20 63 75 72 72 65 6e 74 20 73 6b 69 6e 20  he current skin 
7e10: 28 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79  (if there is any
7e20: 29 0a 2a 2f 0a 76 6f 69 64 20 70 61 67 65 5f 73  ).*/.void page_s
7e30: 63 72 69 70 74 5f 6a 73 28 76 6f 69 64 29 7b 0a  cript_js(void){.
7e40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
7e50: 63 72 69 70 74 20 3d 20 73 6b 69 6e 5f 67 65 74  cript = skin_get
7e60: 28 22 6a 73 22 29 3b 0a 20 20 69 66 28 20 50 28  ("js");.  if( P(
7e70: 22 74 65 73 74 22 29 20 29 7b 0a 20 20 20 20 2f  "test") ){.    /
7e80: 2a 20 52 65 6e 64 65 72 20 74 68 65 20 73 63 72  * Render the scr
7e90: 69 70 74 20 61 73 20 70 6c 61 69 6e 2d 74 65 78  ipt as plain-tex
7ea0: 74 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  t for testing pu
7eb0: 72 70 6f 73 65 73 2c 20 69 66 20 74 68 65 20 22  rposes, if the "
7ec0: 74 65 73 74 22 0a 20 20 20 20 2a 2a 20 71 75 65  test".    ** que
7ed0: 72 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ry parameter is 
7ee0: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 20 20 63  present */.    c
7ef0: 67 69 5f 73 65 74 5f 63 6f 6e 74 65 6e 74 5f 74  gi_set_content_t
7f00: 79 70 65 28 22 74 65 78 74 2f 70 6c 61 69 6e 22  ype("text/plain"
7f10: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7f20: 2f 2a 20 44 65 66 61 75 6c 74 20 62 65 68 61 76  /* Default behav
7f30: 69 6f 72 20 69 73 20 74 6f 20 72 65 74 75 72 6e  ior is to return
7f40: 20 6a 61 76 61 73 63 72 69 70 74 20 2a 2f 0a 20   javascript */. 
7f50: 20 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e 74 65     cgi_set_conte
7f60: 6e 74 5f 74 79 70 65 28 22 61 70 70 6c 69 63 61  nt_type("applica
7f70: 74 69 6f 6e 2f 6a 61 76 61 73 63 72 69 70 74 22  tion/javascript"
7f80: 29 3b 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f 69  );.  }.  style_i
7f90: 6e 69 74 5f 74 68 31 5f 76 61 72 73 28 30 29 3b  nit_th1_vars(0);
7fa0: 0a 20 20 54 68 5f 52 65 6e 64 65 72 28 7a 53 63  .  Th_Render(zSc
7fb0: 72 69 70 74 3f 7a 53 63 72 69 70 74 3a 22 22 29  ript?zScript:"")
7fc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 6f 6e  ;.}../*.** If on
7fd0: 65 20 6f 66 20 74 68 65 20 22 6e 61 6d 65 22 20  e of the "name" 
7fe0: 6f 72 20 22 70 61 67 65 22 20 55 52 4c 20 70 61  or "page" URL pa
7ff0: 72 61 6d 65 74 65 72 73 20 28 69 6e 20 74 68 61  rameters (in tha
8000: 74 20 6f 72 64 65 72 29 0a 2a 2a 20 69 73 20 73  t order).** is s
8010: 65 74 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  et then this fun
8020: 63 74 69 6f 6e 20 6c 6f 6f 6b 73 20 66 6f 72 20  ction looks for 
8030: 70 61 67 65 2f 70 61 67 65 20 67 72 6f 75 70 2d  page/page group-
8040: 73 70 65 63 69 66 69 63 0a 2a 2a 20 43 53 53 20  specific.** CSS 
8050: 61 6e 64 20 28 69 66 20 66 6f 75 6e 64 29 20 61  and (if found) a
8060: 70 70 65 6e 64 73 20 69 74 20 74 6f 20 70 4f 75  ppends it to pOu
8070: 74 2c 20 65 6c 73 65 20 69 74 20 69 73 20 61 20  t, else it is a 
8080: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
8090: 20 76 6f 69 64 20 70 61 67 65 5f 73 74 79 6c 65   void page_style
80a0: 5f 63 73 73 5f 61 70 70 65 6e 64 5f 70 61 67 65  _css_append_page
80b0: 5f 73 74 79 6c 65 28 42 6c 6f 62 20 2a 70 4f 75  _style(Blob *pOu
80c0: 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
80d0: 20 2a 7a 50 61 67 65 20 3d 20 50 44 28 22 6e 61   *zPage = PD("na
80e0: 6d 65 22 2c 50 28 22 70 61 67 65 22 29 29 3b 0a  me",P("page"));.
80f0: 20 20 63 68 61 72 20 2a 20 7a 46 69 6c 65 3b 0a    char * zFile;.
8100: 20 20 69 6e 74 20 6e 46 69 6c 65 20 3d 20 30 3b    int nFile = 0;
8110: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8120: 42 75 69 6c 74 69 6e 3b 0a 0a 20 20 69 66 28 7a  Builtin;..  if(z
8130: 50 61 67 65 3d 3d 30 20 7c 7c 20 7a 50 61 67 65  Page==0 || zPage
8140: 5b 30 5d 3d 3d 30 29 7b 0a 20 20 20 20 72 65 74  [0]==0){.    ret
8150: 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  urn;.  }.  zFile
8160: 20 3d 20 6d 70 72 69 6e 74 66 28 22 73 74 79 6c   = mprintf("styl
8170: 65 2e 25 73 2e 63 73 73 22 2c 20 7a 50 61 67 65  e.%s.css", zPage
8180: 29 3b 0a 20 20 7a 42 75 69 6c 74 69 6e 20 3d 20  );.  zBuiltin = 
8190: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 62 75  (const char *)bu
81a0: 69 6c 74 69 6e 5f 66 69 6c 65 28 7a 46 69 6c 65  iltin_file(zFile
81b0: 2c 20 26 6e 46 69 6c 65 29 3b 0a 20 20 69 66 28  , &nFile);.  if(
81c0: 6e 46 69 6c 65 3e 30 29 7b 0a 20 20 20 20 62 6c  nFile>0){.    bl
81d0: 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c  ob_appendf(pOut,
81e0: 0a 20 20 20 20 20 20 22 5c 6e 2f 2a 2a 2a 2a 2a  .      "\n/*****
81f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8220: 2a 2a 2a 2a 2a 2a 5c 6e 22 0a 20 20 20 20 20 20  ******\n".      
8230: 22 2a 2a 20 53 74 61 72 74 20 6f 66 20 70 61 67  "** Start of pag
8240: 65 2d 73 70 65 63 69 66 69 63 20 43 53 53 20 66  e-specific CSS f
8250: 6f 72 20 70 61 67 65 20 25 73 2e 2e 2e 5c 6e 22  or page %s...\n"
8260: 0a 20 20 20 20 20 20 22 2a 2a 2a 2a 2a 2a 2a 2a  .      "********
8270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82a0: 2a 2a 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 7a  ***/\n",.      z
82b0: 50 61 67 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f  Page);.    blob_
82c0: 61 70 70 65 6e 64 28 70 4f 75 74 2c 20 7a 42 75  append(pOut, zBu
82d0: 69 6c 74 69 6e 2c 20 6e 46 69 6c 65 29 3b 0a 20  iltin, nFile);. 
82e0: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
82f0: 70 4f 75 74 2c 0a 20 20 20 20 20 20 22 5c 6e 2f  pOut,.      "\n/
8300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 5c 6e 22 0a 20  ***********\n". 
8340: 20 20 20 20 20 22 2a 2a 20 45 6e 64 20 6f 66 20       "** End of 
8350: 70 61 67 65 2d 73 70 65 63 69 66 69 63 20 43 53  page-specific CS
8360: 53 20 66 6f 72 20 70 61 67 65 20 25 73 2e 5c 6e  S for page %s.\n
8370: 22 0a 20 20 20 20 20 20 22 2a 2a 2a 2a 2a 2a 2a  ".      "*******
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 2f 5c 6e 22 2c 0a 20 20 20 20 20 20  ****/\n",.      
83c0: 7a 50 61 67 65 29 3b 0a 20 20 20 20 66 6f 73 73  zPage);.    foss
83d0: 69 6c 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a  il_free(zFile);.
83e0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
83f0: 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 54    /* Potential T
8400: 4f 44 4f 3a 20 63 68 65 63 6b 20 66 6f 72 20 61  ODO: check for a
8410: 6c 69 61 73 65 73 2f 70 61 67 65 20 67 72 6f 75  liases/page grou
8420: 70 73 2e 20 65 2e 67 2e 20 67 72 6f 75 70 20 61  ps. e.g. group a
8430: 6c 6c 0a 20 20 2a 2a 20 2f 66 6f 72 75 6d 58 59  ll.  ** /forumXY
8440: 5a 20 43 53 53 20 69 6e 74 6f 20 6f 6e 65 20 66  Z CSS into one f
8450: 69 6c 65 2c 20 61 6c 6c 20 2f 73 65 74 75 70 58  ile, all /setupX
8460: 59 5a 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 2c  YZ into another,
8470: 20 65 74 63 2e 20 41 73 0a 20 20 2a 2a 20 6f 66   etc. As.  ** of
8480: 20 74 68 69 73 20 77 72 69 74 69 6e 67 2c 20 64   this writing, d
8490: 6f 69 6e 67 20 73 6f 20 77 6f 75 6c 64 20 6f 6e  oing so would on
84a0: 6c 79 20 73 68 61 76 65 20 61 20 66 65 77 20 6b  ly shave a few k
84b0: 62 20 66 72 6f 6d 0a 20 20 2a 2a 20 64 65 66 61  b from.  ** defa
84c0: 75 6c 74 2e 63 73 73 2e 20 2a 2f 0a 20 20 66 6f  ult.css. */.  fo
84d0: 73 73 69 6c 5f 66 72 65 65 28 7a 46 69 6c 65 29  ssil_free(zFile)
84e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41  ;.}../*.** WEBPA
84f0: 47 45 3a 20 73 74 79 6c 65 2e 63 73 73 0a 2a 2a  GE: style.css.**
8500: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
8510: 74 79 6c 65 20 73 68 65 65 74 2e 0a 2a 2f 0a 76  tyle sheet..*/.v
8520: 6f 69 64 20 70 61 67 65 5f 73 74 79 6c 65 5f 63  oid page_style_c
8530: 73 73 28 76 6f 69 64 29 7b 0a 20 20 42 6c 6f 62  ss(void){.  Blob
8540: 20 63 73 73 20 3d 20 65 6d 70 74 79 5f 62 6c 6f   css = empty_blo
8550: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  b;.  int i;.  co
8560: 6e 73 74 20 63 68 61 72 20 2a 20 7a 44 65 66 61  nst char * zDefa
8570: 75 6c 74 73 3b 0a 0a 20 20 63 67 69 5f 73 65 74  ults;..  cgi_set
8580: 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 65 28 22 74  _content_type("t
8590: 65 78 74 2f 63 73 73 22 29 3b 0a 20 20 65 74 61  ext/css");.  eta
85a0: 67 5f 63 68 65 63 6b 28 30 2c 20 30 29 3b 0a 20  g_check(0, 0);. 
85b0: 20 2f 2a 20 45 6d 69 74 20 61 6c 6c 20 64 65 66   /* Emit all def
85c0: 61 75 6c 74 20 72 75 6c 65 73 2e 2e 2e 20 2a 2f  ault rules... */
85d0: 0a 20 20 7a 44 65 66 61 75 6c 74 73 20 3d 20 28  .  zDefaults = (
85e0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 62 75 69 6c  const char*)buil
85f0: 74 69 6e 5f 66 69 6c 65 28 22 64 65 66 61 75 6c  tin_file("defaul
8600: 74 2e 63 73 73 22 2c 20 26 69 29 3b 0a 20 20 62  t.css", &i);.  b
8610: 6c 6f 62 5f 61 70 70 65 6e 64 28 26 63 73 73 2c  lob_append(&css,
8620: 20 7a 44 65 66 61 75 6c 74 73 2c 20 69 29 3b 0a   zDefaults, i);.
8630: 20 20 2f 2a 20 50 61 67 65 2d 73 70 65 63 69 66    /* Page-specif
8640: 69 63 20 43 53 53 2c 20 69 66 20 61 6e 79 2e 2e  ic CSS, if any..
8650: 2e 20 2a 2f 0a 20 20 70 61 67 65 5f 73 74 79 6c  . */.  page_styl
8660: 65 5f 63 73 73 5f 61 70 70 65 6e 64 5f 70 61 67  e_css_append_pag
8670: 65 5f 73 74 79 6c 65 28 26 63 73 73 29 3b 0a 20  e_style(&css);. 
8680: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 63 73   blob_append(&cs
8690: 73 2c 0a 20 20 20 20 20 22 5c 6e 2f 2a 2a 2a 2a  s,.     "\n/****
86a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
86b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
86c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
86d0: 2a 2a 2a 2a 2a 2a 2a 5c 6e 22 0a 20 20 20 20 20  *******\n".     
86e0: 22 2a 2a 20 41 6c 6c 20 43 53 53 20 77 68 69 63  "** All CSS whic
86f0: 68 20 66 6f 6c 6c 6f 77 73 20 69 73 20 73 75 70  h follows is sup
8700: 70 6c 69 65 64 20 62 79 20 74 68 65 20 72 65 70  plied by the rep
8710: 6f 73 69 74 6f 72 79 20 5c 22 73 6b 69 6e 5c 22  ository \"skin\"
8720: 2e 5c 6e 22 0a 20 20 20 20 20 22 2a 2a 2a 2a 2a  .\n".     "*****
8730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8760: 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 0a 20 20 20 20  ******/\n",.    
8770: 20 2d 31 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70   -1);.  blob_app
8780: 65 6e 64 28 26 63 73 73 2c 73 6b 69 6e 5f 67 65  end(&css,skin_ge
8790: 74 28 22 63 73 73 22 29 2c 2d 31 29 3b 0a 20 20  t("css"),-1);.  
87a0: 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 72 6f 75  /* Process throu
87b0: 67 68 20 54 48 31 20 69 6e 20 6f 72 64 65 72 20  gh TH1 in order 
87c0: 74 6f 20 67 69 76 65 20 61 6e 20 6f 70 70 6f 72  to give an oppor
87d0: 74 75 6e 69 74 79 20 74 6f 20 73 75 62 73 74 69  tunity to substi
87e0: 74 75 74 65 0a 20 20 2a 2a 20 76 61 72 69 61 62  tute.  ** variab
87f0: 6c 65 73 20 73 75 63 68 20 61 73 20 24 62 61 73  les such as $bas
8800: 65 75 72 6c 2e 0a 20 20 2a 2f 0a 20 20 54 68 5f  eurl..  */.  Th_
8810: 53 74 6f 72 65 28 22 62 61 73 65 75 72 6c 22 2c  Store("baseurl",
8820: 20 67 2e 7a 42 61 73 65 55 52 4c 29 3b 0a 20 20   g.zBaseURL);.  
8830: 54 68 5f 53 74 6f 72 65 28 22 73 65 63 75 72 65  Th_Store("secure
8840: 75 72 6c 22 2c 20 66 6f 73 73 69 6c 5f 77 61 6e  url", fossil_wan
8850: 74 73 5f 68 74 74 70 73 28 31 29 3f 20 67 2e 7a  ts_https(1)? g.z
8860: 48 74 74 70 73 55 52 4c 3a 20 67 2e 7a 42 61 73  HttpsURL: g.zBas
8870: 65 55 52 4c 29 3b 0a 20 20 54 68 5f 53 74 6f 72  eURL);.  Th_Stor
8880: 65 28 22 68 6f 6d 65 22 2c 20 67 2e 7a 54 6f 70  e("home", g.zTop
8890: 29 3b 0a 20 20 69 6d 61 67 65 5f 75 72 6c 5f 76  );.  image_url_v
88a0: 61 72 28 22 6c 6f 67 6f 22 29 3b 0a 20 20 69 6d  ar("logo");.  im
88b0: 61 67 65 5f 75 72 6c 5f 76 61 72 28 22 62 61 63  age_url_var("bac
88c0: 6b 67 72 6f 75 6e 64 22 29 3b 0a 20 20 54 68 5f  kground");.  Th_
88d0: 52 65 6e 64 65 72 28 62 6c 6f 62 5f 73 74 72 28  Render(blob_str(
88e0: 26 63 73 73 29 29 3b 0a 0a 20 20 2f 2a 20 54 65  &css));..  /* Te
88f0: 6c 6c 20 43 47 49 20 74 68 61 74 20 74 68 65 20  ll CGI that the 
8900: 63 6f 6e 74 65 6e 74 20 72 65 74 75 72 6e 65 64  content returned
8910: 20 62 79 20 74 68 69 73 20 70 61 67 65 20 69 73   by this page is
8920: 20 63 6f 6e 73 69 64 65 72 65 64 20 63 61 63 68   considered cach
8930: 65 61 62 6c 65 20 2a 2f 0a 20 20 67 2e 69 73 43  eable */.  g.isC
8940: 6f 6e 73 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  onst = 1;.}../*.
8950: 2a 2a 20 41 6c 6c 20 70 6f 73 73 69 62 6c 65 20  ** All possible 
8960: 63 61 70 61 62 69 6c 69 74 69 65 73 0a 2a 2f 0a  capabilities.*/.
8970: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
8980: 72 20 61 6c 6c 43 61 70 5b 5d 20 3d 20 0a 20 20  r allCap[] = .  
8990: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
89a0: 70 71 72 73 74 75 76 77 78 79 7a 30 31 32 33 34  pqrstuvwxyz01234
89b0: 35 36 37 38 39 41 42 43 44 45 46 47 48 49 4a 4b  56789ABCDEFGHIJK
89c0: 4c 22 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  L";../*.** Compu
89d0: 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  te the current l
89e0: 6f 67 69 6e 20 63 61 70 61 62 69 6c 69 74 69 65  ogin capabilitie
89f0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  s.*/.static char
8a00: 20 2a 66 69 6e 64 5f 63 61 70 61 62 69 6c 69 74   *find_capabilit
8a10: 69 65 73 28 63 68 61 72 20 2a 7a 43 61 70 29 7b  ies(char *zCap){
8a20: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  .  int i, j;.  c
8a30: 68 61 72 20 63 3b 0a 20 20 66 6f 72 28 69 3d 6a  har c;.  for(i=j
8a40: 3d 30 3b 20 28 63 20 3d 20 61 6c 6c 43 61 70 5b  =0; (c = allCap[
8a50: 6a 5d 29 21 3d 30 3b 20 6a 2b 2b 29 7b 0a 20 20  j])!=0; j++){.  
8a60: 20 20 69 66 28 20 6c 6f 67 69 6e 5f 68 61 73 5f    if( login_has_
8a70: 63 61 70 61 62 69 6c 69 74 79 28 26 63 2c 20 31  capability(&c, 1
8a80: 2c 20 30 29 20 29 20 7a 43 61 70 5b 69 2b 2b 5d  , 0) ) zCap[i++]
8a90: 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 43 61 70   = c;.  }.  zCap
8aa0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  [i] = 0;.  retur
8ab0: 6e 20 7a 43 61 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zCap;.}../*.**
8ac0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 75 72   Compute the cur
8ad0: 72 65 6e 74 20 6c 6f 67 69 6e 20 63 61 70 61 62  rent login capab
8ae0: 69 6c 69 74 69 65 73 20 74 68 61 74 20 77 65 72  ilities that wer
8af0: 65 0a 2a 2a 20 63 6f 6e 74 72 69 62 75 74 65 64  e.** contributed
8b00: 20 62 79 20 41 6e 6f 6e 79 6d 6f 75 73 0a 2a 2f   by Anonymous.*/
8b10: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 66 69  .static char *fi
8b20: 6e 64 5f 61 6e 6f 6e 5f 63 61 70 61 62 69 6c 69  nd_anon_capabili
8b30: 74 69 65 73 28 63 68 61 72 20 2a 7a 43 61 70 29  ties(char *zCap)
8b40: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
8b50: 63 68 61 72 20 63 3b 0a 20 20 66 6f 72 28 69 3d  char c;.  for(i=
8b60: 6a 3d 30 3b 20 28 63 20 3d 20 61 6c 6c 43 61 70  j=0; (c = allCap
8b70: 5b 6a 5d 29 21 3d 30 3b 20 6a 2b 2b 29 7b 0a 20  [j])!=0; j++){. 
8b80: 20 20 20 69 66 28 20 6c 6f 67 69 6e 5f 68 61 73     if( login_has
8b90: 5f 63 61 70 61 62 69 6c 69 74 79 28 26 63 2c 20  _capability(&c, 
8ba0: 31 2c 20 4c 4f 47 49 4e 5f 41 4e 4f 4e 29 0a 20  1, LOGIN_ANON). 
8bb0: 20 20 20 20 20 26 26 20 21 6c 6f 67 69 6e 5f 68       && !login_h
8bc0: 61 73 5f 63 61 70 61 62 69 6c 69 74 79 28 26 63  as_capability(&c
8bd0: 2c 20 31 2c 20 30 29 20 29 20 7a 43 61 70 5b 69  , 1, 0) ) zCap[i
8be0: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a  ++] = c;.  }.  z
8bf0: 43 61 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65  Cap[i] = 0;.  re
8c00: 74 75 72 6e 20 7a 43 61 70 3b 0a 7d 0a 0a 2f 2a  turn zCap;.}../*
8c10: 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 74 65 73  .** WEBPAGE: tes
8c20: 74 5f 65 6e 76 0a 2a 2a 0a 2a 2a 20 44 69 73 70  t_env.**.** Disp
8c30: 6c 61 79 20 43 47 49 2d 76 61 72 69 61 62 6c 65  lay CGI-variable
8c40: 73 20 61 6e 64 20 6f 74 68 65 72 20 61 73 70 65  s and other aspe
8c50: 63 74 73 20 6f 66 20 74 68 65 20 72 75 6e 2d 74  cts of the run-t
8c60: 69 6d 65 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d 65  ime.** environme
8c70: 6e 74 2c 20 66 6f 72 20 64 65 62 75 67 67 69 6e  nt, for debuggin
8c80: 67 20 61 6e 64 20 74 72 6f 75 62 6c 65 2d 73 68  g and trouble-sh
8c90: 6f 6f 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  ooting purposes.
8ca0: 0a 2a 2f 0a 76 6f 69 64 20 70 61 67 65 5f 74 65  .*/.void page_te
8cb0: 73 74 5f 65 6e 76 28 76 6f 69 64 29 7b 0a 20 20  st_env(void){.  
8cc0: 77 65 62 70 61 67 65 5f 65 72 72 6f 72 28 22 22  webpage_error(""
8cd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50  );.}../*.** WEBP
8ce0: 41 47 45 3a 20 68 6f 6e 65 79 70 6f 74 0a 2a 2a  AGE: honeypot.**
8cf0: 20 54 68 69 73 20 70 61 67 65 20 69 73 20 61 20   This page is a 
8d00: 68 6f 6e 65 79 70 6f 74 20 66 6f 72 20 73 70 69  honeypot for spi
8d10: 64 65 72 73 20 61 6e 64 20 62 6f 74 73 2e 0a 2a  ders and bots..*
8d20: 2f 0a 76 6f 69 64 20 68 6f 6e 65 79 70 6f 74 5f  /.void honeypot_
8d30: 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 63 67  page(void){.  cg
8d40: 69 5f 73 65 74 5f 73 74 61 74 75 73 28 34 30 33  i_set_status(403
8d50: 2c 20 22 46 6f 72 62 69 64 64 65 6e 22 29 3b 0a  , "Forbidden");.
8d60: 20 20 40 20 3c 70 3e 50 6c 65 61 73 65 20 65 6e    @ <p>Please en
8d70: 61 62 6c 65 20 6a 61 76 61 73 63 72 69 70 74 20  able javascript 
8d80: 6f 72 20 6c 6f 67 20 69 6e 20 74 6f 20 73 65 65  or log in to see
8d90: 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 3c 2f 70   this content</p
8da0: 3e 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 62 70 61  >.}../*.** Webpa
8db0: 67 65 73 20 74 68 61 74 20 65 6e 63 6f 75 6e 74  ges that encount
8dc0: 65 72 20 61 6e 20 65 72 72 6f 72 20 64 75 65 20  er an error due 
8dd0: 74 6f 20 6d 69 73 73 69 6e 67 20 6f 72 20 69 6e  to missing or in
8de0: 63 6f 72 72 65 63 74 0a 2a 2a 20 71 75 65 72 79  correct.** query
8df0: 20 70 61 72 61 6d 65 74 65 72 73 20 63 61 6e 20   parameters can 
8e00: 6a 75 6d 70 20 74 6f 20 74 68 69 73 20 72 6f 75  jump to this rou
8e10: 74 69 6e 65 20 74 6f 20 72 65 6e 64 65 72 20 61  tine to render a
8e20: 6e 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61  n error.** messa
8e30: 67 65 20 73 63 72 65 65 6e 2e 0a 2a 2a 0a 2a 2a  ge screen..**.**
8e40: 20 46 6f 72 20 61 64 6d 69 6e 69 73 74 61 74 6f   For administato
8e50: 72 73 2c 20 6f 72 20 69 66 20 74 68 65 20 74 65  rs, or if the te
8e60: 73 74 5f 65 6e 76 5f 65 6e 61 62 6c 65 20 73 65  st_env_enable se
8e70: 74 74 69 6e 67 20 69 73 20 74 72 75 65 2c 20 74  tting is true, t
8e80: 68 65 6e 0a 2a 2a 20 64 65 74 61 69 6c 73 20 6f  hen.** details o
8e90: 66 20 74 68 65 20 72 65 71 75 65 73 74 20 65 6e  f the request en
8ea0: 76 69 72 6f 6e 6d 65 6e 74 20 61 72 65 20 64 69  vironment are di
8eb0: 73 70 6c 61 79 65 64 2e 20 20 4f 74 68 65 72 77  splayed.  Otherw
8ec0: 69 73 65 2c 20 6a 75 73 74 0a 2a 2a 20 74 68 65  ise, just.** the
8ed0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
8ee0: 73 20 73 68 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20 49  s shown..**.** I
8ef0: 66 20 7a 46 6f 72 6d 61 74 20 69 73 20 61 6e 20  f zFormat is an 
8f00: 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68  empty string, th
8f10: 65 6e 20 74 68 69 73 20 69 73 20 74 68 65 20 2f  en this is the /
8f20: 74 65 73 74 5f 65 6e 76 20 70 61 67 65 2e 0a 2a  test_env page..*
8f30: 2f 0a 76 6f 69 64 20 77 65 62 70 61 67 65 5f 65  /.void webpage_e
8f40: 72 72 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20  rror(const char 
8f50: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
8f60: 20 20 69 6e 74 20 73 68 6f 77 41 6c 6c 3b 0a 20    int showAll;. 
8f70: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
8f80: 0a 20 20 69 6e 74 20 69 73 41 75 74 68 20 3d 20  .  int isAuth = 
8f90: 30 3b 0a 20 20 63 68 61 72 20 7a 43 61 70 5b 31  0;.  char zCap[1
8fa0: 30 30 5d 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68  00];..  login_ch
8fb0: 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28  eck_credentials(
8fc0: 29 3b 0a 20 20 69 66 28 20 67 2e 70 65 72 6d 2e  );.  if( g.perm.
8fd0: 41 64 6d 69 6e 20 7c 7c 20 67 2e 70 65 72 6d 2e  Admin || g.perm.
8fe0: 53 65 74 75 70 20 20 7c 7c 20 64 62 5f 67 65 74  Setup  || db_get
8ff0: 5f 62 6f 6f 6c 65 61 6e 28 22 74 65 73 74 5f 65  _boolean("test_e
9000: 6e 76 5f 65 6e 61 62 6c 65 22 2c 30 29 20 29 7b  nv_enable",0) ){
9010: 0a 20 20 20 20 69 73 41 75 74 68 20 3d 20 31 3b  .    isAuth = 1;
9020: 0a 20 20 7d 0a 20 20 63 67 69 5f 6c 6f 61 64 5f  .  }.  cgi_load_
9030: 65 6e 76 69 72 6f 6e 6d 65 6e 74 28 29 3b 0a 20  environment();. 
9040: 20 73 74 79 6c 65 5f 73 65 74 5f 63 75 72 72 65   style_set_curre
9050: 6e 74 5f 66 65 61 74 75 72 65 28 22 65 72 72 6f  nt_feature("erro
9060: 72 22 29 3b 0a 20 20 69 66 28 20 7a 46 6f 72 6d  r");.  if( zForm
9070: 61 74 5b 30 5d 20 29 7b 0a 20 20 20 20 76 61 5f  at[0] ){.    va_
9080: 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 76 61 5f  list ap;.    va_
9090: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
90a0: 74 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 76  t);.    zErr = v
90b0: 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c  mprintf(zFormat,
90c0: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
90d0: 28 61 70 29 3b 0a 20 20 20 20 73 74 79 6c 65 5f  (ap);.    style_
90e0: 68 65 61 64 65 72 28 22 42 61 64 20 52 65 71 75  header("Bad Requ
90f0: 65 73 74 22 29 3b 0a 20 20 20 20 40 20 3c 68 31  est");.    @ <h1
9100: 3e 2f 25 68 28 67 2e 7a 50 61 74 68 29 3a 20 25  >/%h(g.zPath): %
9110: 68 28 7a 45 72 72 29 3c 2f 68 31 3e 0a 20 20 20  h(zErr)</h1>.   
9120: 20 73 68 6f 77 41 6c 6c 20 3d 20 30 3b 0a 20 20   showAll = 0;.  
9130: 20 20 63 67 69 5f 73 65 74 5f 73 74 61 74 75 73    cgi_set_status
9140: 28 35 30 30 2c 20 22 42 61 64 20 52 65 71 75 65  (500, "Bad Reque
9150: 73 74 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  st");.  }else if
9160: 28 20 21 69 73 41 75 74 68 20 29 7b 0a 20 20 20  ( !isAuth ){.   
9170: 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 30 29   login_needed(0)
9180: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
9190: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 79 6c 65  }else{.    style
91a0: 5f 68 65 61 64 65 72 28 22 45 6e 76 69 72 6f 6e  _header("Environ
91b0: 6d 65 6e 74 20 54 65 73 74 22 29 3b 0a 20 20 20  ment Test");.   
91c0: 20 73 68 6f 77 41 6c 6c 20 3d 20 50 42 28 22 73   showAll = PB("s
91d0: 68 6f 77 61 6c 6c 22 29 3b 0a 20 20 20 20 73 74  howall");.    st
91e0: 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 63 68 65 63  yle_submenu_chec
91f0: 6b 62 6f 78 28 22 73 68 6f 77 61 6c 6c 22 2c 20  kbox("showall", 
9200: 22 43 6f 6f 6b 69 65 73 22 2c 20 30 2c 20 30 29  "Cookies", 0, 0)
9210: 3b 0a 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d  ;.    style_subm
9220: 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 53 74 61  enu_element("Sta
9230: 74 73 22 2c 20 22 25 52 2f 73 74 61 74 22 29 3b  ts", "%R/stat");
9240: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 41 75  .  }..  if( isAu
9250: 74 68 20 29 7b 0a 20 20 23 69 66 20 21 64 65 66  th ){.  #if !def
9260: 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 20  ined(_WIN32).   
9270: 20 40 20 75 69 64 3d 25 64 28 67 65 74 75 69 64   @ uid=%d(getuid
9280: 28 29 29 2c 20 67 69 64 3d 25 64 28 67 65 74 67  ()), gid=%d(getg
9290: 69 64 28 29 29 3c 62 72 20 2f 3e 0a 20 20 23 65  id())<br />.  #e
92a0: 6e 64 69 66 0a 20 20 20 20 40 20 67 2e 7a 42 61  ndif.    @ g.zBa
92b0: 73 65 55 52 4c 20 3d 20 25 68 28 67 2e 7a 42 61  seURL = %h(g.zBa
92c0: 73 65 55 52 4c 29 3c 62 72 20 2f 3e 0a 20 20 20  seURL)<br />.   
92d0: 20 40 20 67 2e 7a 48 74 74 70 73 55 52 4c 20 3d   @ g.zHttpsURL =
92e0: 20 25 68 28 67 2e 7a 48 74 74 70 73 55 52 4c 29   %h(g.zHttpsURL)
92f0: 3c 62 72 20 2f 3e 0a 20 20 20 20 40 20 67 2e 7a  <br />.    @ g.z
9300: 54 6f 70 20 3d 20 25 68 28 67 2e 7a 54 6f 70 29  Top = %h(g.zTop)
9310: 3c 62 72 20 2f 3e 0a 20 20 20 20 40 20 67 2e 7a  <br />.    @ g.z
9320: 50 61 74 68 20 3d 20 25 68 28 67 2e 7a 50 61 74  Path = %h(g.zPat
9330: 68 29 3c 62 72 20 2f 3e 0a 20 20 20 20 40 20 67  h)<br />.    @ g
9340: 2e 75 73 65 72 55 69 64 20 3d 20 25 64 28 67 2e  .userUid = %d(g.
9350: 75 73 65 72 55 69 64 29 3c 62 72 20 2f 3e 0a 20  userUid)<br />. 
9360: 20 20 20 40 20 67 2e 7a 4c 6f 67 69 6e 20 3d 20     @ g.zLogin = 
9370: 25 68 28 67 2e 7a 4c 6f 67 69 6e 29 3c 62 72 20  %h(g.zLogin)<br 
9380: 2f 3e 0a 20 20 20 20 40 20 67 2e 69 73 48 75 6d  />.    @ g.isHum
9390: 61 6e 20 3d 20 25 64 28 67 2e 69 73 48 75 6d 61  an = %d(g.isHuma
93a0: 6e 29 3c 62 72 20 2f 3e 0a 20 20 20 20 69 66 28  n)<br />.    if(
93b0: 20 67 2e 6e 52 65 71 75 65 73 74 20 29 7b 0a 20   g.nRequest ){. 
93c0: 20 20 20 20 20 40 20 67 2e 6e 52 65 71 75 65 73       @ g.nReques
93d0: 74 20 3d 20 25 64 28 67 2e 6e 52 65 71 75 65 73  t = %d(g.nReques
93e0: 74 29 3c 62 72 20 2f 3e 0a 20 20 20 20 7d 0a 20  t)<br />.    }. 
93f0: 20 20 20 69 66 28 20 67 2e 6e 50 65 6e 64 69 6e     if( g.nPendin
9400: 67 52 65 71 75 65 73 74 3e 31 20 29 7b 0a 20 20  gRequest>1 ){.  
9410: 20 20 20 20 40 20 67 2e 6e 50 65 6e 64 69 6e 67      @ g.nPending
9420: 52 65 71 75 65 73 74 20 3d 20 25 64 28 67 2e 6e  Request = %d(g.n
9430: 50 65 6e 64 69 6e 67 52 65 71 75 65 73 74 29 3c  PendingRequest)<
9440: 62 72 20 2f 3e 0a 20 20 20 20 7d 0a 20 20 20 20  br />.    }.    
9450: 40 20 63 61 70 61 62 69 6c 69 74 69 65 73 20 3d  @ capabilities =
9460: 20 25 73 28 66 69 6e 64 5f 63 61 70 61 62 69 6c   %s(find_capabil
9470: 69 74 69 65 73 28 7a 43 61 70 29 29 3c 62 72 20  ities(zCap))<br 
9480: 2f 3e 0a 20 20 20 20 69 66 28 20 7a 43 61 70 5b  />.    if( zCap[
9490: 30 5d 20 29 7b 0a 20 20 20 20 20 20 40 20 61 6e  0] ){.      @ an
94a0: 6f 6e 79 6d 6f 75 73 2d 61 64 64 73 20 3d 20 25  onymous-adds = %
94b0: 73 28 66 69 6e 64 5f 61 6e 6f 6e 5f 63 61 70 61  s(find_anon_capa
94c0: 62 69 6c 69 74 69 65 73 28 7a 43 61 70 29 29 3c  bilities(zCap))<
94d0: 62 72 20 2f 3e 0a 20 20 20 20 7d 0a 20 20 20 20  br />.    }.    
94e0: 40 20 67 2e 7a 52 65 70 6f 73 69 74 6f 72 79 4e  @ g.zRepositoryN
94f0: 61 6d 65 20 3d 20 25 68 28 67 2e 7a 52 65 70 6f  ame = %h(g.zRepo
9500: 73 69 74 6f 72 79 4e 61 6d 65 29 3c 62 72 20 2f  sitoryName)<br /
9510: 3e 0a 20 20 20 20 40 20 6c 6f 61 64 5f 61 76 65  >.    @ load_ave
9520: 72 61 67 65 28 29 20 3d 20 25 66 28 6c 6f 61 64  rage() = %f(load
9530: 5f 61 76 65 72 61 67 65 28 29 29 3c 62 72 20 2f  _average())<br /
9540: 3e 0a 20 20 20 20 40 20 63 67 69 5f 63 73 72 66  >.    @ cgi_csrf
9550: 5f 73 61 66 65 28 30 29 20 3d 20 25 64 28 63 67  _safe(0) = %d(cg
9560: 69 5f 63 73 72 66 5f 73 61 66 65 28 30 29 29 3c  i_csrf_safe(0))<
9570: 62 72 20 2f 3e 0a 20 20 20 20 40 20 66 6f 73 73  br />.    @ foss
9580: 69 6c 5f 65 78 65 5f 69 64 28 29 20 3d 20 25 68  il_exe_id() = %h
9590: 28 66 6f 73 73 69 6c 5f 65 78 65 5f 69 64 28 29  (fossil_exe_id()
95a0: 29 3c 62 72 20 2f 3e 0a 20 20 20 20 40 20 3c 68  )<br />.    @ <h
95b0: 72 20 2f 3e 0a 20 20 20 20 50 28 22 48 54 54 50  r />.    P("HTTP
95c0: 5f 55 53 45 52 5f 41 47 45 4e 54 22 29 3b 0a 20  _USER_AGENT");. 
95d0: 20 20 20 63 67 69 5f 70 72 69 6e 74 5f 61 6c 6c     cgi_print_all
95e0: 28 73 68 6f 77 41 6c 6c 2c 20 30 29 3b 0a 20 20  (showAll, 0);.  
95f0: 20 20 69 66 28 20 73 68 6f 77 41 6c 6c 20 26 26    if( showAll &&
9600: 20 62 6c 6f 62 5f 73 69 7a 65 28 26 67 2e 68 74   blob_size(&g.ht
9610: 74 70 48 65 61 64 65 72 29 3e 30 20 29 7b 0a 20  tpHeader)>0 ){. 
9620: 20 20 20 20 20 40 20 3c 68 72 20 2f 3e 0a 20 20       @ <hr />.  
9630: 20 20 20 20 40 20 3c 70 72 65 3e 0a 20 20 20 20      @ <pre>.    
9640: 20 20 40 20 25 68 28 62 6c 6f 62 5f 73 74 72 28    @ %h(blob_str(
9650: 26 67 2e 68 74 74 70 48 65 61 64 65 72 29 29 0a  &g.httpHeader)).
9660: 20 20 20 20 20 20 40 20 3c 2f 70 72 65 3e 0a 20        @ </pre>. 
9670: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
9680: 45 72 72 20 26 26 20 7a 45 72 72 5b 30 5d 20 29  Err && zErr[0] )
9690: 7b 0a 20 20 20 20 73 74 79 6c 65 5f 66 69 6e 69  {.    style_fini
96a0: 73 68 5f 70 61 67 65 28 22 65 72 72 6f 72 22 29  sh_page("error")
96b0: 3b 0a 20 20 20 20 63 67 69 5f 72 65 70 6c 79 28  ;.    cgi_reply(
96c0: 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 65 78  );.    fossil_ex
96d0: 69 74 28 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  it(1);.  }else{.
96e0: 20 20 20 20 73 74 79 6c 65 5f 66 69 6e 69 73 68      style_finish
96f0: 5f 70 61 67 65 28 22 74 65 73 74 22 29 3b 0a 20  _page("test");. 
9700: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
9710: 72 61 74 65 20 61 20 4e 6f 74 20 59 65 74 20 49  rate a Not Yet I
9720: 6d 70 6c 65 6d 65 6e 74 65 64 20 65 72 72 6f 72  mplemented error
9730: 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 77   page..*/.void w
9740: 65 62 70 61 67 65 5f 6e 6f 74 5f 79 65 74 5f 69  ebpage_not_yet_i
9750: 6d 70 6c 65 6d 65 6e 74 65 64 28 76 6f 69 64 29  mplemented(void)
9760: 7b 0a 20 20 77 65 62 70 61 67 65 5f 65 72 72 6f  {.  webpage_erro
9770: 72 28 22 4e 6f 74 20 79 65 74 20 69 6d 70 6c 65  r("Not yet imple
9780: 6d 65 6e 74 65 64 22 29 3b 0a 7d 0a 0a 2f 2a 0a  mented");.}../*.
9790: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 77 65  ** Generate a we
97a0: 62 70 61 67 65 20 66 6f 72 20 61 20 77 65 62 70  bpage for a webp
97b0: 61 67 65 5f 61 73 73 65 72 74 28 29 2e 0a 2a 2f  age_assert()..*/
97c0: 0a 76 6f 69 64 20 77 65 62 70 61 67 65 5f 61 73  .void webpage_as
97d0: 73 65 72 74 5f 70 61 67 65 28 63 6f 6e 73 74 20  sert_page(const 
97e0: 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74  char *zFile, int
97f0: 20 69 4c 69 6e 65 2c 20 63 6f 6e 73 74 20 63 68   iLine, const ch
9800: 61 72 20 2a 7a 45 78 70 72 29 7b 0a 20 20 66 6f  ar *zExpr){.  fo
9810: 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28 22 61 73  ssil_warning("as
9820: 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 61 74  sertion fault at
9830: 20 25 73 3a 25 64 20 2d 20 25 73 22 2c 20 7a 46   %s:%d - %s", zF
9840: 69 6c 65 2c 20 69 4c 69 6e 65 2c 20 7a 45 78 70  ile, iLine, zExp
9850: 72 29 3b 0a 20 20 63 67 69 5f 72 65 73 65 74 5f  r);.  cgi_reset_
9860: 63 6f 6e 74 65 6e 74 28 29 3b 0a 20 20 77 65 62  content();.  web
9870: 70 61 67 65 5f 65 72 72 6f 72 28 22 61 73 73 65  page_error("asse
9880: 72 74 69 6f 6e 20 66 61 75 6c 74 20 61 74 20 25  rtion fault at %
9890: 73 3a 25 64 20 2d 20 25 73 22 2c 20 7a 46 69 6c  s:%d - %s", zFil
98a0: 65 2c 20 69 4c 69 6e 65 2c 20 7a 45 78 70 72 29  e, iLine, zExpr)
98b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 73 73 75 65  ;.}../*.** Issue
98c0: 20 61 20 34 30 34 20 4e 6f 74 20 46 6f 75 6e 64   a 404 Not Found
98d0: 20 65 72 72 6f 72 20 66 6f 72 20 61 20 77 65 62   error for a web
98e0: 70 61 67 65 0a 2a 2f 0a 76 6f 69 64 20 77 65 62  page.*/.void web
98f0: 70 61 67 65 5f 6e 6f 74 66 6f 75 6e 64 5f 65 72  page_notfound_er
9900: 72 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ror(const char *
9910: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
9920: 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 76   char *zMsg;.  v
9930: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
9940: 20 7a 46 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20   zFormat ){.    
9950: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
9960: 72 6d 61 74 29 3b 0a 20 20 20 20 7a 4d 73 67 20  rmat);.    zMsg 
9970: 3d 20 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d  = vmprintf(zForm
9980: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
9990: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 65 6c 73 65  end(ap);.  }else
99a0: 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 22 4e 6f  {.    zMsg = "No
99b0: 74 20 46 6f 75 6e 64 22 3b 0a 20 20 7d 0a 20 20  t Found";.  }.  
99c0: 73 74 79 6c 65 5f 73 65 74 5f 63 75 72 72 65 6e  style_set_curren
99d0: 74 5f 66 65 61 74 75 72 65 28 22 65 6e 6f 74 66  t_feature("enotf
99e0: 6f 75 6e 64 22 29 3b 0a 20 20 73 74 79 6c 65 5f  ound");.  style_
99f0: 68 65 61 64 65 72 28 22 4e 6f 74 20 46 6f 75 6e  header("Not Foun
9a00: 64 22 29 3b 0a 20 20 40 20 3c 70 3e 25 68 28 7a  d");.  @ <p>%h(z
9a10: 4d 73 67 29 3c 2f 70 3e 0a 20 20 63 67 69 5f 73  Msg)</p>.  cgi_s
9a20: 65 74 5f 73 74 61 74 75 73 28 34 30 34 2c 20 22  et_status(404, "
9a30: 4e 6f 74 20 46 6f 75 6e 64 22 29 3b 0a 20 20 73  Not Found");.  s
9a40: 74 79 6c 65 5f 66 69 6e 69 73 68 5f 70 61 67 65  tyle_finish_page
9a50: 28 22 65 6e 6f 74 66 6f 75 6e 64 22 29 3b 0a 7d  ("enotfound");.}
9a60: 0a 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a  ..#if INTERFACE.
9a70: 23 20 64 65 66 69 6e 65 20 77 65 62 70 61 67 65  # define webpage
9a80: 5f 61 73 73 65 72 74 28 54 29 20 69 66 28 21 28  _assert(T) if(!(
9a90: 54 29 29 7b 77 65 62 70 61 67 65 5f 61 73 73 65  T)){webpage_asse
9aa0: 72 74 5f 70 61 67 65 28 5f 5f 46 49 4c 45 5f 5f  rt_page(__FILE__
9ab0: 2c 5f 5f 4c 49 4e 45 5f 5f 2c 23 54 29 3b 7d 0a  ,__LINE__,#T);}.
9ac0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
9ad0: 74 75 72 6e 73 20 61 20 70 73 65 75 64 6f 2d 72  turns a pseudo-r
9ae0: 61 6e 64 6f 6d 20 69 6e 70 75 74 20 66 69 65 6c  andom input fiel
9af0: 64 20 49 44 2c 20 66 6f 72 20 75 73 65 20 69 6e  d ID, for use in
9b00: 20 61 73 73 6f 63 69 61 74 69 6e 67 20 61 6e 0a   associating an.
9b10: 2a 2a 20 49 44 2d 6c 65 73 73 20 69 6e 70 75 74  ** ID-less input
9b20: 20 66 69 65 6c 64 20 77 69 74 68 20 61 20 6c 61   field with a la
9b30: 62 65 6c 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20  bel. The memory 
9b40: 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65 0a  is owned by the.
9b50: 2a 2a 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  ** caller..*/.st
9b60: 61 74 69 63 20 63 68 61 72 20 2a 20 73 74 79 6c  atic char * styl
9b70: 65 5f 6e 65 78 74 5f 69 6e 70 75 74 5f 69 64 28  e_next_input_id(
9b80: 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
9b90: 69 6e 70 75 74 49 44 20 3d 20 30 3b 0a 20 20 2b  inputID = 0;.  +
9ba0: 2b 69 6e 70 75 74 49 44 3b 0a 20 20 72 65 74 75  +inputID;.  retu
9bb0: 72 6e 20 6d 70 72 69 6e 74 66 28 22 69 6e 70 75  rn mprintf("inpu
9bc0: 74 2d 69 64 2d 25 64 22 2c 20 69 6e 70 75 74 49  t-id-%d", inputI
9bd0: 44 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  D);.}../*.** Out
9be0: 70 75 74 73 20 61 20 6c 61 62 65 6c 65 64 20 63  puts a labeled c
9bf0: 68 65 63 6b 62 6f 78 20 65 6c 65 6d 65 6e 74 2e  heckbox element.
9c00: 20 7a 57 72 61 70 70 65 72 49 64 20 69 73 20 61   zWrapperId is a
9c10: 6e 20 6f 70 74 69 6f 6e 61 6c 20 49 44 0a 2a 2a  n optional ID.**
9c20: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63   value for the c
9c30: 6f 6e 74 61 69 6e 69 6e 67 20 65 6c 65 6d 65 6e  ontaining elemen
9c40: 74 20 28 73 65 65 20 62 65 6c 6f 77 29 2e 20 7a  t (see below). z
9c50: 46 69 65 6c 64 4e 61 6d 65 20 69 73 20 74 68 65  FieldName is the
9c60: 0a 2a 2a 20 66 6f 72 6d 20 65 6c 65 6d 65 6e 74  .** form element
9c70: 20 6e 61 6d 65 2e 20 7a 4c 61 62 65 6c 20 69 73   name. zLabel is
9c80: 20 74 68 65 20 6c 61 62 65 6c 20 66 6f 72 20 74   the label for t
9c90: 68 65 20 63 68 65 63 6b 62 6f 78 2e 20 7a 56 61  he checkbox. zVa
9ca0: 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 6f 70  lue is.** the op
9cb0: 74 69 6f 6e 61 6c 20 76 61 6c 75 65 20 66 6f 72  tional value for
9cc0: 20 74 68 65 20 63 68 65 63 6b 62 6f 78 2e 20 7a   the checkbox. z
9cd0: 54 69 70 20 69 73 20 61 6e 20 6f 70 74 69 6f 6e  Tip is an option
9ce0: 61 6c 20 74 6f 6f 6c 74 69 70 2c 0a 2a 2a 20 77  al tooltip,.** w
9cf0: 68 69 63 68 20 67 65 74 73 20 73 65 74 20 61 73  hich gets set as
9d00: 20 74 68 65 20 22 74 69 74 6c 65 22 20 61 74 74   the "title" att
9d10: 72 69 62 75 74 65 20 6f 66 20 74 68 65 20 6f 75  ribute of the ou
9d20: 74 65 72 6d 6f 73 74 0a 2a 2a 20 65 6c 65 6d 65  termost.** eleme
9d30: 6e 74 2e 20 49 66 20 69 73 43 68 65 63 6b 65 64  nt. If isChecked
9d40: 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 63 68   is true, the ch
9d50: 65 63 6b 62 6f 78 20 67 65 74 73 20 74 68 65 20  eckbox gets the 
9d60: 22 63 68 65 63 6b 65 64 22 0a 2a 2a 20 61 74 74  "checked".** att
9d70: 72 69 62 75 74 65 20 73 65 74 2c 20 65 6c 73 65  ribute set, else
9d80: 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a   it is not..**.*
9d90: 2a 20 52 65 73 75 6c 74 69 6e 67 20 73 74 72 75  * Resulting stru
9da0: 63 74 75 72 65 3a 0a 2a 2a 0a 2a 2a 20 3c 64 69  cture:.**.** <di
9db0: 76 20 63 6c 61 73 73 3d 27 69 6e 70 75 74 2d 77  v class='input-w
9dc0: 69 74 68 2d 6c 61 62 65 6c 27 20 74 69 74 6c 65  ith-label' title
9dd0: 3d 7b 7b 7a 54 69 70 7d 7d 20 69 64 3d 7b 7b 7a  ={{zTip}} id={{z
9de0: 57 72 61 70 70 65 72 49 64 7d 7d 3e 0a 2a 2a 20  WrapperId}}>.** 
9df0: 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 27 63    <input type='c
9e00: 68 65 63 6b 62 6f 78 27 20 6e 61 6d 65 3d 7b 7b  heckbox' name={{
9e10: 7a 46 69 65 6c 64 4e 61 6d 65 7d 7d 20 76 61 6c  zFieldName}} val
9e20: 75 65 3d 7b 7b 7a 56 61 6c 75 65 7d 7d 0a 2a 2a  ue={{zValue}}.**
9e30: 20 20 20 20 20 20 20 20 20 20 69 64 3d 27 41 20            id='A 
9e40: 52 41 4e 44 4f 4d 20 56 41 4c 55 45 27 0a 2a 2a  RANDOM VALUE'.**
9e50: 20 20 20 20 20 20 20 20 20 20 7b 7b 69 73 43 68            {{isCh
9e60: 65 63 6b 65 64 20 3f 20 22 20 63 68 65 63 6b 65  ecked ? " checke
9e70: 64 20 3a 20 22 22 7d 7d 2f 3e 0a 2a 2a 20 20 20  d : ""}}/>.**   
9e80: 3c 6c 61 62 65 6c 20 66 6f 72 3d 27 49 44 20 4f  <label for='ID O
9e90: 46 20 54 48 45 20 49 4e 50 55 54 20 46 49 45 4c  F THE INPUT FIEL
9ea0: 44 27 3e 7b 7b 7a 4c 61 62 65 6c 7d 7d 3c 2f 6c  D'>{{zLabel}}</l
9eb0: 61 62 65 6c 3e 0a 2a 2a 20 3c 2f 64 69 76 3e 0a  abel>.** </div>.
9ec0: 2a 2a 0a 2a 2a 20 7a 4c 61 62 65 6c 2c 20 61 6e  **.** zLabel, an
9ed0: 64 20 7a 56 61 6c 75 65 20 61 72 65 20 72 65 71  d zValue are req
9ee0: 75 69 72 65 64 2e 20 7a 46 69 65 6c 64 4e 61 6d  uired. zFieldNam
9ef0: 65 2c 20 7a 57 72 61 70 70 65 72 49 64 2c 20 61  e, zWrapperId, a
9f00: 6e 64 20 7a 54 69 70 0a 2a 2a 20 61 72 65 20 6d  nd zTip.** are m
9f10: 61 79 20 62 65 20 4e 55 4c 4c 20 6f 72 20 65 6d  ay be NULL or em
9f20: 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 42 65 20 73 75  pty..**.** Be su
9f30: 72 65 20 74 68 61 74 20 74 68 65 20 69 6e 70 75  re that the inpu
9f40: 74 2d 77 69 74 68 2d 6c 61 62 65 6c 20 43 53 53  t-with-label CSS
9f50: 20 63 6c 61 73 73 20 69 73 20 64 65 66 69 6e 65   class is define
9f60: 64 20 73 65 6e 73 69 62 6c 79 2c 20 69 6e 0a 2a  d sensibly, in.*
9f70: 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 68 61  * particular, ha
9f80: 76 69 6e 67 20 69 74 73 20 64 69 73 70 6c 61 79  ving its display
9f90: 3a 69 6e 6c 69 6e 65 2d 62 6c 6f 63 6b 20 69 73  :inline-block is
9fa0: 20 75 73 65 66 75 6c 20 66 6f 72 20 61 6c 69 67   useful for alig
9fb0: 6e 6d 65 6e 74 0a 2a 2a 20 70 75 72 70 6f 73 65  nment.** purpose
9fc0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 74 79 6c 65  s..*/.void style
9fd0: 5f 6c 61 62 65 6c 65 64 5f 63 68 65 63 6b 62 6f  _labeled_checkbo
9fe0: 78 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a  x(const char * z
9ff0: 57 72 61 70 70 65 72 49 64 2c 0a 20 20 20 20 20  WrapperId,.     
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a010: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
a020: 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 2c 20 63  r *zFieldName, c
a030: 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 4c 61 62  onst char * zLab
a040: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  el,.            
a050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a060: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 56 61  const char * zVa
a070: 6c 75 65 2c 20 69 6e 74 20 69 73 43 68 65 63 6b  lue, int isCheck
a080: 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 54 69  const char * zTi
a0b0: 70 29 7b 0a 20 20 63 68 61 72 20 2a 20 7a 4c 61  p){.  char * zLa
a0c0: 62 65 6c 49 44 20 3d 20 73 74 79 6c 65 5f 6e 65  belID = style_ne
a0d0: 78 74 5f 69 6e 70 75 74 5f 69 64 28 29 3b 0a 20  xt_input_id();. 
a0e0: 20 43 58 28 22 3c 64 69 76 20 63 6c 61 73 73 3d   CX("<div class=
a0f0: 27 69 6e 70 75 74 2d 77 69 74 68 2d 6c 61 62 65  'input-with-labe
a100: 6c 27 22 29 3b 0a 20 20 69 66 28 7a 54 69 70 20  l'");.  if(zTip 
a110: 26 26 20 2a 7a 54 69 70 29 7b 0a 20 20 20 20 43  && *zTip){.    C
a120: 58 28 22 20 74 69 74 6c 65 3d 27 25 68 27 22 2c  X(" title='%h'",
a130: 20 7a 54 69 70 29 3b 0a 20 20 7d 0a 20 20 69 66   zTip);.  }.  if
a140: 28 7a 57 72 61 70 70 65 72 49 64 20 26 26 20 2a  (zWrapperId && *
a150: 7a 57 72 61 70 70 65 72 49 64 29 7b 0a 20 20 20  zWrapperId){.   
a160: 20 43 58 28 22 20 69 64 3d 27 25 73 27 22 2c 7a   CX(" id='%s'",z
a170: 57 72 61 70 70 65 72 49 64 29 3b 0a 20 20 7d 0a  WrapperId);.  }.
a180: 20 20 43 58 28 22 3e 3c 69 6e 70 75 74 20 74 79    CX("><input ty
a190: 70 65 3d 27 63 68 65 63 6b 62 6f 78 27 20 69 64  pe='checkbox' id
a1a0: 3d 27 25 73 27 20 22 2c 20 7a 4c 61 62 65 6c 49  ='%s' ", zLabelI
a1b0: 44 29 3b 0a 20 20 69 66 28 7a 46 69 65 6c 64 4e  D);.  if(zFieldN
a1c0: 61 6d 65 20 26 26 20 2a 7a 46 69 65 6c 64 4e 61  ame && *zFieldNa
a1d0: 6d 65 29 7b 0a 20 20 20 20 43 58 28 22 6e 61 6d  me){.    CX("nam
a1e0: 65 3d 27 25 73 27 20 22 2c 7a 46 69 65 6c 64 4e  e='%s' ",zFieldN
a1f0: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 43 58 28 22  ame);.  }.  CX("
a200: 76 61 6c 75 65 3d 27 25 54 27 25 73 2f 3e 22 2c  value='%T'%s/>",
a210: 0a 20 20 20 20 20 7a 56 61 6c 75 65 20 3f 20 7a  .     zValue ? z
a220: 56 61 6c 75 65 20 3a 20 22 22 2c 20 69 73 43 68  Value : "", isCh
a230: 65 63 6b 65 64 20 3f 20 22 20 63 68 65 63 6b 65  ecked ? " checke
a240: 64 22 20 3a 20 22 22 29 3b 0a 20 20 43 58 28 22  d" : "");.  CX("
a250: 3c 6c 61 62 65 6c 20 66 6f 72 3d 27 25 73 27 3e  <label for='%s'>
a260: 25 68 3c 2f 6c 61 62 65 6c 3e 3c 2f 64 69 76 3e  %h</label></div>
a270: 22 2c 20 7a 4c 61 62 65 6c 49 44 2c 20 7a 4c 61  ", zLabelID, zLa
a280: 62 65 6c 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 66  bel);.  fossil_f
a290: 72 65 65 28 7a 4c 61 62 65 6c 49 44 29 3b 0a 7d  ree(zLabelID);.}
a2a0: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 73 20  ../*.** Outputs 
a2b0: 61 20 53 45 4c 45 43 54 20 6c 69 73 74 20 66 72  a SELECT list fr
a2c0: 6f 6d 20 61 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  om a compile-tim
a2d0: 65 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65  e list of intege
a2e0: 72 73 2e 0a 2a 2a 20 54 68 65 20 76 61 72 67 73  rs..** The vargs
a2f0: 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73 74 20   must be a list 
a300: 6f 66 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  of (const char *
a310: 2c 20 69 6e 74 29 20 70 61 69 72 73 2c 20 74 65  , int) pairs, te
a320: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 69 74 68  rminated.** with
a330: 20 61 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 20   a single NULL. 
a340: 45 61 63 68 20 70 61 69 72 20 69 73 20 69 6e 74  Each pair is int
a350: 65 72 70 72 65 74 65 64 20 61 73 2e 2e 2e 0a 2a  erpreted as....*
a360: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 28 63 6f 6e  *.** If the (con
a370: 73 74 20 63 68 61 72 20 2a 29 20 69 73 20 4e 55  st char *) is NU
a380: 4c 4c 2c 20 69 74 20 69 73 20 74 68 65 20 65 6e  LL, it is the en
a390: 64 20 6f 66 20 74 68 65 20 6c 69 73 74 2c 20 65  d of the list, e
a3a0: 6c 73 65 0a 2a 2a 20 61 20 6e 65 77 20 4f 50 54  lse.** a new OPT
a3b0: 49 4f 4e 20 65 6e 74 72 79 20 69 73 20 63 72 65  ION entry is cre
a3c0: 61 74 65 64 2e 20 49 66 20 74 68 65 20 73 74 72  ated. If the str
a3d0: 69 6e 67 20 69 73 20 65 6d 70 74 79 2c 20 74 68  ing is empty, th
a3e0: 65 0a 2a 2a 20 6c 61 62 65 6c 20 61 6e 64 20 76  e.** label and v
a3f0: 61 6c 75 65 20 6f 66 20 74 68 65 20 4f 50 54 49  alue of the OPTI
a400: 4f 4e 20 69 73 20 74 68 65 20 69 6e 74 65 67 65  ON is the intege
a410: 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61  r part of the pa
a420: 69 72 2e 0a 2a 2a 20 49 66 20 74 68 65 20 73 74  ir..** If the st
a430: 72 69 6e 67 20 69 73 20 6e 6f 74 20 65 6d 70 74  ring is not empt
a440: 79 2c 20 69 74 20 62 65 63 6f 6d 65 73 20 74 68  y, it becomes th
a450: 65 20 6c 61 62 65 6c 20 61 6e 64 20 74 68 65 20  e label and the 
a460: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 65 20 76  integer.** the v
a470: 61 6c 75 65 2e 20 49 66 20 74 68 61 74 20 76 61  alue. If that va
a480: 6c 75 65 20 3d 3d 20 73 65 6c 65 63 74 65 64 56  lue == selectedV
a490: 61 6c 75 65 20 74 68 65 6e 20 74 68 61 74 20 4f  alue then that O
a4a0: 50 54 49 4f 4e 0a 2a 2a 20 65 6c 65 6d 65 6e 74  PTION.** element
a4b0: 20 67 65 74 73 20 74 68 65 20 27 73 65 6c 65 63   gets the 'selec
a4c0: 74 65 64 27 20 61 74 74 72 69 62 75 74 65 2e 0a  ted' attribute..
a4d0: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
a4e0: 74 68 65 20 70 61 69 72 73 20 61 72 65 20 6e 6f  the pairs are no
a4f0: 74 20 69 6e 20 28 69 6e 74 2c 20 63 6f 6e 73 74  t in (int, const
a500: 20 63 68 61 72 20 2a 29 20 6f 72 64 65 72 20 62   char *) order b
a510: 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 72 65 20  ecause.** there 
a520: 69 73 20 6e 6f 20 77 65 6c 6c 2d 6b 6e 6f 77 6e  is no well-known
a530: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 77   integer value w
a540: 68 69 63 68 20 77 65 20 63 61 6e 20 64 65 66 69  hich we can defi
a550: 6e 69 74 69 76 65 6c 79 20 75 73 65 0a 2a 2a 20  nitively use.** 
a560: 61 73 20 61 20 6c 69 73 74 20 74 65 72 6d 69 6e  as a list termin
a570: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 7a 57 72 61  ator..**.** zWra
a580: 70 70 65 72 49 64 20 69 73 20 61 6e 20 6f 70 74  pperId is an opt
a590: 69 6f 6e 61 6c 20 49 44 20 76 61 6c 75 65 20 66  ional ID value f
a5a0: 6f 72 20 74 68 65 20 63 6f 6e 74 61 69 6e 69 6e  or the containin
a5b0: 67 20 65 6c 65 6d 65 6e 74 20 28 73 65 65 0a 2a  g element (see.*
a5c0: 2a 20 62 65 6c 6f 77 29 2e 0a 2a 2a 0a 2a 2a 20  * below)..**.** 
a5d0: 7a 46 69 65 6c 64 4e 61 6d 65 20 69 73 20 74 68  zFieldName is th
a5e0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66  e value of the f
a5f0: 6f 72 6d 20 65 6c 65 6d 65 6e 74 27 73 20 6e 61  orm element's na
a600: 6d 65 20 61 74 74 72 69 62 75 74 65 2e 20 4e 6f  me attribute. No
a610: 74 65 0a 2a 2a 20 74 68 61 74 20 66 6f 73 73 69  te.** that fossi
a620: 6c 20 70 72 65 66 65 72 73 20 75 6e 64 65 72 73  l prefers unders
a630: 63 6f 72 65 73 20 6f 76 65 72 20 27 2d 27 20 66  cores over '-' f
a640: 6f 72 20 73 65 70 61 72 61 74 6f 72 73 20 69 6e  or separators in
a650: 20 66 6f 72 6d 0a 2a 2a 20 65 6c 65 6d 65 6e 74   form.** element
a660: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 7a 4c   names..**.** zL
a670: 61 62 65 6c 20 69 73 20 61 6e 20 6f 70 74 69 6f  abel is an optio
a680: 6e 61 6c 20 73 74 72 69 6e 67 20 74 6f 20 75 73  nal string to us
a690: 65 20 61 73 20 61 20 22 6c 61 62 65 6c 22 20 66  e as a "label" f
a6a0: 6f 72 20 74 68 65 20 65 6c 65 6d 65 6e 74 0a 2a  or the element.*
a6b0: 2a 20 28 73 65 65 20 62 65 6c 6f 77 29 2e 0a 2a  * (see below)..*
a6c0: 2a 0a 2a 2a 20 7a 54 6f 6f 6c 74 69 70 20 69 73  *.** zTooltip is
a6d0: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 76 61 6c   an optional val
a6e0: 75 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43  ue for the SELEC
a6f0: 54 27 73 20 74 69 74 6c 65 20 61 74 74 72 69 62  T's title attrib
a700: 75 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ute..**.** The s
a710: 74 72 75 63 74 75 72 65 20 6f 66 20 74 68 65 20  tructure of the 
a720: 65 6d 69 74 74 65 64 20 48 54 4d 4c 20 69 73 3a  emitted HTML is:
a730: 0a 2a 2a 0a 2a 2a 20 3c 64 69 76 20 63 6c 61 73  .**.** <div clas
a740: 73 3d 27 69 6e 70 75 74 2d 77 69 74 68 2d 6c 61  s='input-with-la
a750: 62 65 6c 27 20 74 69 74 6c 65 3d 7b 7b 7a 54 6f  bel' title={{zTo
a760: 6f 6c 54 69 70 7d 7d 20 69 64 3d 7b 7b 7a 57 72  olTip}} id={{zWr
a770: 61 70 70 65 72 49 64 7d 7d 3e 0a 2a 2a 20 20 20  apperId}}>.**   
a780: 3c 6c 61 62 65 6c 20 66 6f 72 3d 27 53 45 4c 45  <label for='SELE
a790: 43 54 20 45 4c 45 4d 45 4e 54 20 49 44 27 3e 7b  CT ELEMENT ID'>{
a7a0: 7b 7a 4c 61 62 65 6c 7d 7d 3c 2f 6c 61 62 65 6c  {zLabel}}</label
a7b0: 3e 0a 2a 2a 20 20 20 3c 73 65 6c 65 63 74 20 69  >.**   <select i
a7c0: 64 3d 27 52 41 4e 44 4f 4d 20 49 44 27 20 6e 61  d='RANDOM ID' na
a7d0: 6d 65 3d 7b 7b 7a 46 69 65 6c 64 4e 61 6d 65 7d  me={{zFieldName}
a7e0: 7d 3e 2e 2e 2e 3c 2f 73 65 6c 65 63 74 3e 0a 2a  }>...</select>.*
a7f0: 2a 20 3c 2f 64 69 76 3e 0a 2a 2a 0a 2a 2a 20 45  * </div>.**.** E
a800: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 73 74  xample:.**.** st
a810: 79 6c 65 5f 73 65 6c 65 63 74 5f 6c 69 73 74 5f  yle_select_list_
a820: 69 6e 74 28 22 6d 79 2d 67 72 61 70 65 73 22 2c  int("my-grapes",
a830: 20 22 6d 79 5f 67 72 61 70 65 73 22 2c 20 22 47   "my_grapes", "G
a840: 72 61 70 65 73 22 2c 0a 2a 2a 20 20 20 20 20 20  rapes",.**      
a850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a860: 22 53 65 6c 65 63 74 20 74 68 65 20 6e 75 6d 62  "Select the numb
a870: 65 72 20 6f 66 20 67 72 61 70 65 73 22 2c 0a 2a  er of grapes",.*
a880: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
a890: 20 20 20 20 20 20 20 20 61 74 6f 69 28 50 44 28          atoi(PD(
a8a0: 22 6d 79 5f 66 69 65 6c 64 22 2c 22 30 22 29 29  "my_field","0"))
a8b0: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
a8c0: 20 20 20 20 20 20 20 20 20 20 20 22 22 2c 20 31             "", 1
a8d0: 2c 20 22 32 22 2c 20 32 2c 20 22 54 68 72 65 65  , "2", 2, "Three
a8e0: 22 2c 20 33 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ", 3,.**        
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
a900: 55 4c 4c 29 3b 0a 2a 2a 20 0a 2a 2f 0a 76 6f 69  ULL);.** .*/.voi
a910: 64 20 73 74 79 6c 65 5f 73 65 6c 65 63 74 5f 6c  d style_select_l
a920: 69 73 74 5f 69 6e 74 28 63 6f 6e 73 74 20 63 68  ist_int(const ch
a930: 61 72 20 2a 20 7a 57 72 61 70 70 65 72 49 64 2c  ar * zWrapperId,
a940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a950: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
a960: 74 20 63 68 61 72 20 2a 7a 46 69 65 6c 64 4e 61  t char *zFieldNa
a970: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
a980: 20 7a 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20   zLabel,.       
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
a9b0: 20 7a 54 6f 6f 6c 54 69 70 2c 20 69 6e 74 20 73   zToolTip, int s
a9c0: 65 6c 65 63 74 65 64 56 61 6c 2c 0a 20 20 20 20  electedVal,.    
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 20 20 20 20 20 20 20 2e 2e 2e 20 29 7b 0a 20 20         ... ){.  
a9f0: 63 68 61 72 20 2a 20 7a 4c 61 62 65 6c 49 44 20  char * zLabelID 
aa00: 3d 20 73 74 79 6c 65 5f 6e 65 78 74 5f 69 6e 70  = style_next_inp
aa10: 75 74 5f 69 64 28 29 3b 0a 20 20 76 61 5f 6c 69  ut_id();.  va_li
aa20: 73 74 20 76 61 72 67 73 3b 0a 0a 20 20 76 61 5f  st vargs;..  va_
aa30: 73 74 61 72 74 28 76 61 72 67 73 2c 73 65 6c 65  start(vargs,sele
aa40: 63 74 65 64 56 61 6c 29 3b 0a 20 20 43 58 28 22  ctedVal);.  CX("
aa50: 3c 64 69 76 20 63 6c 61 73 73 3d 27 69 6e 70 75  <div class='inpu
aa60: 74 2d 77 69 74 68 2d 6c 61 62 65 6c 27 22 29 3b  t-with-label'");
aa70: 0a 20 20 69 66 28 7a 54 6f 6f 6c 54 69 70 20 26  .  if(zToolTip &
aa80: 26 20 2a 7a 54 6f 6f 6c 54 69 70 29 7b 0a 20 20  & *zToolTip){.  
aa90: 20 20 43 58 28 22 20 74 69 74 6c 65 3d 27 25 68    CX(" title='%h
aaa0: 27 22 2c 7a 54 6f 6f 6c 54 69 70 29 3b 0a 20 20  '",zToolTip);.  
aab0: 7d 0a 20 20 69 66 28 7a 57 72 61 70 70 65 72 49  }.  if(zWrapperI
aac0: 64 20 26 26 20 2a 7a 57 72 61 70 70 65 72 49 64  d && *zWrapperId
aad0: 29 7b 0a 20 20 20 20 43 58 28 22 20 69 64 3d 27  ){.    CX(" id='
aae0: 25 73 27 22 2c 7a 57 72 61 70 70 65 72 49 64 29  %s'",zWrapperId)
aaf0: 3b 0a 20 20 7d 0a 20 20 43 58 28 22 3e 22 29 3b  ;.  }.  CX(">");
ab00: 0a 20 20 69 66 28 7a 4c 61 62 65 6c 20 26 26 20  .  if(zLabel && 
ab10: 2a 7a 4c 61 62 65 6c 29 7b 0a 20 20 20 20 43 58  *zLabel){.    CX
ab20: 28 22 3c 6c 61 62 65 6c 20 66 6f 72 3d 27 25 73  ("<label for='%s
ab30: 27 3e 25 68 3c 2f 6c 61 62 65 6c 3e 22 2c 20 7a  '>%h</label>", z
ab40: 4c 61 62 65 6c 49 44 2c 20 7a 4c 61 62 65 6c 29  LabelID, zLabel)
ab50: 3b 0a 20 20 7d 0a 20 20 43 58 28 22 3c 73 65 6c  ;.  }.  CX("<sel
ab60: 65 63 74 20 6e 61 6d 65 3d 27 25 73 27 20 69 64  ect name='%s' id
ab70: 3d 27 25 73 27 3e 22 2c 7a 46 69 65 6c 64 4e 61  ='%s'>",zFieldNa
ab80: 6d 65 2c 20 7a 4c 61 62 65 6c 49 44 29 3b 0a 20  me, zLabelID);. 
ab90: 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 63   while(1){.    c
aba0: 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 4f 70 74  onst char * zOpt
abb0: 69 6f 6e 20 3d 20 76 61 5f 61 72 67 28 76 61 72  ion = va_arg(var
abc0: 67 73 2c 63 68 61 72 20 2a 29 3b 0a 20 20 20 20  gs,char *);.    
abd0: 69 6e 74 20 76 3b 0a 20 20 20 20 69 66 28 4e 55  int v;.    if(NU
abe0: 4c 4c 3d 3d 7a 4f 70 74 69 6f 6e 29 7b 0a 20 20  LL==zOption){.  
abf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ac00: 0a 20 20 20 20 76 20 3d 20 76 61 5f 61 72 67 28  .    v = va_arg(
ac10: 76 61 72 67 73 2c 69 6e 74 29 3b 0a 20 20 20 20  vargs,int);.    
ac20: 43 58 28 22 3c 6f 70 74 69 6f 6e 20 76 61 6c 75  CX("<option valu
ac30: 65 3d 27 25 64 27 25 73 3e 22 2c 0a 20 20 20 20  e='%d'%s>",.    
ac40: 20 20 20 20 20 76 2c 20 76 3d 3d 73 65 6c 65 63       v, v==selec
ac50: 74 65 64 56 61 6c 20 3f 20 22 20 73 65 6c 65 63  tedVal ? " selec
ac60: 74 65 64 22 20 3a 20 22 22 29 3b 0a 20 20 20 20  ted" : "");.    
ac70: 69 66 28 2a 7a 4f 70 74 69 6f 6e 29 7b 0a 20 20  if(*zOption){.  
ac80: 20 20 20 20 43 58 28 22 25 73 22 2c 20 7a 4f 70      CX("%s", zOp
ac90: 74 69 6f 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tion);.    }else
aca0: 7b 0a 20 20 20 20 20 20 43 58 28 22 25 64 22 2c  {.      CX("%d",
acb0: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 43 58  v);.    }.    CX
acc0: 28 22 3c 2f 6f 70 74 69 6f 6e 3e 5c 6e 22 29 3b  ("</option>\n");
acd0: 0a 20 20 7d 0a 20 20 43 58 28 22 3c 2f 73 65 6c  .  }.  CX("</sel
ace0: 65 63 74 3e 5c 6e 22 29 3b 0a 20 20 43 58 28 22  ect>\n");.  CX("
acf0: 3c 2f 64 69 76 3e 5c 6e 22 29 3b 0a 20 20 76 61  </div>\n");.  va
ad00: 5f 65 6e 64 28 76 61 72 67 73 29 3b 0a 20 20 66  _end(vargs);.  f
ad10: 6f 73 73 69 6c 5f 66 72 65 65 28 7a 4c 61 62 65  ossil_free(zLabe
ad20: 6c 49 44 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  lID);.}../*.** T
ad30: 68 65 20 43 2d 73 74 72 69 6e 67 20 63 6f 75 6e  he C-string coun
ad40: 74 65 72 70 61 72 74 20 6f 66 20 73 74 79 6c 65  terpart of style
ad50: 5f 73 65 6c 65 63 74 5f 6c 69 73 74 5f 69 6e 74  _select_list_int
ad60: 28 29 2c 20 74 68 69 73 20 76 61 72 69 61 6e 74  (), this variant
ad70: 0a 2a 2a 20 64 69 66 66 65 72 73 20 6f 6e 6c 79  .** differs only
ad80: 20 69 6e 20 74 68 61 74 20 69 74 73 20 76 61 72   in that its var
ad90: 69 61 64 69 63 20 61 72 67 75 6d 65 6e 74 73 20  iadic arguments 
ada0: 61 72 65 20 43 2d 73 74 72 69 6e 67 73 20 69 6e  are C-strings in
adb0: 20 70 61 69 72 73 0a 2a 2a 20 6f 66 20 28 6f 70   pairs.** of (op
adc0: 74 69 6f 6e 4c 61 62 65 6c 2c 20 6f 70 74 69 6f  tionLabel, optio
add0: 6e 56 61 6c 75 65 29 2e 20 49 66 20 61 20 67 69  nValue). If a gi
ade0: 76 65 6e 20 6f 70 74 69 6f 6e 4c 61 62 65 6c 20  ven optionLabel 
adf0: 69 73 20 61 6e 20 65 6d 70 74 79 0a 2a 2a 20 73  is an empty.** s
ae00: 74 72 69 6e 67 2c 20 74 68 65 20 63 6f 72 72 65  tring, the corre
ae10: 73 70 6f 6e 64 69 6e 67 20 6f 70 74 69 6f 6e 56  sponding optionV
ae20: 61 6c 75 65 20 69 73 20 75 73 65 64 20 61 73 20  alue is used as 
ae30: 69 74 73 20 6c 61 62 65 6c 2e 20 49 66 20 61 6e  its label. If an
ae40: 79 0a 2a 2a 20 67 69 76 65 6e 20 76 61 6c 75 65  y.** given value
ae50: 20 6d 61 74 63 68 65 73 20 7a 53 65 6c 65 63 74   matches zSelect
ae60: 65 64 56 61 6c 2c 20 74 68 61 74 20 6f 70 74 69  edVal, that opti
ae70: 6f 6e 20 67 65 74 73 20 70 72 65 73 65 6c 65 63  on gets preselec
ae80: 74 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 6f 70  ted. If.** no op
ae90: 74 69 6f 6e 73 20 6d 61 74 63 68 20 7a 53 65 6c  tions match zSel
aea0: 65 63 74 65 64 56 61 6c 20 74 68 65 6e 20 74 68  ectedVal then th
aeb0: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 73  e first entry is
aec0: 20 73 65 6c 65 63 74 65 64 20 62 79 0a 2a 2a 20   selected by.** 
aed0: 64 65 66 61 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 41  default..**.** A
aee0: 6e 79 20 6f 66 20 28 7a 57 72 61 70 70 65 72 49  ny of (zWrapperI
aef0: 64 2c 20 7a 54 6f 6f 6c 74 69 70 2c 20 7a 53 65  d, zTooltip, zSe
af00: 6c 65 63 74 65 64 56 61 6c 29 20 6d 61 79 20 62  lectedVal) may b
af10: 65 20 4e 55 4c 4c 20 6f 72 20 65 6d 70 74 79 2e  e NULL or empty.
af20: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a  .**.** Example:.
af30: 2a 2a 0a 2a 2a 20 73 74 79 6c 65 5f 73 65 6c 65  **.** style_sele
af40: 63 74 5f 6c 69 73 74 5f 73 74 72 28 22 6d 79 2d  ct_list_str("my-
af50: 67 72 61 70 65 73 22 2c 20 22 6d 79 5f 67 72 61  grapes", "my_gra
af60: 70 65 73 22 2c 20 22 47 72 61 70 65 73 22 2c 0a  pes", "Grapes",.
af70: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
af80: 20 20 20 20 20 20 20 20 22 53 65 6c 65 63 74 20          "Select 
af90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 67 72  the number of gr
afa0: 61 70 65 73 22 2c 0a 2a 2a 20 20 20 20 20 20 20  apes",.**       
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afc0: 50 28 22 6d 79 5f 66 69 65 6c 64 22 29 2c 0a 2a  P("my_field"),.*
afd0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
afe0: 20 20 20 20 20 20 20 20 22 31 22 2c 20 22 4f 6e          "1", "On
aff0: 65 22 2c 20 22 32 22 2c 20 22 54 77 6f 22 2c 20  e", "2", "Two", 
b000: 22 22 2c 20 22 33 22 2c 0a 2a 2a 20 20 20 20 20  "", "3",.**     
b010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b020: 20 20 4e 55 4c 4c 29 3b 0a 2a 2f 0a 76 6f 69 64    NULL);.*/.void
b030: 20 73 74 79 6c 65 5f 73 65 6c 65 63 74 5f 6c 69   style_select_li
b040: 73 74 5f 73 74 72 28 63 6f 6e 73 74 20 63 68 61  st_str(const cha
b050: 72 20 2a 20 7a 57 72 61 70 70 65 72 49 64 2c 0a  r * zWrapperId,.
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b070: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
b080: 20 63 68 61 72 20 2a 7a 46 69 65 6c 64 4e 61 6d   char *zFieldNam
b090: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  e, const char * 
b0a0: 7a 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20  zLabel,.        
b0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20     const char * 
b0d0: 7a 54 6f 6f 6c 54 69 70 2c 20 63 68 61 72 20 63  zToolTip, char c
b0e0: 6f 6e 73 74 20 2a 20 7a 53 65 6c 65 63 74 65 64  onst * zSelected
b0f0: 56 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Val,.           
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 2e 2e 2e 20 29 7b 0a 20 20 63 68 61 72 20 2a 20  ... ){.  char * 
b120: 7a 4c 61 62 65 6c 49 44 20 3d 20 73 74 79 6c 65  zLabelID = style
b130: 5f 6e 65 78 74 5f 69 6e 70 75 74 5f 69 64 28 29  _next_input_id()
b140: 3b 0a 20 20 76 61 5f 6c 69 73 74 20 76 61 72 67  ;.  va_list varg
b150: 73 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 76  s;..  va_start(v
b160: 61 72 67 73 2c 7a 53 65 6c 65 63 74 65 64 56 61  args,zSelectedVa
b170: 6c 29 3b 0a 20 20 69 66 28 21 7a 53 65 6c 65 63  l);.  if(!zSelec
b180: 74 65 64 56 61 6c 29 7b 0a 20 20 20 20 7a 53 65  tedVal){.    zSe
b190: 6c 65 63 74 65 64 56 61 6c 20 3d 20 5f 5f 46 49  lectedVal = __FI
b1a0: 4c 45 5f 5f 2f 2a 73 6f 6d 65 20 73 74 72 69 6e  LE__/*some strin
b1b0: 67 20 77 65 27 6c 6c 20 6e 65 76 65 72 20 6d 61  g we'll never ma
b1c0: 74 63 68 2a 2f 3b 0a 20 20 7d 0a 20 20 43 58 28  tch*/;.  }.  CX(
b1d0: 22 3c 64 69 76 20 63 6c 61 73 73 3d 27 69 6e 70  "<div class='inp
b1e0: 75 74 2d 77 69 74 68 2d 6c 61 62 65 6c 27 22 29  ut-with-label'")
b1f0: 3b 0a 20 20 69 66 28 7a 54 6f 6f 6c 54 69 70 20  ;.  if(zToolTip 
b200: 26 26 20 2a 7a 54 6f 6f 6c 54 69 70 29 7b 0a 20  && *zToolTip){. 
b210: 20 20 20 43 58 28 22 20 74 69 74 6c 65 3d 27 25     CX(" title='%
b220: 68 27 22 2c 7a 54 6f 6f 6c 54 69 70 29 3b 0a 20  h'",zToolTip);. 
b230: 20 7d 0a 20 20 69 66 28 7a 57 72 61 70 70 65 72   }.  if(zWrapper
b240: 49 64 20 26 26 20 2a 7a 57 72 61 70 70 65 72 49  Id && *zWrapperI
b250: 64 29 7b 0a 20 20 20 20 43 58 28 22 20 69 64 3d  d){.    CX(" id=
b260: 27 25 73 27 22 2c 7a 57 72 61 70 70 65 72 49 64  '%s'",zWrapperId
b270: 29 3b 0a 20 20 7d 0a 20 20 43 58 28 22 3e 22 29  );.  }.  CX(">")
b280: 3b 0a 20 20 69 66 28 7a 4c 61 62 65 6c 20 26 26  ;.  if(zLabel &&
b290: 20 2a 7a 4c 61 62 65 6c 29 7b 0a 20 20 20 20 43   *zLabel){.    C
b2a0: 58 28 22 3c 6c 61 62 65 6c 20 66 6f 72 3d 27 25  X("<label for='%
b2b0: 73 27 3e 25 68 3c 2f 6c 61 62 65 6c 3e 22 2c 20  s'>%h</label>", 
b2c0: 7a 4c 61 62 65 6c 49 44 2c 20 7a 4c 61 62 65 6c  zLabelID, zLabel
b2d0: 29 3b 0a 20 20 7d 0a 20 20 43 58 28 22 3c 73 65  );.  }.  CX("<se
b2e0: 6c 65 63 74 20 6e 61 6d 65 3d 27 25 73 27 20 69  lect name='%s' i
b2f0: 64 3d 27 25 73 27 3e 22 2c 7a 46 69 65 6c 64 4e  d='%s'>",zFieldN
b300: 61 6d 65 2c 20 7a 4c 61 62 65 6c 49 44 29 3b 0a  ame, zLabelID);.
b310: 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20    while(1){.    
b320: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 4c 61  const char * zLa
b330: 62 65 6c 20 3d 20 76 61 5f 61 72 67 28 76 61 72  bel = va_arg(var
b340: 67 73 2c 63 68 61 72 20 2a 29 3b 0a 20 20 20 20  gs,char *);.    
b350: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 7a 56 61  const char * zVa
b360: 6c 3b 0a 20 20 20 20 69 66 28 4e 55 4c 4c 3d 3d  l;.    if(NULL==
b370: 7a 4c 61 62 65 6c 29 7b 0a 20 20 20 20 20 20 62  zLabel){.      b
b380: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b390: 7a 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 76 61  zVal = va_arg(va
b3a0: 72 67 73 2c 63 68 61 72 20 2a 29 3b 0a 20 20 20  rgs,char *);.   
b3b0: 20 43 58 28 22 3c 6f 70 74 69 6f 6e 20 76 61 6c   CX("<option val
b3c0: 75 65 3d 27 25 54 27 25 73 3e 22 2c 0a 20 20 20  ue='%T'%s>",.   
b3d0: 20 20 20 20 7a 56 61 6c 2c 20 30 3d 3d 66 6f 73      zVal, 0==fos
b3e0: 73 69 6c 5f 73 74 72 63 6d 70 28 7a 56 61 6c 2c  sil_strcmp(zVal,
b3f0: 20 7a 53 65 6c 65 63 74 65 64 56 61 6c 29 20 3f   zSelectedVal) ?
b400: 20 22 20 73 65 6c 65 63 74 65 64 22 20 3a 20 22   " selected" : "
b410: 22 29 3b 0a 20 20 20 20 69 66 28 2a 7a 4c 61 62  ");.    if(*zLab
b420: 65 6c 29 7b 0a 20 20 20 20 20 20 43 58 28 22 25  el){.      CX("%
b430: 73 22 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20 20  s", zLabel);.   
b440: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 43 58   }else{.      CX
b450: 28 22 25 68 22 2c 7a 56 61 6c 29 3b 0a 20 20 20  ("%h",zVal);.   
b460: 20 7d 0a 20 20 20 20 43 58 28 22 3c 2f 6f 70 74   }.    CX("</opt
b470: 69 6f 6e 3e 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  ion>\n");.  }.  
b480: 43 58 28 22 3c 2f 73 65 6c 65 63 74 3e 5c 6e 22  CX("</select>\n"
b490: 29 3b 0a 20 20 43 58 28 22 3c 2f 64 69 76 3e 5c  );.  CX("</div>\
b4a0: 6e 22 29 3b 0a 20 20 76 61 5f 65 6e 64 28 76 61  n");.  va_end(va
b4b0: 72 67 73 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 66  rgs);.  fossil_f
b4c0: 72 65 65 28 7a 4c 61 62 65 6c 49 44 29 3b 0a 7d  ree(zLabelID);.}
b4d0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
b4e0: 20 61 20 3c 73 63 72 69 70 74 3e 20 77 69 74 68   a <script> with
b4f0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
b500: 6e 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4f 72  nonce..**.** zOr
b510: 69 67 69 6e 20 61 6e 64 20 69 4c 69 6e 65 20 61  igin and iLine a
b520: 72 65 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f  re the source co
b530: 64 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  de filename and 
b540: 6c 69 6e 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 74  line number.** t
b550: 68 61 74 20 67 65 6e 65 72 61 74 65 64 20 74 68  hat generated th
b560: 69 73 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 76  is request..*/.v
b570: 6f 69 64 20 73 74 79 6c 65 5f 73 63 72 69 70 74  oid style_script
b580: 5f 62 65 67 69 6e 28 63 6f 6e 73 74 20 63 68 61  _begin(const cha
b590: 72 20 2a 7a 4f 72 69 67 69 6e 2c 20 69 6e 74 20  r *zOrigin, int 
b5a0: 69 4c 69 6e 65 29 7b 0a 20 20 63 6f 6e 73 74 20  iLine){.  const 
b5b0: 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28 7a  char *z;.  for(z
b5c0: 3d 7a 4f 72 69 67 69 6e 3b 20 7a 5b 30 5d 21 3d  =zOrigin; z[0]!=
b5d0: 30 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  0; z++){.    if(
b5e0: 20 7a 5b 30 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 5b   z[0]=='/' || z[
b5f0: 30 5d 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20  0]=='\\' ){.    
b600: 20 20 7a 4f 72 69 67 69 6e 20 3d 20 7a 2b 31 3b    zOrigin = z+1;
b610: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 58 28  .    }.  }.  CX(
b620: 22 3c 73 63 72 69 70 74 20 6e 6f 6e 63 65 3d 27  "<script nonce='
b630: 25 73 27 3e 2f 2a 20 25 73 3a 25 64 20 2a 2f 5c  %s'>/* %s:%d */\
b640: 6e 22 2c 20 73 74 79 6c 65 5f 6e 6f 6e 63 65 28  n", style_nonce(
b650: 29 2c 20 7a 4f 72 69 67 69 6e 2c 20 69 4c 69 6e  ), zOrigin, iLin
b660: 65 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61  e);.}../* Genera
b670: 74 65 20 74 68 65 20 63 6c 6f 73 69 6e 67 20 3c  te the closing <
b680: 2f 73 63 72 69 70 74 3e 20 74 61 67 20 0a 2a 2f  /script> tag .*/
b690: 0a 76 6f 69 64 20 73 74 79 6c 65 5f 73 63 72 69  .void style_scri
b6a0: 70 74 5f 65 6e 64 28 76 6f 69 64 29 7b 0a 20 20  pt_end(void){.  
b6b0: 43 58 28 22 3c 2f 73 63 72 69 70 74 3e 5c 6e 22  CX("</script>\n"
b6c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6d 69 74  );.}../*.** Emit
b6d0: 73 20 61 20 4e 4f 53 43 52 49 50 54 20 74 61 67  s a NOSCRIPT tag
b6e0: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
b6f0: 65 73 73 61 67 65 20 73 74 61 74 69 6e 67 20 74  essage stating t
b700: 68 61 74 20 4a 53 20 69 73 0a 2a 2a 20 72 65 71  hat JS is.** req
b710: 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 63 75  uired for the cu
b720: 72 72 65 6e 74 20 70 61 67 65 2e 20 54 68 69 73  rrent page. This
b730: 20 22 73 68 6f 75 6c 64 22 20 62 65 20 63 61 6c   "should" be cal
b740: 6c 65 64 20 6e 65 61 72 20 74 68 65 20 74 6f 70  led near the top
b750: 0a 2a 2a 20 6f 66 20 70 61 67 65 73 20 77 68 69  .** of pages whi
b760: 63 68 20 2a 72 65 71 75 69 72 65 2a 20 4a 53 2e  ch *require* JS.
b770: 20 54 68 65 20 69 6e 6e 65 72 20 44 49 56 20 68   The inner DIV h
b780: 61 73 20 74 68 65 20 43 53 53 20 63 6c 61 73 73  as the CSS class
b790: 0a 2a 2a 20 27 65 72 72 6f 72 27 20 61 6e 64 20  .** 'error' and 
b7a0: 63 61 6e 20 62 65 20 73 74 79 6c 65 64 20 76 69  can be styled vi
b7b0: 61 20 61 20 28 6e 6f 73 63 72 69 70 74 20 3e 20  a a (noscript > 
b7c0: 2e 65 72 72 6f 72 29 20 43 53 53 20 73 65 6c 65  .error) CSS sele
b7d0: 63 74 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 74  ctor..*/.void st
b7e0: 79 6c 65 5f 65 6d 69 74 5f 6e 6f 73 63 72 69 70  yle_emit_noscrip
b7f0: 74 5f 66 6f 72 5f 6a 73 5f 70 61 67 65 28 76 6f  t_for_js_page(vo
b800: 69 64 29 7b 0a 20 20 43 58 28 22 3c 6e 6f 73 63  id){.  CX("<nosc
b810: 72 69 70 74 3e 3c 64 69 76 20 63 6c 61 73 73 3d  ript><div class=
b820: 27 65 72 72 6f 72 27 3e 22 0a 20 20 20 20 20 22  'error'>".     "
b830: 54 68 69 73 20 70 61 67 65 20 72 65 71 75 69 72  This page requir
b840: 65 73 20 4a 61 76 61 53 63 72 69 70 74 20 28 45  es JavaScript (E
b850: 53 32 30 31 35 2c 20 61 2e 6b 2e 61 2e 20 45 53  S2015, a.k.a. ES
b860: 36 2c 20 6f 72 20 6e 65 77 65 72 29 2e 22 0a 20  6, or newer).". 
b870: 20 20 20 20 22 3c 2f 64 69 76 3e 3c 2f 6e 6f 73      "</div></nos
b880: 63 72 69 70 74 3e 22 29 3b 0a 7d 0a              cript>");.}.