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> <
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> &
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> &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();.}.