Fossil

Hex Artifact Content
Login

Artifact a7cf63cb87463581a3cbde3ddf47a7c7057da198:


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 31 30 20 44 2e 20 52 69 63 68  (c) 2010 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 0a 2a 2a 20 54 68 69 73  ense".)..** This
00f0: 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74   program is dist
0100: 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 68  ributed in the h
0110: 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c  ope that it will
0120: 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 62   be useful,.** b
0130: 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79 20 77  ut without any w
0140: 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f 75 74  arranty; without
0150: 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65   even the implie
0160: 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a 2a  d warranty of.**
0170: 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69 74 79   merchantability
0180: 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f 72 20   or fitness for 
0190: 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 72  a particular pur
01a0: 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75 74 68  pose..**.** Auth
01b0: 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66 6f 72  or contact infor
01c0: 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64 72 68  mation:.**   drh
01d0: 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20 20 20  @hwaci.com.**   
01e0: 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61 63 69  http://www.hwaci
01f0: 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a  .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 0a 2a 2a 0a  ************.**.
0250: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e  ** This file con
0260: 74 61 69 6e 73 20 63 6f 64 65 20 74 6f 20 64 6f  tains code to do
0270: 20 66 6f 72 6d 61 74 74 69 6e 67 20 6f 66 20 65   formatting of e
0280: 76 65 6e 74 20 6d 65 73 73 61 67 65 73 3a 0a 2a  vent messages:.*
0290: 2a 0a 2a 2a 20 20 20 20 20 4d 69 6c 65 73 74 6f  *.**     Milesto
02a0: 6e 65 73 0a 2a 2a 20 20 20 20 20 42 6c 6f 67 20  nes.**     Blog 
02b0: 70 6f 73 74 73 0a 2a 2a 20 20 20 20 20 4e 65 77  posts.**     New
02c0: 20 61 72 74 69 63 6c 65 73 0a 2a 2a 20 20 20 20   articles.**    
02d0: 20 50 72 6f 63 65 73 73 20 63 68 65 63 6b 70 6f   Process checkpo
02e0: 69 6e 74 73 0a 2a 2a 20 20 20 20 20 41 6e 6e 6f  ints.**     Anno
02f0: 75 6e 63 65 6d 65 6e 74 73 0a 2a 2f 0a 23 69 6e  uncements.*/.#in
0300: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
0310: 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65  .#include <ctype
0320: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f  .h>.#include "co
0330: 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64 65  nfig.h".#include
0340: 20 22 65 76 65 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a   "event.h"../*.*
0350: 2a 20 4f 75 74 70 75 74 20 61 20 68 79 70 65 72  * Output a hyper
0360: 6c 69 6e 6b 20 74 6f 20 61 6e 20 65 76 65 6e 74  link to an event
0370: 20 67 69 76 65 6e 20 69 74 73 20 74 61 67 69 64   given its tagid
0380: 2e 0a 2a 2f 0a 76 6f 69 64 20 68 79 70 65 72 6c  ..*/.void hyperl
0390: 69 6e 6b 5f 74 6f 5f 65 76 65 6e 74 5f 74 61 67  ink_to_event_tag
03a0: 69 64 28 69 6e 74 20 74 61 67 69 64 29 7b 0a 20  id(int tagid){. 
03b0: 20 63 68 61 72 20 2a 7a 45 76 65 6e 74 49 64 3b   char *zEventId;
03c0: 0a 20 20 7a 45 76 65 6e 74 49 64 20 3d 20 64 62  .  zEventId = db
03d0: 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54  _text(0, "SELECT
03e0: 20 73 75 62 73 74 72 28 74 61 67 6e 61 6d 65 2c   substr(tagname,
03f0: 20 37 29 20 46 52 4f 4d 20 74 61 67 20 57 48 45   7) FROM tag WHE
0400: 52 45 20 74 61 67 69 64 3d 25 64 22 2c 0a 20 20  RE tagid=%d",.  
0410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0420: 20 20 20 74 61 67 69 64 29 3b 0a 20 20 40 20 5b     tagid);.  @ [
0430: 25 7a 28 68 72 65 66 28 22 25 52 2f 65 76 65 6e  %z(href("%R/even
0440: 74 2f 25 73 22 2c 7a 45 76 65 6e 74 49 64 29 29  t/%s",zEventId))
0450: 25 53 28 7a 45 76 65 6e 74 49 64 29 3c 2f 61 3e  %S(zEventId)</a>
0460: 5d 0a 20 20 66 72 65 65 28 7a 45 76 65 6e 74 49  ].  free(zEventI
0470: 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42  d);.}../*.** WEB
0480: 50 41 47 45 3a 20 65 76 65 6e 74 0a 2a 2a 20 55  PAGE: event.** U
0490: 52 4c 3a 20 2f 65 76 65 6e 74 0a 2a 2a 20 50 41  RL: /event.** PA
04a0: 52 41 4d 45 54 45 52 53 3a 0a 2a 2a 0a 2a 2a 20  RAMETERS:.**.** 
04b0: 20 6e 61 6d 65 3d 45 56 45 4e 54 49 44 20 20 20   name=EVENTID   
04c0: 20 20 20 2f 2f 20 49 64 65 6e 74 69 66 79 20 74     // Identify t
04d0: 68 65 20 65 76 65 6e 74 20 74 6f 20 64 69 73 70  he event to disp
04e0: 6c 61 79 20 45 56 45 4e 54 49 44 20 6d 75 73 74  lay EVENTID must
04f0: 20 62 65 20 63 6f 6d 70 6c 65 74 65 0a 2a 2a 20   be complete.** 
0500: 20 61 69 64 3d 41 52 54 49 46 41 43 54 49 44 20   aid=ARTIFACTID 
0510: 20 20 20 2f 2f 20 57 68 69 63 68 20 73 70 65 63     // Which spec
0520: 69 66 69 63 20 76 65 72 73 69 6f 6e 20 6f 66 20  ific version of 
0530: 74 68 65 20 65 76 65 6e 74 2e 20 20 4f 70 74 69  the event.  Opti
0540: 6f 6e 61 6c 2e 0a 2a 2a 20 20 76 3d 42 4f 4f 4c  onal..**  v=BOOL
0550: 45 41 4e 20 20 20 20 20 20 20 20 20 2f 2f 20 53  EAN         // S
0560: 68 6f 77 20 64 65 74 61 69 6c 73 20 69 66 20 54  how details if T
0570: 52 55 45 2e 20 20 44 65 66 61 75 6c 74 20 69 73  RUE.  Default is
0580: 20 46 41 4c 53 45 2e 20 20 4f 70 74 69 6f 6e 61   FALSE.  Optiona
0590: 6c 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 70 6c 61 79  l..**.** Display
05a0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 76 65   an existing eve
05b0: 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  nt identified by
05c0: 20 45 56 45 4e 54 49 44 0a 2a 2f 0a 76 6f 69 64   EVENTID.*/.void
05d0: 20 65 76 65 6e 74 5f 70 61 67 65 28 76 6f 69 64   event_page(void
05e0: 29 7b 0a 20 20 69 6e 74 20 72 69 64 20 3d 20 30  ){.  int rid = 0
05f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0600: 20 72 69 64 20 6f 66 20 74 68 65 20 65 76 65 6e   rid of the even
0610: 74 20 61 72 74 69 66 61 63 74 20 2a 2f 0a 20 20  t artifact */.  
0620: 63 68 61 72 20 2a 7a 55 75 69 64 3b 20 20 20 20  char *zUuid;    
0630: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 55 49 44           /* UUID
0640: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
0650: 6f 20 72 69 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  o rid */.  const
0660: 20 63 68 61 72 20 2a 7a 45 76 65 6e 74 49 64 3b   char *zEventId;
0670: 20 20 20 20 2f 2a 20 45 76 65 6e 74 20 69 64 65      /* Event ide
0680: 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20 63 6f 6e  ntifier */.  con
0690: 73 74 20 63 68 61 72 20 2a 7a 56 65 72 62 6f 73  st char *zVerbos
06a0: 65 3b 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f  e;    /* Value o
06b0: 66 20 76 65 72 62 6f 73 65 20 6f 70 74 69 6f 6e  f verbose option
06c0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 54 69   */.  char *zETi
06d0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
06e0: 2a 20 54 69 6d 65 20 6f 66 20 74 68 65 20 65 76  * Time of the ev
06f0: 65 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ent */.  char *z
0700: 41 54 69 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ATime;          
0710: 20 20 2f 2a 20 54 69 6d 65 20 74 68 65 20 61 72    /* Time the ar
0720: 74 69 66 61 63 74 20 77 61 73 20 63 72 65 61 74  tifact was creat
0730: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 70 65 63  ed */.  int spec
0740: 52 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rid;            
0750: 20 2f 2a 20 72 69 64 20 73 70 65 63 69 66 69 65   /* rid specifie
0760: 64 20 62 79 20 61 69 64 3d 20 70 61 72 61 6d 65  d by aid= parame
0770: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65  ter */.  int pre
0780: 76 52 69 64 2c 20 6e 65 78 74 52 69 64 3b 20 20  vRid, nextRid;  
0790: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6f 72    /* Previous or
07a0: 20 6e 65 78 74 20 65 64 69 74 73 20 6f 66 20 74   next edits of t
07b0: 68 69 73 20 65 76 65 6e 74 20 2a 2f 0a 20 20 4d  his event */.  M
07c0: 61 6e 69 66 65 73 74 20 2a 70 45 76 65 6e 74 3b  anifest *pEvent;
07d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
07e0: 64 20 65 76 65 6e 74 20 61 72 74 69 66 61 63 74  d event artifact
07f0: 20 2a 2f 0a 20 20 42 6c 6f 62 20 66 75 6c 6c 62   */.  Blob fullb
0800: 6f 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ody;           /
0810: 2a 20 43 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  * Complete conte
0820: 6e 74 20 6f 66 20 74 68 65 20 65 76 65 6e 74 20  nt of the event 
0830: 62 6f 64 79 20 2a 2f 0a 20 20 42 6c 6f 62 20 74  body */.  Blob t
0840: 69 74 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  itle;           
0850: 20 20 20 2f 2a 20 54 69 74 6c 65 20 65 78 74 72     /* Title extr
0860: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 65  acted from the e
0870: 76 65 6e 74 20 62 6f 64 79 20 2a 2f 0a 20 20 42  vent body */.  B
0880: 6c 6f 62 20 74 61 69 6c 3b 20 20 20 20 20 20 20  lob tail;       
0890: 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 74          /* Event
08a0: 20 62 6f 64 79 20 74 68 61 74 20 63 6f 6d 65 73   body that comes
08b0: 20 61 66 74 65 72 20 74 68 65 20 74 69 74 6c 65   after the title
08c0: 20 2a 2f 0a 20 20 53 74 6d 74 20 71 31 3b 20 20   */.  Stmt q1;  
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
08e0: 2a 20 51 75 65 72 79 20 74 6f 20 73 65 61 72 63  * Query to searc
08f0: 68 20 66 6f 72 20 74 68 65 20 65 76 65 6e 74 20  h for the event 
0900: 2a 2f 0a 20 20 69 6e 74 20 76 65 72 62 6f 73 65  */.  int verbose
0910: 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  Flag;         /*
0920: 20 54 72 75 65 20 74 6f 20 73 68 6f 77 20 64 65   True to show de
0930: 74 61 69 6c 73 20 2a 2f 0a 0a 0a 20 20 2f 2a 20  tails */...  /* 
0940: 77 69 6b 69 2d 72 65 61 64 20 70 72 69 76 69 6c  wiki-read privil
0950: 65 67 65 20 69 73 20 6e 65 65 64 65 64 20 69 6e  ege is needed in
0960: 20 6f 72 64 65 72 20 74 6f 20 72 65 61 64 20 65   order to read e
0970: 76 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 6c 6f  vents..  */.  lo
0980: 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e  gin_check_creden
0990: 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21  tials();.  if( !
09a0: 67 2e 70 65 72 6d 2e 52 64 57 69 6b 69 20 29 7b  g.perm.RdWiki ){
09b0: 0a 20 20 20 20 6c 6f 67 69 6e 5f 6e 65 65 64 65  .    login_neede
09c0: 64 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d();.    return;
09d0: 0a 20 20 7d 0a 0a 20 20 7a 45 76 65 6e 74 49 64  .  }..  zEventId
09e0: 20 3d 20 50 28 22 6e 61 6d 65 22 29 3b 0a 20 20   = P("name");.  
09f0: 69 66 28 20 7a 45 76 65 6e 74 49 64 3d 3d 30 20  if( zEventId==0 
0a00: 29 7b 20 66 6f 73 73 69 6c 5f 72 65 64 69 72 65  ){ fossil_redire
0a10: 63 74 5f 68 6f 6d 65 28 29 3b 20 72 65 74 75 72  ct_home(); retur
0a20: 6e 3b 20 7d 0a 20 20 7a 55 75 69 64 20 3d 20 28  n; }.  zUuid = (
0a30: 63 68 61 72 2a 29 50 28 22 61 69 64 22 29 3b 0a  char*)P("aid");.
0a40: 20 20 73 70 65 63 52 69 64 20 3d 20 7a 55 75 69    specRid = zUui
0a50: 64 20 3f 20 75 75 69 64 5f 74 6f 5f 72 69 64 28  d ? uuid_to_rid(
0a60: 7a 55 75 69 64 2c 20 30 29 20 3a 20 30 3b 0a 20  zUuid, 0) : 0;. 
0a70: 20 72 69 64 20 3d 20 6e 65 78 74 52 69 64 20 3d   rid = nextRid =
0a80: 20 70 72 65 76 52 69 64 20 3d 20 30 3b 0a 20 20   prevRid = 0;.  
0a90: 64 62 5f 70 72 65 70 61 72 65 28 26 71 31 2c 0a  db_prepare(&q1,.
0aa0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 72 69 64       "SELECT rid
0ab0: 20 46 52 4f 4d 20 74 61 67 78 72 65 66 22 0a 20   FROM tagxref". 
0ac0: 20 20 20 20 22 20 57 48 45 52 45 20 74 61 67 69      " WHERE tagi
0ad0: 64 3d 28 53 45 4c 45 43 54 20 74 61 67 69 64 20  d=(SELECT tagid 
0ae0: 46 52 4f 4d 20 74 61 67 20 57 48 45 52 45 20 74  FROM tag WHERE t
0af0: 61 67 6e 61 6d 65 20 47 4c 4f 42 20 27 65 76 65  agname GLOB 'eve
0b00: 6e 74 2d 25 71 2a 27 29 22 0a 20 20 20 20 20 22  nt-%q*')".     "
0b10: 20 4f 52 44 45 52 20 42 59 20 6d 74 69 6d 65 20   ORDER BY mtime 
0b20: 44 45 53 43 22 2c 0a 20 20 20 20 20 7a 45 76 65  DESC",.     zEve
0b30: 6e 74 49 64 0a 20 20 29 3b 0a 20 20 77 68 69 6c  ntId.  );.  whil
0b40: 65 28 20 64 62 5f 73 74 65 70 28 26 71 31 29 3d  e( db_step(&q1)=
0b50: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
0b60: 20 20 20 6e 65 78 74 52 69 64 20 3d 20 72 69 64     nextRid = rid
0b70: 3b 0a 20 20 20 20 72 69 64 20 3d 20 64 62 5f 63  ;.    rid = db_c
0b80: 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 31 2c 20 30  olumn_int(&q1, 0
0b90: 29 3b 0a 20 20 20 20 69 66 28 20 73 70 65 63 52  );.    if( specR
0ba0: 69 64 3d 3d 30 20 7c 7c 20 73 70 65 63 52 69 64  id==0 || specRid
0bb0: 3d 3d 72 69 64 20 29 7b 0a 20 20 20 20 20 20 69  ==rid ){.      i
0bc0: 66 28 20 64 62 5f 73 74 65 70 28 26 71 31 29 3d  f( db_step(&q1)=
0bd0: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
0be0: 20 20 20 20 20 20 20 70 72 65 76 52 69 64 20 3d         prevRid =
0bf0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26   db_column_int(&
0c00: 71 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  q1, 0);.      }.
0c10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0c20: 20 7d 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61   }.  }.  db_fina
0c30: 6c 69 7a 65 28 26 71 31 29 3b 0a 20 20 69 66 28  lize(&q1);.  if(
0c40: 20 72 69 64 3d 3d 30 20 7c 7c 20 28 73 70 65 63   rid==0 || (spec
0c50: 52 69 64 21 3d 30 20 26 26 20 73 70 65 63 52 69  Rid!=0 && specRi
0c60: 64 21 3d 72 69 64 29 20 29 7b 0a 20 20 20 20 73  d!=rid) ){.    s
0c70: 74 79 6c 65 5f 68 65 61 64 65 72 28 22 4e 6f 20  tyle_header("No 
0c80: 53 75 63 68 20 45 76 65 6e 74 22 29 3b 0a 20 20  Such Event");.  
0c90: 20 20 40 20 43 61 6e 6e 6f 74 20 6c 6f 63 61 74    @ Cannot locat
0ca0: 65 20 73 70 65 63 69 66 69 65 64 20 65 76 65 6e  e specified even
0cb0: 74 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74  t.    style_foot
0cc0: 65 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  er();.    return
0cd0: 3b 0a 20 20 7d 0a 20 20 7a 55 75 69 64 20 3d 20  ;.  }.  zUuid = 
0ce0: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
0cf0: 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f  CT uuid FROM blo
0d00: 62 20 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c  b WHERE rid=%d",
0d10: 20 72 69 64 29 3b 0a 20 20 7a 56 65 72 62 6f 73   rid);.  zVerbos
0d20: 65 20 3d 20 50 28 22 76 22 29 3b 0a 20 20 69 66  e = P("v");.  if
0d30: 28 20 21 7a 56 65 72 62 6f 73 65 20 29 7b 0a 20  ( !zVerbose ){. 
0d40: 20 20 20 7a 56 65 72 62 6f 73 65 20 3d 20 50 28     zVerbose = P(
0d50: 22 76 65 72 62 6f 73 65 22 29 3b 0a 20 20 7d 0a  "verbose");.  }.
0d60: 20 20 69 66 28 20 21 7a 56 65 72 62 6f 73 65 20    if( !zVerbose 
0d70: 29 7b 0a 20 20 20 20 7a 56 65 72 62 6f 73 65 20  ){.    zVerbose 
0d80: 3d 20 50 28 22 64 65 74 61 69 6c 22 29 3b 20 2f  = P("detail"); /
0d90: 2a 20 64 65 70 72 65 63 61 74 65 64 20 2a 2f 0a  * deprecated */.
0da0: 20 20 7d 0a 20 20 76 65 72 62 6f 73 65 46 6c 61    }.  verboseFla
0db0: 67 20 3d 20 28 7a 56 65 72 62 6f 73 65 21 3d 30  g = (zVerbose!=0
0dc0: 29 20 26 26 20 21 69 73 5f 66 61 6c 73 65 28 7a  ) && !is_false(z
0dd0: 56 65 72 62 6f 73 65 29 3b 0a 0a 20 20 2f 2a 20  Verbose);..  /* 
0de0: 45 78 74 72 61 63 74 20 74 68 65 20 65 76 65 6e  Extract the even
0df0: 74 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 2a 2f 0a  t content..  */.
0e00: 20 20 70 45 76 65 6e 74 20 3d 20 6d 61 6e 69 66    pEvent = manif
0e10: 65 73 74 5f 67 65 74 28 72 69 64 2c 20 43 46 54  est_get(rid, CFT
0e20: 59 50 45 5f 45 56 45 4e 54 29 3b 0a 20 20 69 66  YPE_EVENT);.  if
0e30: 28 20 70 45 76 65 6e 74 3d 3d 30 20 29 7b 0a 20  ( pEvent==0 ){. 
0e40: 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28     fossil_panic(
0e50: 22 4f 62 6a 65 63 74 20 23 25 64 20 69 73 20 6e  "Object #%d is n
0e60: 6f 74 20 61 6e 20 65 76 65 6e 74 22 2c 20 72 69  ot an event", ri
0e70: 64 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 69  d);.  }.  blob_i
0e80: 6e 69 74 28 26 66 75 6c 6c 62 6f 64 79 2c 20 70  nit(&fullbody, p
0e90: 45 76 65 6e 74 2d 3e 7a 57 69 6b 69 2c 20 2d 31  Event->zWiki, -1
0ea0: 29 3b 0a 20 20 69 66 28 20 77 69 6b 69 5f 66 69  );.  if( wiki_fi
0eb0: 6e 64 5f 74 69 74 6c 65 28 26 66 75 6c 6c 62 6f  nd_title(&fullbo
0ec0: 64 79 2c 20 26 74 69 74 6c 65 2c 20 26 74 61 69  dy, &title, &tai
0ed0: 6c 29 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f  l) ){.    style_
0ee0: 68 65 61 64 65 72 28 62 6c 6f 62 5f 73 74 72 28  header(blob_str(
0ef0: 26 74 69 74 6c 65 29 29 3b 0a 20 20 7d 65 6c 73  &title));.  }els
0f00: 65 7b 0a 20 20 20 20 73 74 79 6c 65 5f 68 65 61  e{.    style_hea
0f10: 64 65 72 28 22 45 76 65 6e 74 20 25 53 22 2c 20  der("Event %S", 
0f20: 7a 45 76 65 6e 74 49 64 29 3b 0a 20 20 20 20 74  zEventId);.    t
0f30: 61 69 6c 20 3d 20 66 75 6c 6c 62 6f 64 79 3b 0a  ail = fullbody;.
0f40: 20 20 7d 0a 20 20 69 66 28 20 67 2e 70 65 72 6d    }.  if( g.perm
0f50: 2e 57 72 57 69 6b 69 20 26 26 20 67 2e 70 65 72  .WrWiki && g.per
0f60: 6d 2e 57 72 69 74 65 20 26 26 20 6e 65 78 74 52  m.Write && nextR
0f70: 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 79  id==0 ){.    sty
0f80: 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65  le_submenu_eleme
0f90: 6e 74 28 22 45 64 69 74 22 2c 20 22 45 64 69 74  nt("Edit", "Edit
0fa0: 22 2c 20 22 25 73 2f 65 76 65 6e 74 65 64 69 74  ", "%s/eventedit
0fb0: 3f 6e 61 6d 65 3d 25 73 22 2c 0a 20 20 20 20 20  ?name=%s",.     
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fd0: 20 20 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 45 76       g.zTop, zEv
0fe0: 65 6e 74 49 64 29 3b 0a 20 20 7d 0a 20 20 7a 45  entId);.  }.  zE
0ff0: 54 69 6d 65 20 3d 20 64 62 5f 74 65 78 74 28 30  Time = db_text(0
1000: 2c 20 22 53 45 4c 45 43 54 20 64 61 74 65 74 69  , "SELECT dateti
1010: 6d 65 28 25 2e 31 37 67 29 22 2c 20 70 45 76 65  me(%.17g)", pEve
1020: 6e 74 2d 3e 72 45 76 65 6e 74 44 61 74 65 29 3b  nt->rEventDate);
1030: 0a 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75  .  style_submenu
1040: 5f 65 6c 65 6d 65 6e 74 28 22 43 6f 6e 74 65 78  _element("Contex
1050: 74 22 2c 20 22 43 6f 6e 74 65 78 74 22 2c 20 22  t", "Context", "
1060: 25 73 2f 74 69 6d 65 6c 69 6e 65 3f 63 3d 25 54  %s/timeline?c=%T
1070: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1080: 20 20 20 20 20 20 20 20 20 20 20 67 2e 7a 54 6f             g.zTo
1090: 70 2c 20 7a 45 54 69 6d 65 29 3b 0a 20 20 69 66  p, zETime);.  if
10a0: 28 20 67 2e 70 65 72 6d 2e 48 79 70 65 72 6c 69  ( g.perm.Hyperli
10b0: 6e 6b 20 29 7b 0a 20 20 20 20 69 66 28 20 76 65  nk ){.    if( ve
10c0: 72 62 6f 73 65 46 6c 61 67 20 29 7b 0a 20 20 20  rboseFlag ){.   
10d0: 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75     style_submenu
10e0: 5f 65 6c 65 6d 65 6e 74 28 22 50 6c 61 69 6e 22  _element("Plain"
10f0: 2c 20 22 50 6c 61 69 6e 22 2c 20 22 25 73 2f 65  , "Plain", "%s/e
1100: 76 65 6e 74 3f 6e 61 6d 65 3d 25 73 26 61 69 64  vent?name=%s&aid
1110: 3d 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%s",.          
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1130: 20 20 67 2e 7a 54 6f 70 2c 20 7a 45 76 65 6e 74    g.zTop, zEvent
1140: 49 64 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20  Id, zUuid);.    
1150: 20 20 69 66 28 20 6e 65 78 74 52 69 64 20 29 7b    if( nextRid ){
1160: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
1170: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7a 4e  Next;.        zN
1180: 65 78 74 20 3d 20 64 62 5f 74 65 78 74 28 30 2c  ext = db_text(0,
1190: 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52   "SELECT uuid FR
11a0: 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69  OM blob WHERE ri
11b0: 64 3d 25 64 22 2c 20 6e 65 78 74 52 69 64 29 3b  d=%d", nextRid);
11c0: 0a 20 20 20 20 20 20 20 20 73 74 79 6c 65 5f 73  .        style_s
11d0: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22  ubmenu_element("
11e0: 4e 65 78 74 22 2c 20 22 4e 65 78 74 22 2c 0a 20  Next", "Next",. 
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73               "%s
1210: 2f 65 76 65 6e 74 3f 6e 61 6d 65 3d 25 73 26 61  /event?name=%s&a
1220: 69 64 3d 25 73 26 76 22 2c 0a 20 20 20 20 20 20  id=%s&v",.      
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1240: 20 20 20 20 20 20 20 20 67 2e 7a 54 6f 70 2c 20          g.zTop, 
1250: 7a 45 76 65 6e 74 49 64 2c 20 7a 4e 65 78 74 29  zEventId, zNext)
1260: 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a  ;.        free(z
1270: 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Next);.      }. 
1280: 20 20 20 20 20 69 66 28 20 70 72 65 76 52 69 64       if( prevRid
1290: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
12a0: 20 2a 7a 50 72 65 76 3b 0a 20 20 20 20 20 20 20   *zPrev;.       
12b0: 20 7a 50 72 65 76 20 3d 20 64 62 5f 74 65 78 74   zPrev = db_text
12c0: 28 30 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64  (0, "SELECT uuid
12d0: 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45   FROM blob WHERE
12e0: 20 72 69 64 3d 25 64 22 2c 20 70 72 65 76 52 69   rid=%d", prevRi
12f0: 64 29 3b 0a 20 20 20 20 20 20 20 20 73 74 79 6c  d);.        styl
1300: 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e  e_submenu_elemen
1310: 74 28 22 50 72 65 76 22 2c 20 22 50 72 65 76 22  t("Prev", "Prev"
1320: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 22 25 73 2f 65 76 65 6e 74 3f 6e 61 6d 65 3d 25  "%s/event?name=%
1350: 73 26 61 69 64 3d 25 73 26 76 22 2c 0a 20 20 20  s&aid=%s&v",.   
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1370: 20 20 20 20 20 20 20 20 20 20 20 67 2e 7a 54 6f             g.zTo
1380: 70 2c 20 7a 45 76 65 6e 74 49 64 2c 20 7a 50 72  p, zEventId, zPr
1390: 65 76 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65  ev);.        fre
13a0: 65 28 7a 50 72 65 76 29 3b 0a 20 20 20 20 20 20  e(zPrev);.      
13b0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
13c0: 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75     style_submenu
13d0: 5f 65 6c 65 6d 65 6e 74 28 22 44 65 74 61 69 6c  _element("Detail
13e0: 22 2c 20 22 44 65 74 61 69 6c 22 2c 0a 20 20 20  ", "Detail",.   
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 20 20 20 22 25 73 2f 65 76 65           "%s/eve
1410: 6e 74 3f 6e 61 6d 65 3d 25 73 26 61 69 64 3d 25  nt?name=%s&aid=%
1420: 73 26 76 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s&v",.          
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 67 2e 7a 54 6f 70 2c 20 7a 45 76 65 6e 74    g.zTop, zEvent
1450: 49 64 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20  Id, zUuid);.    
1460: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 65 72  }.  }..  if( ver
1470: 62 6f 73 65 46 6c 61 67 20 26 26 20 67 2e 70 65  boseFlag && g.pe
1480: 72 6d 2e 48 79 70 65 72 6c 69 6e 6b 20 29 7b 0a  rm.Hyperlink ){.
1490: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
14a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6c 72 20  onst char *zClr 
14b0: 3d 20 30 3b 0a 20 20 20 20 42 6c 6f 62 20 63 6f  = 0;.    Blob co
14c0: 6d 6d 65 6e 74 3b 0a 0a 20 20 20 20 7a 41 54 69  mment;..    zATi
14d0: 6d 65 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20  me = db_text(0, 
14e0: 22 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d 65  "SELECT datetime
14f0: 28 25 2e 31 37 67 29 22 2c 20 70 45 76 65 6e 74  (%.17g)", pEvent
1500: 2d 3e 72 44 61 74 65 29 3b 0a 20 20 20 20 40 20  ->rDate);.    @ 
1510: 3c 70 3e 45 76 65 6e 74 20 5b 25 7a 28 68 72 65  <p>Event [%z(hre
1520: 66 28 22 25 52 2f 61 72 74 69 66 61 63 74 2f 25  f("%R/artifact/%
1530: 73 22 2c 7a 55 75 69 64 29 29 25 53 28 7a 55 75  s",zUuid))%S(zUu
1540: 69 64 29 3c 2f 61 3e 5d 20 61 74 0a 20 20 20 20  id)</a>] at.    
1550: 40 20 5b 25 7a 28 68 72 65 66 28 22 25 52 2f 74  @ [%z(href("%R/t
1560: 69 6d 65 6c 69 6e 65 3f 63 3d 25 54 22 2c 7a 45  imeline?c=%T",zE
1570: 54 69 6d 65 29 29 25 73 28 7a 45 54 69 6d 65 29  Time))%s(zETime)
1580: 3c 2f 61 3e 5d 0a 20 20 20 20 40 20 65 6e 74 65  </a>].    @ ente
1590: 72 65 64 20 62 79 20 75 73 65 72 20 3c 62 3e 25  red by user <b>%
15a0: 68 28 70 45 76 65 6e 74 2d 3e 7a 55 73 65 72 29  h(pEvent->zUser)
15b0: 3c 2f 62 3e 20 6f 6e 0a 20 20 20 20 40 20 5b 25  </b> on.    @ [%
15c0: 7a 28 68 72 65 66 28 22 25 52 2f 74 69 6d 65 6c  z(href("%R/timel
15d0: 69 6e 65 3f 63 3d 25 54 22 2c 7a 41 54 69 6d 65  ine?c=%T",zATime
15e0: 29 29 25 73 28 7a 41 54 69 6d 65 29 3c 2f 61 3e  ))%s(zATime)</a>
15f0: 5d 3a 3c 2f 70 3e 0a 20 20 20 20 40 20 3c 62 6c  ]:</p>.    @ <bl
1600: 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 20 20 66 6f  ockquote>.    fo
1610: 72 28 69 3d 30 3b 20 69 3c 70 45 76 65 6e 74 2d  r(i=0; i<pEvent-
1620: 3e 6e 54 61 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nTag; i++){.   
1630: 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74     if( fossil_st
1640: 72 63 6d 70 28 70 45 76 65 6e 74 2d 3e 61 54 61  rcmp(pEvent->aTa
1650: 67 5b 69 5d 2e 7a 4e 61 6d 65 2c 22 2b 62 67 63  g[i].zName,"+bgc
1660: 6f 6c 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  olor")==0 ){.   
1670: 20 20 20 20 20 7a 43 6c 72 20 3d 20 70 45 76 65       zClr = pEve
1680: 6e 74 2d 3e 61 54 61 67 5b 69 5d 2e 7a 56 61 6c  nt->aTag[i].zVal
1690: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
16a0: 7d 0a 20 20 20 20 69 66 28 20 7a 43 6c 72 20 26  }.    if( zClr &
16b0: 26 20 7a 43 6c 72 5b 30 5d 3d 3d 30 20 29 20 7a  & zClr[0]==0 ) z
16c0: 43 6c 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Clr = 0;.    if(
16d0: 20 7a 43 6c 72 20 29 7b 0a 20 20 20 20 20 20 40   zClr ){.      @
16e0: 20 3c 64 69 76 20 73 74 79 6c 65 3d 22 62 61 63   <div style="bac
16f0: 6b 67 72 6f 75 6e 64 2d 63 6f 6c 6f 72 3a 20 25  kground-color: %
1700: 68 28 7a 43 6c 72 29 3b 22 3e 0a 20 20 20 20 7d  h(zClr);">.    }
1710: 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20 3c 64  else{.      @ <d
1720: 69 76 3e 0a 20 20 20 20 7d 0a 20 20 20 20 62 6c  iv>.    }.    bl
1730: 6f 62 5f 69 6e 69 74 28 26 63 6f 6d 6d 65 6e 74  ob_init(&comment
1740: 2c 20 70 45 76 65 6e 74 2d 3e 7a 43 6f 6d 6d 65  , pEvent->zComme
1750: 6e 74 2c 20 2d 31 29 3b 0a 20 20 20 20 77 69 6b  nt, -1);.    wik
1760: 69 5f 63 6f 6e 76 65 72 74 28 26 63 6f 6d 6d 65  i_convert(&comme
1770: 6e 74 2c 20 30 2c 20 57 49 4b 49 5f 49 4e 4c 49  nt, 0, WIKI_INLI
1780: 4e 45 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65  NE);.    blob_re
1790: 73 65 74 28 26 63 6f 6d 6d 65 6e 74 29 3b 0a 20  set(&comment);. 
17a0: 20 20 20 40 20 3c 2f 64 69 76 3e 0a 20 20 20 20     @ </div>.    
17b0: 40 20 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c  @ </blockquote><
17c0: 68 72 20 2f 3e 0a 20 20 7d 0a 0a 20 20 77 69 6b  hr />.  }..  wik
17d0: 69 5f 63 6f 6e 76 65 72 74 28 26 74 61 69 6c 2c  i_convert(&tail,
17e0: 20 30 2c 20 30 29 3b 0a 20 20 73 74 79 6c 65 5f   0, 0);.  style_
17f0: 66 6f 6f 74 65 72 28 29 3b 0a 20 20 6d 61 6e 69  footer();.  mani
1800: 66 65 73 74 5f 64 65 73 74 72 6f 79 28 70 45 76  fest_destroy(pEv
1810: 65 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ent);.}../*.** W
1820: 45 42 50 41 47 45 3a 20 65 76 65 6e 74 65 64 69  EBPAGE: eventedi
1830: 74 0a 2a 2a 20 55 52 4c 3a 20 2f 65 76 65 6e 74  t.** URL: /event
1840: 65 64 69 74 3f 6e 61 6d 65 3d 45 56 45 4e 54 49  edit?name=EVENTI
1850: 44 0a 2a 2a 0a 2a 2a 20 45 64 69 74 20 61 6e 20  D.**.** Edit an 
1860: 65 76 65 6e 74 2e 20 20 49 66 20 6e 61 6d 65 20  event.  If name 
1870: 69 73 20 6f 6d 69 74 74 65 64 2c 20 63 72 65 61  is omitted, crea
1880: 74 65 20 61 20 6e 65 77 20 65 76 65 6e 74 2e 0a  te a new event..
1890: 2a 2f 0a 76 6f 69 64 20 65 76 65 6e 74 65 64 69  */.void eventedi
18a0: 74 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20  t_page(void){.  
18b0: 63 68 61 72 20 2a 7a 54 61 67 3b 0a 20 20 69 6e  char *zTag;.  in
18c0: 74 20 72 69 64 20 3d 20 30 3b 0a 20 20 42 6c 6f  t rid = 0;.  Blo
18d0: 62 20 65 76 65 6e 74 3b 0a 20 20 63 6f 6e 73 74  b event;.  const
18e0: 20 63 68 61 72 20 2a 7a 45 76 65 6e 74 49 64 3b   char *zEventId;
18f0: 0a 20 20 63 68 61 72 20 2a 7a 48 74 6d 6c 50 61  .  char *zHtmlPa
1900: 67 65 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b  geName;.  int n;
1910: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1920: 3b 0a 20 20 63 68 61 72 20 2a 7a 42 6f 64 79 20  ;.  char *zBody 
1930: 3d 20 28 63 68 61 72 2a 29 50 28 22 77 22 29 3b  = (char*)P("w");
1940: 0a 20 20 63 68 61 72 20 2a 7a 45 54 69 6d 65 20  .  char *zETime 
1950: 3d 20 28 63 68 61 72 2a 29 50 28 22 74 22 29 3b  = (char*)P("t");
1960: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1970: 43 6f 6d 6d 65 6e 74 20 3d 20 50 28 22 63 22 29  Comment = P("c")
1980: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1990: 7a 54 61 67 73 20 3d 20 50 28 22 67 22 29 3b 0a  zTags = P("g");.
19a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
19b0: 6c 72 3b 0a 0a 20 20 69 66 28 20 7a 42 6f 64 79  lr;..  if( zBody
19c0: 20 29 7b 0a 20 20 20 20 7a 42 6f 64 79 20 3d 20   ){.    zBody = 
19d0: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 42  mprintf("%s", zB
19e0: 6f 64 79 29 3b 0a 20 20 7d 0a 20 20 6c 6f 67 69  ody);.  }.  logi
19f0: 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69  n_check_credenti
1a00: 61 6c 73 28 29 3b 0a 20 20 7a 45 76 65 6e 74 49  als();.  zEventI
1a10: 64 20 3d 20 50 28 22 6e 61 6d 65 22 29 3b 0a 20  d = P("name");. 
1a20: 20 69 66 28 20 7a 45 76 65 6e 74 49 64 3d 3d 30   if( zEventId==0
1a30: 20 29 7b 0a 20 20 20 20 7a 45 76 65 6e 74 49 64   ){.    zEventId
1a40: 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53   = db_text(0, "S
1a50: 45 4c 45 43 54 20 6c 6f 77 65 72 28 68 65 78 28  ELECT lower(hex(
1a60: 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 29 29 29  randomblob(20)))
1a70: 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
1a80: 20 69 6e 74 20 6e 45 76 65 6e 74 49 64 20 3d 20   int nEventId = 
1a90: 73 74 72 6c 65 6e 28 7a 45 76 65 6e 74 49 64 29  strlen(zEventId)
1aa0: 3b 0a 20 20 20 20 69 66 28 20 6e 45 76 65 6e 74  ;.    if( nEvent
1ab0: 49 64 21 3d 34 30 20 7c 7c 20 21 76 61 6c 69 64  Id!=40 || !valid
1ac0: 61 74 65 31 36 28 7a 45 76 65 6e 74 49 64 2c 20  ate16(zEventId, 
1ad0: 34 30 29 20 29 7b 0a 20 20 20 20 20 20 66 6f 73  40) ){.      fos
1ae0: 73 69 6c 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d  sil_redirect_hom
1af0: 65 28 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  e();.      retur
1b00: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  n;.    }.  }.  z
1b10: 54 61 67 20 3d 20 6d 70 72 69 6e 74 66 28 22 65  Tag = mprintf("e
1b20: 76 65 6e 74 2d 25 73 22 2c 20 7a 45 76 65 6e 74  vent-%s", zEvent
1b30: 49 64 29 3b 0a 20 20 72 69 64 20 3d 20 64 62 5f  Id);.  rid = db_
1b40: 69 6e 74 28 30 2c 0a 20 20 20 20 22 53 45 4c 45  int(0,.    "SELE
1b50: 43 54 20 72 69 64 20 46 52 4f 4d 20 74 61 67 78  CT rid FROM tagx
1b60: 72 65 66 22 0a 20 20 20 20 22 20 57 48 45 52 45  ref".    " WHERE
1b70: 20 74 61 67 69 64 3d 28 53 45 4c 45 43 54 20 74   tagid=(SELECT t
1b80: 61 67 69 64 20 46 52 4f 4d 20 74 61 67 20 57 48  agid FROM tag WH
1b90: 45 52 45 20 74 61 67 6e 61 6d 65 3d 25 51 29 22  ERE tagname=%Q)"
1ba0: 0a 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20  .    " ORDER BY 
1bb0: 6d 74 69 6d 65 20 44 45 53 43 22 2c 20 7a 54 61  mtime DESC", zTa
1bc0: 67 0a 20 20 29 3b 0a 20 20 66 72 65 65 28 7a 54  g.  );.  free(zT
1bd0: 61 67 29 3b 0a 0a 20 20 2f 2a 20 4e 65 65 64 20  ag);..  /* Need 
1be0: 62 6f 74 68 20 63 68 65 63 6b 2d 69 6e 20 61 6e  both check-in an
1bf0: 64 20 77 69 6b 69 2d 77 72 69 74 65 20 6f 72 20  d wiki-write or 
1c00: 77 69 6b 69 2d 63 72 65 61 74 65 20 70 72 69 76  wiki-create priv
1c10: 69 6c 65 67 65 73 20 69 6e 20 6f 72 64 65 72 0a  ileges in order.
1c20: 20 20 2a 2a 20 74 6f 20 65 64 69 74 2f 63 72 65    ** to edit/cre
1c30: 61 74 65 20 61 6e 20 65 76 65 6e 74 2e 0a 20 20  ate an event..  
1c40: 2a 2f 0a 20 20 69 66 28 20 21 67 2e 70 65 72 6d  */.  if( !g.perm
1c50: 2e 57 72 69 74 65 20 7c 7c 20 28 72 69 64 20 26  .Write || (rid &
1c60: 26 20 21 67 2e 70 65 72 6d 2e 57 72 57 69 6b 69  & !g.perm.WrWiki
1c70: 29 20 7c 7c 20 28 21 72 69 64 20 26 26 20 21 67  ) || (!rid && !g
1c80: 2e 70 65 72 6d 2e 4e 65 77 57 69 6b 69 29 20 29  .perm.NewWiki) )
1c90: 7b 0a 20 20 20 20 6c 6f 67 69 6e 5f 6e 65 65 64  {.    login_need
1ca0: 65 64 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed();.    return
1cb0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
1cc0: 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c 6f 72  re out the color
1cd0: 20 2a 2f 0a 20 20 69 66 28 20 72 69 64 20 29 7b   */.  if( rid ){
1ce0: 0a 20 20 20 20 7a 43 6c 72 20 3d 20 64 62 5f 74  .    zClr = db_t
1cf0: 65 78 74 28 22 22 2c 20 22 53 45 4c 45 43 54 20  ext("", "SELECT 
1d00: 62 67 63 6f 6c 6f 72 20 20 46 52 4f 4d 20 65 76  bgcolor  FROM ev
1d10: 65 6e 74 20 57 48 45 52 45 20 6f 62 6a 69 64 3d  ent WHERE objid=
1d20: 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 7d 65 6c  %d", rid);.  }el
1d30: 73 65 7b 0a 20 20 20 20 7a 43 6c 72 20 3d 20 22  se{.    zClr = "
1d40: 22 3b 0a 20 20 7d 0a 20 20 7a 43 6c 72 20 3d 20  ";.  }.  zClr = 
1d50: 50 44 28 22 63 6c 72 22 2c 7a 43 6c 72 29 3b 0a  PD("clr",zClr);.
1d60: 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72    if( fossil_str
1d70: 63 6d 70 28 7a 43 6c 72 2c 22 23 23 22 29 3d 3d  cmp(zClr,"##")==
1d80: 30 20 29 20 7a 43 6c 72 20 3d 20 50 44 28 22 63  0 ) zClr = PD("c
1d90: 63 6c 72 22 2c 22 22 29 3b 0a 0a 0a 20 20 2f 2a  clr","");...  /*
1da0: 20 49 66 20 65 64 69 74 69 6e 67 20 61 6e 20 65   If editing an e
1db0: 78 69 73 74 69 6e 67 20 65 76 65 6e 74 2c 20 65  xisting event, e
1dc0: 78 74 72 61 63 74 20 74 68 65 20 6b 65 79 20 66  xtract the key f
1dd0: 69 65 6c 64 73 20 74 6f 20 75 73 65 20 61 73 0a  ields to use as.
1de0: 20 20 2a 2a 20 61 20 73 74 61 72 74 69 6e 67 20    ** a starting 
1df0: 70 6f 69 6e 74 20 66 6f 72 20 74 68 65 20 65 64  point for the ed
1e00: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  it..  */.  if( r
1e10: 69 64 20 26 26 20 28 7a 42 6f 64 79 3d 3d 30 20  id && (zBody==0 
1e20: 7c 7c 20 7a 45 54 69 6d 65 3d 3d 30 20 7c 7c 20  || zETime==0 || 
1e30: 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 7a  zComment==0 || z
1e40: 54 61 67 73 3d 3d 30 29 20 29 7b 0a 20 20 20 20  Tags==0) ){.    
1e50: 4d 61 6e 69 66 65 73 74 20 2a 70 45 76 65 6e 74  Manifest *pEvent
1e60: 3b 0a 20 20 20 20 70 45 76 65 6e 74 20 3d 20 6d  ;.    pEvent = m
1e70: 61 6e 69 66 65 73 74 5f 67 65 74 28 72 69 64 2c  anifest_get(rid,
1e80: 20 43 46 54 59 50 45 5f 45 56 45 4e 54 29 3b 0a   CFTYPE_EVENT);.
1e90: 20 20 20 20 69 66 28 20 70 45 76 65 6e 74 20 26      if( pEvent &
1ea0: 26 20 70 45 76 65 6e 74 2d 3e 74 79 70 65 3d 3d  & pEvent->type==
1eb0: 43 46 54 59 50 45 5f 45 56 45 4e 54 20 29 7b 0a  CFTYPE_EVENT ){.
1ec0: 20 20 20 20 20 20 69 66 28 20 7a 42 6f 64 79 3d        if( zBody=
1ed0: 3d 30 20 29 20 7a 42 6f 64 79 20 3d 20 70 45 76  =0 ) zBody = pEv
1ee0: 65 6e 74 2d 3e 7a 57 69 6b 69 3b 0a 20 20 20 20  ent->zWiki;.    
1ef0: 20 20 69 66 28 20 7a 45 54 69 6d 65 3d 3d 30 20    if( zETime==0 
1f00: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 54 69 6d  ){.        zETim
1f10: 65 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22  e = db_text(0, "
1f20: 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d 65 28  SELECT datetime(
1f30: 25 2e 31 37 67 29 22 2c 20 70 45 76 65 6e 74 2d  %.17g)", pEvent-
1f40: 3e 72 45 76 65 6e 74 44 61 74 65 29 3b 0a 20 20  >rEventDate);.  
1f50: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1f60: 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 29 20 7a 43  zComment==0 ) zC
1f70: 6f 6d 6d 65 6e 74 20 3d 20 70 45 76 65 6e 74 2d  omment = pEvent-
1f80: 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 7d  >zComment;.    }
1f90: 0a 20 20 20 20 69 66 28 20 7a 54 61 67 73 3d 3d  .    if( zTags==
1fa0: 30 20 29 7b 0a 20 20 20 20 20 20 7a 54 61 67 73  0 ){.      zTags
1fb0: 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 0a 20 20   = db_text(0,.  
1fc0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 67 72        "SELECT gr
1fd0: 6f 75 70 5f 63 6f 6e 63 61 74 28 73 75 62 73 74  oup_concat(subst
1fe0: 72 28 74 61 67 6e 61 6d 65 2c 35 29 2c 27 2c 20  r(tagname,5),', 
1ff0: 27 29 22 0a 20 20 20 20 20 20 20 20 22 20 20 46  ')".        "  F
2000: 52 4f 4d 20 74 61 67 78 72 65 66 2c 20 74 61 67  ROM tagxref, tag
2010: 22 0a 20 20 20 20 20 20 20 20 22 20 57 48 45 52  ".        " WHER
2020: 45 20 74 61 67 78 72 65 66 2e 72 69 64 3d 25 64  E tagxref.rid=%d
2030: 22 0a 20 20 20 20 20 20 20 20 22 20 20 20 41 4e  ".        "   AN
2040: 44 20 74 61 67 78 72 65 66 2e 74 61 67 69 64 3d  D tagxref.tagid=
2050: 74 61 67 2e 74 61 67 69 64 22 0a 20 20 20 20 20  tag.tagid".     
2060: 20 20 20 22 20 20 20 41 4e 44 20 74 61 67 2e 74     "   AND tag.t
2070: 61 67 6e 61 6d 65 20 47 4c 4f 42 20 27 73 79 6d  agname GLOB 'sym
2080: 2d 2a 27 22 2c 0a 20 20 20 20 20 20 20 20 72 69  -*'",.        ri
2090: 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  d.      );.    }
20a0: 0a 20 20 7d 0a 20 20 7a 45 54 69 6d 65 20 3d 20  .  }.  zETime = 
20b0: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
20c0: 43 54 20 63 6f 61 6c 65 73 63 65 28 64 61 74 65  CT coalesce(date
20d0: 74 69 6d 65 28 25 51 29 2c 64 61 74 65 74 69 6d  time(%Q),datetim
20e0: 65 28 27 6e 6f 77 27 29 29 22 2c 20 7a 45 54 69  e('now'))", zETi
20f0: 6d 65 29 3b 0a 20 20 69 66 28 20 50 28 22 73 75  me);.  if( P("su
2100: 62 6d 69 74 22 29 21 3d 30 20 26 26 20 28 7a 42  bmit")!=0 && (zB
2110: 6f 64 79 21 3d 30 20 26 26 20 7a 43 6f 6d 6d 65  ody!=0 && zComme
2120: 6e 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 63 68  nt!=0) ){.    ch
2130: 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20 20 20 42  ar *zDate;.    B
2140: 6c 6f 62 20 63 6b 73 75 6d 3b 0a 20 20 20 20 69  lob cksum;.    i
2150: 6e 74 20 6e 72 69 64 3b 0a 20 20 20 20 62 6c 6f  nt nrid;.    blo
2160: 62 5f 7a 65 72 6f 28 26 65 76 65 6e 74 29 3b 0a  b_zero(&event);.
2170: 20 20 20 20 64 62 5f 62 65 67 69 6e 5f 74 72 61      db_begin_tra
2180: 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 20 20  nsaction();.    
2190: 6c 6f 67 69 6e 5f 76 65 72 69 66 79 5f 63 73 72  login_verify_csr
21a0: 66 5f 73 65 63 72 65 74 28 29 3b 0a 20 20 20 20  f_secret();.    
21b0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 65 76  blob_appendf(&ev
21c0: 65 6e 74 2c 20 22 43 20 25 46 5c 6e 22 2c 20 7a  ent, "C %F\n", z
21d0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 7a 44  Comment);.    zD
21e0: 61 74 65 20 3d 20 64 61 74 65 5f 69 6e 5f 73 74  ate = date_in_st
21f0: 61 6e 64 61 72 64 5f 66 6f 72 6d 61 74 28 22 6e  andard_format("n
2200: 6f 77 22 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61  ow");.    blob_a
2210: 70 70 65 6e 64 66 28 26 65 76 65 6e 74 2c 20 22  ppendf(&event, "
2220: 44 20 25 73 5c 6e 22 2c 20 7a 44 61 74 65 29 3b  D %s\n", zDate);
2230: 0a 20 20 20 20 66 72 65 65 28 7a 44 61 74 65 29  .    free(zDate)
2240: 3b 0a 20 20 20 20 7a 45 54 69 6d 65 5b 31 30 5d  ;.    zETime[10]
2250: 20 3d 20 27 54 27 3b 0a 20 20 20 20 62 6c 6f 62   = 'T';.    blob
2260: 5f 61 70 70 65 6e 64 66 28 26 65 76 65 6e 74 2c  _appendf(&event,
2270: 20 22 45 20 25 73 20 25 73 5c 6e 22 2c 20 7a 45   "E %s %s\n", zE
2280: 54 69 6d 65 2c 20 7a 45 76 65 6e 74 49 64 29 3b  Time, zEventId);
2290: 0a 20 20 20 20 7a 45 54 69 6d 65 5b 31 30 5d 20  .    zETime[10] 
22a0: 3d 20 27 20 27 3b 0a 20 20 20 20 69 66 28 20 72  = ' ';.    if( r
22b0: 69 64 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  id ){.      char
22c0: 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f 74 65 78   *zUuid = db_tex
22d0: 74 28 30 2c 20 22 53 45 4c 45 43 54 20 75 75 69  t(0, "SELECT uui
22e0: 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52  d FROM blob WHER
22f0: 45 20 72 69 64 3d 25 64 22 2c 20 72 69 64 29 3b  E rid=%d", rid);
2300: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  .      blob_appe
2310: 6e 64 66 28 26 65 76 65 6e 74 2c 20 22 50 20 25  ndf(&event, "P %
2320: 73 5c 6e 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20  s\n", zUuid);.  
2330: 20 20 20 20 66 72 65 65 28 7a 55 75 69 64 29 3b      free(zUuid);
2340: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
2350: 43 6c 72 20 26 26 20 7a 43 6c 72 5b 30 5d 20 29  Clr && zClr[0] )
2360: 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  {.      blob_app
2370: 65 6e 64 66 28 26 65 76 65 6e 74 2c 20 22 54 20  endf(&event, "T 
2380: 2b 62 67 63 6f 6c 6f 72 20 2a 20 25 46 5c 6e 22  +bgcolor * %F\n"
2390: 2c 20 7a 43 6c 72 29 3b 0a 20 20 20 20 7d 0a 20  , zClr);.    }. 
23a0: 20 20 20 69 66 28 20 7a 54 61 67 73 20 26 26 20     if( zTags && 
23b0: 7a 54 61 67 73 5b 30 5d 20 29 7b 0a 20 20 20 20  zTags[0] ){.    
23c0: 20 20 42 6c 6f 62 20 74 61 67 73 2c 20 6f 6e 65    Blob tags, one
23d0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  ;.      int i, j
23e0: 3b 0a 20 20 20 20 20 20 53 74 6d 74 20 71 3b 0a  ;.      Stmt q;.
23f0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f        char *zBlo
2400: 62 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 61  b;..      /* Loa
2410: 64 20 74 68 65 20 74 61 67 73 20 73 74 72 69 6e  d the tags strin
2420: 67 20 69 6e 74 6f 20 61 20 62 6c 6f 62 20 2a 2f  g into a blob */
2430: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f  .      blob_zero
2440: 28 26 74 61 67 73 29 3b 0a 20 20 20 20 20 20 62  (&tags);.      b
2450: 6c 6f 62 5f 61 70 70 65 6e 64 28 26 74 61 67 73  lob_append(&tags
2460: 2c 20 7a 54 61 67 73 2c 20 2d 31 29 3b 0a 0a 20  , zTags, -1);.. 
2470: 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 70 73 65       /* Collapse
2480: 20 61 6c 6c 20 73 65 71 75 65 6e 63 65 73 20 6f   all sequences o
2490: 66 20 77 68 69 74 65 73 70 61 63 65 20 61 6e 64  f whitespace and
24a0: 20 22 2c 22 20 63 68 61 72 61 63 74 65 72 73 20   "," characters 
24b0: 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 20  into.      ** a 
24c0: 73 69 6e 67 6c 65 20 73 70 61 63 65 20 63 68 61  single space cha
24d0: 72 61 63 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  racter */.      
24e0: 7a 42 6c 6f 62 20 3d 20 62 6c 6f 62 5f 73 74 72  zBlob = blob_str
24f0: 28 26 74 61 67 73 29 3b 0a 20 20 20 20 20 20 66  (&tags);.      f
2500: 6f 72 28 69 3d 6a 3d 30 3b 20 7a 42 6c 6f 62 5b  or(i=j=0; zBlob[
2510: 69 5d 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  i]; i++, j++){. 
2520: 20 20 20 20 20 20 20 69 66 28 20 66 6f 73 73 69         if( fossi
2530: 6c 5f 69 73 73 70 61 63 65 28 7a 42 6c 6f 62 5b  l_isspace(zBlob[
2540: 69 5d 29 20 7c 7c 20 7a 42 6c 6f 62 5b 69 5d 3d  i]) || zBlob[i]=
2550: 3d 27 2c 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =',' ){.        
2560: 20 20 77 68 69 6c 65 28 20 66 6f 73 73 69 6c 5f    while( fossil_
2570: 69 73 73 70 61 63 65 28 7a 42 6c 6f 62 5b 69 2b  isspace(zBlob[i+
2580: 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20  1]) ){ i++; }.  
2590: 20 20 20 20 20 20 20 20 7a 42 6c 6f 62 5b 6a 5d          zBlob[j]
25a0: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
25b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25c0: 20 7a 42 6c 6f 62 5b 6a 5d 20 3d 20 7a 42 6c 6f   zBlob[j] = zBlo
25d0: 62 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  b[i];.        }.
25e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 6c        }.      bl
25f0: 6f 62 5f 72 65 73 69 7a 65 28 26 74 61 67 73 2c  ob_resize(&tags,
2600: 20 6a 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 50   j);..      /* P
2610: 61 72 73 65 20 6f 75 74 20 65 61 63 68 20 74 61  arse out each ta
2620: 67 20 61 6e 64 20 6c 6f 61 64 20 69 74 20 69 6e  g and load it in
2630: 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  to a temporary t
2640: 61 62 6c 65 20 66 6f 72 20 73 6f 72 74 69 6e 67  able for sorting
2650: 20 2a 2f 0a 20 20 20 20 20 20 64 62 5f 6d 75 6c   */.      db_mul
2660: 74 69 5f 65 78 65 63 28 22 43 52 45 41 54 45 20  ti_exec("CREATE 
2670: 54 45 4d 50 20 54 41 42 4c 45 20 6e 65 77 74 61  TEMP TABLE newta
2680: 67 73 28 78 29 3b 22 29 3b 0a 20 20 20 20 20 20  gs(x);");.      
2690: 77 68 69 6c 65 28 20 62 6c 6f 62 5f 74 6f 6b 65  while( blob_toke
26a0: 6e 28 26 74 61 67 73 2c 20 26 6f 6e 65 29 20 29  n(&tags, &one) )
26b0: 7b 0a 20 20 20 20 20 20 20 20 64 62 5f 6d 75 6c  {.        db_mul
26c0: 74 69 5f 65 78 65 63 28 22 49 4e 53 45 52 54 20  ti_exec("INSERT 
26d0: 49 4e 54 4f 20 6e 65 77 74 61 67 73 20 56 41 4c  INTO newtags VAL
26e0: 55 45 53 28 25 42 29 22 2c 20 26 6f 6e 65 29 3b  UES(%B)", &one);
26f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
2700: 6c 6f 62 5f 72 65 73 65 74 28 26 74 61 67 73 29  lob_reset(&tags)
2710: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 78 74 72  ;..      /* Extr
2720: 61 63 74 20 74 68 65 20 74 61 67 73 20 69 6e 20  act the tags in 
2730: 73 6f 72 74 65 64 20 6f 72 64 65 72 20 61 6e 64  sorted order and
2740: 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 69   make an entry i
2750: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 61  n the.      ** a
2760: 72 74 69 66 61 63 74 20 66 6f 72 20 65 61 63 68  rtifact for each
2770: 2e 20 2a 2f 0a 20 20 20 20 20 20 64 62 5f 70 72  . */.      db_pr
2780: 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45 43  epare(&q, "SELEC
2790: 54 20 78 20 46 52 4f 4d 20 6e 65 77 74 61 67 73  T x FROM newtags
27a0: 20 4f 52 44 45 52 20 42 59 20 78 22 29 3b 0a 20   ORDER BY x");. 
27b0: 20 20 20 20 20 77 68 69 6c 65 28 20 64 62 5f 73       while( db_s
27c0: 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f  tep(&q)==SQLITE_
27d0: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ROW ){.        b
27e0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 65 76 65  lob_appendf(&eve
27f0: 6e 74 2c 20 22 54 20 2b 73 79 6d 2d 25 46 20 2a  nt, "T +sym-%F *
2800: 5c 6e 22 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  \n", db_column_t
2810: 65 78 74 28 26 71 2c 20 30 29 29 3b 0a 20 20 20  ext(&q, 0));.   
2820: 20 20 20 7d 0a 20 20 20 20 20 20 64 62 5f 66 69     }.      db_fi
2830: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 20 20  nalize(&q);.    
2840: 7d 0a 20 20 20 20 69 66 28 20 67 2e 7a 4c 6f 67  }.    if( g.zLog
2850: 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62  in ){.      blob
2860: 5f 61 70 70 65 6e 64 66 28 26 65 76 65 6e 74 2c  _appendf(&event,
2870: 20 22 55 20 25 46 5c 6e 22 2c 20 67 2e 7a 4c 6f   "U %F\n", g.zLo
2880: 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  gin);.    }.    
2890: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 65 76  blob_appendf(&ev
28a0: 65 6e 74 2c 20 22 57 20 25 64 5c 6e 25 73 5c 6e  ent, "W %d\n%s\n
28b0: 22 2c 20 73 74 72 6c 65 6e 28 7a 42 6f 64 79 29  ", strlen(zBody)
28c0: 2c 20 7a 42 6f 64 79 29 3b 0a 20 20 20 20 6d 64  , zBody);.    md
28d0: 35 73 75 6d 5f 62 6c 6f 62 28 26 65 76 65 6e 74  5sum_blob(&event
28e0: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 62  , &cksum);.    b
28f0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 65 76 65  lob_appendf(&eve
2900: 6e 74 2c 20 22 5a 20 25 62 5c 6e 22 2c 20 26 63  nt, "Z %b\n", &c
2910: 6b 73 75 6d 29 3b 0a 20 20 20 20 62 6c 6f 62 5f  ksum);.    blob_
2920: 72 65 73 65 74 28 26 63 6b 73 75 6d 29 3b 0a 20  reset(&cksum);. 
2930: 20 20 20 6e 72 69 64 20 3d 20 63 6f 6e 74 65 6e     nrid = conten
2940: 74 5f 70 75 74 28 26 65 76 65 6e 74 29 3b 0a 20  t_put(&event);. 
2950: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
2960: 28 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f  ("INSERT OR IGNO
2970: 52 45 20 49 4e 54 4f 20 75 6e 73 65 6e 74 20 56  RE INTO unsent V
2980: 41 4c 55 45 53 28 25 64 29 22 2c 20 6e 72 69 64  ALUES(%d)", nrid
2990: 29 3b 0a 20 20 20 20 6d 61 6e 69 66 65 73 74 5f  );.    manifest_
29a0: 63 72 6f 73 73 6c 69 6e 6b 28 6e 72 69 64 2c 20  crosslink(nrid, 
29b0: 26 65 76 65 6e 74 29 3b 0a 20 20 20 20 61 73 73  &event);.    ass
29c0: 65 72 74 28 20 62 6c 6f 62 5f 69 73 5f 72 65 73  ert( blob_is_res
29d0: 65 74 28 26 65 76 65 6e 74 29 20 29 3b 0a 20 20  et(&event) );.  
29e0: 20 20 63 6f 6e 74 65 6e 74 5f 64 65 6c 74 69 66    content_deltif
29f0: 79 28 72 69 64 2c 20 6e 72 69 64 2c 20 30 29 3b  y(rid, nrid, 0);
2a00: 0a 20 20 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e  .    db_end_tran
2a10: 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20 20 20  saction(0);.    
2a20: 63 67 69 5f 72 65 64 69 72 65 63 74 66 28 22 65  cgi_redirectf("e
2a30: 76 65 6e 74 3f 6e 61 6d 65 3d 25 54 22 2c 20 7a  vent?name=%T", z
2a40: 45 76 65 6e 74 49 64 29 3b 0a 20 20 7d 0a 20 20  EventId);.  }.  
2a50: 69 66 28 20 50 28 22 63 61 6e 63 65 6c 22 29 21  if( P("cancel")!
2a60: 3d 30 20 29 7b 0a 20 20 20 20 63 67 69 5f 72 65  =0 ){.    cgi_re
2a70: 64 69 72 65 63 74 66 28 22 65 76 65 6e 74 3f 6e  directf("event?n
2a80: 61 6d 65 3d 25 54 22 2c 20 7a 45 76 65 6e 74 49  ame=%T", zEventI
2a90: 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  d);.    return;.
2aa0: 20 20 7d 0a 20 20 69 66 28 20 7a 42 6f 64 79 3d    }.  if( zBody=
2ab0: 3d 30 20 29 7b 0a 20 20 20 20 7a 42 6f 64 79 20  =0 ){.    zBody 
2ac0: 3d 20 6d 70 72 69 6e 74 66 28 22 3c 69 3e 45 76  = mprintf("<i>Ev
2ad0: 65 6e 74 20 54 65 78 74 3c 2f 69 3e 22 29 3b 0a  ent Text</i>");.
2ae0: 20 20 7d 0a 20 20 7a 48 74 6d 6c 50 61 67 65 4e    }.  zHtmlPageN
2af0: 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 45  ame = mprintf("E
2b00: 64 69 74 20 45 76 65 6e 74 20 25 53 22 2c 20 7a  dit Event %S", z
2b10: 45 76 65 6e 74 49 64 29 3b 0a 20 20 73 74 79 6c  EventId);.  styl
2b20: 65 5f 68 65 61 64 65 72 28 7a 48 74 6d 6c 50 61  e_header(zHtmlPa
2b30: 67 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 50  geName);.  if( P
2b40: 28 22 70 72 65 76 69 65 77 22 29 21 3d 30 20 29  ("preview")!=0 )
2b50: 7b 0a 20 20 20 20 42 6c 6f 62 20 74 69 74 6c 65  {.    Blob title
2b60: 2c 20 74 61 69 6c 2c 20 63 6f 6d 3b 0a 20 20 20  , tail, com;.   
2b70: 20 40 20 3c 70 3e 3c 62 3e 54 69 6d 65 6c 69 6e   @ <p><b>Timelin
2b80: 65 20 63 6f 6d 6d 65 6e 74 20 70 72 65 76 69 65  e comment previe
2b90: 77 3a 3c 2f 62 3e 3c 2f 70 3e 0a 20 20 20 20 40  w:</b></p>.    @
2ba0: 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20   <blockquote>.  
2bb0: 20 20 40 20 3c 74 61 62 6c 65 20 62 6f 72 64 65    @ <table borde
2bc0: 72 3d 22 30 22 3e 0a 20 20 20 20 69 66 28 20 7a  r="0">.    if( z
2bd0: 43 6c 72 20 26 26 20 7a 43 6c 72 5b 30 5d 20 29  Clr && zClr[0] )
2be0: 7b 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74  {.      @ <tr><t
2bf0: 64 20 73 74 79 6c 65 3d 22 62 61 63 6b 67 72 6f  d style="backgro
2c00: 75 6e 64 2d 63 6f 6c 6f 72 3a 20 25 68 28 7a 43  und-color: %h(zC
2c10: 6c 72 29 3b 22 3e 0a 20 20 20 20 7d 65 6c 73 65  lr);">.    }else
2c20: 7b 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74  {.      @ <tr><t
2c30: 64 3e 0a 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f  d>.    }.    blo
2c40: 62 5f 7a 65 72 6f 28 26 63 6f 6d 29 3b 0a 20 20  b_zero(&com);.  
2c50: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 63    blob_append(&c
2c60: 6f 6d 2c 20 7a 43 6f 6d 6d 65 6e 74 2c 20 2d 31  om, zComment, -1
2c70: 29 3b 0a 20 20 20 20 77 69 6b 69 5f 63 6f 6e 76  );.    wiki_conv
2c80: 65 72 74 28 26 63 6f 6d 2c 20 30 2c 20 57 49 4b  ert(&com, 0, WIK
2c90: 49 5f 49 4e 4c 49 4e 45 7c 57 49 4b 49 5f 4e 4f  I_INLINE|WIKI_NO
2ca0: 42 41 44 4c 49 4e 4b 53 29 3b 0a 20 20 20 20 40  BADLINKS);.    @
2cb0: 20 3c 2f 74 64 3e 3c 2f 74 72 3e 3c 2f 74 61 62   </td></tr></tab
2cc0: 6c 65 3e 0a 20 20 20 20 40 20 3c 2f 62 6c 6f 63  le>.    @ </bloc
2cd0: 6b 71 75 6f 74 65 3e 0a 20 20 20 20 40 20 3c 70  kquote>.    @ <p
2ce0: 3e 3c 62 3e 50 61 67 65 20 63 6f 6e 74 65 6e 74  ><b>Page content
2cf0: 20 70 72 65 76 69 65 77 3a 3c 2f 62 3e 3c 70 3e   preview:</b><p>
2d00: 0a 20 20 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f  .    @ <blockquo
2d10: 74 65 3e 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72  te>.    blob_zer
2d20: 6f 28 26 65 76 65 6e 74 29 3b 0a 20 20 20 20 62  o(&event);.    b
2d30: 6c 6f 62 5f 61 70 70 65 6e 64 28 26 65 76 65 6e  lob_append(&even
2d40: 74 2c 20 7a 42 6f 64 79 2c 20 2d 31 29 3b 0a 20  t, zBody, -1);. 
2d50: 20 20 20 69 66 28 20 77 69 6b 69 5f 66 69 6e 64     if( wiki_find
2d60: 5f 74 69 74 6c 65 28 26 65 76 65 6e 74 2c 20 26  _title(&event, &
2d70: 74 69 74 6c 65 2c 20 26 74 61 69 6c 29 20 29 7b  title, &tail) ){
2d80: 0a 20 20 20 20 20 20 40 20 3c 68 32 20 61 6c 69  .      @ <h2 ali
2d90: 67 6e 3d 22 63 65 6e 74 65 72 22 3e 25 68 28 62  gn="center">%h(b
2da0: 6c 6f 62 5f 73 74 72 28 26 74 69 74 6c 65 29 29  lob_str(&title))
2db0: 3c 2f 68 32 3e 0a 20 20 20 20 20 20 77 69 6b 69  </h2>.      wiki
2dc0: 5f 63 6f 6e 76 65 72 74 28 26 74 61 69 6c 2c 20  _convert(&tail, 
2dd0: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0, 0);.    }else
2de0: 7b 0a 20 20 20 20 20 20 77 69 6b 69 5f 63 6f 6e  {.      wiki_con
2df0: 76 65 72 74 28 26 65 76 65 6e 74 2c 20 30 2c 20  vert(&event, 0, 
2e00: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 40 20  0);.    }.    @ 
2e10: 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 68 72  </blockquote><hr
2e20: 20 2f 3e 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73   />.    blob_res
2e30: 65 74 28 26 65 76 65 6e 74 29 3b 0a 20 20 7d 0a  et(&event);.  }.
2e40: 20 20 66 6f 72 28 6e 3d 32 2c 20 7a 3d 7a 42 6f    for(n=2, z=zBo
2e50: 64 79 3b 20 7a 5b 30 5d 3b 20 7a 2b 2b 29 7b 0a  dy; z[0]; z++){.
2e60: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 5c      if( z[0]=='\
2e70: 6e 27 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  n' ) n++;.  }.  
2e80: 69 66 28 20 6e 3c 32 30 20 29 20 6e 20 3d 20 32  if( n<20 ) n = 2
2e90: 30 3b 0a 20 20 69 66 28 20 6e 3e 34 30 20 29 20  0;.  if( n>40 ) 
2ea0: 6e 20 3d 20 34 30 3b 0a 20 20 40 20 3c 66 6f 72  n = 40;.  @ <for
2eb0: 6d 20 6d 65 74 68 6f 64 3d 22 70 6f 73 74 22 20  m method="post" 
2ec0: 61 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 54 6f  action="%s(g.zTo
2ed0: 70 29 2f 65 76 65 6e 74 65 64 69 74 22 3e 3c 64  p)/eventedit"><d
2ee0: 69 76 3e 0a 20 20 6c 6f 67 69 6e 5f 69 6e 73 65  iv>.  login_inse
2ef0: 72 74 5f 63 73 72 66 5f 73 65 63 72 65 74 28 29  rt_csrf_secret()
2f00: 3b 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70  ;.  @ <input typ
2f10: 65 3d 22 68 69 64 64 65 6e 22 20 6e 61 6d 65 3d  e="hidden" name=
2f20: 22 6e 61 6d 65 22 20 76 61 6c 75 65 3d 22 25 68  "name" value="%h
2f30: 28 7a 45 76 65 6e 74 49 64 29 22 20 2f 3e 0a 20  (zEventId)" />. 
2f40: 20 40 20 3c 74 61 62 6c 65 20 62 6f 72 64 65 72   @ <table border
2f50: 3d 22 30 22 20 63 65 6c 6c 73 70 61 63 69 6e 67  ="0" cellspacing
2f60: 3d 22 31 30 22 3e 0a 0a 20 20 40 20 3c 74 72 3e  ="10">..  @ <tr>
2f70: 3c 74 64 20 61 6c 69 67 6e 3d 22 72 69 67 68 74  <td align="right
2f80: 22 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 3c  " valign="top"><
2f90: 62 3e 45 76 65 6e 74 26 6e 62 73 70 3b 54 69 6d  b>Event&nbsp;Tim
2fa0: 65 3a 3c 2f 62 3e 3c 2f 74 64 3e 0a 20 20 40 20  e:</b></td>.  @ 
2fb0: 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22  <td valign="top"
2fc0: 3e 0a 20 20 40 20 20 20 3c 69 6e 70 75 74 20 74  >.  @   <input t
2fd0: 79 70 65 3d 22 74 65 78 74 22 20 6e 61 6d 65 3d  ype="text" name=
2fe0: 22 74 22 20 73 69 7a 65 3d 22 32 35 22 20 76 61  "t" size="25" va
2ff0: 6c 75 65 3d 22 25 68 28 7a 45 54 69 6d 65 29 22  lue="%h(zETime)"
3000: 20 2f 3e 0a 20 20 40 20 3c 2f 74 64 3e 3c 2f 74   />.  @ </td></t
3010: 72 3e 0a 0a 20 20 40 20 3c 74 72 3e 3c 74 64 20  r>..  @ <tr><td 
3020: 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 20 76 61  align="right" va
3030: 6c 69 67 6e 3d 22 74 6f 70 22 3e 3c 62 3e 54 69  lign="top"><b>Ti
3040: 6d 65 6c 69 6e 65 26 6e 62 73 70 3b 43 6f 6d 6d  meline&nbsp;Comm
3050: 65 6e 74 3a 3c 2f 62 3e 3c 2f 74 64 3e 0a 20 20  ent:</b></td>.  
3060: 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f  @ <td valign="to
3070: 70 22 3e 0a 20 20 40 20 3c 74 65 78 74 61 72 65  p">.  @ <textare
3080: 61 20 6e 61 6d 65 3d 22 63 22 20 63 6c 61 73 73  a name="c" class
3090: 3d 22 65 76 65 6e 74 65 64 69 74 22 20 63 6f 6c  ="eventedit" col
30a0: 73 3d 22 38 30 22 0a 20 20 40 20 20 72 6f 77 73  s="80".  @  rows
30b0: 3d 22 33 22 20 77 72 61 70 3d 22 76 69 72 74 75  ="3" wrap="virtu
30c0: 61 6c 22 3e 25 68 28 7a 43 6f 6d 6d 65 6e 74 29  al">%h(zComment)
30d0: 3c 2f 74 65 78 74 61 72 65 61 3e 0a 20 20 40 20  </textarea>.  @ 
30e0: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 0a 20 20 40 20  </td></tr>..  @ 
30f0: 3c 74 72 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 72  <tr><td align="r
3100: 69 67 68 74 22 20 76 61 6c 69 67 6e 3d 22 74 6f  ight" valign="to
3110: 70 22 3e 3c 62 3e 42 61 63 6b 67 72 6f 75 6e 64  p"><b>Background
3120: 26 6e 62 73 70 3b 43 6f 6c 6f 72 3a 3c 2f 62 3e  &nbsp;Color:</b>
3130: 3c 2f 74 64 3e 0a 20 20 40 20 3c 74 64 20 76 61  </td>.  @ <td va
3140: 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20 72 65  lign="top">.  re
3150: 6e 64 65 72 5f 63 6f 6c 6f 72 5f 63 68 6f 6f 73  nder_color_choos
3160: 65 72 28 30 2c 20 7a 43 6c 72 2c 20 30 2c 20 22  er(0, zClr, 0, "
3170: 63 6c 72 22 2c 20 22 63 63 6c 72 22 29 3b 0a 20  clr", "cclr");. 
3180: 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 0a 20   @ </td></tr>.. 
3190: 20 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69 67 6e   @ <tr><td align
31a0: 3d 22 72 69 67 68 74 22 20 76 61 6c 69 67 6e 3d  ="right" valign=
31b0: 22 74 6f 70 22 3e 3c 62 3e 54 61 67 73 3a 3c 2f  "top"><b>Tags:</
31c0: 62 3e 3c 2f 74 64 3e 0a 20 20 40 20 3c 74 64 20  b></td>.  @ <td 
31d0: 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20  valign="top">.  
31e0: 40 20 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d  @   <input type=
31f0: 22 74 65 78 74 22 20 6e 61 6d 65 3d 22 67 22 20  "text" name="g" 
3200: 73 69 7a 65 3d 22 34 30 22 20 76 61 6c 75 65 3d  size="40" value=
3210: 22 25 68 28 7a 54 61 67 73 29 22 20 2f 3e 0a 20  "%h(zTags)" />. 
3220: 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 0a 20   @ </td></tr>.. 
3230: 20 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69 67 6e   @ <tr><td align
3240: 3d 22 72 69 67 68 74 22 20 76 61 6c 69 67 6e 3d  ="right" valign=
3250: 22 74 6f 70 22 3e 3c 62 3e 50 61 67 65 26 6e 62  "top"><b>Page&nb
3260: 73 70 3b 43 6f 6e 74 65 6e 74 3a 3c 2f 62 3e 3c  sp;Content:</b><
3270: 2f 74 64 3e 0a 20 20 40 20 3c 74 64 20 76 61 6c  /td>.  @ <td val
3280: 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20 40 20 3c  ign="top">.  @ <
3290: 74 65 78 74 61 72 65 61 20 6e 61 6d 65 3d 22 77  textarea name="w
32a0: 22 20 63 6c 61 73 73 3d 22 65 76 65 6e 74 65 64  " class="evented
32b0: 69 74 22 20 63 6f 6c 73 3d 22 38 30 22 0a 20 20  it" cols="80".  
32c0: 40 20 20 72 6f 77 73 3d 22 25 64 28 6e 29 22 20  @  rows="%d(n)" 
32d0: 77 72 61 70 3d 22 76 69 72 74 75 61 6c 22 3e 25  wrap="virtual">%
32e0: 68 28 7a 42 6f 64 79 29 3c 2f 74 65 78 74 61 72  h(zBody)</textar
32f0: 65 61 3e 0a 20 20 40 20 3c 2f 74 64 3e 3c 2f 74  ea>.  @ </td></t
3300: 72 3e 0a 0a 20 20 40 20 3c 74 72 3e 3c 74 64 20  r>..  @ <tr><td 
3310: 63 6f 6c 73 70 61 6e 3d 22 32 22 3e 0a 20 20 40  colspan="2">.  @
3320: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75   <input type="su
3330: 62 6d 69 74 22 20 6e 61 6d 65 3d 22 70 72 65 76  bmit" name="prev
3340: 69 65 77 22 20 76 61 6c 75 65 3d 22 50 72 65 76  iew" value="Prev
3350: 69 65 77 20 59 6f 75 72 20 43 68 61 6e 67 65 73  iew Your Changes
3360: 22 20 2f 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20  " />.  @ <input 
3370: 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61  type="submit" na
3380: 6d 65 3d 22 73 75 62 6d 69 74 22 20 76 61 6c 75  me="submit" valu
3390: 65 3d 22 41 70 70 6c 79 20 54 68 65 73 65 20 43  e="Apply These C
33a0: 68 61 6e 67 65 73 22 20 2f 3e 0a 20 20 40 20 3c  hanges" />.  @ <
33b0: 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d  input type="subm
33c0: 69 74 22 20 6e 61 6d 65 3d 22 63 61 6e 63 65 6c  it" name="cancel
33d0: 22 20 76 61 6c 75 65 3d 22 43 61 6e 63 65 6c 22  " value="Cancel"
33e0: 20 2f 3e 0a 20 20 40 20 3c 2f 74 64 3e 3c 2f 74   />.  @ </td></t
33f0: 72 3e 3c 2f 74 61 62 6c 65 3e 0a 20 20 40 20 3c  r></table>.  @ <
3400: 2f 64 69 76 3e 3c 2f 66 6f 72 6d 3e 0a 20 20 73  /div></form>.  s
3410: 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d  tyle_footer();.}
3420: 0a                                               .