Fossil

Hex Artifact Content
Login

Artifact ee7d4e1fc276c254cb5930b25079bb923ca7ee30d67243c6e19752db054bc47d:


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 39 20 44 2e 20 52 69 63 68  (c) 2009 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 53 69 6d 70 6c 69 66 69 65 64 20 42 53 44 20   Simplified BSD 
00a0: 4c 69 63 65 6e 73 65 20 28 61 6c 73 6f 0a 2a 2a  License (also.**
00b0: 20 6b 6e 6f 77 6e 20 61 73 20 74 68 65 20 22 32   known as the "2
00c0: 2d 43 6c 61 75 73 65 20 4c 69 63 65 6e 73 65 22  -Clause License"
00d0: 20 6f 72 20 22 46 72 65 65 42 53 44 20 4c 69 63   or "FreeBSD Lic
00e0: 65 6e 73 65 22 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  ense".).**.** Th
00f0: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0100: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65  stributed in the
0110: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69   hope that it wi
0120: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a  ll be useful,.**
0130: 20 62 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79   but without any
0140: 20 77 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f   warranty; witho
0150: 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c  ut even the impl
0160: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a  ied warranty of.
0170: 2a 2a 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69  ** merchantabili
0180: 74 79 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f  ty or fitness fo
0190: 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 70  r a particular p
01a0: 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75  urpose..**.** Au
01b0: 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66  thor contact inf
01c0: 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64  ormation:.**   d
01d0: 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20  rh@hwaci.com.** 
01e0: 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61    http://www.hwa
01f0: 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a  ci.com/drh/.**.*
0200: 2a 2a 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 0a 2a  **************.*
0250: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
0260: 69 6f 6e 20 6f 66 20 74 68 65 20 53 65 74 75 70  ion of the Setup
0270: 20 70 61 67 65 20 66 6f 72 20 22 73 6b 69 6e 73   page for "skins
0280: 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  "..*/.#include "
0290: 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75  config.h".#inclu
02a0: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69  de <assert.h>.#i
02b0: 6e 63 6c 75 64 65 20 22 73 6b 69 6e 73 2e 68 22  nclude "skins.h"
02c0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 72 72 61 79  ../*.** An array
02d0: 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 75   of available bu
02e0: 69 6c 74 2d 69 6e 20 73 6b 69 6e 73 2e 0a 2a 2a  ilt-in skins..**
02f0: 0a 2a 2a 20 54 6f 20 61 64 64 20 6e 65 77 20 62  .** To add new b
0300: 75 69 6c 74 2d 69 6e 20 73 6b 69 6e 73 3a 0a 2a  uilt-in skins:.*
0310: 2a 0a 2a 2a 20 20 20 20 31 2e 20 20 50 69 63 6b  *.**    1.  Pick
0320: 20 61 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20   a name for the 
0330: 6e 65 77 20 73 6b 69 6e 2e 20 20 28 48 65 72 65  new skin.  (Here
0340: 20 77 65 20 75 73 65 20 22 78 79 7a 7a 79 22 29   we use "xyzzy")
0350: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 32 2e 20 20 49  ..**.**    2.  I
0360: 6e 73 74 61 6c 6c 20 66 69 6c 65 73 20 73 6b 69  nstall files ski
0370: 6e 73 2f 78 79 7a 7a 79 2f 63 73 73 2e 74 78 74  ns/xyzzy/css.txt
0380: 2c 20 73 6b 69 6e 73 2f 78 79 7a 7a 79 2f 68 65  , skins/xyzzy/he
0390: 61 64 65 72 2e 74 78 74 2c 0a 2a 2a 20 20 20 20  ader.txt,.**    
03a0: 20 20 20 20 61 6e 64 20 73 6b 69 6e 73 2f 78 79      and skins/xy
03b0: 7a 7a 79 2f 66 6f 6f 74 65 72 2e 74 78 74 20 69  zzy/footer.txt i
03c0: 6e 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74  nto the source t
03d0: 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 33 2e  ree..**.**    3.
03e0: 20 20 52 65 72 75 6e 20 22 74 63 6c 73 68 20 6d    Rerun "tclsh m
03f0: 61 6b 65 6d 61 6b 65 2e 74 63 6c 22 20 69 6e 20  akemake.tcl" in 
0400: 74 68 65 20 73 72 63 2f 20 66 6f 6c 64 65 72 20  the src/ folder 
0410: 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 20  in order to.**  
0420: 20 20 20 20 20 20 72 65 62 75 69 6c 64 20 74 68        rebuild th
0430: 65 20 6d 61 6b 65 66 69 6c 65 73 20 74 6f 20 72  e makefiles to r
0440: 65 66 65 72 65 6e 63 65 20 74 68 65 20 6e 65 77  eference the new
0450: 20 43 53 53 2c 20 68 65 61 64 65 72 73 2c 20 61   CSS, headers, a
0460: 6e 64 20 66 6f 6f 74 65 72 73 2e 0a 2a 2a 0a 2a  nd footers..**.*
0470: 2a 20 20 20 20 34 2e 20 20 4d 61 6b 65 20 61 6e  *    4.  Make an
0480: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 66 6f   entry in the fo
0490: 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 66 6f  llowing array fo
04a0: 72 20 74 68 65 20 6e 65 77 20 73 6b 69 6e 2e 0a  r the new skin..
04b0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
04c0: 20 42 75 69 6c 74 69 6e 53 6b 69 6e 20 7b 0a 20   BuiltinSkin {. 
04d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
04e0: 73 63 3b 20 20 20 20 2f 2a 20 44 65 73 63 72 69  sc;    /* Descri
04f0: 70 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 73 6b  ption of this sk
0500: 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  in */.  const ch
0510: 61 72 20 2a 7a 4c 61 62 65 6c 3b 20 20 20 2f 2a  ar *zLabel;   /*
0520: 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 75   The directory u
0530: 6e 64 65 72 20 73 6b 69 6e 73 2f 20 68 6f 6c 64  nder skins/ hold
0540: 69 6e 67 20 74 68 69 73 20 73 6b 69 6e 20 2a 2f  ing this skin */
0550: 0a 20 20 63 68 61 72 20 2a 7a 53 51 4c 3b 20 20  .  char *zSQL;  
0560: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
0570: 65 64 20 69 6e 20 61 74 20 72 75 6e 2d 74 69 6d  ed in at run-tim
0580: 65 20 77 69 74 68 20 53 51 4c 20 74 6f 20 69 6e  e with SQL to in
0590: 73 65 72 74 20 74 68 69 73 20 73 6b 69 6e 20 2a  sert this skin *
05a0: 2f 0a 7d 20 61 42 75 69 6c 74 69 6e 53 6b 69 6e  /.} aBuiltinSkin
05b0: 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 44 65 66 61  [] = {.  { "Defa
05c0: 75 6c 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  ult",           
05d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05e0: 22 64 65 66 61 75 6c 74 22 2c 20 20 20 20 20 20  "default",      
05f0: 20 20 20 20 20 30 20 7d 2c 0a 20 20 7b 20 22 42       0 },.  { "B
0600: 6c 69 74 7a 22 2c 20 20 20 20 20 20 20 20 20 20  litz",          
0610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0620: 20 20 20 22 62 6c 69 74 7a 22 2c 20 20 20 20 20     "blitz",     
0630: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 7b          0 },.  {
0640: 20 22 42 6c 69 74 7a 2c 20 4e 6f 20 4c 6f 67 6f   "Blitz, No Logo
0650: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
0660: 20 20 20 20 20 20 22 62 6c 69 74 7a 5f 6e 6f 5f        "blitz_no_
0670: 6c 6f 67 6f 22 2c 20 20 20 20 20 30 20 7d 2c 0a  logo",     0 },.
0680: 20 20 7b 20 22 42 6f 6f 74 73 74 72 61 70 22 2c    { "Bootstrap",
0690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06a0: 20 20 20 20 20 20 20 20 20 22 62 6f 6f 74 73 74           "bootst
06b0: 72 61 70 22 2c 20 20 20 20 20 20 20 20 20 30 20  rap",         0 
06c0: 7d 2c 0a 20 20 7b 20 22 58 65 6b 72 69 22 2c 20  },.  { "Xekri", 
06d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 78 65 6b              "xek
06f0: 72 69 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ri",            
0700: 20 30 20 7d 2c 0a 20 20 7b 20 22 4f 72 69 67 69   0 },.  { "Origi
0710: 6e 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20  nal",           
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
0730: 6f 72 69 67 69 6e 61 6c 22 2c 20 20 20 20 20 20  original",      
0740: 20 20 20 20 30 20 7d 2c 0a 20 20 7b 20 22 45 6e      0 },.  { "En
0750: 68 61 6e 63 65 64 20 4f 72 69 67 69 6e 61 6c 22  hanced Original"
0760: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
0770: 20 20 22 65 6e 68 61 6e 63 65 64 31 22 2c 20 20    "enhanced1",  
0780: 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 7b 20         0 },.  { 
0790: 22 53 68 61 64 6f 77 20 62 6f 78 65 73 20 26 20  "Shadow boxes & 
07a0: 52 6f 75 6e 64 65 64 20 43 6f 72 6e 65 72 73 22  Rounded Corners"
07b0: 2c 20 20 20 20 22 72 6f 75 6e 64 65 64 31 22 2c  ,    "rounded1",
07c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20            0 },. 
07d0: 20 7b 20 22 45 61 67 6c 65 22 2c 20 20 20 20 20   { "Eagle",     
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 20 20 22 65 61 67 6c 65 22 2c          "eagle",
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
0810: 2c 0a 20 20 7b 20 22 42 6c 61 63 6b 20 26 20 57  ,.  { "Black & W
0820: 68 69 74 65 2c 20 4d 65 6e 75 20 6f 6e 20 4c 65  hite, Menu on Le
0830: 66 74 22 2c 20 20 20 20 20 20 20 22 62 6c 61 63  ft",       "blac
0840: 6b 5f 61 6e 64 5f 77 68 69 74 65 22 2c 20 20 20  k_and_white",   
0850: 30 20 7d 2c 0a 20 20 7b 20 22 50 6c 61 69 6e 20  0 },.  { "Plain 
0860: 47 72 61 79 2c 20 4e 6f 20 4c 6f 67 6f 22 2c 20  Gray, No Logo", 
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
0880: 6c 61 69 6e 5f 67 72 61 79 22 2c 20 20 20 20 20  lain_gray",     
0890: 20 20 20 30 20 7d 2c 0a 20 20 7b 20 22 4b 68 61     0 },.  { "Kha
08a0: 6b 69 2c 20 4e 6f 20 4c 6f 67 6f 22 2c 20 20 20  ki, No Logo",   
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 22 6b 68 61 6b 69 22 2c 20 20 20 20 20 20 20   "khaki",       
08d0: 20 20 20 20 20 20 30 20 7d 2c 0a 7d 3b 0a 0a 2f        0 },.};../
08e0: 2a 0a 2a 2a 20 41 20 73 6b 69 6e 20 63 6f 6e 73  *.** A skin cons
08f0: 69 73 74 73 20 6f 66 20 66 6f 75 72 20 22 66 69  ists of four "fi
0900: 6c 65 73 22 20 6e 61 6d 65 64 20 68 65 72 65 3a  les" named here:
0910: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
0920: 20 63 68 61 72 20 2a 61 7a 53 6b 69 6e 46 69 6c   char *azSkinFil
0930: 65 5b 5d 20 3d 20 7b 20 22 63 73 73 22 2c 20 22  e[] = { "css", "
0940: 68 65 61 64 65 72 22 2c 20 22 66 6f 6f 74 65 72  header", "footer
0950: 22 2c 20 22 64 65 74 61 69 6c 73 22 20 7d 3b 0a  ", "details" };.
0960: 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69  ./*.** Alternati
0970: 76 65 20 73 6b 69 6e 73 20 63 61 6e 20 62 65 20  ve skins can be 
0980: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
0990: 20 43 47 49 20 73 63 72 69 70 74 20 6f 72 20 62   CGI script or b
09a0: 79 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 6f 6e 20  y options.** on 
09b0: 74 68 65 20 22 68 74 74 70 22 2c 20 22 75 69 22  the "http", "ui"
09c0: 2c 20 61 6e 64 20 22 73 65 72 76 65 72 22 20 63  , and "server" c
09d0: 6f 6d 6d 61 6e 64 73 2e 20 20 54 68 65 20 61 6c  ommands.  The al
09e0: 74 65 72 6e 61 74 69 76 65 20 73 6b 69 6e 0a 2a  ternative skin.*
09f0: 2a 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 6f  * name must be o
0a00: 6e 65 20 6f 66 20 74 68 65 20 61 42 75 69 6c 74  ne of the aBuilt
0a10: 69 6e 53 6b 69 6e 5b 5d 2e 7a 4c 61 62 65 6c 20  inSkin[].zLabel 
0a20: 6e 61 6d 65 73 2e 20 20 49 66 20 74 68 65 72 65  names.  If there
0a30: 20 69 73 0a 2a 2a 20 61 20 6d 61 74 63 68 2c 20   is.** a match, 
0a40: 74 68 61 74 20 61 6c 74 65 72 6e 61 74 69 76 65  that alternative
0a50: 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   is used..**.** 
0a60: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
0a70: 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 68 6f  atic variable ho
0a80: 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
0a90: 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20  the alternative 
0aa0: 73 6b 69 6e 2c 0a 2a 2a 20 6f 72 20 4e 55 4c 4c  skin,.** or NULL
0ab0: 20 69 66 20 74 68 65 20 73 6b 69 6e 20 73 68 6f   if the skin sho
0ac0: 75 6c 64 20 62 65 20 61 73 20 63 6f 6e 66 69 67  uld be as config
0ad0: 75 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ured..*/.static 
0ae0: 73 74 72 75 63 74 20 42 75 69 6c 74 69 6e 53 6b  struct BuiltinSk
0af0: 69 6e 20 2a 70 41 6c 74 53 6b 69 6e 20 3d 20 30  in *pAltSkin = 0
0b00: 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  ;.static char *z
0b10: 41 6c 74 53 6b 69 6e 44 69 72 20 3d 20 30 3b 0a  AltSkinDir = 0;.
0b20: 73 74 61 74 69 63 20 69 6e 74 20 69 44 72 61 66  static int iDraf
0b30: 74 53 6b 69 6e 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  tSkin = 0;../*.*
0b40: 2a 20 53 6b 69 6e 20 64 65 74 61 69 6c 73 20 61  * Skin details a
0b50: 72 65 20 61 20 73 65 74 20 6f 66 20 6b 65 79 2f  re a set of key/
0b60: 76 61 6c 75 65 20 70 61 69 72 73 20 74 68 61 74  value pairs that
0b70: 20 64 65 66 69 6e 65 20 64 69 73 70 6c 61 79 0a   define display.
0b80: 2a 2a 20 61 74 74 72 69 62 75 74 65 73 20 6f 66  ** attributes of
0b90: 20 74 68 65 20 73 6b 69 6e 20 74 68 61 74 20 63   the skin that c
0ba0: 61 6e 6e 6f 74 20 62 65 20 65 61 73 69 6c 79 20  annot be easily 
0bb0: 73 70 65 63 69 66 69 65 64 20 75 73 69 6e 67 20  specified using 
0bc0: 43 53 53 0a 2a 2a 20 6f 72 20 74 68 61 74 20 6e  CSS.** or that n
0bd0: 65 65 64 20 74 6f 20 62 65 20 6b 6e 6f 77 6e 20  eed to be known 
0be0: 6f 6e 20 74 68 65 20 73 65 72 76 65 72 2d 73 69  on the server-si
0bf0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  de..**.** The fo
0c00: 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f  llowing array ho
0c10: 6c 64 73 20 74 68 65 20 76 61 6c 75 65 20 66 6f  lds the value fo
0c20: 72 20 61 6c 6c 20 6b 6e 6f 77 6e 20 73 6b 69 6e  r all known skin
0c30: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61   details..*/.sta
0c40: 74 69 63 20 73 74 72 75 63 74 20 53 6b 69 6e 44  tic struct SkinD
0c50: 65 74 61 69 6c 20 7b 0a 20 20 63 6f 6e 73 74 20  etail {.  const 
0c60: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
0c70: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
0c80: 20 64 65 74 61 69 6c 20 2a 2f 0a 20 20 63 6f 6e   detail */.  con
0c90: 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 3b  st char *zValue;
0ca0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
0cb0: 20 74 68 65 20 64 65 74 61 69 6c 20 2a 2f 0a 7d   the detail */.}
0cc0: 20 61 53 6b 69 6e 44 65 74 61 69 6c 5b 5d 20 3d   aSkinDetail[] =
0cd0: 20 7b 0a 20 20 7b 20 22 74 69 6d 65 6c 69 6e 65   {.  { "timeline
0ce0: 2d 61 72 72 6f 77 68 65 61 64 73 22 2c 20 20 20  -arrowheads",   
0cf0: 20 20 20 20 20 22 31 22 20 20 7d 2c 0a 20 20 7b       "1"  },.  {
0d00: 20 22 74 69 6d 65 6c 69 6e 65 2d 63 69 72 63 6c   "timeline-circl
0d10: 65 2d 6e 6f 64 65 73 22 2c 20 20 20 20 20 20 22  e-nodes",      "
0d20: 30 22 20 20 7d 2c 0a 20 20 7b 20 22 74 69 6d 65  0"  },.  { "time
0d30: 6c 69 6e 65 2d 63 6f 6c 6f 72 2d 67 72 61 70 68  line-color-graph
0d40: 2d 6c 69 6e 65 73 22 2c 20 22 30 22 20 20 7d 2c  -lines", "0"  },
0d50: 0a 20 20 7b 20 22 77 68 69 74 65 2d 66 6f 72 65  .  { "white-fore
0d60: 67 72 6f 75 6e 64 22 2c 20 20 20 20 20 20 20 20  ground",        
0d70: 20 20 20 22 30 22 20 20 7d 2c 0a 7d 3b 0a 0a 2f     "0"  },.};../
0d80: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 69 73  *.** Invoke this
0d90: 20 72 6f 75 74 69 6e 65 20 74 6f 20 73 65 74 20   routine to set 
0da0: 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20  the alternative 
0db0: 73 6b 69 6e 2e 20 20 52 65 74 75 72 6e 20 4e 55  skin.  Return NU
0dc0: 4c 4c 20 69 66 20 74 68 65 0a 2a 2a 20 61 6c 74  LL if the.** alt
0dd0: 65 72 6e 61 74 69 76 65 20 77 61 73 20 73 75 63  ernative was suc
0de0: 63 65 73 73 66 75 6c 6c 79 20 69 6e 73 74 61 6c  cessfully instal
0df0: 6c 65 64 2e 20 20 52 65 74 75 72 6e 20 61 20 73  led.  Return a s
0e00: 74 72 69 6e 67 20 6c 69 73 74 69 6e 67 20 61 6c  tring listing al
0e10: 6c 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73  l.** available s
0e20: 6b 69 6e 73 20 69 66 20 7a 4e 61 6d 65 20 64 6f  kins if zName do
0e30: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 20  es not match an 
0e40: 61 76 61 69 6c 61 62 6c 65 20 73 6b 69 6e 2e 20  available skin. 
0e50: 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74   Memory.** for t
0e60: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
0e70: 6e 67 20 63 6f 6d 65 73 20 66 72 6f 6d 20 66 6f  ng comes from fo
0e80: 73 73 69 6c 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ssil_malloc() an
0e90: 64 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65  d should be free
0ea0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
0eb0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
0ec0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 6b 69   alternative ski
0ed0: 6e 20 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20  n name contains 
0ee0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 27 2f 27 20  one or more '/' 
0ef0: 63 68 61 72 61 63 74 65 72 73 2c 20 74 68 65 6e  characters, then
0f00: 0a 2a 2a 20 69 74 20 69 73 20 61 73 73 75 6d 65  .** it is assume
0f10: 64 20 74 6f 20 62 65 20 61 20 64 69 72 65 63 74  d to be a direct
0f20: 6f 72 79 20 6f 6e 20 64 69 73 6b 20 74 68 61 74  ory on disk that
0f30: 20 68 6f 6c 64 73 20 6f 76 65 72 72 69 64 65 20   holds override 
0f40: 63 73 73 2e 74 78 74 2c 0a 2a 2a 20 66 6f 6f 74  css.txt,.** foot
0f50: 65 72 2e 74 78 74 2c 20 61 6e 64 20 68 65 61 64  er.txt, and head
0f60: 65 72 2e 74 78 74 2e 20 20 54 68 69 73 20 6d 6f  er.txt.  This mo
0f70: 64 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  de can be used f
0f80: 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65 0a 2a  or interactive.*
0f90: 2a 20 64 65 76 65 6c 6f 70 6d 65 6e 74 20 6f 66  * development of
0fa0: 20 6e 65 77 20 73 6b 69 6e 73 2e 0a 2a 2f 0a 63   new skins..*/.c
0fb0: 68 61 72 20 2a 73 6b 69 6e 5f 75 73 65 5f 61 6c  har *skin_use_al
0fc0: 74 65 72 6e 61 74 69 76 65 28 63 6f 6e 73 74 20  ternative(const 
0fd0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
0fe0: 69 6e 74 20 69 3b 0a 20 20 42 6c 6f 62 20 65 72  int i;.  Blob er
0ff0: 72 20 3d 20 42 4c 4f 42 5f 49 4e 49 54 49 41 4c  r = BLOB_INITIAL
1000: 49 5a 45 52 3b 0a 20 20 69 66 28 20 73 74 72 63  IZER;.  if( strc
1010: 68 72 28 7a 4e 61 6d 65 2c 20 27 2f 27 29 21 3d  hr(zName, '/')!=
1020: 30 20 29 7b 0a 20 20 20 20 7a 41 6c 74 53 6b 69  0 ){.    zAltSki
1030: 6e 44 69 72 20 3d 20 66 6f 73 73 69 6c 5f 73 74  nDir = fossil_st
1040: 72 64 75 70 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  rdup(zName);.   
1050: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1060: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
1070: 67 6c 6f 62 28 22 64 72 61 66 74 5b 31 2d 39 5d  glob("draft[1-9]
1080: 22 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  ", zName)==0 ){.
1090: 20 20 20 20 73 6b 69 6e 5f 75 73 65 5f 64 72 61      skin_use_dra
10a0: 66 74 28 7a 4e 61 6d 65 5b 35 5d 20 2d 20 27 30  ft(zName[5] - '0
10b0: 27 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ');.    return 0
10c0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
10d0: 20 69 3c 63 6f 75 6e 74 28 61 42 75 69 6c 74 69   i<count(aBuilti
10e0: 6e 53 6b 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20  nSkin); i++){.  
10f0: 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72    if( fossil_str
1100: 63 6d 70 28 61 42 75 69 6c 74 69 6e 53 6b 69 6e  cmp(aBuiltinSkin
1110: 5b 69 5d 2e 7a 4c 61 62 65 6c 2c 20 7a 4e 61 6d  [i].zLabel, zNam
1120: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)==0 ){.      p
1130: 41 6c 74 53 6b 69 6e 20 3d 20 26 61 42 75 69 6c  AltSkin = &aBuil
1140: 74 69 6e 53 6b 69 6e 5b 69 5d 3b 0a 20 20 20 20  tinSkin[i];.    
1150: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1160: 7d 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 61 70 70  }.  }.  blob_app
1170: 65 6e 64 66 28 26 65 72 72 2c 20 22 61 76 61 69  endf(&err, "avai
1180: 6c 61 62 6c 65 20 73 6b 69 6e 73 3a 20 25 73 22  lable skins: %s"
1190: 2c 20 61 42 75 69 6c 74 69 6e 53 6b 69 6e 5b 30  , aBuiltinSkin[0
11a0: 5d 2e 7a 4c 61 62 65 6c 29 3b 0a 20 20 66 6f 72  ].zLabel);.  for
11b0: 28 69 3d 31 3b 20 69 3c 63 6f 75 6e 74 28 61 42  (i=1; i<count(aB
11c0: 75 69 6c 74 69 6e 53 6b 69 6e 29 3b 20 69 2b 2b  uiltinSkin); i++
11d0: 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  ){.    blob_appe
11e0: 6e 64 28 26 65 72 72 2c 20 22 20 22 2c 20 31 29  nd(&err, " ", 1)
11f0: 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e  ;.    blob_appen
1200: 64 28 26 65 72 72 2c 20 61 42 75 69 6c 74 69 6e  d(&err, aBuiltin
1210: 53 6b 69 6e 5b 69 5d 2e 7a 4c 61 62 65 6c 2c 20  Skin[i].zLabel, 
1220: 2d 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  -1);.  }.  retur
1230: 6e 20 62 6c 6f 62 5f 73 74 72 28 26 65 72 72 29  n blob_str(&err)
1240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20  ;.}../*.** Look 
1250: 66 6f 72 20 74 68 65 20 2d 2d 73 6b 69 6e 20 63  for the --skin c
1260: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
1270: 6f 6e 20 61 6e 64 20 70 72 6f 63 65 73 73 20 69  on and process i
1280: 74 2e 20 20 4f 72 0a 2a 2a 20 63 61 6c 6c 20 66  t.  Or.** call f
1290: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 29 20 69 66  ossil_fatal() if
12a0: 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20 73 6b 69 6e   an unknown skin
12b0: 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a   is specified..*
12c0: 2f 0a 76 6f 69 64 20 73 6b 69 6e 5f 6f 76 65 72  /.void skin_over
12d0: 72 69 64 65 28 76 6f 69 64 29 7b 0a 20 20 63 6f  ride(void){.  co
12e0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 6b 69 6e 20  nst char *zSkin 
12f0: 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 73  = find_option("s
1300: 6b 69 6e 22 2c 30 2c 31 29 3b 0a 20 20 69 66 28  kin",0,1);.  if(
1310: 20 7a 53 6b 69 6e 20 29 7b 0a 20 20 20 20 63 68   zSkin ){.    ch
1320: 61 72 20 2a 7a 45 72 72 20 3d 20 73 6b 69 6e 5f  ar *zErr = skin_
1330: 75 73 65 5f 61 6c 74 65 72 6e 61 74 69 76 65 28  use_alternative(
1340: 7a 53 6b 69 6e 29 3b 0a 20 20 20 20 69 66 28 20  zSkin);.    if( 
1350: 7a 45 72 72 20 29 20 66 6f 73 73 69 6c 5f 66 61  zErr ) fossil_fa
1360: 74 61 6c 28 22 25 73 22 2c 20 7a 45 72 72 29 3b  tal("%s", zErr);
1370: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  .  }.}../*.** Us
1380: 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 72 61  e one of the dra
1390: 66 74 20 73 6b 69 6e 73 2e 0a 2a 2f 0a 76 6f 69  ft skins..*/.voi
13a0: 64 20 73 6b 69 6e 5f 75 73 65 5f 64 72 61 66 74  d skin_use_draft
13b0: 28 69 6e 74 20 69 29 7b 0a 20 20 69 44 72 61 66  (int i){.  iDraf
13c0: 74 53 6b 69 6e 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a  tSkin = i;.}../*
13d0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
13e0: 67 20 72 6f 75 74 69 6e 65 73 20 72 65 74 75 72  g routines retur
13f0: 6e 20 74 68 65 20 76 61 72 69 6f 75 73 20 63 6f  n the various co
1400: 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 74 68 65 20  mponents of the 
1410: 73 6b 69 6e 0a 2a 2a 20 74 68 61 74 20 73 68 6f  skin.** that sho
1420: 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20  uld be used for 
1430: 74 68 65 20 63 75 72 72 65 6e 74 20 72 75 6e 2e  the current run.
1440: 0a 2a 2a 0a 2a 2a 20 7a 57 68 61 74 20 69 73 20  .**.** zWhat is 
1450: 6f 6e 65 20 6f 66 3a 20 20 22 63 73 73 22 2c 20  one of:  "css", 
1460: 22 68 65 61 64 65 72 22 2c 20 22 66 6f 6f 74 65  "header", "foote
1470: 72 22 2c 20 22 64 65 74 61 69 6c 73 22 2e 0a 2a  r", "details"..*
1480: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 6b  /.const char *sk
1490: 69 6e 5f 67 65 74 28 63 6f 6e 73 74 20 63 68 61  in_get(const cha
14a0: 72 20 2a 7a 57 68 61 74 29 7b 0a 20 20 63 6f 6e  r *zWhat){.  con
14b0: 73 74 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20  st char *zOut;. 
14c0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
14d0: 69 44 72 61 66 74 53 6b 69 6e 20 29 7b 0a 20 20  iDraftSkin ){.  
14e0: 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22 64    z = mprintf("d
14f0: 72 61 66 74 25 64 2d 25 73 22 2c 20 69 44 72 61  raft%d-%s", iDra
1500: 66 74 53 6b 69 6e 2c 20 7a 57 68 61 74 29 3b 0a  ftSkin, zWhat);.
1510: 20 20 20 20 7a 4f 75 74 20 3d 20 64 62 5f 67 65      zOut = db_ge
1520: 74 28 7a 2c 20 30 29 3b 0a 20 20 20 20 66 6f 73  t(z, 0);.    fos
1530: 73 69 6c 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20  sil_free(z);.   
1540: 20 69 66 28 20 7a 4f 75 74 20 29 20 72 65 74 75   if( zOut ) retu
1550: 72 6e 20 7a 4f 75 74 3b 0a 20 20 7d 0a 20 20 69  rn zOut;.  }.  i
1560: 66 28 20 7a 41 6c 74 53 6b 69 6e 44 69 72 20 29  f( zAltSkinDir )
1570: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
1580: 6d 70 72 69 6e 74 66 28 22 25 73 2f 25 73 2e 74  mprintf("%s/%s.t
1590: 78 74 22 2c 20 7a 41 6c 74 53 6b 69 6e 44 69 72  xt", zAltSkinDir
15a0: 2c 20 7a 57 68 61 74 29 3b 0a 20 20 20 20 69 66  , zWhat);.    if
15b0: 28 20 66 69 6c 65 5f 69 73 66 69 6c 65 28 7a 29  ( file_isfile(z)
15c0: 20 29 7b 0a 20 20 20 20 20 20 42 6c 6f 62 20 78   ){.      Blob x
15d0: 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 61  ;.      blob_rea
15e0: 64 5f 66 72 6f 6d 5f 66 69 6c 65 28 26 78 2c 20  d_from_file(&x, 
15f0: 7a 29 3b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c  z);.      fossil
1600: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  _free(z);.      
1610: 72 65 74 75 72 6e 20 62 6c 6f 62 5f 73 74 72 28  return blob_str(
1620: 26 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  &x);.    }.    f
1630: 6f 73 73 69 6c 5f 66 72 65 65 28 7a 29 3b 0a 20  ossil_free(z);. 
1640: 20 7d 0a 20 20 69 66 28 20 70 41 6c 74 53 6b 69   }.  if( pAltSki
1650: 6e 20 29 7b 0a 20 20 20 20 7a 20 3d 20 6d 70 72  n ){.    z = mpr
1660: 69 6e 74 66 28 22 73 6b 69 6e 73 2f 25 73 2f 25  intf("skins/%s/%
1670: 73 2e 74 78 74 22 2c 20 70 41 6c 74 53 6b 69 6e  s.txt", pAltSkin
1680: 2d 3e 7a 4c 61 62 65 6c 2c 20 7a 57 68 61 74 29  ->zLabel, zWhat)
1690: 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 62 75 69  ;.    zOut = bui
16a0: 6c 74 69 6e 5f 74 65 78 74 28 7a 29 3b 0a 20 20  ltin_text(z);.  
16b0: 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 29    fossil_free(z)
16c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
16d0: 4f 75 74 20 3d 20 64 62 5f 67 65 74 28 7a 57 68  Out = db_get(zWh
16e0: 61 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  at, 0);.    if( 
16f0: 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zOut==0 ){.     
1700: 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22 73 6b   z = mprintf("sk
1710: 69 6e 73 2f 64 65 66 61 75 6c 74 2f 25 73 2e 74  ins/default/%s.t
1720: 78 74 22 2c 20 7a 57 68 61 74 29 3b 0a 20 20 20  xt", zWhat);.   
1730: 20 20 20 7a 4f 75 74 20 3d 20 62 75 69 6c 74 69     zOut = builti
1740: 6e 5f 74 65 78 74 28 7a 29 3b 0a 20 20 20 20 20  n_text(z);.     
1750: 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 29 3b   fossil_free(z);
1760: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1770: 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a  urn zOut;.}../*.
1780: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
1790: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
17a0: 6e 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  n used to set th
17b0: 65 20 73 6b 69 6e 2c 20 6f 72 20 72 65 74 75 72  e skin, or retur
17c0: 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 65  n NULL.** if the
17d0: 20 64 65 66 61 75 6c 74 20 73 6b 69 6e 20 69 73   default skin is
17e0: 20 62 65 69 6e 67 20 75 73 65 64 2e 0a 2a 2f 0a   being used..*/.
17f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 6b 69 6e  const char *skin
1800: 5f 69 6e 5f 75 73 65 28 76 6f 69 64 29 7b 0a 20  _in_use(void){. 
1810: 20 69 66 28 20 7a 41 6c 74 53 6b 69 6e 44 69 72   if( zAltSkinDir
1820: 20 29 20 72 65 74 75 72 6e 20 7a 41 6c 74 53 6b   ) return zAltSk
1830: 69 6e 44 69 72 3b 0a 20 20 69 66 28 20 70 41 6c  inDir;.  if( pAl
1840: 74 53 6b 69 6e 20 29 20 72 65 74 75 72 6e 20 70  tSkin ) return p
1850: 41 6c 74 53 6b 69 6e 2d 3e 7a 4c 61 62 65 6c 3b  AltSkin->zLabel;
1860: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1870: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
1880: 6f 69 6e 74 65 72 20 74 6f 20 61 20 53 6b 69 6e  ointer to a Skin
1890: 44 65 74 61 69 6c 20 65 6c 65 6d 65 6e 74 2e 20  Detail element. 
18a0: 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
18b0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
18c0: 63 20 73 74 72 75 63 74 20 53 6b 69 6e 44 65 74  c struct SkinDet
18d0: 61 69 6c 20 2a 73 6b 69 6e 5f 64 65 74 61 69 6c  ail *skin_detail
18e0: 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72  _find(const char
18f0: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
1900: 6c 77 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75  lwr = 0;.  int u
1910: 70 72 20 3d 20 63 6f 75 6e 74 28 61 53 6b 69 6e  pr = count(aSkin
1920: 44 65 74 61 69 6c 29 3b 0a 20 20 77 68 69 6c 65  Detail);.  while
1930: 28 20 75 70 72 3e 3d 6c 77 72 20 29 7b 0a 20 20  ( upr>=lwr ){.  
1940: 20 20 69 6e 74 20 6d 69 64 20 3d 20 28 75 70 72    int mid = (upr
1950: 2b 6c 77 72 29 2f 32 3b 0a 20 20 20 20 69 6e 74  +lwr)/2;.    int
1960: 20 63 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 63   c = fossil_strc
1970: 6d 70 28 61 53 6b 69 6e 44 65 74 61 69 6c 5b 6d  mp(aSkinDetail[m
1980: 69 64 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  id].zName, zName
1990: 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20  );.    if( c==0 
19a0: 29 20 72 65 74 75 72 6e 20 26 61 53 6b 69 6e 44  ) return &aSkinD
19b0: 65 74 61 69 6c 5b 6d 69 64 5d 3b 0a 20 20 20 20  etail[mid];.    
19c0: 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
19d0: 20 6c 77 72 20 3d 20 6d 69 64 2b 31 3b 0a 20 20   lwr = mid+1;.  
19e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
19f0: 70 72 20 3d 20 6d 69 64 2d 31 3b 0a 20 20 20 20  pr = mid-1;.    
1a00: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1a10: 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69  ;.}../* Initiali
1a20: 7a 65 20 74 68 65 20 61 53 6b 69 6e 44 65 74 61  ze the aSkinDeta
1a30: 69 6c 20 61 72 72 61 79 20 75 73 69 6e 67 20 74  il array using t
1a40: 68 65 20 74 65 78 74 20 69 6e 20 74 68 65 20 64  he text in the d
1a50: 65 74 61 69 6c 73 2e 74 78 74 0a 2a 2a 20 66 69  etails.txt.** fi
1a60: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
1a70: 69 64 20 73 6b 69 6e 5f 64 65 74 61 69 6c 5f 69  id skin_detail_i
1a80: 6e 69 74 69 61 6c 69 7a 65 28 76 6f 69 64 29 7b  nitialize(void){
1a90: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73  .  static int is
1aa0: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Init = 0;.  char
1ab0: 20 2a 7a 44 65 74 61 69 6c 3b 0a 20 20 42 6c 6f   *zDetail;.  Blo
1ac0: 62 20 64 65 74 61 69 6c 2c 20 6c 69 6e 65 2c 20  b detail, line, 
1ad0: 6b 65 79 2c 20 76 61 6c 75 65 3b 0a 20 20 69 66  key, value;.  if
1ae0: 28 20 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  ( isInit ) retur
1af0: 6e 3b 0a 20 20 69 73 49 6e 69 74 20 3d 20 31 3b  n;.  isInit = 1;
1b00: 0a 20 20 7a 44 65 74 61 69 6c 20 3d 20 28 63 68  .  zDetail = (ch
1b10: 61 72 2a 29 73 6b 69 6e 5f 67 65 74 28 22 64 65  ar*)skin_get("de
1b20: 74 61 69 6c 73 22 29 3b 0a 20 20 69 66 28 20 7a  tails");.  if( z
1b30: 44 65 74 61 69 6c 3d 3d 30 20 29 20 72 65 74 75  Detail==0 ) retu
1b40: 72 6e 3b 0a 20 20 7a 44 65 74 61 69 6c 20 3d 20  rn;.  zDetail = 
1b50: 66 6f 73 73 69 6c 5f 73 74 72 64 75 70 28 7a 44  fossil_strdup(zD
1b60: 65 74 61 69 6c 29 3b 0a 20 20 62 6c 6f 62 5f 69  etail);.  blob_i
1b70: 6e 69 74 28 26 64 65 74 61 69 6c 2c 20 7a 44 65  nit(&detail, zDe
1b80: 74 61 69 6c 2c 20 2d 31 29 3b 0a 20 20 77 68 69  tail, -1);.  whi
1b90: 6c 65 28 20 62 6c 6f 62 5f 6c 69 6e 65 28 26 64  le( blob_line(&d
1ba0: 65 74 61 69 6c 2c 20 26 6c 69 6e 65 29 20 29 7b  etail, &line) ){
1bb0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4b 65 79 3b  .    char *zKey;
1bc0: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  .    int nKey;. 
1bd0: 20 20 20 73 74 72 75 63 74 20 53 6b 69 6e 44 65     struct SkinDe
1be0: 74 61 69 6c 20 2a 70 44 65 74 61 69 6c 3b 0a 20  tail *pDetail;. 
1bf0: 20 20 20 69 66 28 20 21 62 6c 6f 62 5f 74 6f 6b     if( !blob_tok
1c00: 65 6e 28 26 6c 69 6e 65 2c 20 26 6b 65 79 29 20  en(&line, &key) 
1c10: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1c20: 7a 4b 65 79 20 3d 20 62 6c 6f 62 5f 62 75 66 66  zKey = blob_buff
1c30: 65 72 28 26 6b 65 79 29 3b 0a 20 20 20 20 69 66  er(&key);.    if
1c40: 28 20 7a 4b 65 79 5b 30 5d 3d 3d 27 23 27 20 29  ( zKey[0]=='#' )
1c50: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e   continue;.    n
1c60: 4b 65 79 20 3d 20 62 6c 6f 62 5f 73 69 7a 65 28  Key = blob_size(
1c70: 26 6b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 6e  &key);.    if( n
1c80: 4b 65 79 3c 32 20 29 20 63 6f 6e 74 69 6e 75 65  Key<2 ) continue
1c90: 3b 0a 20 20 20 20 69 66 28 20 7a 4b 65 79 5b 6e  ;.    if( zKey[n
1ca0: 4b 65 79 2d 31 5d 21 3d 27 3a 27 20 29 20 63 6f  Key-1]!=':' ) co
1cb0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 4b 65 79  ntinue;.    zKey
1cc0: 5b 6e 4b 65 79 2d 31 5d 20 3d 20 30 3b 0a 20 20  [nKey-1] = 0;.  
1cd0: 20 20 70 44 65 74 61 69 6c 20 3d 20 73 6b 69 6e    pDetail = skin
1ce0: 5f 64 65 74 61 69 6c 5f 66 69 6e 64 28 7a 4b 65  _detail_find(zKe
1cf0: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 44 65 74  y);.    if( pDet
1d00: 61 69 6c 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ail==0 ) continu
1d10: 65 3b 0a 20 20 20 20 69 66 28 20 21 62 6c 6f 62  e;.    if( !blob
1d20: 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 76  _token(&line, &v
1d30: 61 6c 75 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  alue) ) continue
1d40: 3b 0a 20 20 20 20 70 44 65 74 61 69 6c 2d 3e 7a  ;.    pDetail->z
1d50: 56 61 6c 75 65 20 3d 20 66 6f 73 73 69 6c 5f 73  Value = fossil_s
1d60: 74 72 64 75 70 28 62 6c 6f 62 5f 73 74 72 28 26  trdup(blob_str(&
1d70: 76 61 6c 75 65 29 29 3b 0a 20 20 7d 0a 20 20 62  value));.  }.  b
1d80: 6c 6f 62 5f 72 65 73 65 74 28 26 64 65 74 61 69  lob_reset(&detai
1d90: 6c 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65  l);.  fossil_fre
1da0: 65 28 7a 44 65 74 61 69 6c 29 3b 0a 7d 0a 0a 2f  e(zDetail);.}../
1db0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 6b  *.** Return a sk
1dc0: 69 6e 20 64 65 74 61 69 6c 20 73 65 74 74 69 6e  in detail settin
1dd0: 67 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  g.*/.const char 
1de0: 2a 73 6b 69 6e 5f 64 65 74 61 69 6c 28 63 6f 6e  *skin_detail(con
1df0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
1e00: 0a 20 20 73 74 72 75 63 74 20 53 6b 69 6e 44 65  .  struct SkinDe
1e10: 74 61 69 6c 20 2a 70 44 65 74 61 69 6c 3b 0a 20  tail *pDetail;. 
1e20: 20 73 6b 69 6e 5f 64 65 74 61 69 6c 5f 69 6e 69   skin_detail_ini
1e30: 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 70 44 65  tialize();.  pDe
1e40: 74 61 69 6c 20 3d 20 73 6b 69 6e 5f 64 65 74 61  tail = skin_deta
1e50: 69 6c 5f 66 69 6e 64 28 7a 4e 61 6d 65 29 3b 0a  il_find(zName);.
1e60: 20 20 69 66 28 20 70 44 65 74 61 69 6c 3d 3d 30    if( pDetail==0
1e70: 20 29 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28   ) fossil_fatal(
1e80: 22 6e 6f 20 73 75 63 68 20 73 6b 69 6e 20 64 65  "no such skin de
1e90: 74 61 69 6c 3a 20 25 73 22 2c 20 7a 4e 61 6d 65  tail: %s", zName
1ea0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 44 65 74  );.  return pDet
1eb0: 61 69 6c 2d 3e 7a 56 61 6c 75 65 3b 0a 7d 0a 69  ail->zValue;.}.i
1ec0: 6e 74 20 73 6b 69 6e 5f 64 65 74 61 69 6c 5f 62  nt skin_detail_b
1ed0: 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61  oolean(const cha
1ee0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 72 65 74  r *zName){.  ret
1ef0: 75 72 6e 20 21 69 73 5f 66 61 6c 73 65 28 73 6b  urn !is_false(sk
1f00: 69 6e 5f 64 65 74 61 69 6c 28 7a 4e 61 6d 65 29  in_detail(zName)
1f10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68  );.}../*.** Hash
1f20: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 63 6f   function for co
1f30: 6d 70 75 74 69 6e 67 20 61 20 73 6b 69 6e 20 69  mputing a skin i
1f40: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73  d..*/.static uns
1f50: 69 67 6e 65 64 20 69 6e 74 20 73 6b 69 6e 5f 68  igned int skin_h
1f60: 61 73 68 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  ash(unsigned int
1f70: 20 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   h, const char *
1f80: 7a 29 7b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  z){.  if( z==0 )
1f90: 20 72 65 74 75 72 6e 20 68 3b 0a 20 20 77 68 69   return h;.  whi
1fa0: 6c 65 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  le( z[0] ){.    
1fb0: 68 20 3d 20 28 68 3c 3c 31 31 29 20 5e 20 28 68  h = (h<<11) ^ (h
1fc0: 3c 3c 31 29 20 5e 20 28 68 3e 3e 33 29 20 5e 20  <<1) ^ (h>>3) ^ 
1fd0: 7a 5b 30 5d 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20  z[0];.    z++;. 
1fe0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d   }.  return h;.}
1ff0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
2000: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 74 68 61  n identifier tha
2010: 74 20 69 73 20 28 70 72 6f 62 61 62 6c 79 29 20  t is (probably) 
2020: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
2030: 65 72 79 20 73 6b 69 6e 0a 2a 2a 20 62 75 74 20  ery skin.** but 
2040: 74 68 61 74 20 69 73 20 28 70 72 6f 62 61 62 6c  that is (probabl
2050: 79 29 20 74 68 65 20 73 61 6d 65 20 69 66 20 74  y) the same if t
2060: 68 65 20 73 6b 69 6e 20 69 73 20 75 6e 63 68 61  he skin is uncha
2070: 6e 67 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 69  nged.  This.** i
2080: 64 65 6e 74 69 66 69 65 72 20 63 61 6e 20 62 65  dentifier can be
2090: 20 61 74 74 61 63 68 65 64 20 74 6f 20 72 65 73   attached to res
20a0: 6f 75 72 63 65 20 55 52 4c 73 20 74 6f 20 66 6f  ource URLs to fo
20b0: 72 63 65 20 72 65 6c 6f 61 64 69 6e 67 20 77 68  rce reloading wh
20c0: 65 6e 0a 2a 2a 20 74 68 65 20 72 65 73 6f 75 72  en.** the resour
20d0: 63 65 73 20 63 68 61 6e 67 65 20 62 75 74 20 61  ces change but a
20e0: 6c 6c 6f 77 20 74 68 65 20 72 65 73 6f 75 72 63  llow the resourc
20f0: 65 73 20 74 6f 20 62 65 20 72 65 61 64 20 66 72  es to be read fr
2100: 6f 6d 20 63 61 63 68 65 0a 2a 2a 20 61 73 20 6c  om cache.** as l
2110: 6f 6e 67 20 61 73 20 74 68 65 79 20 61 72 65 20  ong as they are 
2120: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 75 6e  unchanged..*/.un
2130: 73 69 67 6e 65 64 20 69 6e 74 20 73 6b 69 6e 5f  signed int skin_
2140: 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  id(const char *z
2150: 52 65 73 6f 75 72 63 65 29 7b 0a 20 20 75 6e 73  Resource){.  uns
2160: 69 67 6e 65 64 20 69 6e 74 20 68 20 3d 20 30 3b  igned int h = 0;
2170: 0a 20 20 69 66 28 20 7a 41 6c 74 53 6b 69 6e 44  .  if( zAltSkinD
2180: 69 72 20 29 7b 0a 20 20 20 20 68 20 3d 20 73 6b  ir ){.    h = sk
2190: 69 6e 5f 68 61 73 68 28 30 2c 20 7a 41 6c 74 53  in_hash(0, zAltS
21a0: 6b 69 6e 44 69 72 29 3b 0a 20 20 7d 65 6c 73 65  kinDir);.  }else
21b0: 20 69 66 28 20 70 41 6c 74 53 6b 69 6e 20 29 7b   if( pAltSkin ){
21c0: 0a 20 20 20 20 68 20 3d 20 73 6b 69 6e 5f 68 61  .    h = skin_ha
21d0: 73 68 28 30 2c 20 70 41 6c 74 53 6b 69 6e 2d 3e  sh(0, pAltSkin->
21e0: 7a 4c 61 62 65 6c 29 3b 0a 20 20 7d 65 6c 73 65  zLabel);.  }else
21f0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 54 69  {.    char *zMTi
2200: 6d 65 20 3d 20 64 62 5f 67 65 74 5f 6d 74 69 6d  me = db_get_mtim
2210: 65 28 7a 52 65 73 6f 75 72 63 65 2c 20 30 2c 20  e(zResource, 0, 
2220: 30 29 3b 0a 20 20 20 20 68 20 3d 20 73 6b 69 6e  0);.    h = skin
2230: 5f 68 61 73 68 28 30 2c 20 7a 4d 54 69 6d 65 29  _hash(0, zMTime)
2240: 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 72 65  ;.    fossil_fre
2250: 65 28 7a 4d 54 69 6d 65 29 3b 0a 20 20 7d 0a 20  e(zMTime);.  }. 
2260: 20 68 20 3d 20 73 6b 69 6e 5f 68 61 73 68 28 68   h = skin_hash(h
2270: 2c 20 4d 41 4e 49 46 45 53 54 5f 55 55 49 44 29  , MANIFEST_UUID)
2280: 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a  ;.  return h;.}.
2290: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 20 73 6b 69  ./*.** For a ski
22a0: 6e 20 6e 61 6d 65 64 20 7a 53 6b 69 6e 4e 61 6d  n named zSkinNam
22b0: 65 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e  e, compute the n
22c0: 61 6d 65 20 6f 66 20 74 68 65 20 43 4f 4e 46 49  ame of the CONFI
22d0: 47 20 74 61 62 6c 65 0a 2a 2a 20 65 6e 74 72 79  G table.** entry
22e0: 20 77 68 65 72 65 20 74 68 61 74 20 73 6b 69 6e   where that skin
22f0: 20 69 73 20 73 74 6f 72 65 64 20 61 6e 64 20 72   is stored and r
2300: 65 74 75 72 6e 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  eturn it..**.** 
2310: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a  Return NULL if z
2320: 53 6b 69 6e 4e 61 6d 65 20 69 73 20 4e 55 4c 4c  SkinName is NULL
2330: 20 6f 72 20 61 6e 20 65 6d 70 74 79 20 73 74 72   or an empty str
2340: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 66  ing..**.** If if
2350: 45 78 69 73 74 73 20 69 73 20 74 72 75 65 2c 20  Exists is true, 
2360: 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 73 6b  and the named sk
2370: 69 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  in does not exis
2380: 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  t, return NULL..
2390: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
23a0: 73 6b 69 6e 56 61 72 4e 61 6d 65 28 63 6f 6e 73  skinVarName(cons
23b0: 74 20 63 68 61 72 20 2a 7a 53 6b 69 6e 4e 61 6d  t char *zSkinNam
23c0: 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73 29  e, int ifExists)
23d0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
23e0: 66 28 20 7a 53 6b 69 6e 4e 61 6d 65 3d 3d 30 20  f( zSkinName==0 
23f0: 7c 7c 20 7a 53 6b 69 6e 4e 61 6d 65 5b 30 5d 3d  || zSkinName[0]=
2400: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2410: 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22 73 6b   z = mprintf("sk
2420: 69 6e 3a 25 73 22 2c 20 7a 53 6b 69 6e 4e 61 6d  in:%s", zSkinNam
2430: 65 29 3b 0a 20 20 69 66 28 20 69 66 45 78 69 73  e);.  if( ifExis
2440: 74 73 20 26 26 20 21 64 62 5f 65 78 69 73 74 73  ts && !db_exists
2450: 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  ("SELECT 1 FROM 
2460: 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d  config WHERE nam
2470: 65 3d 25 51 22 2c 20 7a 29 20 29 7b 0a 20 20 20  e=%Q", z) ){.   
2480: 20 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 7a 20   free(z);.    z 
2490: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
24a0: 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n z;.}../*.** Re
24b0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
24c0: 72 65 20 65 78 69 73 74 73 20 61 20 73 6b 69 6e  re exists a skin
24d0: 20 6e 61 6d 65 20 22 7a 53 6b 69 6e 4e 61 6d 65   name "zSkinName
24e0: 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
24f0: 20 73 6b 69 6e 45 78 69 73 74 73 28 63 6f 6e 73   skinExists(cons
2500: 74 20 63 68 61 72 20 2a 7a 53 6b 69 6e 4e 61 6d  t char *zSkinNam
2510: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
2520: 66 28 20 7a 53 6b 69 6e 4e 61 6d 65 3d 3d 30 20  f( zSkinName==0 
2530: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
2540: 72 28 69 3d 30 3b 20 69 3c 63 6f 75 6e 74 28 61  r(i=0; i<count(a
2550: 42 75 69 6c 74 69 6e 53 6b 69 6e 29 3b 20 69 2b  BuiltinSkin); i+
2560: 2b 29 7b 0a 20 20 20 20 69 66 28 20 66 6f 73 73  +){.    if( foss
2570: 69 6c 5f 73 74 72 63 6d 70 28 7a 53 6b 69 6e 4e  il_strcmp(zSkinN
2580: 61 6d 65 2c 20 61 42 75 69 6c 74 69 6e 53 6b 69  ame, aBuiltinSki
2590: 6e 5b 69 5d 2e 7a 44 65 73 63 29 3d 3d 30 20 29  n[i].zDesc)==0 )
25a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
25b0: 20 72 65 74 75 72 6e 20 64 62 5f 65 78 69 73 74   return db_exist
25c0: 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  s("SELECT 1 FROM
25d0: 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61   config WHERE na
25e0: 6d 65 3d 27 73 6b 69 6e 3a 25 71 27 22 2c 20 7a  me='skin:%q'", z
25f0: 53 6b 69 6e 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  SkinName);.}../*
2600: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 6e  .** Construct an
2610: 64 20 72 65 74 75 72 6e 20 61 6e 20 73 74 72 69  d return an stri
2620: 6e 67 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  ng of SQL statem
2630: 65 6e 74 73 20 74 68 61 74 20 72 65 70 72 65 73  ents that repres
2640: 65 6e 74 73 0a 2a 2a 20 61 20 22 73 6b 69 6e 22  ents.** a "skin"
2650: 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20 7a 4e   setting.  If zN
2660: 61 6d 65 3d 3d 30 20 74 68 65 6e 20 72 65 74 75  ame==0 then retu
2670: 72 6e 20 74 68 65 20 73 6b 69 6e 20 63 75 72 72  rn the skin curr
2680: 65 6e 74 6c 79 0a 2a 2a 20 69 6e 73 74 61 6c 6c  ently.** install
2690: 65 64 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  ed.  Otherwise, 
26a0: 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68  return one of th
26b0: 65 20 62 75 69 6c 74 2d 69 6e 20 73 6b 69 6e 73  e built-in skins
26c0: 20 64 65 73 69 67 6e 61 74 65 64 0a 2a 2a 20 62   designated.** b
26d0: 79 20 7a 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4d  y zName..**.** M
26e0: 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
26f0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
2700: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
2710: 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74  om malloc..*/.st
2720: 61 74 69 63 20 63 68 61 72 20 2a 67 65 74 53 6b  atic char *getSk
2730: 69 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  in(const char *z
2740: 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63  Name){.  const c
2750: 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a  har *z;.  char *
2760: 7a 4c 61 62 65 6c 3b 0a 20 20 69 6e 74 20 69 3b  zLabel;.  int i;
2770: 0a 20 20 42 6c 6f 62 20 76 61 6c 3b 0a 20 20 62  .  Blob val;.  b
2780: 6c 6f 62 5f 7a 65 72 6f 28 26 76 61 6c 29 3b 0a  lob_zero(&val);.
2790: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f 75    for(i=0; i<cou
27a0: 6e 74 28 61 7a 53 6b 69 6e 46 69 6c 65 29 3b 20  nt(azSkinFile); 
27b0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 4e  i++){.    if( zN
27c0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 7a 4c 61  ame ){.      zLa
27d0: 62 65 6c 20 3d 20 6d 70 72 69 6e 74 66 28 22 73  bel = mprintf("s
27e0: 6b 69 6e 73 2f 25 73 2f 25 73 2e 74 78 74 22 2c  kins/%s/%s.txt",
27f0: 20 7a 4e 61 6d 65 2c 20 61 7a 53 6b 69 6e 46 69   zName, azSkinFi
2800: 6c 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7a 20  le[i]);.      z 
2810: 3d 20 62 75 69 6c 74 69 6e 5f 74 65 78 74 28 7a  = builtin_text(z
2820: 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 66 6f  Label);.      fo
2830: 73 73 69 6c 5f 66 72 65 65 28 7a 4c 61 62 65 6c  ssil_free(zLabel
2840: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2850: 20 20 20 20 7a 20 3d 20 64 62 5f 67 65 74 28 61      z = db_get(a
2860: 7a 53 6b 69 6e 46 69 6c 65 5b 69 5d 2c 20 30 29  zSkinFile[i], 0)
2870: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30  ;.      if( z==0
2880: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62   ){.        zLab
2890: 65 6c 20 3d 20 6d 70 72 69 6e 74 66 28 22 73 6b  el = mprintf("sk
28a0: 69 6e 73 2f 64 65 66 61 75 6c 74 2f 25 73 2e 74  ins/default/%s.t
28b0: 78 74 22 2c 20 61 7a 53 6b 69 6e 46 69 6c 65 5b  xt", azSkinFile[
28c0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d  i]);.        z =
28d0: 20 62 75 69 6c 74 69 6e 5f 74 65 78 74 28 7a 4c   builtin_text(zL
28e0: 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 66  abel);.        f
28f0: 6f 73 73 69 6c 5f 66 72 65 65 28 7a 4c 61 62 65  ossil_free(zLabe
2900: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
2910: 7d 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e  }.    blob_appen
2920: 64 66 28 26 76 61 6c 2c 0a 20 20 20 20 20 20 20  df(&val,.       
2930: 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 63 6f  "REPLACE INTO co
2940: 6e 66 69 67 28 6e 61 6d 65 2c 76 61 6c 75 65 2c  nfig(name,value,
2950: 6d 74 69 6d 65 29 20 56 41 4c 55 45 53 28 25 51  mtime) VALUES(%Q
2960: 2c 25 51 2c 6e 6f 77 28 29 29 3b 5c 6e 22 2c 0a  ,%Q,now());\n",.
2970: 20 20 20 20 20 20 20 61 7a 53 6b 69 6e 46 69 6c         azSkinFil
2980: 65 5b 69 5d 2c 20 7a 0a 20 20 20 20 29 3b 0a 20  e[i], z.    );. 
2990: 20 7d 0a 20 20 72 65 74 75 72 6e 20 62 6c 6f 62   }.  return blob
29a0: 5f 73 74 72 28 26 76 61 6c 29 3b 0a 7d 0a 0a 2f  _str(&val);.}../
29b0: 2a 0a 2a 2a 20 52 65 73 70 6f 6e 64 20 74 6f 20  *.** Respond to 
29c0: 61 20 52 65 6e 61 6d 65 20 62 75 74 74 6f 6e 20  a Rename button 
29d0: 70 72 65 73 73 2e 20 20 52 65 74 75 72 6e 20 54  press.  Return T
29e0: 52 55 45 20 69 66 20 61 20 64 69 61 6c 6f 67 20  RUE if a dialog 
29f0: 77 61 73 20 70 61 69 6e 74 65 64 2e 0a 2a 2a 20  was painted..** 
2a00: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 74 6f 20  Return FALSE to 
2a10: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
2a20: 65 20 6d 61 69 6e 20 53 6b 69 6e 73 20 70 61 67  e main Skins pag
2a30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2a40: 20 73 6b 69 6e 52 65 6e 61 6d 65 28 76 6f 69 64   skinRename(void
2a50: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
2a60: 2a 7a 4f 6c 64 4e 61 6d 65 3b 0a 20 20 63 6f 6e  *zOldName;.  con
2a70: 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d  st char *zNewNam
2a80: 65 3b 0a 20 20 69 6e 74 20 65 78 20 3d 20 30 3b  e;.  int ex = 0;
2a90: 0a 20 20 69 66 28 20 50 28 22 72 65 6e 61 6d 65  .  if( P("rename
2aa0: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ")==0 ) return 0
2ab0: 3b 0a 20 20 7a 4f 6c 64 4e 61 6d 65 20 3d 20 50  ;.  zOldName = P
2ac0: 28 22 73 6e 22 29 3b 0a 20 20 7a 4e 65 77 4e 61  ("sn");.  zNewNa
2ad0: 6d 65 20 3d 20 50 28 22 6e 65 77 6e 61 6d 65 22  me = P("newname"
2ae0: 29 3b 0a 20 20 69 66 28 20 7a 4f 6c 64 4e 61 6d  );.  if( zOldNam
2af0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
2b00: 0a 20 20 69 66 28 20 7a 4e 65 77 4e 61 6d 65 3d  .  if( zNewName=
2b10: 3d 30 20 7c 7c 20 7a 4e 65 77 4e 61 6d 65 5b 30  =0 || zNewName[0
2b20: 5d 3d 3d 30 20 7c 7c 20 28 65 78 20 3d 20 73 6b  ]==0 || (ex = sk
2b30: 69 6e 45 78 69 73 74 73 28 7a 4e 65 77 4e 61 6d  inExists(zNewNam
2b40: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  e))!=0 ){.    if
2b50: 28 20 7a 4e 65 77 4e 61 6d 65 3d 3d 30 20 29 20  ( zNewName==0 ) 
2b60: 7a 4e 65 77 4e 61 6d 65 20 3d 20 7a 4f 6c 64 4e  zNewName = zOldN
2b70: 61 6d 65 3b 0a 20 20 20 20 73 74 79 6c 65 5f 68  ame;.    style_h
2b80: 65 61 64 65 72 28 22 52 65 6e 61 6d 65 20 41 20  eader("Rename A 
2b90: 53 6b 69 6e 22 29 3b 0a 20 20 20 20 69 66 28 20  Skin");.    if( 
2ba0: 65 78 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 70  ex ){.      @ <p
2bb0: 3e 3c 73 70 61 6e 20 63 6c 61 73 73 3d 22 67 65  ><span class="ge
2bc0: 6e 65 72 61 6c 45 72 72 6f 72 22 3e 54 68 65 72  neralError">Ther
2bd0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 6f  e is already ano
2be0: 74 68 65 72 20 73 6b 69 6e 0a 20 20 20 20 20 20  ther skin.      
2bf0: 40 20 6e 61 6d 65 64 20 22 25 68 28 7a 4e 65 77  @ named "%h(zNew
2c00: 4e 61 6d 65 29 22 2e 20 20 43 68 6f 6f 73 65 20  Name)".  Choose 
2c10: 61 20 64 69 66 66 65 72 65 6e 74 20 6e 61 6d 65  a different name
2c20: 2e 3c 2f 73 70 61 6e 3e 3c 2f 70 3e 0a 20 20 20  .</span></p>.   
2c30: 20 7d 0a 20 20 20 20 40 20 3c 66 6f 72 6d 20 61   }.    @ <form a
2c40: 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 54 6f 70  ction="%s(g.zTop
2c50: 29 2f 73 65 74 75 70 5f 73 6b 69 6e 5f 6f 6c 64  )/setup_skin_old
2c60: 22 20 6d 65 74 68 6f 64 3d 22 70 6f 73 74 22 3e  " method="post">
2c70: 3c 64 69 76 3e 0a 20 20 20 20 40 20 3c 74 61 62  <div>.    @ <tab
2c80: 6c 65 20 62 6f 72 64 65 72 3d 22 30 22 3e 3c 74  le border="0"><t
2c90: 72 3e 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 64  r>.    @ <tr><td
2ca0: 20 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 3e 43   align="right">C
2cb0: 75 72 72 65 6e 74 20 6e 61 6d 65 3a 3c 74 64 20  urrent name:<td 
2cc0: 61 6c 69 67 6e 3d 22 6c 65 66 74 22 3e 3c 62 3e  align="left"><b>
2cd0: 25 68 28 7a 4f 6c 64 4e 61 6d 65 29 3c 2f 62 3e  %h(zOldName)</b>
2ce0: 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 20 61  .    @ <tr><td a
2cf0: 6c 69 67 6e 3d 22 72 69 67 68 74 22 3e 4e 65 77  lign="right">New
2d00: 20 6e 61 6d 65 3a 3c 74 64 20 61 6c 69 67 6e 3d   name:<td align=
2d10: 22 6c 65 66 74 22 3e 0a 20 20 20 20 40 20 3c 69  "left">.    @ <i
2d20: 6e 70 75 74 20 74 79 70 65 3d 22 74 65 78 74 22  nput type="text"
2d30: 20 73 69 7a 65 3d 22 33 35 22 20 6e 61 6d 65 3d   size="35" name=
2d40: 22 6e 65 77 6e 61 6d 65 22 20 76 61 6c 75 65 3d  "newname" value=
2d50: 22 25 68 28 7a 4e 65 77 4e 61 6d 65 29 22 3e 0a  "%h(zNewName)">.
2d60: 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 3e 3c 74      @ <tr><td><t
2d70: 64 3e 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20  d>.    @ <input 
2d80: 74 79 70 65 3d 22 68 69 64 64 65 6e 22 20 6e 61  type="hidden" na
2d90: 6d 65 3d 22 73 6e 22 20 76 61 6c 75 65 3d 22 25  me="sn" value="%
2da0: 68 28 7a 4f 6c 64 4e 61 6d 65 29 22 3e 0a 20 20  h(zOldName)">.  
2db0: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
2dc0: 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 72  "submit" name="r
2dd0: 65 6e 61 6d 65 22 20 76 61 6c 75 65 3d 22 52 65  ename" value="Re
2de0: 6e 61 6d 65 22 3e 0a 20 20 20 20 40 20 3c 69 6e  name">.    @ <in
2df0: 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74  put type="submit
2e00: 22 20 6e 61 6d 65 3d 22 63 61 6e 72 65 6e 22 20  " name="canren" 
2e10: 76 61 6c 75 65 3d 22 43 61 6e 63 65 6c 22 3e 0a  value="Cancel">.
2e20: 20 20 20 20 40 20 3c 2f 74 61 62 6c 65 3e 0a 20      @ </table>. 
2e30: 20 20 20 6c 6f 67 69 6e 5f 69 6e 73 65 72 74 5f     login_insert_
2e40: 63 73 72 66 5f 73 65 63 72 65 74 28 29 3b 0a 20  csrf_secret();. 
2e50: 20 20 20 40 20 3c 2f 64 69 76 3e 3c 2f 66 6f 72     @ </div></for
2e60: 6d 3e 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f  m>.    style_foo
2e70: 74 65 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72  ter();.    retur
2e80: 6e 20 31 3b 0a 20 20 7d 0a 20 20 64 62 5f 6d 75  n 1;.  }.  db_mu
2e90: 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 22 55  lti_exec(.    "U
2ea0: 50 44 41 54 45 20 63 6f 6e 66 69 67 20 53 45 54  PDATE config SET
2eb0: 20 6e 61 6d 65 3d 27 73 6b 69 6e 3a 25 71 27 20   name='skin:%q' 
2ec0: 57 48 45 52 45 20 6e 61 6d 65 3d 27 73 6b 69 6e  WHERE name='skin
2ed0: 3a 25 71 27 3b 22 2c 0a 20 20 20 20 7a 4e 65 77  :%q';",.    zNew
2ee0: 4e 61 6d 65 2c 20 7a 4f 6c 64 4e 61 6d 65 0a 20  Name, zOldName. 
2ef0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   );.  return 0;.
2f00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 70 6f 6e 64  }../*.** Respond
2f10: 20 74 6f 20 61 20 53 61 76 65 20 62 75 74 74 6f   to a Save butto
2f20: 6e 20 70 72 65 73 73 2e 20 20 52 65 74 75 72 6e  n press.  Return
2f30: 20 54 52 55 45 20 69 66 20 61 20 64 69 61 6c 6f   TRUE if a dialo
2f40: 67 20 77 61 73 20 70 61 69 6e 74 65 64 2e 0a 2a  g was painted..*
2f50: 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 74  * Return FALSE t
2f60: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
2f70: 74 68 65 20 6d 61 69 6e 20 53 6b 69 6e 73 20 70  the main Skins p
2f80: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
2f90: 6e 74 20 73 6b 69 6e 53 61 76 65 28 63 6f 6e 73  nt skinSave(cons
2fa0: 74 20 63 68 61 72 20 2a 7a 43 75 72 72 65 6e 74  t char *zCurrent
2fb0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
2fc0: 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 69 6e 74  *zNewName;.  int
2fd0: 20 65 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 50   ex = 0;.  if( P
2fe0: 28 22 73 61 76 65 22 29 3d 3d 30 20 29 20 72 65  ("save")==0 ) re
2ff0: 74 75 72 6e 20 30 3b 0a 20 20 7a 4e 65 77 4e 61  turn 0;.  zNewNa
3000: 6d 65 20 3d 20 50 28 22 73 76 6e 61 6d 65 22 29  me = P("svname")
3010: 3b 0a 20 20 69 66 28 20 7a 4e 65 77 4e 61 6d 65  ;.  if( zNewName
3020: 20 26 26 20 7a 4e 65 77 4e 61 6d 65 5b 30 5d 21   && zNewName[0]!
3030: 3d 30 20 29 7b 0a 20 20 7d 0a 20 20 69 66 28 20  =0 ){.  }.  if( 
3040: 7a 4e 65 77 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  zNewName==0 || z
3050: 4e 65 77 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c  NewName[0]==0 ||
3060: 20 28 65 78 20 3d 20 73 6b 69 6e 45 78 69 73 74   (ex = skinExist
3070: 73 28 7a 4e 65 77 4e 61 6d 65 29 29 21 3d 30 20  s(zNewName))!=0 
3080: 29 7b 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 4e  ){.    if( zNewN
3090: 61 6d 65 3d 3d 30 20 29 20 7a 4e 65 77 4e 61 6d  ame==0 ) zNewNam
30a0: 65 20 3d 20 22 22 3b 0a 20 20 20 20 73 74 79 6c  e = "";.    styl
30b0: 65 5f 68 65 61 64 65 72 28 22 53 61 76 65 20 43  e_header("Save C
30c0: 75 72 72 65 6e 74 20 53 6b 69 6e 22 29 3b 0a 20  urrent Skin");. 
30d0: 20 20 20 69 66 28 20 65 78 20 29 7b 0a 20 20 20     if( ex ){.   
30e0: 20 20 20 40 20 3c 70 3e 3c 73 70 61 6e 20 63 6c     @ <p><span cl
30f0: 61 73 73 3d 22 67 65 6e 65 72 61 6c 45 72 72 6f  ass="generalErro
3100: 72 22 3e 54 68 65 72 65 20 69 73 20 61 6c 72 65  r">There is alre
3110: 61 64 79 20 61 6e 6f 74 68 65 72 20 73 6b 69 6e  ady another skin
3120: 0a 20 20 20 20 20 20 40 20 6e 61 6d 65 64 20 22  .      @ named "
3130: 25 68 28 7a 4e 65 77 4e 61 6d 65 29 22 2e 20 20  %h(zNewName)".  
3140: 43 68 6f 6f 73 65 20 61 20 64 69 66 66 65 72 65  Choose a differe
3150: 6e 74 20 6e 61 6d 65 2e 3c 2f 73 70 61 6e 3e 3c  nt name.</span><
3160: 2f 70 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40 20  /p>.    }.    @ 
3170: 3c 66 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 25 73  <form action="%s
3180: 28 67 2e 7a 54 6f 70 29 2f 73 65 74 75 70 5f 73  (g.zTop)/setup_s
3190: 6b 69 6e 5f 6f 6c 64 22 20 6d 65 74 68 6f 64 3d  kin_old" method=
31a0: 22 70 6f 73 74 22 3e 3c 64 69 76 3e 0a 20 20 20  "post"><div>.   
31b0: 20 40 20 3c 74 61 62 6c 65 20 62 6f 72 64 65 72   @ <table border
31c0: 3d 22 30 22 3e 3c 74 72 3e 0a 20 20 20 20 40 20  ="0"><tr>.    @ 
31d0: 3c 74 72 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 72  <tr><td align="r
31e0: 69 67 68 74 22 3e 4e 61 6d 65 20 66 6f 72 20 74  ight">Name for t
31f0: 68 69 73 20 73 6b 69 6e 3a 3c 74 64 20 61 6c 69  his skin:<td ali
3200: 67 6e 3d 22 6c 65 66 74 22 3e 0a 20 20 20 20 40  gn="left">.    @
3210: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 74 65   <input type="te
3220: 78 74 22 20 73 69 7a 65 3d 22 33 35 22 20 6e 61  xt" size="35" na
3230: 6d 65 3d 22 73 76 6e 61 6d 65 22 20 76 61 6c 75  me="svname" valu
3240: 65 3d 22 25 68 28 7a 4e 65 77 4e 61 6d 65 29 22  e="%h(zNewName)"
3250: 3e 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 3e  >.    @ <tr><td>
3260: 3c 74 64 3e 0a 20 20 20 20 40 20 3c 69 6e 70 75  <td>.    @ <inpu
3270: 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20  t type="submit" 
3280: 6e 61 6d 65 3d 22 73 61 76 65 22 20 76 61 6c 75  name="save" valu
3290: 65 3d 22 53 61 76 65 22 3e 0a 20 20 20 20 40 20  e="Save">.    @ 
32a0: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62  <input type="sub
32b0: 6d 69 74 22 20 6e 61 6d 65 3d 22 63 61 6e 73 61  mit" name="cansa
32c0: 76 65 22 20 76 61 6c 75 65 3d 22 43 61 6e 63 65  ve" value="Cance
32d0: 6c 22 3e 0a 20 20 20 20 40 20 3c 2f 74 61 62 6c  l">.    @ </tabl
32e0: 65 3e 0a 20 20 20 20 6c 6f 67 69 6e 5f 69 6e 73  e>.    login_ins
32f0: 65 72 74 5f 63 73 72 66 5f 73 65 63 72 65 74 28  ert_csrf_secret(
3300: 29 3b 0a 20 20 20 20 40 20 3c 2f 64 69 76 3e 3c  );.    @ </div><
3310: 2f 66 6f 72 6d 3e 0a 20 20 20 20 73 74 79 6c 65  /form>.    style
3320: 5f 66 6f 6f 74 65 72 28 29 3b 0a 20 20 20 20 72  _footer();.    r
3330: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 64  eturn 1;.  }.  d
3340: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20  b_multi_exec(.  
3350: 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e    "INSERT OR IGN
3360: 4f 52 45 20 49 4e 54 4f 20 63 6f 6e 66 69 67 28  ORE INTO config(
3370: 6e 61 6d 65 2c 20 76 61 6c 75 65 2c 20 6d 74 69  name, value, mti
3380: 6d 65 29 22 0a 20 20 20 20 22 56 41 4c 55 45 53  me)".    "VALUES
3390: 28 27 73 6b 69 6e 3a 25 71 27 2c 25 51 2c 6e 6f  ('skin:%q',%Q,no
33a0: 77 28 29 29 22 2c 0a 20 20 20 20 7a 4e 65 77 4e  w())",.    zNewN
33b0: 61 6d 65 2c 20 7a 43 75 72 72 65 6e 74 0a 20 20  ame, zCurrent.  
33c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
33d0: 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a  ../*.** WEBPAGE:
33e0: 20 73 65 74 75 70 5f 73 6b 69 6e 5f 6f 6c 64 0a   setup_skin_old.
33f0: 2a 2a 0a 2a 2a 20 53 68 6f 77 20 61 20 6c 69 73  **.** Show a lis
3400: 74 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73  t of available s
3410: 6b 69 6e 73 20 77 69 74 68 20 62 75 74 74 6f 6e  kins with button
3420: 73 20 66 6f 72 20 73 65 6c 65 63 74 69 6e 67 20  s for selecting 
3430: 77 68 69 63 68 0a 2a 2a 20 73 6b 69 6e 20 74 6f  which.** skin to
3440: 20 75 73 65 2e 20 20 52 65 71 75 69 72 65 73 20   use.  Requires 
3450: 53 65 74 75 70 20 70 72 69 76 69 6c 65 67 65 2e  Setup privilege.
3460: 0a 2a 2f 0a 76 6f 69 64 20 73 65 74 75 70 5f 73  .*/.void setup_s
3470: 6b 69 6e 5f 6f 6c 64 28 76 6f 69 64 29 7b 0a 20  kin_old(void){. 
3480: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
3490: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
34a0: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
34b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
34c0: 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 2f 2a  Current = 0;  /*
34d0: 20 43 75 72 72 65 6e 74 20 73 6b 69 6e 20 2a 2f   Current skin */
34e0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3500: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
3510: 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e 74  .  Stmt q;.  int
3520: 20 73 65 65 6e 43 75 72 72 65 6e 74 20 3d 20 30   seenCurrent = 0
3530: 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b  ;..  login_check
3540: 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a  _credentials();.
3550: 20 20 69 66 28 20 21 67 2e 70 65 72 6d 2e 53 65    if( !g.perm.Se
3560: 74 75 70 20 29 7b 0a 20 20 20 20 6c 6f 67 69 6e  tup ){.    login
3570: 5f 6e 65 65 64 65 64 28 30 29 3b 0a 20 20 20 20  _needed(0);.    
3580: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 64 62  return;.  }.  db
3590: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
35a0: 6f 6e 28 29 3b 0a 20 20 7a 43 75 72 72 65 6e 74  on();.  zCurrent
35b0: 20 3d 20 67 65 74 53 6b 69 6e 28 30 29 3b 0a 20   = getSkin(0);. 
35c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f 75 6e   for(i=0; i<coun
35d0: 74 28 61 42 75 69 6c 74 69 6e 53 6b 69 6e 29 3b  t(aBuiltinSkin);
35e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 42 75 69 6c   i++){.    aBuil
35f0: 74 69 6e 53 6b 69 6e 5b 69 5d 2e 7a 53 51 4c 20  tinSkin[i].zSQL 
3600: 3d 20 67 65 74 53 6b 69 6e 28 61 42 75 69 6c 74  = getSkin(aBuilt
3610: 69 6e 53 6b 69 6e 5b 69 5d 2e 7a 4c 61 62 65 6c  inSkin[i].zLabel
3620: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f  );.  }..  /* Pro
3630: 63 65 73 73 20 72 65 71 75 65 73 74 73 20 74 6f  cess requests to
3640: 20 64 65 6c 65 74 65 20 61 20 75 73 65 72 2d 64   delete a user-d
3650: 65 66 69 6e 65 64 20 73 6b 69 6e 20 2a 2f 0a 20  efined skin */. 
3660: 20 69 66 28 20 50 28 22 64 65 6c 31 22 29 20 26   if( P("del1") &
3670: 26 20 28 7a 4e 61 6d 65 20 3d 20 73 6b 69 6e 56  & (zName = skinV
3680: 61 72 4e 61 6d 65 28 50 28 22 73 6e 22 29 2c 20  arName(P("sn"), 
3690: 31 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74  1))!=0 ){.    st
36a0: 79 6c 65 5f 68 65 61 64 65 72 28 22 43 6f 6e 66  yle_header("Conf
36b0: 69 72 6d 20 43 75 73 74 6f 6d 20 53 6b 69 6e 20  irm Custom Skin 
36c0: 44 65 6c 65 74 65 22 29 3b 0a 20 20 20 20 40 20  Delete");.    @ 
36d0: 3c 66 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 25 73  <form action="%s
36e0: 28 67 2e 7a 54 6f 70 29 2f 73 65 74 75 70 5f 73  (g.zTop)/setup_s
36f0: 6b 69 6e 5f 6f 6c 64 22 20 6d 65 74 68 6f 64 3d  kin_old" method=
3700: 22 70 6f 73 74 22 3e 3c 64 69 76 3e 0a 20 20 20  "post"><div>.   
3710: 20 40 20 3c 70 3e 44 65 6c 65 74 69 6f 6e 20 6f   @ <p>Deletion o
3720: 66 20 61 20 63 75 73 74 6f 6d 20 73 6b 69 6e 20  f a custom skin 
3730: 69 73 20 61 20 70 65 72 6d 61 6e 65 6e 74 20 61  is a permanent a
3740: 63 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 6e 6f  ction that canno
3750: 74 0a 20 20 20 20 40 20 62 65 20 75 6e 64 6f 6e  t.    @ be undon
3760: 65 2e 20 20 50 6c 65 61 73 65 20 63 6f 6e 66 69  e.  Please confi
3770: 72 6d 20 74 68 61 74 20 74 68 69 73 20 69 73 20  rm that this is 
3780: 77 68 61 74 20 79 6f 75 20 77 61 6e 74 20 74 6f  what you want to
3790: 20 64 6f 3a 3c 2f 70 3e 0a 20 20 20 20 40 20 3c   do:</p>.    @ <
37a0: 69 6e 70 75 74 20 74 79 70 65 3d 22 68 69 64 64  input type="hidd
37b0: 65 6e 22 20 6e 61 6d 65 3d 22 73 6e 22 20 76 61  en" name="sn" va
37c0: 6c 75 65 3d 22 25 68 28 50 28 22 73 6e 22 29 29  lue="%h(P("sn"))
37d0: 22 20 2f 3e 0a 20 20 20 20 40 20 3c 69 6e 70 75  " />.    @ <inpu
37e0: 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20  t type="submit" 
37f0: 6e 61 6d 65 3d 22 64 65 6c 32 22 20 76 61 6c 75  name="del2" valu
3800: 65 3d 22 43 6f 6e 66 69 72 6d 20 2d 20 44 65 6c  e="Confirm - Del
3810: 65 74 65 20 54 68 65 20 53 6b 69 6e 22 20 2f 3e  ete The Skin" />
3820: 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79  .    @ <input ty
3830: 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d 65  pe="submit" name
3840: 3d 22 63 61 6e 63 65 6c 22 20 76 61 6c 75 65 3d  ="cancel" value=
3850: 22 43 61 6e 63 65 6c 20 2d 20 44 6f 20 4e 6f 74  "Cancel - Do Not
3860: 20 44 65 6c 65 74 65 22 20 2f 3e 0a 20 20 20 20   Delete" />.    
3870: 6c 6f 67 69 6e 5f 69 6e 73 65 72 74 5f 63 73 72  login_insert_csr
3880: 66 5f 73 65 63 72 65 74 28 29 3b 0a 20 20 20 20  f_secret();.    
3890: 40 20 3c 2f 64 69 76 3e 3c 2f 66 6f 72 6d 3e 0a  @ </div></form>.
38a0: 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72      style_footer
38b0: 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ();.    return;.
38c0: 20 20 7d 0a 20 20 69 66 28 20 50 28 22 64 65 6c    }.  if( P("del
38d0: 32 22 29 21 3d 30 20 26 26 20 28 7a 4e 61 6d 65  2")!=0 && (zName
38e0: 20 3d 20 73 6b 69 6e 56 61 72 4e 61 6d 65 28 50   = skinVarName(P
38f0: 28 22 73 6e 22 29 2c 20 31 29 29 21 3d 30 20 29  ("sn"), 1))!=0 )
3900: 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65  {.    db_multi_e
3910: 78 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d  xec("DELETE FROM
3920: 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61   config WHERE na
3930: 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a  me=%Q", zName);.
3940: 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 6e 52 65    }.  if( skinRe
3950: 6e 61 6d 65 28 29 20 29 20 72 65 74 75 72 6e 3b  name() ) return;
3960: 0a 20 20 69 66 28 20 73 6b 69 6e 53 61 76 65 28  .  if( skinSave(
3970: 7a 43 75 72 72 65 6e 74 29 20 29 20 72 65 74 75  zCurrent) ) retu
3980: 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 75 73  rn;..  /* The us
3990: 65 72 20 70 72 65 73 73 65 64 20 6f 6e 65 20 6f  er pressed one o
39a0: 66 20 74 68 65 20 22 49 6e 73 74 61 6c 6c 22 20  f the "Install" 
39b0: 62 75 74 74 6f 6e 73 2e 20 2a 2f 0a 20 20 69 66  buttons. */.  if
39c0: 28 20 50 28 22 6c 6f 61 64 22 29 20 26 26 20 28  ( P("load") && (
39d0: 7a 20 3d 20 50 28 22 73 6e 22 29 29 21 3d 30 20  z = P("sn"))!=0 
39e0: 26 26 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 69  && z[0] ){.    i
39f0: 6e 74 20 73 65 65 6e 20 3d 20 30 3b 0a 0a 20 20  nt seen = 0;..  
3a00: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
3a10: 65 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  e if the current
3a20: 20 73 6b 69 6e 20 69 73 20 61 6c 72 65 61 64 79   skin is already
3a30: 20 73 61 76 65 64 2e 20 20 49 66 20 69 74 20 69   saved.  If it i
3a40: 73 2c 20 74 68 65 72 65 0a 20 20 20 20 2a 2a 20  s, there.    ** 
3a50: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 63 72  is no need to cr
3a60: 65 61 74 65 20 61 20 62 61 63 6b 75 70 20 2a 2f  eate a backup */
3a70: 0a 20 20 20 20 7a 43 75 72 72 65 6e 74 20 3d 20  .    zCurrent = 
3a80: 67 65 74 53 6b 69 6e 28 30 29 3b 0a 20 20 20 20  getSkin(0);.    
3a90: 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f 75 6e 74  for(i=0; i<count
3aa0: 28 61 42 75 69 6c 74 69 6e 53 6b 69 6e 29 3b 20  (aBuiltinSkin); 
3ab0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
3ac0: 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 61 42  fossil_strcmp(aB
3ad0: 75 69 6c 74 69 6e 53 6b 69 6e 5b 69 5d 2e 7a 53  uiltinSkin[i].zS
3ae0: 51 4c 2c 20 7a 43 75 72 72 65 6e 74 29 3d 3d 30  QL, zCurrent)==0
3af0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e   ){.        seen
3b00: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72   = 1;.        br
3b10: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3b20: 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e   }.    if( !seen
3b30: 20 29 7b 0a 20 20 20 20 20 20 73 65 65 6e 20 3d   ){.      seen =
3b40: 20 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45   db_exists("SELE
3b50: 43 54 20 31 20 46 52 4f 4d 20 63 6f 6e 66 69 67  CT 1 FROM config
3b60: 20 57 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f 42   WHERE name GLOB
3b70: 20 27 73 6b 69 6e 3a 2a 27 22 0a 20 20 20 20 20   'skin:*'".     
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b90: 20 20 22 20 41 4e 44 20 76 61 6c 75 65 3d 25 51    " AND value=%Q
3ba0: 22 2c 20 7a 43 75 72 72 65 6e 74 29 3b 0a 20 20  ", zCurrent);.  
3bb0: 20 20 20 20 69 66 28 20 21 73 65 65 6e 20 29 7b      if( !seen ){
3bc0: 0a 20 20 20 20 20 20 20 20 64 62 5f 6d 75 6c 74  .        db_mult
3bd0: 69 5f 65 78 65 63 28 0a 20 20 20 20 20 20 20 20  i_exec(.        
3be0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63    "INSERT INTO c
3bf0: 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61 6c 75 65  onfig(name,value
3c00: 2c 6d 74 69 6d 65 29 20 56 41 4c 55 45 53 28 22  ,mtime) VALUES("
3c10: 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 73 74  .          "  st
3c20: 72 66 74 69 6d 65 28 27 73 6b 69 6e 3a 42 61 63  rftime('skin:Bac
3c30: 6b 75 70 20 4f 6e 20 25 25 59 2d 25 25 6d 2d 25  kup On %%Y-%%m-%
3c40: 25 64 20 25 25 48 3a 25 25 4d 3a 25 25 53 27 29  %d %%H:%%M:%%S')
3c50: 2c 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  ,".          "  
3c60: 25 51 2c 6e 6f 77 28 29 29 22 2c 20 7a 43 75 72  %Q,now())", zCur
3c70: 72 65 6e 74 0a 20 20 20 20 20 20 20 20 29 3b 0a  rent.        );.
3c80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3c90: 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20    seen = 0;.    
3ca0: 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f 75 6e 74  for(i=0; i<count
3cb0: 28 61 42 75 69 6c 74 69 6e 53 6b 69 6e 29 3b 20  (aBuiltinSkin); 
3cc0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
3cd0: 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 61 42  fossil_strcmp(aB
3ce0: 75 69 6c 74 69 6e 53 6b 69 6e 5b 69 5d 2e 7a 44  uiltinSkin[i].zD
3cf0: 65 73 63 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20  esc, z)==0 ){.  
3d00: 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a        seen = 1;.
3d10: 20 20 20 20 20 20 20 20 7a 43 75 72 72 65 6e 74          zCurrent
3d20: 20 3d 20 61 42 75 69 6c 74 69 6e 53 6b 69 6e 5b   = aBuiltinSkin[
3d30: 69 5d 2e 7a 53 51 4c 3b 0a 20 20 20 20 20 20 20  i].zSQL;.       
3d40: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
3d50: 25 73 22 2c 20 7a 43 75 72 72 65 6e 74 2f 2a 73  %s", zCurrent/*s
3d60: 61 66 65 2d 66 6f 72 2d 25 73 2a 2f 29 3b 0a 20  afe-for-%s*/);. 
3d70: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3d80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3d90: 69 66 28 20 21 73 65 65 6e 20 29 7b 0a 20 20 20  if( !seen ){.   
3da0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 6b 69 6e 56     zName = skinV
3db0: 61 72 4e 61 6d 65 28 7a 2c 30 29 3b 0a 20 20 20  arName(z,0);.   
3dc0: 20 20 20 7a 43 75 72 72 65 6e 74 20 3d 20 64 62     zCurrent = db
3dd0: 5f 67 65 74 28 7a 4e 61 6d 65 2c 20 30 29 3b 0a  _get(zName, 0);.
3de0: 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65        db_multi_e
3df0: 78 65 63 28 22 25 73 22 2c 20 7a 43 75 72 72 65  xec("%s", zCurre
3e00: 6e 74 2f 2a 73 61 66 65 2d 66 6f 72 2d 25 73 2a  nt/*safe-for-%s*
3e10: 2f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  /);.    }.  }.. 
3e20: 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 53   style_header("S
3e30: 6b 69 6e 73 22 29 3b 0a 20 20 69 66 28 20 7a 45  kins");.  if( zE
3e40: 72 72 20 29 7b 0a 20 20 20 20 40 20 3c 70 20 73  rr ){.    @ <p s
3e50: 74 79 6c 65 3d 22 63 6f 6c 6f 72 3a 72 65 64 22  tyle="color:red"
3e60: 3e 25 68 28 7a 45 72 72 29 3c 2f 70 3e 0a 20 20  >%h(zErr)</p>.  
3e70: 7d 0a 20 20 40 20 3c 70 3e 41 20 22 73 6b 69 6e  }.  @ <p>A "skin
3e80: 22 20 69 73 20 61 20 63 6f 6d 62 69 6e 61 74 69  " is a combinati
3e90: 6f 6e 20 6f 66 0a 20 20 40 20 3c 61 20 68 72 65  on of.  @ <a hre
3ea0: 66 3d 22 73 65 74 75 70 5f 73 6b 69 6e 65 64 69  f="setup_skinedi
3eb0: 74 3f 77 3d 30 22 3e 43 53 53 3c 2f 61 3e 2c 0a  t?w=0">CSS</a>,.
3ec0: 20 20 40 20 3c 61 20 68 72 65 66 3d 22 73 65 74    @ <a href="set
3ed0: 75 70 5f 73 6b 69 6e 65 64 69 74 3f 77 3d 32 22  up_skinedit?w=2"
3ee0: 3e 48 65 61 64 65 72 3c 2f 61 3e 2c 0a 20 20 40  >Header</a>,.  @
3ef0: 20 3c 61 20 68 72 65 66 3d 22 73 65 74 75 70 5f   <a href="setup_
3f00: 73 6b 69 6e 65 64 69 74 3f 77 3d 31 22 3e 46 6f  skinedit?w=1">Fo
3f10: 6f 74 65 72 3c 2f 61 3e 2c 20 61 6e 64 0a 20 20  oter</a>, and.  
3f20: 40 20 3c 61 20 68 72 65 66 3d 22 73 65 74 75 70  @ <a href="setup
3f30: 5f 73 6b 69 6e 65 64 69 74 3f 77 3d 33 22 3e 44  _skinedit?w=3">D
3f40: 65 74 61 69 6c 73 3c 2f 61 3e 0a 20 20 40 20 74  etails</a>.  @ t
3f50: 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 74  hat determines t
3f60: 68 65 20 6c 6f 6f 6b 20 61 6e 64 20 66 65 65 6c  he look and feel
3f70: 0a 20 20 40 20 6f 66 20 74 68 65 20 77 65 62 20  .  @ of the web 
3f80: 69 6e 74 65 72 66 61 63 65 2e 3c 2f 70 3e 0a 20  interface.</p>. 
3f90: 20 40 0a 20 20 69 66 28 20 70 41 6c 74 53 6b 69   @.  if( pAltSki
3fa0: 6e 20 29 7b 0a 20 20 20 20 40 20 3c 70 20 63 6c  n ){.    @ <p cl
3fb0: 61 73 73 3d 22 67 65 6e 65 72 61 6c 45 72 72 6f  ass="generalErro
3fc0: 72 22 3e 0a 20 20 20 20 40 20 54 68 69 73 20 70  r">.    @ This p
3fd0: 61 67 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  age is generated
3fe0: 20 75 73 69 6e 67 20 61 6e 20 73 6b 69 6e 20 6f   using an skin o
3ff0: 76 65 72 72 69 64 65 20 6e 61 6d 65 64 0a 20 20  verride named.  
4000: 20 20 40 20 22 25 68 28 70 41 6c 74 53 6b 69 6e    @ "%h(pAltSkin
4010: 2d 3e 7a 4c 61 62 65 6c 29 22 2e 20 20 59 6f 75  ->zLabel)".  You
4020: 20 63 61 6e 20 63 68 61 6e 67 65 20 74 68 65 20   can change the 
4030: 73 6b 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69  skin configurati
4040: 6f 6e 0a 20 20 20 20 40 20 62 65 6c 6f 77 2c 20  on.    @ below, 
4050: 62 75 74 20 74 68 65 20 63 68 61 6e 67 65 73 20  but the changes 
4060: 77 69 6c 6c 20 6e 6f 74 20 74 61 6b 65 20 65 66  will not take ef
4070: 66 65 63 74 20 75 6e 74 69 6c 20 74 68 65 20 46  fect until the F
4080: 6f 73 73 69 6c 20 73 65 72 76 65 72 0a 20 20 20  ossil server.   
4090: 20 40 20 69 73 20 72 65 73 74 61 72 74 65 64 20   @ is restarted 
40a0: 77 69 74 68 6f 75 74 20 74 68 65 20 6f 76 65 72  without the over
40b0: 72 69 64 65 2e 3c 2f 70 3e 0a 20 20 20 20 40 0a  ride.</p>.    @.
40c0: 20 20 7d 0a 20 20 40 20 3c 68 32 3e 41 76 61 69    }.  @ <h2>Avai
40d0: 6c 61 62 6c 65 20 53 6b 69 6e 73 3a 3c 2f 68 32  lable Skins:</h2
40e0: 3e 0a 20 20 40 20 3c 74 61 62 6c 65 20 62 6f 72  >.  @ <table bor
40f0: 64 65 72 3d 22 30 22 3e 0a 20 20 66 6f 72 28 69  der="0">.  for(i
4100: 3d 30 3b 20 69 3c 63 6f 75 6e 74 28 61 42 75 69  =0; i<count(aBui
4110: 6c 74 69 6e 53 6b 69 6e 29 3b 20 69 2b 2b 29 7b  ltinSkin); i++){
4120: 0a 20 20 20 20 7a 20 3d 20 61 42 75 69 6c 74 69  .    z = aBuilti
4130: 6e 53 6b 69 6e 5b 69 5d 2e 7a 44 65 73 63 3b 0a  nSkin[i].zDesc;.
4140: 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 3e 25 64      @ <tr><td>%d
4150: 28 69 2b 31 29 2e 3c 74 64 3e 25 68 28 7a 29 3c  (i+1).<td>%h(z)<
4160: 74 64 3e 26 6e 62 73 70 3b 26 6e 62 73 70 3b 3c  td>&nbsp;&nbsp;<
4170: 74 64 3e 0a 20 20 20 20 69 66 28 20 66 6f 73 73  td>.    if( foss
4180: 69 6c 5f 73 74 72 63 6d 70 28 61 42 75 69 6c 74  il_strcmp(aBuilt
4190: 69 6e 53 6b 69 6e 5b 69 5d 2e 7a 53 51 4c 2c 20  inSkin[i].zSQL, 
41a0: 7a 43 75 72 72 65 6e 74 29 3d 3d 30 20 29 7b 0a  zCurrent)==0 ){.
41b0: 20 20 20 20 20 20 40 20 28 43 75 72 72 65 6e 74        @ (Current
41c0: 6c 79 20 49 6e 20 55 73 65 29 0a 20 20 20 20 20  ly In Use).     
41d0: 20 73 65 65 6e 43 75 72 72 65 6e 74 20 3d 20 31   seenCurrent = 1
41e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
41f0: 20 20 20 40 20 3c 66 6f 72 6d 20 61 63 74 69 6f     @ <form actio
4200: 6e 3d 22 25 73 28 67 2e 7a 54 6f 70 29 2f 73 65  n="%s(g.zTop)/se
4210: 74 75 70 5f 73 6b 69 6e 5f 6f 6c 64 22 20 6d 65  tup_skin_old" me
4220: 74 68 6f 64 3d 22 70 6f 73 74 22 3e 0a 20 20 20  thod="post">.   
4230: 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65     @ <input type
4240: 3d 22 68 69 64 64 65 6e 22 20 6e 61 6d 65 3d 22  ="hidden" name="
4250: 73 6e 22 20 76 61 6c 75 65 3d 22 25 68 28 7a 29  sn" value="%h(z)
4260: 22 20 2f 3e 0a 20 20 20 20 20 20 40 20 3c 69 6e  " />.      @ <in
4270: 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74  put type="submit
4280: 22 20 6e 61 6d 65 3d 22 6c 6f 61 64 22 20 76 61  " name="load" va
4290: 6c 75 65 3d 22 49 6e 73 74 61 6c 6c 22 20 2f 3e  lue="Install" />
42a0: 0a 20 20 20 20 20 20 69 66 28 20 70 41 6c 74 53  .      if( pAltS
42b0: 6b 69 6e 3d 3d 26 61 42 75 69 6c 74 69 6e 53 6b  kin==&aBuiltinSk
42c0: 69 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  in[i] ){.       
42d0: 20 40 20 28 43 75 72 72 65 6e 74 20 6f 76 65 72   @ (Current over
42e0: 72 69 64 65 29 0a 20 20 20 20 20 20 7d 0a 20 20  ride).      }.  
42f0: 20 20 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20      @ </form>.  
4300: 20 20 7d 0a 20 20 20 20 40 20 3c 2f 74 72 3e 0a    }.    @ </tr>.
4310: 20 20 7d 0a 20 20 64 62 5f 70 72 65 70 61 72 65    }.  db_prepare
4320: 28 26 71 2c 0a 20 20 20 20 20 22 53 45 4c 45 43  (&q,.     "SELEC
4330: 54 20 73 75 62 73 74 72 28 6e 61 6d 65 2c 20 36  T substr(name, 6
4340: 29 2c 20 76 61 6c 75 65 20 46 52 4f 4d 20 63 6f  ), value FROM co
4350: 6e 66 69 67 22 0a 20 20 20 20 20 22 20 57 48 45  nfig".     " WHE
4360: 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27 73 6b  RE name GLOB 'sk
4370: 69 6e 3a 2a 27 22 0a 20 20 20 20 20 22 20 4f 52  in:*'".     " OR
4380: 44 45 52 20 42 59 20 6e 61 6d 65 22 0a 20 20 29  DER BY name".  )
4390: 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74  ;.  while( db_st
43a0: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
43b0: 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OW ){.    const 
43c0: 63 68 61 72 20 2a 7a 4e 20 3d 20 64 62 5f 63 6f  char *zN = db_co
43d0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29  lumn_text(&q, 0)
43e0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
43f0: 20 2a 7a 56 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e   *zV = db_column
4400: 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a 20 20  _text(&q, 1);.  
4410: 20 20 69 2b 2b 3b 0a 20 20 20 20 40 20 3c 74 72    i++;.    @ <tr
4420: 3e 3c 74 64 3e 25 64 28 69 29 2e 3c 74 64 3e 25  ><td>%d(i).<td>%
4430: 68 28 7a 4e 29 3c 74 64 3e 26 6e 62 73 70 3b 26  h(zN)<td>&nbsp;&
4440: 6e 62 73 70 3b 3c 74 64 3e 0a 20 20 20 20 40 20  nbsp;<td>.    @ 
4450: 3c 66 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 25 73  <form action="%s
4460: 28 67 2e 7a 54 6f 70 29 2f 73 65 74 75 70 5f 73  (g.zTop)/setup_s
4470: 6b 69 6e 5f 6f 6c 64 22 20 6d 65 74 68 6f 64 3d  kin_old" method=
4480: 22 70 6f 73 74 22 3e 0a 20 20 20 20 69 66 28 20  "post">.    if( 
4490: 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a 56  fossil_strcmp(zV
44a0: 2c 20 7a 43 75 72 72 65 6e 74 29 3d 3d 30 20 29  , zCurrent)==0 )
44b0: 7b 0a 20 20 20 20 20 20 40 20 28 43 75 72 72 65  {.      @ (Curre
44c0: 6e 74 6c 79 20 49 6e 20 55 73 65 29 0a 20 20 20  ntly In Use).   
44d0: 20 20 20 73 65 65 6e 43 75 72 72 65 6e 74 20 3d     seenCurrent =
44e0: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
44f0: 20 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79       @ <input ty
4500: 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d 65  pe="submit" name
4510: 3d 22 6c 6f 61 64 22 20 76 61 6c 75 65 3d 22 49  ="load" value="I
4520: 6e 73 74 61 6c 6c 22 3e 0a 20 20 20 20 20 20 40  nstall">.      @
4530: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75   <input type="su
4540: 62 6d 69 74 22 20 6e 61 6d 65 3d 22 64 65 6c 31  bmit" name="del1
4550: 22 20 76 61 6c 75 65 3d 22 44 65 6c 65 74 65 22  " value="Delete"
4560: 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 3c 69  >.    }.    @ <i
4570: 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69  nput type="submi
4580: 74 22 20 6e 61 6d 65 3d 22 72 65 6e 61 6d 65 22  t" name="rename"
4590: 20 76 61 6c 75 65 3d 22 52 65 6e 61 6d 65 22 3e   value="Rename">
45a0: 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79  .    @ <input ty
45b0: 70 65 3d 22 68 69 64 64 65 6e 22 20 6e 61 6d 65  pe="hidden" name
45c0: 3d 22 73 6e 22 20 76 61 6c 75 65 3d 22 25 68 28  ="sn" value="%h(
45d0: 7a 4e 29 22 3e 0a 20 20 20 20 40 20 3c 2f 66 6f  zN)">.    @ </fo
45e0: 72 6d 3e 3c 2f 74 72 3e 0a 20 20 7d 0a 20 20 64  rm></tr>.  }.  d
45f0: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a  b_finalize(&q);.
4600: 20 20 69 66 28 20 21 73 65 65 6e 43 75 72 72 65    if( !seenCurre
4610: 6e 74 20 29 7b 0a 20 20 20 20 69 2b 2b 3b 0a 20  nt ){.    i++;. 
4620: 20 20 20 40 20 3c 74 72 3e 3c 74 64 3e 25 64 28     @ <tr><td>%d(
4630: 69 29 2e 3c 74 64 3e 3c 69 3e 43 75 72 72 65 6e  i).<td><i>Curren
4640: 74 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 3c  t Configuration<
4650: 2f 69 3e 3c 74 64 3e 26 6e 62 73 70 3b 26 6e 62  /i><td>&nbsp;&nb
4660: 73 70 3b 3c 74 64 3e 0a 20 20 20 20 40 20 3c 66  sp;<td>.    @ <f
4670: 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 25 73 28 67  orm action="%s(g
4680: 2e 7a 54 6f 70 29 2f 73 65 74 75 70 5f 73 6b 69  .zTop)/setup_ski
4690: 6e 5f 6f 6c 64 22 20 6d 65 74 68 6f 64 3d 22 70  n_old" method="p
46a0: 6f 73 74 22 3e 0a 20 20 20 20 40 20 3c 69 6e 70  ost">.    @ <inp
46b0: 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22  ut type="submit"
46c0: 20 6e 61 6d 65 3d 22 73 61 76 65 22 20 76 61 6c   name="save" val
46d0: 75 65 3d 22 53 61 76 65 22 3e 0a 20 20 20 20 40  ue="Save">.    @
46e0: 20 3c 2f 66 6f 72 6d 3e 0a 20 20 7d 0a 20 20 40   </form>.  }.  @
46f0: 20 3c 2f 74 61 62 6c 65 3e 0a 20 20 73 74 79 6c   </table>.  styl
4700: 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 20 20 64 62  e_footer();.  db
4710: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
4720: 28 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57  (0);.}.../*.** W
4730: 45 42 50 41 47 45 3a 20 73 65 74 75 70 5f 73 6b  EBPAGE: setup_sk
4740: 69 6e 65 64 69 74 0a 2a 2a 0a 2a 2a 20 45 64 69  inedit.**.** Edi
4750: 74 20 61 73 70 65 63 74 73 20 6f 66 20 61 20 73  t aspects of a s
4760: 6b 69 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 62  kin determined b
4770: 79 20 74 68 65 20 77 3d 20 71 75 65 72 79 20 70  y the w= query p
4780: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 71  arameter..** Req
4790: 75 69 72 65 73 20 53 65 74 75 70 20 70 72 69 76  uires Setup priv
47a0: 69 6c 65 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  ileges..**.**   
47b0: 20 77 3d 4e 55 4d 20 20 20 20 20 2d 2d 20 30 3d   w=NUM     -- 0=
47c0: 43 53 53 2c 20 31 3d 66 6f 6f 74 65 72 2c 20 32  CSS, 1=footer, 2
47d0: 3d 68 65 61 64 65 72 2c 20 33 3d 64 65 74 61 69  =header, 3=detai
47e0: 6c 73 0a 2a 2a 20 20 20 20 73 6b 3d 4e 55 4d 20  ls.**    sk=NUM 
47f0: 20 20 20 2d 2d 20 74 68 65 20 64 72 61 66 74 20     -- the draft 
4800: 73 6b 69 6e 20 6e 75 6d 62 65 72 0a 2a 2f 0a 76  skin number.*/.v
4810: 6f 69 64 20 73 65 74 75 70 5f 73 6b 69 6e 65 64  oid setup_skined
4820: 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  it(void){.  stat
4830: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
4840: 73 53 6b 69 6e 41 64 64 72 20 7b 0a 20 20 20 20  sSkinAddr {.    
4850: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
4860: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
4870: 72 20 2a 7a 54 69 74 6c 65 3b 0a 20 20 20 20 63  r *zTitle;.    c
4880: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 62 6d  onst char *zSubm
4890: 65 6e 75 3b 0a 20 20 7d 20 61 53 6b 69 6e 41 74  enu;.  } aSkinAt
48a0: 74 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  tr[] = {.    /* 
48b0: 30 20 2a 2f 20 7b 20 22 63 73 73 22 2c 20 20 20  0 */ { "css",   
48c0: 20 20 22 43 53 53 22 2c 20 20 20 20 20 20 20 20    "CSS",        
48d0: 20 20 20 20 20 22 43 53 53 22 2c 20 20 20 20 20       "CSS",     
48e0: 7d 2c 0a 20 20 20 20 2f 2a 20 31 20 2a 2f 20 7b  },.    /* 1 */ {
48f0: 20 22 66 6f 6f 74 65 72 22 2c 20 20 22 50 61 67   "footer",  "Pag
4900: 65 20 46 6f 6f 74 65 72 22 2c 20 20 20 20 20 22  e Footer",     "
4910: 46 6f 6f 74 65 72 22 2c 20 20 7d 2c 0a 20 20 20  Footer",  },.   
4920: 20 2f 2a 20 32 20 2a 2f 20 7b 20 22 68 65 61 64   /* 2 */ { "head
4930: 65 72 22 2c 20 20 22 50 61 67 65 20 48 65 61 64  er",  "Page Head
4940: 65 72 22 2c 20 20 20 20 20 22 48 65 61 64 65 72  er",     "Header
4950: 22 2c 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 33 20  ",  },.    /* 3 
4960: 2a 2f 20 7b 20 22 64 65 74 61 69 6c 73 22 2c 20  */ { "details", 
4970: 22 44 69 73 70 6c 61 79 20 44 65 74 61 69 6c 73  "Display Details
4980: 22 2c 20 22 44 65 74 61 69 6c 73 22 2c 20 7d 2c  ", "Details", },
4990: 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  .  };.  const ch
49a0: 61 72 20 2a 7a 42 61 73 69 73 3b 0a 20 20 63 6f  ar *zBasis;.  co
49b0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  nst char *zConte
49c0: 6e 74 3b 0a 20 20 63 68 61 72 20 2a 7a 44 66 6c  nt;.  char *zDfl
49d0: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 4b 65 79 3b  t;.  char *zKey;
49e0: 0a 20 20 69 6e 74 20 69 53 6b 69 6e 3b 0a 20 20  .  int iSkin;.  
49f0: 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 6a 3b  int ii;.  int j;
4a00: 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f  ..  login_check_
4a10: 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 0a  credentials();..
4a20: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
4a30: 77 68 69 63 68 20 73 6b 69 6e 20 77 65 20 61 72  which skin we ar
4a40: 65 20 65 64 69 74 69 6e 67 20 2a 2f 0a 20 20 69  e editing */.  i
4a50: 53 6b 69 6e 20 3d 20 61 74 6f 69 28 50 44 28 22  Skin = atoi(PD("
4a60: 73 6b 22 2c 22 31 22 29 29 3b 0a 20 20 69 66 28  sk","1"));.  if(
4a70: 20 69 53 6b 69 6e 3c 31 20 7c 7c 20 69 53 6b 69   iSkin<1 || iSki
4a80: 6e 3e 39 20 29 20 69 53 6b 69 6e 20 3d 20 31 3b  n>9 ) iSkin = 1;
4a90: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
4aa0: 74 20 74 68 65 20 75 73 65 72 20 69 73 20 61 75  t the user is au
4ab0: 74 68 6f 72 69 7a 65 64 20 74 6f 20 65 64 69 74  thorized to edit
4ac0: 20 74 68 69 73 20 73 6b 69 6e 2e 20 2a 2f 0a 20   this skin. */. 
4ad0: 20 69 66 28 20 21 67 2e 70 65 72 6d 2e 53 65 74   if( !g.perm.Set
4ae0: 75 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  up ){.    char *
4af0: 7a 41 6c 6c 6f 77 65 64 45 64 69 74 6f 72 73 20  zAllowedEditors 
4b00: 3d 20 64 62 5f 67 65 74 5f 6d 70 72 69 6e 74 66  = db_get_mprintf
4b10: 28 22 64 72 61 66 74 25 64 2d 75 73 65 72 73 22  ("draft%d-users"
4b20: 2c 20 22 22 2c 20 69 53 6b 69 6e 29 3b 0a 20 20  , "", iSkin);.  
4b30: 20 20 47 6c 6f 62 20 2a 70 41 6c 6c 6f 77 65 64    Glob *pAllowed
4b40: 45 64 69 74 6f 72 73 3b 0a 20 20 20 20 69 66 28  Editors;.    if(
4b50: 20 7a 41 6c 6c 6f 77 65 64 45 64 69 74 6f 72 73   zAllowedEditors
4b60: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 41 6c  [0] ){.      pAl
4b70: 6c 6f 77 65 64 45 64 69 74 6f 72 73 20 3d 20 67  lowedEditors = g
4b80: 6c 6f 62 5f 63 72 65 61 74 65 28 7a 41 6c 6c 6f  lob_create(zAllo
4b90: 77 65 64 45 64 69 74 6f 72 73 29 3b 0a 20 20 20  wedEditors);.   
4ba0: 20 20 20 69 66 28 20 21 67 6c 6f 62 5f 6d 61 74     if( !glob_mat
4bb0: 63 68 28 70 41 6c 6c 6f 77 65 64 45 64 69 74 6f  ch(pAllowedEdito
4bc0: 72 73 2c 20 7a 41 6c 6c 6f 77 65 64 45 64 69 74  rs, zAllowedEdit
4bd0: 6f 72 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ors) ){.        
4be0: 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 30 29 3b  login_needed(0);
4bf0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
4c00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
4c10: 6c 6f 62 5f 66 72 65 65 28 70 41 6c 6c 6f 77 65  lob_free(pAllowe
4c20: 64 45 64 69 74 6f 72 73 29 3b 0a 20 20 20 20 7d  dEditors);.    }
4c30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 66 69 67 75 72  .  }..  /* figur
4c40: 65 20 6f 75 74 20 77 68 69 63 68 20 66 69 6c 65  e out which file
4c50: 20 69 73 20 74 6f 20 62 65 20 65 64 69 74 65 64   is to be edited
4c60: 20 2a 2f 0a 20 20 69 69 20 3d 20 61 74 6f 69 28   */.  ii = atoi(
4c70: 50 44 28 22 77 22 2c 22 30 22 29 29 3b 0a 20 20  PD("w","0"));.  
4c80: 69 66 28 20 69 69 3c 30 20 7c 7c 20 69 69 3e 63  if( ii<0 || ii>c
4c90: 6f 75 6e 74 28 61 53 6b 69 6e 41 74 74 72 29 20  ount(aSkinAttr) 
4ca0: 29 20 69 69 20 3d 20 30 3b 0a 20 20 7a 4b 65 79  ) ii = 0;.  zKey
4cb0: 20 3d 20 6d 70 72 69 6e 74 66 28 22 64 72 61 66   = mprintf("draf
4cc0: 74 25 64 2d 25 73 22 2c 20 69 53 6b 69 6e 2c 20  t%d-%s", iSkin, 
4cd0: 61 53 6b 69 6e 41 74 74 72 5b 69 69 5d 2e 7a 46  aSkinAttr[ii].zF
4ce0: 69 6c 65 29 3b 0a 0a 20 20 7a 42 61 73 69 73 20  ile);..  zBasis 
4cf0: 3d 20 50 44 28 22 62 61 73 69 73 22 2c 22 64 65  = PD("basis","de
4d00: 66 61 75 6c 74 22 29 3b 0a 20 20 7a 44 66 6c 74  fault");.  zDflt
4d10: 20 3d 20 6d 70 72 69 6e 74 66 28 22 73 6b 69 6e   = mprintf("skin
4d20: 73 2f 25 73 2f 25 73 2e 74 78 74 22 2c 20 7a 42  s/%s/%s.txt", zB
4d30: 61 73 69 73 2c 20 61 53 6b 69 6e 41 74 74 72 5b  asis, aSkinAttr[
4d40: 69 69 5d 2e 7a 46 69 6c 65 29 3b 0a 20 20 64 62  ii].zFile);.  db
4d50: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
4d60: 6f 6e 28 29 3b 0a 20 20 69 66 28 20 50 28 22 72  on();.  if( P("r
4d70: 65 76 65 72 74 22 29 21 3d 30 20 29 7b 0a 20 20  evert")!=0 ){.  
4d80: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
4d90: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 6f 6e  "DELETE FROM con
4da0: 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  fig WHERE name=%
4db0: 51 22 2c 20 61 53 6b 69 6e 41 74 74 72 5b 69 69  Q", aSkinAttr[ii
4dc0: 5d 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 63 67  ].zFile);.    cg
4dd0: 69 5f 72 65 70 6c 61 63 65 5f 70 61 72 61 6d 65  i_replace_parame
4de0: 74 65 72 28 61 53 6b 69 6e 41 74 74 72 5b 69 69  ter(aSkinAttr[ii
4df0: 5d 2e 7a 46 69 6c 65 2c 20 62 75 69 6c 74 69 6e  ].zFile, builtin
4e00: 5f 74 65 78 74 28 7a 44 66 6c 74 29 29 3b 0a 20  _text(zDflt));. 
4e10: 20 7d 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65   }.  style_heade
4e20: 72 28 22 25 73 22 2c 20 61 53 6b 69 6e 41 74 74  r("%s", aSkinAtt
4e30: 72 5b 69 69 5d 2e 7a 54 69 74 6c 65 29 3b 0a 20  r[ii].zTitle);. 
4e40: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 63 6f 75 6e   for(j=0; j<coun
4e50: 74 28 61 53 6b 69 6e 41 74 74 72 29 3b 20 6a 2b  t(aSkinAttr); j+
4e60: 2b 29 7b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 69  +){.    if( j==i
4e70: 69 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  i ) continue;.  
4e80: 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f    style_submenu_
4e90: 65 6c 65 6d 65 6e 74 28 61 53 6b 69 6e 41 74 74  element(aSkinAtt
4ea0: 72 5b 6a 5d 2e 7a 53 75 62 6d 65 6e 75 2c 0a 20  r[j].zSubmenu,. 
4eb0: 20 20 20 20 20 20 20 20 20 22 25 52 2f 73 65 74           "%R/set
4ec0: 75 70 5f 73 6b 69 6e 65 64 69 74 3f 77 3d 25 64  up_skinedit?w=%d
4ed0: 26 62 61 73 69 73 3d 25 68 22 2c 6a 2c 7a 42 61  &basis=%h",j,zBa
4ee0: 73 69 73 29 3b 0a 20 20 7d 0a 20 20 40 20 3c 66  sis);.  }.  @ <f
4ef0: 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 25 73 28 67  orm action="%s(g
4f00: 2e 7a 54 6f 70 29 2f 73 65 74 75 70 5f 73 6b 69  .zTop)/setup_ski
4f10: 6e 65 64 69 74 22 20 6d 65 74 68 6f 64 3d 22 70  nedit" method="p
4f20: 6f 73 74 22 3e 3c 64 69 76 3e 0a 20 20 6c 6f 67  ost"><div>.  log
4f30: 69 6e 5f 69 6e 73 65 72 74 5f 63 73 72 66 5f 73  in_insert_csrf_s
4f40: 65 63 72 65 74 28 29 3b 0a 20 20 40 20 3c 69 6e  ecret();.  @ <in
4f50: 70 75 74 20 74 79 70 65 3d 27 68 69 64 64 65 6e  put type='hidden
4f60: 27 20 6e 61 6d 65 3d 27 77 27 20 76 61 6c 75 65  ' name='w' value
4f70: 3d 27 25 64 28 69 69 29 27 3e 0a 20 20 40 20 3c  ='%d(ii)'>.  @ <
4f80: 69 6e 70 75 74 20 74 79 70 65 3d 27 68 69 64 64  input type='hidd
4f90: 65 6e 27 20 6e 61 6d 65 3d 27 73 6b 27 20 76 61  en' name='sk' va
4fa0: 6c 75 65 3d 27 25 64 28 69 53 6b 69 6e 29 27 3e  lue='%d(iSkin)'>
4fb0: 0a 20 20 40 20 3c 68 32 3e 45 64 69 74 20 25 73  .  @ <h2>Edit %s
4fc0: 28 61 53 6b 69 6e 41 74 74 72 5b 69 69 5d 2e 7a  (aSkinAttr[ii].z
4fd0: 54 69 74 6c 65 29 3a 3c 2f 68 32 3e 0a 20 20 7a  Title):</h2>.  z
4fe0: 43 6f 6e 74 65 6e 74 20 3d 20 74 65 78 74 61 72  Content = textar
4ff0: 65 61 5f 61 74 74 72 69 62 75 74 65 28 22 22 2c  ea_attribute("",
5000: 20 31 30 2c 20 38 30 2c 20 7a 4b 65 79 2c 0a 20   10, 80, zKey,. 
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 20 20 20 20 20 20 20 61 53 6b 69 6e 41 74 74 72         aSkinAttr
5030: 5b 69 69 5d 2e 7a 46 69 6c 65 2c 20 62 75 69 6c  [ii].zFile, buil
5040: 74 69 6e 5f 74 65 78 74 28 7a 44 66 6c 74 29 2c  tin_text(zDflt),
5050: 20 30 29 3b 0a 20 20 40 20 3c 62 72 20 2f 3e 0a   0);.  @ <br />.
5060: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
5070: 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 73  "submit" name="s
5080: 75 62 6d 69 74 22 20 76 61 6c 75 65 3d 22 41 70  ubmit" value="Ap
5090: 70 6c 79 20 43 68 61 6e 67 65 73 22 20 2f 3e 0a  ply Changes" />.
50a0: 20 20 40 20 3c 68 72 20 2f 3e 0a 20 20 40 20 42    @ <hr />.  @ B
50b0: 61 73 65 6c 69 6e 65 3a 20 3c 73 65 6c 65 63 74  aseline: <select
50c0: 20 73 69 7a 65 3d 27 31 27 20 6e 61 6d 65 3d 27   size='1' name='
50d0: 62 61 73 69 73 27 3e 0a 20 20 66 6f 72 28 6a 3d  basis'>.  for(j=
50e0: 30 3b 20 6a 3c 63 6f 75 6e 74 28 61 42 75 69 6c  0; j<count(aBuil
50f0: 74 69 6e 53 6b 69 6e 29 3b 20 6a 2b 2b 29 7b 0a  tinSkin); j++){.
5100: 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66 28 22      cgi_printf("
5110: 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 27 25  <option value='%
5120: 68 27 25 73 3e 25 68 3c 2f 6f 70 74 69 6f 6e 3e  h'%s>%h</option>
5130: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 61 42 75 69  \n",.       aBui
5140: 6c 74 69 6e 53 6b 69 6e 5b 6a 5d 2e 7a 4c 61 62  ltinSkin[j].zLab
5150: 65 6c 2c 0a 20 20 20 20 20 20 20 66 6f 73 73 69  el,.       fossi
5160: 6c 5f 73 74 72 63 6d 70 28 7a 42 61 73 69 73 2c  l_strcmp(zBasis,
5170: 61 42 75 69 6c 74 69 6e 53 6b 69 6e 5b 6a 5d 2e  aBuiltinSkin[j].
5180: 7a 4c 61 62 65 6c 29 3d 3d 30 20 3f 20 22 20 73  zLabel)==0 ? " s
5190: 65 6c 65 63 74 65 64 22 20 3a 20 22 22 2c 0a 20  elected" : "",. 
51a0: 20 20 20 20 20 20 61 42 75 69 6c 74 69 6e 53 6b        aBuiltinSk
51b0: 69 6e 5b 6a 5d 2e 7a 44 65 73 63 0a 20 20 20 20  in[j].zDesc.    
51c0: 29 3b 0a 20 20 7d 0a 20 20 40 20 3c 2f 73 65 6c  );.  }.  @ </sel
51d0: 65 63 74 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20  ect>.  @ <input 
51e0: 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61  type="submit" na
51f0: 6d 65 3d 22 64 69 66 66 22 20 76 61 6c 75 65 3d  me="diff" value=
5200: 22 44 69 66 66 22 20 2f 3e 0a 20 20 69 66 28 20  "Diff" />.  if( 
5210: 50 28 22 64 69 66 66 22 29 21 3d 30 20 29 7b 0a  P("diff")!=0 ){.
5220: 20 20 20 20 75 36 34 20 64 69 66 66 46 6c 61 67      u64 diffFlag
5230: 73 20 3d 20 63 6f 6e 73 74 72 75 63 74 5f 64 69  s = construct_di
5240: 66 66 5f 66 6c 61 67 73 28 30 2c 30 29 20 7c 0a  ff_flags(0,0) |.
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 20 20 20 20 20 44 49 46 46 5f 53 54 52          DIFF_STR
5270: 49 50 5f 45 4f 4c 43 52 3b 0a 20 20 20 20 42 6c  IP_EOLCR;.    Bl
5280: 6f 62 20 66 72 6f 6d 2c 20 74 6f 2c 20 6f 75 74  ob from, to, out
5290: 3b 0a 20 20 20 20 62 6c 6f 62 5f 69 6e 69 74 28  ;.    blob_init(
52a0: 26 74 6f 2c 20 7a 43 6f 6e 74 65 6e 74 2c 20 2d  &to, zContent, -
52b0: 31 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 69 6e 69  1);.    blob_ini
52c0: 74 28 26 66 72 6f 6d 2c 20 62 75 69 6c 74 69 6e  t(&from, builtin
52d0: 5f 74 65 78 74 28 7a 44 66 6c 74 29 2c 20 2d 31  _text(zDflt), -1
52e0: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f  );.    blob_zero
52f0: 28 26 6f 75 74 29 3b 0a 20 20 20 20 40 20 3c 69  (&out);.    @ <i
5300: 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69  nput type="submi
5310: 74 22 20 6e 61 6d 65 3d 22 72 65 76 65 72 74 22  t" name="revert"
5320: 20 76 61 6c 75 65 3d 22 52 65 76 65 72 74 22 20   value="Revert" 
5330: 2f 3e 3c 70 3e 0a 20 20 20 20 69 66 28 20 64 69  /><p>.    if( di
5340: 66 66 46 6c 61 67 73 20 26 20 44 49 46 46 5f 53  ffFlags & DIFF_S
5350: 49 44 45 42 59 53 49 44 45 20 29 7b 0a 20 20 20  IDEBYSIDE ){.   
5360: 20 20 20 74 65 78 74 5f 64 69 66 66 28 26 66 72     text_diff(&fr
5370: 6f 6d 2c 20 26 74 6f 2c 20 26 6f 75 74 2c 20 30  om, &to, &out, 0
5380: 2c 20 64 69 66 66 46 6c 61 67 73 20 7c 20 44 49  , diffFlags | DI
5390: 46 46 5f 48 54 4d 4c 20 7c 20 44 49 46 46 5f 4e  FF_HTML | DIFF_N
53a0: 4f 54 54 4f 4f 42 49 47 29 3b 0a 20 20 20 20 20  OTTOOBIG);.     
53b0: 20 40 20 25 73 28 62 6c 6f 62 5f 73 74 72 28 26   @ %s(blob_str(&
53c0: 6f 75 74 29 29 0a 20 20 20 20 7d 65 6c 73 65 7b  out)).    }else{
53d0: 0a 20 20 20 20 20 20 74 65 78 74 5f 64 69 66 66  .      text_diff
53e0: 28 26 66 72 6f 6d 2c 20 26 74 6f 2c 20 26 6f 75  (&from, &to, &ou
53f0: 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  t, 0,.          
5400: 20 20 20 64 69 66 66 46 6c 61 67 73 20 7c 20 44     diffFlags | D
5410: 49 46 46 5f 4c 49 4e 45 4e 4f 20 7c 20 44 49 46  IFF_LINENO | DIF
5420: 46 5f 48 54 4d 4c 20 7c 20 44 49 46 46 5f 4e 4f  F_HTML | DIFF_NO
5430: 54 54 4f 4f 42 49 47 29 3b 0a 20 20 20 20 20 20  TTOOBIG);.      
5440: 40 20 3c 70 72 65 20 63 6c 61 73 73 3d 22 75 64  @ <pre class="ud
5450: 69 66 66 22 3e 0a 20 20 20 20 20 20 40 20 25 73  iff">.      @ %s
5460: 28 62 6c 6f 62 5f 73 74 72 28 26 6f 75 74 29 29  (blob_str(&out))
5470: 0a 20 20 20 20 20 20 40 20 3c 2f 70 72 65 3e 0a  .      @ </pre>.
5480: 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 72      }.    blob_r
5490: 65 73 65 74 28 26 66 72 6f 6d 29 3b 0a 20 20 20  eset(&from);.   
54a0: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 74 6f 29   blob_reset(&to)
54b0: 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74  ;.    blob_reset
54c0: 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 20 20 40 20  (&out);.  }.  @ 
54d0: 3c 2f 64 69 76 3e 3c 2f 66 6f 72 6d 3e 0a 20 20  </div></form>.  
54e0: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a  style_footer();.
54f0: 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63    db_end_transac
5500: 74 69 6f 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  tion(0);.}../*.*
5510: 2a 20 54 72 79 20 74 6f 20 69 6e 69 74 69 61 6c  * Try to initial
5520: 69 7a 65 20 64 72 61 66 74 20 73 6b 69 6e 20 69  ize draft skin i
5530: 53 6b 69 6e 20 74 6f 20 74 68 65 20 62 75 69 6c  Skin to the buil
5540: 74 2d 69 6e 20 6f 72 20 70 72 65 65 78 69 73 74  t-in or preexist
5550: 69 6e 67 0a 2a 2a 20 73 6b 69 6e 20 6e 61 6d 65  ing.** skin name
5560: 64 20 62 79 20 7a 54 65 6d 70 6c 61 74 65 2e 0a  d by zTemplate..
5570: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
5580: 6b 69 6e 5f 69 6e 69 74 69 61 6c 69 7a 65 5f 64  kin_initialize_d
5590: 72 61 66 74 28 69 6e 74 20 69 53 6b 69 6e 2c 20  raft(int iSkin, 
55a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 6d  const char *zTem
55b0: 70 6c 61 74 65 29 7b 0a 20 20 69 6e 74 20 69 3b  plate){.  int i;
55c0: 0a 20 20 69 66 28 20 7a 54 65 6d 70 6c 61 74 65  .  if( zTemplate
55d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
55e0: 69 66 28 20 73 74 72 63 6d 70 28 7a 54 65 6d 70  if( strcmp(zTemp
55f0: 6c 61 74 65 2c 20 22 63 75 72 72 65 6e 74 22 29  late, "current")
5600: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ==0 ){.    for(i
5610: 3d 30 3b 20 69 3c 63 6f 75 6e 74 28 61 7a 53 6b  =0; i<count(azSk
5620: 69 6e 46 69 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20  inFile); i++){. 
5630: 20 20 20 20 20 64 62 5f 75 6e 73 65 74 5f 6d 70       db_unset_mp
5640: 72 69 6e 74 66 28 22 64 72 61 66 74 25 64 2d 25  rintf("draft%d-%
5650: 73 22 2c 20 30 2c 20 69 53 6b 69 6e 2c 20 61 7a  s", 0, iSkin, az
5660: 53 6b 69 6e 46 69 6c 65 5b 69 5d 29 3b 0a 20 20  SkinFile[i]);.  
5670: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
5680: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f 75 6e   for(i=0; i<coun
5690: 74 28 61 42 75 69 6c 74 69 6e 53 6b 69 6e 29 3b  t(aBuiltinSkin);
56a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
56b0: 20 73 74 72 63 6d 70 28 7a 54 65 6d 70 6c 61 74   strcmp(zTemplat
56c0: 65 2c 20 61 42 75 69 6c 74 69 6e 53 6b 69 6e 5b  e, aBuiltinSkin[
56d0: 69 5d 2e 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b  i].zLabel)==0 ){
56e0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
56f0: 3b 20 69 3c 63 6f 75 6e 74 28 61 7a 53 6b 69 6e  ; i<count(azSkin
5700: 46 69 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  File); i++){.   
5710: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4b 65         char *zKe
5720: 79 20 3d 20 6d 70 72 69 6e 74 66 28 22 73 6b 69  y = mprintf("ski
5730: 6e 73 2f 25 73 2f 25 73 2e 74 78 74 22 2c 20 7a  ns/%s/%s.txt", z
5740: 54 65 6d 70 6c 61 74 65 2c 20 61 7a 53 6b 69 6e  Template, azSkin
5750: 46 69 6c 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  File[i]);.      
5760: 20 20 20 20 64 62 5f 73 65 74 5f 6d 70 72 69 6e      db_set_mprin
5770: 74 66 28 22 64 72 61 66 74 25 64 2d 25 73 22 2c  tf("draft%d-%s",
5780: 20 62 75 69 6c 74 69 6e 5f 74 65 78 74 28 7a 4b   builtin_text(zK
5790: 65 79 29 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ey), 0,.        
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 20 69 53 6b 69 6e 2c 20 61 7a 53 6b 69 6e 46 69   iSkin, azSkinFi
57c0: 6c 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  le[i]);.        
57d0: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
57e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
57f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 62 6c   }.}../*.** Publ
5800: 69 73 68 20 74 68 65 20 64 72 61 66 74 20 73 6b  ish the draft sk
5810: 69 6e 20 69 53 6b 69 6e 20 61 73 20 74 68 65 20  in iSkin as the 
5820: 6e 65 77 20 64 65 66 61 75 6c 74 2e 0a 2a 2f 0a  new default..*/.
5830: 73 74 61 74 69 63 20 76 6f 69 64 20 73 6b 69 6e  static void skin
5840: 5f 70 75 62 6c 69 73 68 28 69 6e 74 20 69 53 6b  _publish(int iSk
5850: 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 75  in){.  char *zCu
5860: 72 72 65 6e 74 3b 20 20 20 20 2f 2a 20 53 51 4c  rrent;    /* SQL
5870: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
5880: 74 68 65 20 63 75 72 72 65 6e 74 20 73 6b 69 6e  the current skin
5890: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 69   */.  char *zBui
58a0: 6c 74 69 6e 3b 20 20 20 20 2f 2a 20 53 51 4c 20  ltin;    /* SQL 
58b0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61  description of a
58c0: 20 62 75 69 6c 74 2d 69 6e 20 73 6b 69 6e 20 2a   built-in skin *
58d0: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  /.  int i;.  int
58e0: 20 73 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20   seen = 0;      
58f0: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 6e 65  /* True if no ne
5900: 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 62 61 63  ed to make a bac
5910: 6b 75 70 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  kup */..  /* Che
5920: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
5930: 20 63 75 72 72 65 6e 74 20 73 6b 69 6e 20 69 73   current skin is
5940: 20 61 6c 72 65 61 64 79 20 73 61 76 65 64 2e 20   already saved. 
5950: 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 72 65   If it is, there
5960: 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6e 65 65 64  .  ** is no need
5970: 20 74 6f 20 63 72 65 61 74 65 20 61 20 62 61 63   to create a bac
5980: 6b 75 70 20 2a 2f 0a 20 20 7a 43 75 72 72 65 6e  kup */.  zCurren
5990: 74 20 3d 20 67 65 74 53 6b 69 6e 28 30 29 3b 0a  t = getSkin(0);.
59a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f 75    for(i=0; i<cou
59b0: 6e 74 28 61 42 75 69 6c 74 69 6e 53 6b 69 6e 29  nt(aBuiltinSkin)
59c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 69  ; i++){.    zBui
59d0: 6c 74 69 6e 20 3d 20 67 65 74 53 6b 69 6e 28 61  ltin = getSkin(a
59e0: 42 75 69 6c 74 69 6e 53 6b 69 6e 5b 69 5d 2e 7a  BuiltinSkin[i].z
59f0: 4c 61 62 65 6c 29 3b 0a 20 20 20 20 69 66 28 20  Label);.    if( 
5a00: 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 61 42  fossil_strcmp(aB
5a10: 75 69 6c 74 69 6e 53 6b 69 6e 5b 69 5d 2e 7a 53  uiltinSkin[i].zS
5a20: 51 4c 2c 20 7a 43 75 72 72 65 6e 74 29 3d 3d 30  QL, zCurrent)==0
5a30: 20 29 7b 0a 20 20 20 20 20 20 73 65 65 6e 20 3d   ){.      seen =
5a40: 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
5a50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5a60: 20 21 73 65 65 6e 20 29 7b 0a 20 20 20 20 73 65   !seen ){.    se
5a70: 65 6e 20 3d 20 64 62 5f 65 78 69 73 74 73 28 22  en = db_exists("
5a80: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 63 6f  SELECT 1 FROM co
5a90: 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65 20  nfig WHERE name 
5aa0: 47 4c 4f 42 20 27 73 6b 69 6e 3a 2a 27 22 0a 20  GLOB 'skin:*'". 
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ac0: 20 20 20 20 20 20 22 20 41 4e 44 20 76 61 6c 75        " AND valu
5ad0: 65 3d 25 51 22 2c 20 7a 43 75 72 72 65 6e 74 29  e=%Q", zCurrent)
5ae0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 65 65  ;.  }.  if( !see
5af0: 6e 20 29 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74  n ){.    db_mult
5b00: 69 5f 65 78 65 63 28 0a 20 20 20 20 20 20 22 49  i_exec(.      "I
5b10: 4e 53 45 52 54 20 49 4e 54 4f 20 63 6f 6e 66 69  NSERT INTO confi
5b20: 67 28 6e 61 6d 65 2c 76 61 6c 75 65 2c 6d 74 69  g(name,value,mti
5b30: 6d 65 29 20 56 41 4c 55 45 53 28 22 0a 20 20 20  me) VALUES(".   
5b40: 20 20 20 22 20 20 73 74 72 66 74 69 6d 65 28 27     "  strftime('
5b50: 73 6b 69 6e 3a 42 61 63 6b 75 70 20 4f 6e 20 25  skin:Backup On %
5b60: 25 59 2d 25 25 6d 2d 25 25 64 20 25 25 48 3a 25  %Y-%%m-%%d %%H:%
5b70: 25 4d 3a 25 25 53 27 29 2c 22 0a 20 20 20 20 20  %M:%%S'),".     
5b80: 20 22 20 20 25 51 2c 6e 6f 77 28 29 29 22 2c 20   "  %Q,now())", 
5b90: 7a 43 75 72 72 65 6e 74 0a 20 20 20 20 29 3b 0a  zCurrent.    );.
5ba0: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 62 6c 69 73    }..  /* Publis
5bb0: 68 20 64 72 61 66 74 20 69 53 6b 69 6e 20 2a 2f  h draft iSkin */
5bc0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f  .  for(i=0; i<co
5bd0: 75 6e 74 28 61 7a 53 6b 69 6e 46 69 6c 65 29 3b  unt(azSkinFile);
5be0: 20 69 2b 2b 29 7b 0a 20 20 20 20 64 62 5f 6d 75   i++){.    db_mu
5bf0: 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 20  lti_exec(.      
5c00: 22 55 50 44 41 54 45 20 63 6f 6e 66 69 67 22 0a  "UPDATE config".
5c10: 20 20 20 20 20 20 22 20 53 45 54 20 76 61 6c 75        " SET valu
5c20: 65 3d 28 53 45 4c 45 43 54 20 76 61 6c 75 65 20  e=(SELECT value 
5c30: 46 52 4f 4d 20 63 6f 6e 66 69 67 20 41 53 20 78  FROM config AS x
5c40: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
5c50: 20 20 20 20 22 20 57 48 45 52 45 20 78 2e 6e 61      " WHERE x.na
5c60: 6d 65 20 3d 20 70 72 69 6e 74 66 28 27 64 72 61  me = printf('dra
5c70: 66 74 25 64 2d 25 25 73 27 2c 63 6f 6e 66 69 67  ft%d-%%s',config
5c80: 2e 6e 61 6d 65 29 29 2c 22 0a 20 20 20 20 20 20  .name)),".      
5c90: 22 20 20 20 20 20 6d 74 69 6d 65 3d 6e 6f 77 28  "     mtime=now(
5ca0: 29 22 0a 20 20 20 20 20 20 22 20 57 48 45 52 45  )".      " WHERE
5cb0: 20 6e 61 6d 65 20 49 4e 20 28 27 63 73 73 27 2c   name IN ('css',
5cc0: 27 68 65 61 64 65 72 27 2c 27 66 6f 6f 74 65 72  'header','footer
5cd0: 27 2c 27 64 65 74 61 69 6c 73 27 29 22 2c 20 69  ','details')", i
5ce0: 53 6b 69 6e 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  Skin.    );.  }.
5cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45  }../*.** WEBPAGE
5d00: 3a 20 73 65 74 75 70 5f 73 6b 69 6e 0a 2a 2a 0a  : setup_skin.**.
5d10: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 70 61  ** Generate a pa
5d20: 67 65 20 73 68 6f 77 69 6e 67 20 74 68 65 20 73  ge showing the s
5d30: 74 65 70 73 20 6e 65 65 64 65 64 20 74 6f 20 63  teps needed to c
5d40: 75 73 74 6f 6d 69 7a 65 20 61 20 73 6b 69 6e 2e  ustomize a skin.
5d50: 0a 2a 2f 0a 76 6f 69 64 20 73 65 74 75 70 5f 73  .*/.void setup_s
5d60: 6b 69 6e 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74  kin(void){.  int
5d70: 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   i;          /* 
5d80: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
5d90: 20 20 69 6e 74 20 69 53 6b 69 6e 3b 20 20 20 20    int iSkin;    
5da0: 20 20 2f 2a 20 57 68 69 63 68 20 64 72 61 66 74    /* Which draft
5db0: 20 73 6b 69 6e 20 69 73 20 62 65 69 6e 67 20 65   skin is being e
5dc0: 64 69 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dited */.  int i
5dd0: 73 53 65 74 75 70 3b 20 20 20 20 2f 2a 20 54 72  sSetup;    /* Tr
5de0: 75 65 20 66 6f 72 20 61 6e 20 61 64 6d 69 6e 69  ue for an admini
5df0: 73 74 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  strator */.  int
5e00: 20 69 73 45 64 69 74 6f 72 3b 20 20 20 2f 2a 20   isEditor;   /* 
5e10: 4f 74 68 65 72 73 20 61 75 74 68 6f 72 69 7a 65  Others authorize
5e20: 64 20 74 6f 20 6d 61 6b 65 20 65 64 69 74 73 20  d to make edits 
5e30: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 6c 6c 6f  */.  char *zAllo
5e40: 77 65 64 45 64 69 74 6f 72 73 3b 20 20 20 2f 2a  wedEditors;   /*
5e50: 20 57 68 6f 20 6d 61 79 20 65 64 69 74 20 74 68   Who may edit th
5e60: 65 20 64 72 61 66 74 20 73 6b 69 6e 20 2a 2f 0a  e draft skin */.
5e70: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
5e80: 68 61 72 20 2a 61 7a 54 65 73 74 50 61 67 65 73  har *azTestPages
5e90: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 22 68 6f 6d  [] = {.     "hom
5ea0: 65 22 2c 0a 20 20 20 20 20 22 74 69 6d 65 6c 69  e",.     "timeli
5eb0: 6e 65 22 2c 0a 20 20 20 20 20 22 64 69 72 3f 63  ne",.     "dir?c
5ec0: 69 3d 74 69 70 22 2c 0a 20 20 20 20 20 22 64 69  i=tip",.     "di
5ed0: 72 3f 63 69 3d 74 69 70 26 74 79 70 65 3d 74 72  r?ci=tip&type=tr
5ee0: 65 65 22 2c 0a 20 20 20 20 20 22 62 72 6c 69 73  ee",.     "brlis
5ef0: 74 22 2c 0a 20 20 20 20 20 22 69 6e 66 6f 2f 74  t",.     "info/t
5f00: 72 75 6e 6b 22 2c 0a 20 20 7d 3b 0a 0a 20 20 2f  runk",.  };..  /
5f10: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69  * Figure out whi
5f20: 63 68 20 73 6b 69 6e 20 77 65 20 61 72 65 20 65  ch skin we are e
5f30: 64 69 74 69 6e 67 20 2a 2f 0a 20 20 69 53 6b 69  diting */.  iSki
5f40: 6e 20 3d 20 61 74 6f 69 28 50 44 28 22 73 6b 22  n = atoi(PD("sk"
5f50: 2c 22 31 22 29 29 3b 0a 20 20 69 66 28 20 69 53  ,"1"));.  if( iS
5f60: 6b 69 6e 3c 31 20 7c 7c 20 69 53 6b 69 6e 3e 39  kin<1 || iSkin>9
5f70: 20 29 20 69 53 6b 69 6e 20 3d 20 31 3b 0a 0a 20   ) iSkin = 1;.. 
5f80: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69   /* Figure out i
5f90: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 75 73  f the current us
5fa0: 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  er is allowed to
5fb0: 20 6d 61 6b 65 20 61 64 6d 69 6e 69 73 74 72 61   make administra
5fc0: 74 69 76 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65  tive.  ** change
5fd0: 73 20 61 6e 64 2f 6f 72 20 65 64 69 74 73 0a 20  s and/or edits. 
5fe0: 20 2a 2f 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63   */.  login_chec
5ff0: 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b  k_credentials();
6000: 0a 20 20 7a 41 6c 6c 6f 77 65 64 45 64 69 74 6f  .  zAllowedEdito
6010: 72 73 20 3d 20 64 62 5f 67 65 74 5f 6d 70 72 69  rs = db_get_mpri
6020: 6e 74 66 28 22 64 72 61 66 74 25 64 2d 75 73 65  ntf("draft%d-use
6030: 72 73 22 2c 20 22 22 2c 20 69 53 6b 69 6e 29 3b  rs", "", iSkin);
6040: 0a 20 20 69 66 28 20 67 2e 70 65 72 6d 2e 53 65  .  if( g.perm.Se
6050: 74 75 70 20 29 7b 0a 20 20 20 20 69 73 53 65 74  tup ){.    isSet
6060: 75 70 20 3d 20 69 73 45 64 69 74 6f 72 20 3d 20  up = isEditor = 
6070: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
6080: 47 6c 6f 62 20 2a 70 41 6c 6c 6f 77 65 64 45 64  Glob *pAllowedEd
6090: 69 74 6f 72 73 3b 0a 20 20 20 20 69 73 53 65 74  itors;.    isSet
60a0: 75 70 20 3d 20 69 73 45 64 69 74 6f 72 20 3d 20  up = isEditor = 
60b0: 30 3b 0a 20 20 20 20 69 66 28 20 7a 41 6c 6c 6f  0;.    if( zAllo
60c0: 77 65 64 45 64 69 74 6f 72 73 5b 30 5d 20 29 7b  wedEditors[0] ){
60d0: 0a 20 20 20 20 20 20 70 41 6c 6c 6f 77 65 64 45  .      pAllowedE
60e0: 64 69 74 6f 72 73 20 3d 20 67 6c 6f 62 5f 63 72  ditors = glob_cr
60f0: 65 61 74 65 28 7a 41 6c 6c 6f 77 65 64 45 64 69  eate(zAllowedEdi
6100: 74 6f 72 73 29 3b 0a 20 20 20 20 20 20 69 73 45  tors);.      isE
6110: 64 69 74 6f 72 20 3d 20 67 6c 6f 62 5f 6d 61 74  ditor = glob_mat
6120: 63 68 28 70 41 6c 6c 6f 77 65 64 45 64 69 74 6f  ch(pAllowedEdito
6130: 72 73 2c 20 7a 41 6c 6c 6f 77 65 64 45 64 69 74  rs, zAllowedEdit
6140: 6f 72 73 29 3b 0a 20 20 20 20 20 20 67 6c 6f 62  ors);.      glob
6150: 5f 66 72 65 65 28 70 41 6c 6c 6f 77 65 64 45 64  _free(pAllowedEd
6160: 69 74 6f 72 73 29 3b 0a 20 20 20 20 7d 0a 20 20  itors);.    }.  
6170: 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
6180: 7a 65 20 74 68 65 20 73 6b 69 6e 2c 20 69 66 20  ze the skin, if 
6190: 72 65 71 75 65 73 74 65 64 20 61 6e 64 20 61 75  requested and au
61a0: 74 68 6f 72 69 7a 65 64 2e 20 2a 2f 0a 20 20 69  thorized. */.  i
61b0: 66 28 20 50 28 22 69 6e 69 74 33 22 29 21 3d 30  f( P("init3")!=0
61c0: 20 26 26 20 69 73 45 64 69 74 6f 72 20 29 7b 0a   && isEditor ){.
61d0: 20 20 20 20 73 6b 69 6e 5f 69 6e 69 74 69 61 6c      skin_initial
61e0: 69 7a 65 5f 64 72 61 66 74 28 69 53 6b 69 6e 2c  ize_draft(iSkin,
61f0: 20 50 28 22 69 6e 69 74 73 6b 69 6e 22 29 29 3b   P("initskin"));
6200: 0a 20 20 7d 0a 20 20 69 66 28 20 50 28 22 65 33  .  }.  if( P("e3
6210: 22 29 21 3d 30 20 26 26 20 69 73 53 65 74 75 70  ")!=0 && isSetup
6220: 20 29 7b 0a 20 20 20 20 64 62 5f 73 65 74 5f 6d   ){.    db_set_m
6230: 70 72 69 6e 74 66 28 22 64 72 61 66 74 25 64 2d  printf("draft%d-
6240: 75 73 65 72 73 22 2c 20 50 44 28 22 65 64 69 74  users", PD("edit
6250: 6f 72 73 22 2c 22 22 29 2c 20 30 2c 20 69 53 6b  ors",""), 0, iSk
6260: 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  in);.  }..  /* P
6270: 75 62 6c 69 73 68 20 74 68 65 20 64 72 61 66 74  ublish the draft
6280: 20 73 6b 69 6e 20 2a 2f 0a 20 20 69 66 28 20 50   skin */.  if( P
6290: 28 22 70 75 62 37 22 29 21 3d 30 20 26 26 20 50  ("pub7")!=0 && P
62a0: 42 28 22 70 75 62 37 63 6b 31 22 29 20 26 26 20  B("pub7ck1") && 
62b0: 50 42 28 22 70 75 62 37 63 6b 32 22 29 20 29 7b  PB("pub7ck2") ){
62c0: 0a 20 20 20 20 73 6b 69 6e 5f 70 75 62 6c 69 73  .    skin_publis
62d0: 68 28 69 53 6b 69 6e 29 3b 0a 20 20 7d 0a 0a 20  h(iSkin);.  }.. 
62e0: 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 43   style_header("C
62f0: 75 73 74 6f 6d 69 7a 65 20 53 6b 69 6e 22 29 3b  ustomize Skin");
6300: 0a 0a 20 20 40 20 3c 70 3e 43 75 73 74 6f 6d 69  ..  @ <p>Customi
6310: 7a 65 20 74 68 65 20 6c 6f 6f 6b 20 6f 66 20 74  ze the look of t
6320: 68 69 73 20 46 6f 73 73 69 6c 20 72 65 70 6f 73  his Fossil repos
6330: 69 74 6f 72 79 20 62 79 20 6d 61 6b 69 6e 67 20  itory by making 
6340: 63 68 61 6e 67 65 73 0a 20 20 40 20 74 6f 20 74  changes.  @ to t
6350: 68 65 20 43 53 53 2c 20 48 65 61 64 65 72 2c 20  he CSS, Header, 
6360: 46 6f 6f 74 65 72 2c 20 61 6e 64 20 44 65 74 61  Footer, and Deta
6370: 69 6c 20 53 65 74 74 69 6e 67 73 20 69 6e 20 6f  il Settings in o
6380: 6e 65 20 6f 66 20 6e 69 6e 65 20 22 64 72 61 66  ne of nine "draf
6390: 74 22 0a 20 20 40 20 63 6f 6e 66 69 67 75 72 61  t".  @ configura
63a0: 74 69 6f 6e 73 2e 20 20 54 68 65 6e 2c 20 61 66  tions.  Then, af
63b0: 74 65 72 20 76 65 72 69 66 79 69 6e 67 20 74 68  ter verifying th
63c0: 61 74 20 61 6c 6c 20 69 73 20 77 6f 72 6b 69 6e  at all is workin
63d0: 67 20 63 6f 72 72 65 63 74 6c 79 2c 0a 20 20 40  g correctly,.  @
63e0: 20 70 75 62 6c 69 73 68 20 74 68 65 20 64 72 61   publish the dra
63f0: 66 74 20 74 6f 20 62 65 63 6f 6d 65 20 74 68 65  ft to become the
6400: 20 6e 65 77 20 6d 61 69 6e 20 53 6b 69 6e 2e 3c   new main Skin.<
6410: 70 3e 0a 20 20 40 0a 20 20 40 20 3c 61 20 6e 61  p>.  @.  @ <a na
6420: 6d 65 3d 27 73 74 65 70 31 27 3e 3c 2f 61 3e 0a  me='step1'></a>.
6430: 20 20 40 20 3c 68 31 3e 53 74 65 70 20 31 3a 20    @ <h1>Step 1: 
6440: 49 64 65 6e 74 69 66 79 20 57 68 69 63 68 20 44  Identify Which D
6450: 72 61 66 74 20 54 6f 20 55 73 65 3c 2f 68 31 3e  raft To Use</h1>
6460: 0a 20 20 40 0a 20 20 40 20 3c 70 3e 54 68 65 20  .  @.  @ <p>The 
6470: 6d 61 69 6e 20 73 6b 69 6e 20 6f 66 20 46 6f 73  main skin of Fos
6480: 73 69 6c 20 63 61 6e 6e 6f 74 20 62 65 20 65 64  sil cannot be ed
6490: 69 74 65 64 20 64 69 72 65 63 74 6c 79 2e 20 20  ited directly.  
64a0: 49 6e 73 74 65 61 64 2c 0a 20 20 40 20 65 64 69  Instead,.  @ edi
64b0: 74 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 6f  ts are made to o
64c0: 6e 65 20 6f 66 20 6e 69 6e 65 20 64 72 61 66 74  ne of nine draft
64d0: 20 73 6b 69 6e 73 2e 20 20 41 20 64 72 61 66 74   skins.  A draft
64e0: 20 73 6b 69 6e 20 63 61 6e 20 74 68 65 6e 0a 20   skin can then. 
64f0: 20 40 20 62 65 20 70 75 62 6c 69 73 68 65 64 20   @ be published 
6500: 74 6f 20 62 65 63 6f 6d 65 20 74 68 65 20 64 65  to become the de
6510: 66 61 75 6c 74 20 73 6b 69 6e 2e 0a 20 20 40 20  fault skin..  @ 
6520: 4e 69 6e 65 20 73 65 70 61 72 61 74 65 20 64 72  Nine separate dr
6530: 61 66 74 73 20 61 72 65 20 61 76 61 69 6c 61 62  afts are availab
6540: 6c 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  le to facilitate
6550: 20 41 2f 42 20 74 65 73 74 69 6e 67 2e 3c 2f 70   A/B testing.</p
6560: 3e 0a 20 20 40 0a 20 20 40 20 3c 66 6f 72 6d 20  >.  @.  @ <form 
6570: 6d 65 74 68 6f 64 3d 27 50 4f 53 54 27 20 61 63  method='POST' ac
6580: 74 69 6f 6e 3d 27 25 52 2f 73 65 74 75 70 5f 73  tion='%R/setup_s
6590: 6b 69 6e 23 73 74 65 70 32 27 20 69 64 3d 27 66  kin#step2' id='f
65a0: 30 31 27 3e 0a 20 20 40 20 3c 70 20 63 6c 61 73  01'>.  @ <p clas
65b0: 73 3d 27 73 6b 69 6e 49 6e 70 75 74 27 3e 44 72  s='skinInput'>Dr
65c0: 61 66 74 20 73 6b 69 6e 20 74 6f 20 65 64 69 74  aft skin to edit
65d0: 3a 0a 20 20 40 20 3c 73 65 6c 65 63 74 20 73 69  :.  @ <select si
65e0: 7a 65 3d 27 31 27 20 6e 61 6d 65 3d 27 73 6b 27  ze='1' name='sk'
65f0: 20 6f 6e 63 68 61 6e 67 65 3d 27 67 65 62 69 28   onchange='gebi(
6600: 22 66 30 31 22 29 2e 73 75 62 6d 69 74 28 29 27  "f01").submit()'
6610: 3e 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  >.  for(i=1; i<=
6620: 39 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  9; i++){.    if(
6630: 20 69 3d 3d 69 53 6b 69 6e 20 29 7b 0a 20 20 20   i==iSkin ){.   
6640: 20 20 20 40 20 3c 6f 70 74 69 6f 6e 20 76 61 6c     @ <option val
6650: 75 65 3d 27 25 64 28 69 29 27 20 73 65 6c 65 63  ue='%d(i)' selec
6660: 74 65 64 3e 64 72 61 66 74 25 64 28 69 29 3c 2f  ted>draft%d(i)</
6670: 6f 70 74 69 6f 6e 3e 0a 20 20 20 20 7d 65 6c 73  option>.    }els
6680: 65 7b 0a 20 20 20 20 20 20 40 20 3c 6f 70 74 69  e{.      @ <opti
6690: 6f 6e 20 76 61 6c 75 65 3d 27 25 64 28 69 29 27  on value='%d(i)'
66a0: 3e 64 72 61 66 74 25 64 28 69 29 3c 2f 6f 70 74  >draft%d(i)</opt
66b0: 69 6f 6e 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ion>.    }.  }. 
66c0: 20 40 20 3c 2f 73 65 6c 65 63 74 3e 0a 20 20 40   @ </select>.  @
66d0: 20 3c 2f 70 3e 0a 20 20 40 0a 20 20 40 20 3c 61   </p>.  @.  @ <a
66e0: 20 6e 61 6d 65 3d 27 73 74 65 70 32 27 3e 3c 2f   name='step2'></
66f0: 61 3e 0a 20 20 40 20 3c 68 31 3e 53 74 65 70 20  a>.  @ <h1>Step 
6700: 32 3a 20 41 75 74 68 65 6e 74 69 63 61 74 65 3c  2: Authenticate<
6710: 2f 68 31 3e 0a 20 20 40 0a 20 20 69 66 28 20 69  /h1>.  @.  if( i
6720: 73 53 65 74 75 70 20 29 7b 0a 20 20 20 20 40 20  sSetup ){.    @ 
6730: 3c 70 3e 41 73 20 61 6e 20 61 64 6d 69 6e 69 73  <p>As an adminis
6740: 74 72 61 74 6f 72 2c 20 79 6f 75 20 63 61 6e 20  trator, you can 
6750: 6d 61 6b 65 20 61 6e 79 20 65 64 69 74 73 20 79  make any edits y
6760: 6f 75 20 6c 69 6b 65 20 74 6f 20 74 68 69 73 20  ou like to this 
6770: 6f 72 0a 20 20 20 20 40 20 61 6e 79 20 6f 74 68  or.    @ any oth
6780: 65 72 20 73 6b 69 6e 2e 20 20 59 6f 75 20 63 61  er skin.  You ca
6790: 6e 20 61 6c 73 6f 20 61 75 74 68 6f 72 69 7a 65  n also authorize
67a0: 64 20 6f 74 68 65 72 20 75 73 65 72 73 20 74 6f  d other users to
67b0: 20 65 64 69 74 20 74 68 69 73 0a 20 20 20 20 40   edit this.    @
67c0: 20 73 6b 69 6e 2e 20 20 41 6e 79 20 75 73 65 72   skin.  Any user
67d0: 20 77 68 6f 73 65 20 6c 6f 67 69 6e 20 6e 61 6d   whose login nam
67e0: 65 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 6f  e matches the co
67f0: 6d 6d 61 2d 73 65 70 61 72 61 74 65 20 6c 69 73  mma-separate lis
6800: 74 0a 20 20 20 20 40 20 6f 66 20 47 4c 4f 42 20  t.    @ of GLOB 
6810: 65 78 70 72 65 73 73 69 6f 6e 73 20 62 65 6c 6f  expressions belo
6820: 77 20 69 73 20 67 69 76 65 6e 20 73 70 65 63 69  w is given speci
6830: 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 20 74 6f  al permission to
6840: 20 65 64 69 74 0a 20 20 20 20 40 20 74 68 65 20   edit.    @ the 
6850: 64 72 61 66 74 25 64 28 69 53 6b 69 6e 29 20 73  draft%d(iSkin) s
6860: 6b 69 6e 3a 0a 20 20 20 20 40 0a 20 20 20 20 40  kin:.    @.    @
6870: 20 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d 27 50   <form method='P
6880: 4f 53 54 27 20 61 63 74 69 6f 6e 3d 27 25 52 2f  OST' action='%R/
6890: 73 65 74 75 70 5f 73 6b 69 6e 23 73 74 65 70 32  setup_skin#step2
68a0: 27 20 69 64 3d 27 66 30 32 27 3e 0a 20 20 20 20  ' id='f02'>.    
68b0: 40 20 3c 70 20 63 6c 61 73 73 3d 27 73 6b 69 6e  @ <p class='skin
68c0: 49 6e 70 75 74 27 3e 0a 20 20 20 20 40 20 3c 69  Input'>.    @ <i
68d0: 6e 70 75 74 20 74 79 70 65 3d 27 68 69 64 64 65  nput type='hidde
68e0: 6e 27 20 6e 61 6d 65 3d 27 73 6b 27 20 76 61 6c  n' name='sk' val
68f0: 75 65 3d 27 25 64 28 69 53 6b 69 6e 29 27 3e 0a  ue='%d(iSkin)'>.
6900: 20 20 20 20 40 20 41 75 74 68 6f 72 69 7a 65 64      @ Authorized
6910: 20 65 64 69 74 6f 72 73 20 66 6f 72 20 73 6b 69   editors for ski
6920: 6e 20 64 72 61 66 74 25 64 28 69 53 6b 69 6e 29  n draft%d(iSkin)
6930: 3a 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74  :.    @ <input t
6940: 79 70 65 3d 27 74 65 78 74 27 20 6e 61 6d 65 3d  ype='text' name=
6950: 27 65 64 69 74 6f 72 73 27 20 76 61 6c 75 65 3d  'editors' value=
6960: 27 25 68 28 7a 41 6c 6c 6f 77 65 64 45 64 69 74  '%h(zAllowedEdit
6970: 6f 72 73 29 27 5c 0a 20 20 20 20 40 20 20 77 69  ors)'\.    @  wi
6980: 64 74 68 3d 27 34 30 27 3e 0a 20 20 20 20 40 20  dth='40'>.    @ 
6990: 3c 69 6e 70 75 74 20 74 79 70 65 3d 27 73 75 62  <input type='sub
69a0: 6d 69 74 27 20 6e 61 6d 65 3d 27 73 75 62 6d 69  mit' name='submi
69b0: 74 32 27 20 76 61 6c 75 65 3d 27 43 68 61 6e 67  t2' value='Chang
69c0: 65 27 3e 0a 20 20 20 20 40 20 3c 2f 70 3e 0a 20  e'>.    @ </p>. 
69d0: 20 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20 7d     @ </form>.  }
69e0: 65 6c 73 65 20 69 66 28 20 69 73 45 64 69 74 6f  else if( isEdito
69f0: 72 20 29 7b 0a 20 20 20 20 40 20 3c 70 3e 59 6f  r ){.    @ <p>Yo
6a00: 75 20 61 72 65 20 61 75 74 68 6f 72 69 7a 65 64  u are authorized
6a10: 20 74 6f 20 6d 61 6b 65 20 63 68 61 6e 67 65 73   to make changes
6a20: 20 74 6f 20 74 68 65 20 64 72 61 66 74 25 64 28   to the draft%d(
6a30: 69 53 6b 69 6e 29 20 73 6b 69 6e 2e 0a 20 20 20  iSkin) skin..   
6a40: 20 40 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74   @ Continue to t
6a50: 68 65 20 3c 61 20 68 72 65 66 3d 27 23 73 74 65  he <a href='#ste
6a60: 70 33 27 3e 6e 65 78 74 20 73 74 65 70 3c 2f 61  p3'>next step</a
6a70: 3e 2e 3c 2f 70 3e 0a 20 20 7d 65 6c 73 65 7b 0a  >.</p>.  }else{.
6a80: 20 20 20 20 40 20 3c 70 3e 59 6f 75 20 61 72 65      @ <p>You are
6a90: 20 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20   not authorized 
6aa0: 74 6f 20 6d 61 6b 65 20 63 68 61 6e 67 65 73 20  to make changes 
6ab0: 74 6f 20 74 68 65 20 64 72 61 66 74 25 64 28 69  to the draft%d(i
6ac0: 53 6b 69 6e 29 0a 20 20 20 20 40 20 73 6b 69 6e  Skin).    @ skin
6ad0: 2e 20 20 43 6f 6e 74 61 63 74 20 74 68 65 20 61  .  Contact the a
6ae0: 64 6d 69 6e 69 73 74 72 61 74 6f 72 20 6f 66 20  dministrator of 
6af0: 74 68 69 73 20 46 6f 73 73 69 6c 20 72 65 70 6f  this Fossil repo
6b00: 73 69 74 6f 72 79 20 66 6f 72 0a 20 20 20 20 40  sitory for.    @
6b10: 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61   further informa
6b20: 74 69 6f 6e 2e 3c 2f 70 3e 0a 20 20 7d 0a 20 20  tion.</p>.  }.  
6b30: 40 0a 20 20 40 20 3c 61 20 6e 61 6d 65 3d 27 73  @.  @ <a name='s
6b40: 74 65 70 33 27 3e 3c 2f 61 3e 0a 20 20 40 20 3c  tep3'></a>.  @ <
6b50: 68 31 3e 53 74 65 70 20 33 3a 20 49 6e 69 74 69  h1>Step 3: Initi
6b60: 61 6c 69 7a 65 20 54 68 65 20 44 72 61 66 74 3c  alize The Draft<
6b70: 2f 68 31 3e 0a 20 20 40 0a 20 20 69 66 28 20 21  /h1>.  @.  if( !
6b80: 69 73 45 64 69 74 6f 72 20 29 7b 0a 20 20 20 20  isEditor ){.    
6b90: 40 20 3c 70 3e 59 6f 75 20 61 72 65 20 6e 6f 74  @ <p>You are not
6ba0: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 69 6e 69 74   allowed to init
6bb0: 69 61 6c 69 7a 65 20 64 72 61 66 74 25 28 69 53  ialize draft%(iS
6bc0: 6b 69 6e 29 2e 20 20 43 6f 6e 74 61 63 74 0a 20  kin).  Contact. 
6bd0: 20 20 20 40 20 74 68 65 20 61 64 6d 69 6e 69 73     @ the adminis
6be0: 74 72 61 74 6f 72 20 66 6f 72 20 74 68 69 73 20  trator for this 
6bf0: 72 65 70 6f 73 69 74 6f 72 79 20 66 6f 72 20 6d  repository for m
6c00: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ore information.
6c10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 40 20  .  }else{.    @ 
6c20: 3c 70 3e 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  <p>Initialize th
6c30: 65 20 64 72 61 66 74 25 64 28 69 53 6b 69 6e 29  e draft%d(iSkin)
6c40: 20 73 6b 69 6e 20 74 6f 20 6f 6e 65 20 6f 66 20   skin to one of 
6c50: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 73 6b 69  the built-in ski
6c60: 6e 73 0a 20 20 20 20 40 20 6f 72 20 61 20 70 72  ns.    @ or a pr
6c70: 65 65 78 69 73 74 69 6e 67 20 73 6b 69 6e 2c 20  eexisting skin, 
6c80: 74 6f 20 75 73 65 20 61 73 20 61 20 62 61 73 65  to use as a base
6c90: 6c 69 6e 65 2e 3c 2f 70 3e 0a 20 20 20 20 40 0a  line.</p>.    @.
6ca0: 20 20 20 20 40 20 3c 66 6f 72 6d 20 6d 65 74 68      @ <form meth
6cb0: 6f 64 3d 27 50 4f 53 54 27 20 61 63 74 69 6f 6e  od='POST' action
6cc0: 3d 27 25 52 2f 73 65 74 75 70 5f 73 6b 69 6e 23  ='%R/setup_skin#
6cd0: 73 74 65 70 34 27 20 69 64 3d 27 66 30 33 27 3e  step4' id='f03'>
6ce0: 0a 20 20 20 20 40 20 3c 70 20 63 6c 61 73 73 3d  .    @ <p class=
6cf0: 27 73 6b 69 6e 49 6e 70 75 74 27 3e 0a 20 20 20  'skinInput'>.   
6d00: 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 27   @ <input type='
6d10: 68 69 64 64 65 6e 27 20 6e 61 6d 65 3d 27 73 6b  hidden' name='sk
6d20: 27 20 76 61 6c 75 65 3d 27 25 64 28 69 53 6b 69  ' value='%d(iSki
6d30: 6e 29 27 3e 0a 20 20 20 20 40 20 49 6e 69 74 69  n)'>.    @ Initi
6d40: 61 6c 69 7a 65 20 73 6b 69 6e 20 3c 62 3e 64 72  alize skin <b>dr
6d50: 61 66 74 25 64 28 69 53 6b 69 6e 29 3c 2f 62 3e  aft%d(iSkin)</b>
6d60: 20 75 73 69 6e 67 0a 20 20 20 20 40 20 3c 73 65   using.    @ <se
6d70: 6c 65 63 74 20 73 69 7a 65 3d 27 31 27 20 6e 61  lect size='1' na
6d80: 6d 65 3d 27 69 6e 69 74 73 6b 69 6e 27 3e 0a 20  me='initskin'>. 
6d90: 20 20 20 40 20 3c 6f 70 74 69 6f 6e 20 76 61 6c     @ <option val
6da0: 75 65 3d 27 63 75 72 72 65 6e 74 27 3e 43 75 72  ue='current'>Cur
6db0: 72 65 6e 74 6c 79 20 49 6e 20 55 73 65 3c 2f 6f  rently In Use</o
6dc0: 70 74 69 6f 6e 3e 0a 20 20 20 20 66 6f 72 28 69  ption>.    for(i
6dd0: 3d 30 3b 20 69 3c 63 6f 75 6e 74 28 61 42 75 69  =0; i<count(aBui
6de0: 6c 74 69 6e 53 6b 69 6e 29 3b 20 69 2b 2b 29 7b  ltinSkin); i++){
6df0: 0a 20 20 20 20 20 20 40 20 3c 6f 70 74 69 6f 6e  .      @ <option
6e00: 20 76 61 6c 75 65 3d 27 25 73 28 61 42 75 69 6c   value='%s(aBuil
6e10: 74 69 6e 53 6b 69 6e 5b 69 5d 2e 7a 4c 61 62 65  tinSkin[i].zLabe
6e20: 6c 29 27 3e 5c 0a 20 20 20 20 20 20 40 20 25 68  l)'>\.      @ %h
6e30: 28 61 42 75 69 6c 74 69 6e 53 6b 69 6e 5b 69 5d  (aBuiltinSkin[i]
6e40: 2e 7a 44 65 73 63 29 20 28 62 75 69 6c 74 2d 69  .zDesc) (built-i
6e50: 6e 29 3c 2f 6f 70 74 69 6f 6e 3e 0a 20 20 20 20  n)</option>.    
6e60: 7d 0a 20 20 20 20 40 20 3c 2f 73 65 6c 65 63 74  }.    @ </select
6e70: 3e 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74  >.    @ <input t
6e80: 79 70 65 3d 27 73 75 62 6d 69 74 27 20 6e 61 6d  ype='submit' nam
6e90: 65 3d 27 69 6e 69 74 33 27 20 76 61 6c 75 65 3d  e='init3' value=
6ea0: 27 47 6f 27 3e 0a 20 20 20 20 40 20 3c 2f 70 3e  'Go'>.    @ </p>
6eb0: 0a 20 20 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20  .    @ </form>. 
6ec0: 20 7d 0a 20 20 40 0a 20 20 40 20 3c 61 20 6e 61   }.  @.  @ <a na
6ed0: 6d 65 3d 27 73 74 65 70 34 27 3e 3c 2f 61 3e 0a  me='step4'></a>.
6ee0: 20 20 40 20 3c 68 31 3e 53 74 65 70 20 34 3a 20    @ <h1>Step 4: 
6ef0: 4d 61 6b 65 20 45 64 69 74 73 3c 2f 68 31 3e 0a  Make Edits</h1>.
6f00: 20 20 40 0a 20 20 69 66 28 20 21 69 73 45 64 69    @.  if( !isEdi
6f10: 74 6f 72 20 29 7b 0a 20 20 20 20 40 20 3c 70 3e  tor ){.    @ <p>
6f20: 59 6f 75 20 61 72 65 20 6e 6f 74 20 61 75 74 68  You are not auth
6f30: 6f 72 69 7a 65 64 20 74 6f 20 6d 61 6b 65 20 65  orized to make e
6f40: 64 69 74 73 20 74 6f 20 74 68 65 20 64 72 61 66  dits to the draf
6f50: 74 25 64 28 69 53 6b 69 6e 29 20 73 6b 69 6e 2e  t%d(iSkin) skin.
6f60: 0a 20 20 20 20 40 20 43 6f 6e 74 61 63 74 20 74  .    @ Contact t
6f70: 68 65 20 61 64 6d 69 6e 69 73 74 72 61 74 6f 72  he administrator
6f80: 20 6f 66 20 74 68 69 73 20 46 6f 73 73 69 6c 20   of this Fossil 
6f90: 72 65 70 6f 73 69 74 6f 72 79 20 66 6f 72 20 68  repository for h
6fa0: 65 6c 70 2e 3c 2f 70 3e 0a 20 20 7d 65 6c 73 65  elp.</p>.  }else
6fb0: 7b 0a 20 20 20 20 40 20 3c 70 3e 45 64 69 74 20  {.    @ <p>Edit 
6fc0: 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f  the components o
6fd0: 66 20 74 68 65 20 64 72 61 66 74 25 64 28 69 53  f the draft%d(iS
6fe0: 6b 69 6e 29 20 73 6b 69 6e 3a 0a 20 20 20 20 40  kin) skin:.    @
6ff0: 20 3c 75 6c 3e 0a 20 20 20 20 40 20 3c 6c 69 3e   <ul>.    @ <li>
7000: 3c 61 20 68 72 65 66 3d 27 25 52 2f 73 65 74 75  <a href='%R/setu
7010: 70 5f 73 6b 69 6e 65 64 69 74 3f 77 3d 30 26 73  p_skinedit?w=0&s
7020: 6b 3d 25 64 28 69 53 6b 69 6e 29 27 20 74 61 72  k=%d(iSkin)' tar
7030: 67 65 74 3d 27 5f 62 6c 61 6e 6b 27 3e 43 53 53  get='_blank'>CSS
7040: 3c 2f 61 3e 0a 20 20 20 20 40 20 3c 6c 69 3e 3c  </a>.    @ <li><
7050: 61 20 68 72 65 66 3d 27 25 52 2f 73 65 74 75 70  a href='%R/setup
7060: 5f 73 6b 69 6e 65 64 69 74 3f 77 3d 31 26 73 6b  _skinedit?w=1&sk
7070: 3d 25 64 28 69 53 6b 69 6e 29 27 20 74 61 72 67  =%d(iSkin)' targ
7080: 65 74 3d 27 5f 62 6c 61 6e 6b 27 3e 5c 0a 20 20  et='_blank'>\.  
7090: 20 20 40 20 48 65 61 64 65 72 3c 2f 61 3e 0a 20    @ Header</a>. 
70a0: 20 20 20 40 20 3c 6c 69 3e 3c 61 20 68 72 65 66     @ <li><a href
70b0: 3d 27 25 52 2f 73 65 74 75 70 5f 73 6b 69 6e 65  ='%R/setup_skine
70c0: 64 69 74 3f 77 3d 32 26 73 6b 3d 25 64 28 69 53  dit?w=2&sk=%d(iS
70d0: 6b 69 6e 29 27 20 74 61 72 67 65 74 3d 27 5f 62  kin)' target='_b
70e0: 6c 61 6e 6b 27 3e 5c 0a 20 20 20 20 40 20 46 6f  lank'>\.    @ Fo
70f0: 6f 74 65 72 3c 2f 61 3e 0a 20 20 20 20 40 20 3c  oter</a>.    @ <
7100: 6c 69 3e 3c 61 20 68 72 65 66 3d 27 25 52 2f 73  li><a href='%R/s
7110: 65 74 75 70 5f 73 6b 69 6e 65 64 69 74 3f 77 3d  etup_skinedit?w=
7120: 33 26 73 6b 3d 25 64 28 69 53 6b 69 6e 29 27 20  3&sk=%d(iSkin)' 
7130: 74 61 72 67 65 74 3d 27 5f 62 6c 61 6e 6b 27 3e  target='_blank'>
7140: 5c 0a 20 20 20 20 40 20 44 65 74 61 69 6c 73 3c  \.    @ Details<
7150: 2f 61 3e 0a 20 20 20 20 40 20 3c 2f 75 6c 3e 0a  /a>.    @ </ul>.
7160: 20 20 7d 0a 20 20 40 0a 20 20 40 20 3c 61 20 6e    }.  @.  @ <a n
7170: 61 6d 65 3d 27 73 74 65 70 35 27 3e 3c 2f 61 3e  ame='step5'></a>
7180: 0a 20 20 40 20 3c 68 31 3e 53 74 65 70 20 35 3a  .  @ <h1>Step 5:
7190: 20 56 65 72 69 66 79 20 54 68 65 20 44 72 61 66   Verify The Draf
71a0: 74 20 53 6b 69 6e 3c 2f 68 31 3e 0a 20 20 40 0a  t Skin</h1>.  @.
71b0: 20 20 40 20 3c 70 3e 54 6f 20 74 65 73 74 20 74    @ <p>To test t
71c0: 68 69 73 20 64 72 61 66 74 20 73 6b 69 6e 2c 20  his draft skin, 
71d0: 69 6e 73 65 72 74 20 74 65 78 74 20 22 2f 64 72  insert text "/dr
71e0: 61 66 74 25 64 28 69 53 6b 69 6e 29 2f 22 20 6a  aft%d(iSkin)/" j
71f0: 75 73 74 20 62 65 66 6f 72 65 20 74 68 65 0a 20  ust before the. 
7200: 20 40 20 6f 70 65 72 61 74 69 6f 6e 20 6e 61 6d   @ operation nam
7210: 65 20 69 6e 20 74 68 65 20 55 52 4c 2e 20 20 48  e in the URL.  H
7220: 65 72 65 20 61 72 65 20 61 20 66 65 77 20 6c 69  ere are a few li
7230: 6e 6b 73 20 74 6f 20 74 72 79 3a 0a 20 20 40 20  nks to try:.  @ 
7240: 3c 75 6c 3e 0a 20 20 66 6f 72 28 69 3d 30 3b 20  <ul>.  for(i=0; 
7250: 69 3c 63 6f 75 6e 74 28 61 7a 54 65 73 74 50 61  i<count(azTestPa
7260: 67 65 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ges); i++){.    
7270: 40 20 3c 6c 69 3e 3c 61 20 68 72 65 66 3d 27 25  @ <li><a href='%
7280: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 64 72  s(g.zBaseURL)/dr
7290: 61 66 74 25 64 28 69 53 6b 69 6e 29 2f 25 73 28  aft%d(iSkin)/%s(
72a0: 61 7a 54 65 73 74 50 61 67 65 73 5b 69 5d 29 27  azTestPages[i])'
72b0: 20 5c 0a 20 20 20 20 40 20 74 61 72 67 65 74 3d   \.    @ target=
72c0: 27 5f 62 6c 61 6e 6b 27 3e 25 73 28 67 2e 7a 42  '_blank'>%s(g.zB
72d0: 61 73 65 55 52 4c 29 2f 64 72 61 66 74 25 64 28  aseURL)/draft%d(
72e0: 69 53 6b 69 6e 29 2f 25 73 28 61 7a 54 65 73 74  iSkin)/%s(azTest
72f0: 50 61 67 65 73 5b 69 5d 29 3c 2f 61 3e 0a 20 20  Pages[i])</a>.  
7300: 7d 0a 20 20 40 20 3c 2f 75 6c 3e 0a 20 20 40 0a  }.  @ </ul>.  @.
7310: 20 20 40 20 3c 70 3e 59 6f 75 20 77 69 6c 6c 20    @ <p>You will 
7320: 70 72 6f 62 61 62 6c 79 20 6e 65 65 64 20 74 6f  probably need to
7330: 20 70 72 65 73 73 20 52 65 6c 6f 61 64 20 6f 6e   press Reload on
7340: 20 79 6f 75 72 20 62 72 6f 77 73 65 72 20 62 65   your browser be
7350: 66 6f 72 65 20 61 6e 79 0a 20 20 40 20 43 53 53  fore any.  @ CSS
7360: 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 74 61   changes will ta
7370: 6b 65 20 65 66 66 65 63 74 2e 3c 2f 70 3e 0a 20  ke effect.</p>. 
7380: 20 40 0a 20 20 40 20 3c 61 20 68 61 6d 65 3d 27   @.  @ <a hame='
7390: 73 74 65 70 36 27 3e 3c 2f 61 3e 0a 20 20 40 20  step6'></a>.  @ 
73a0: 3c 68 31 3e 53 74 65 70 20 36 3a 20 49 6e 74 65  <h1>Step 6: Inte
73b0: 72 61 74 65 3c 2f 68 31 3e 0a 20 20 40 0a 20 20  rate</h1>.  @.  
73c0: 40 20 3c 70 3e 52 65 70 65 61 74 20 3c 61 20 68  @ <p>Repeat <a h
73d0: 72 65 66 3d 27 23 73 74 65 70 34 27 3e 73 74 65  ref='#step4'>ste
73e0: 70 20 34 3c 2f 61 3e 20 61 6e 64 0a 20 20 40 20  p 4</a> and.  @ 
73f0: 3c 61 20 68 72 65 66 3d 27 23 73 74 65 70 35 27  <a href='#step5'
7400: 3e 73 74 65 70 20 35 3c 2f 61 3e 20 61 73 20 6d  >step 5</a> as m
7410: 61 6e 79 20 74 69 6d 65 73 20 61 73 20 6e 65 63  any times as nec
7420: 65 73 73 61 72 79 20 74 6f 20 63 72 65 61 74 65  essary to create
7430: 0a 20 20 40 20 61 20 70 72 6f 64 75 63 74 69 6f  .  @ a productio
7440: 6e 2d 72 65 61 64 79 20 73 6b 69 6e 2e 0a 20 20  n-ready skin..  
7450: 40 0a 20 20 40 20 3c 61 20 6e 61 6d 65 3d 27 73  @.  @ <a name='s
7460: 74 65 70 36 27 3e 3c 2f 61 3e 0a 20 20 40 20 3c  tep6'></a>.  @ <
7470: 68 31 3e 53 74 65 70 20 37 3a 20 50 75 62 6c 69  h1>Step 7: Publi
7480: 73 68 20 54 68 65 20 44 72 61 66 74 3c 2f 68 31  sh The Draft</h1
7490: 3e 0a 20 20 40 0a 20 20 69 66 28 20 21 67 2e 70  >.  @.  if( !g.p
74a0: 65 72 6d 2e 53 65 74 75 70 20 29 7b 0a 20 20 20  erm.Setup ){.   
74b0: 20 40 20 3c 70 3e 4f 6e 6c 79 20 61 64 6d 69 6e   @ <p>Only admin
74c0: 69 73 74 72 61 74 6f 72 73 20 61 72 65 20 61 6c  istrators are al
74d0: 6c 6f 77 65 64 20 74 6f 20 70 75 62 6c 69 73 68  lowed to publish
74e0: 20 64 72 61 66 74 20 73 6b 69 6e 73 2e 20 20 43   draft skins.  C
74f0: 6f 6e 74 61 63 74 0a 20 20 20 20 40 20 61 6e 20  ontact.    @ an 
7500: 61 64 6d 69 6e 69 73 74 72 61 74 6f 72 20 74 6f  administrator to
7510: 20 67 65 74 20 74 68 69 73 20 22 64 72 61 66 74   get this "draft
7520: 25 64 28 69 53 6b 69 6e 29 22 20 73 6b 69 6e 20  %d(iSkin)" skin 
7530: 70 75 62 6c 69 73 68 65 64 2e 3c 2f 70 3e 0a 20  published.</p>. 
7540: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 40 20 3c 70   }else{.    @ <p
7550: 3e 57 68 65 6e 20 74 68 65 20 64 72 61 66 74 25  >When the draft%
7560: 64 28 69 53 6b 69 6e 29 20 73 6b 69 6e 20 69 73  d(iSkin) skin is
7570: 20 72 65 61 64 79 20 66 6f 72 20 70 72 6f 64 75   ready for produ
7580: 63 74 69 6f 6e 20 75 73 65 2c 0a 20 20 20 20 40  ction use,.    @
7590: 20 6d 61 6b 65 20 69 74 20 74 68 65 20 64 65 66   make it the def
75a0: 61 75 6c 74 20 73 63 61 6e 20 62 79 20 63 6c 69  ault scan by cli
75b0: 63 6b 69 6e 67 20 74 68 65 20 61 63 6b 6e 6f 77  cking the acknow
75c0: 6c 65 64 67 65 6d 65 6e 74 73 20 61 6e 64 0a 20  ledgements and. 
75d0: 20 20 20 40 20 70 72 65 73 73 69 6e 67 20 74 68     @ pressing th
75e0: 65 20 62 75 74 74 6f 6e 20 62 65 6c 6f 77 3a 3c  e button below:<
75f0: 2f 70 3e 0a 20 20 20 20 40 0a 20 20 20 20 40 20  /p>.    @.    @ 
7600: 3c 66 6f 72 6d 20 6d 65 74 68 6f 64 3d 27 50 4f  <form method='PO
7610: 53 54 27 20 61 63 74 69 6f 6e 3d 27 25 52 2f 73  ST' action='%R/s
7620: 65 74 75 70 5f 73 6b 69 6e 23 73 74 65 70 37 27  etup_skin#step7'
7630: 3e 0a 20 20 20 20 40 20 3c 70 20 63 6c 61 73 73  >.    @ <p class
7640: 3d 27 73 6b 69 6e 49 6e 70 75 74 27 3e 0a 20 20  ='skinInput'>.  
7650: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
7660: 27 68 69 64 64 65 6e 27 20 6e 61 6d 65 3d 27 73  'hidden' name='s
7670: 6b 27 20 76 61 6c 75 65 3d 27 25 64 28 69 53 6b  k' value='%d(iSk
7680: 69 6e 29 27 3e 0a 20 20 20 20 40 20 3c 69 6e 70  in)'>.    @ <inp
7690: 75 74 20 74 79 70 65 3d 27 63 68 65 63 6b 62 6f  ut type='checkbo
76a0: 78 27 20 6e 61 6d 65 3d 27 70 75 62 37 63 6b 31  x' name='pub7ck1
76b0: 27 20 76 61 6c 75 65 3d 27 79 65 73 27 3e 5c 0a  ' value='yes'>\.
76c0: 20 20 20 20 40 20 53 6b 69 6e 20 64 72 61 66 74      @ Skin draft
76d0: 25 64 28 69 53 6b 69 6e 29 20 68 61 73 20 62 65  %d(iSkin) has be
76e0: 65 6e 20 74 65 73 74 69 6e 67 20 61 6e 64 20 66  en testing and f
76f0: 6f 75 6e 64 20 72 65 61 64 79 20 66 6f 72 20 70  ound ready for p
7700: 72 6f 64 75 63 74 69 6f 6e 2e 3c 62 72 3e 0a 20  roduction.<br>. 
7710: 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65     @ <input type
7720: 3d 27 63 68 65 63 6b 62 6f 78 27 20 6e 61 6d 65  ='checkbox' name
7730: 3d 27 70 75 62 37 63 6b 32 27 20 76 61 6c 75 65  ='pub7ck2' value
7740: 3d 27 79 65 73 27 3e 5c 0a 20 20 20 20 40 20 54  ='yes'>\.    @ T
7750: 68 65 20 63 75 72 72 65 6e 74 20 73 6b 69 6e 20  he current skin 
7760: 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72  should be overwr
7770: 69 74 74 65 6e 20 77 69 74 68 20 64 72 61 66 74  itten with draft
7780: 25 64 28 69 53 6b 69 6e 29 2e 3c 62 72 3e 0a 20  %d(iSkin).<br>. 
7790: 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65     @ <input type
77a0: 3d 27 73 75 62 6d 69 74 27 20 6e 61 6d 65 3d 27  ='submit' name='
77b0: 70 75 62 37 27 20 76 61 6c 75 65 3d 27 50 75 62  pub7' value='Pub
77c0: 6c 69 73 68 20 44 72 61 66 74 25 64 28 69 53 6b  lish Draft%d(iSk
77d0: 69 6e 29 27 3e 0a 20 20 20 20 40 20 3c 2f 70 3e  in)'>.    @ </p>
77e0: 3c 2f 66 6f 72 6d 3e 0a 20 20 20 20 40 0a 20 20  </form>.    @.  
77f0: 20 20 40 20 3c 70 3e 59 6f 75 20 77 69 6c 6c 20    @ <p>You will 
7800: 70 72 6f 62 61 62 6c 79 20 6e 65 65 64 20 74 6f  probably need to
7810: 20 70 72 65 73 73 20 52 65 6c 6f 61 64 20 6f 6e   press Reload on
7820: 20 79 6f 75 72 20 62 72 6f 77 73 65 72 20 61 66   your browser af
7830: 74 65 72 0a 20 20 20 20 40 20 70 75 62 6c 69 73  ter.    @ publis
7840: 68 69 6e 67 20 74 68 65 20 6e 65 77 20 73 6b 69  hing the new ski
7850: 6e 2e 3c 2f 70 3e 0a 20 20 7d 0a 20 20 73 74 79  n.</p>.  }.  sty
7860: 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a     le_footer();.}.