Fossil

Hex Artifact Content
Login

Artifact 8fbe8eab122390890876343633fd567c9beff575d328af0e613c441b726f7278:


0000: 28 66 75 6e 63 74 69 6f 6e 28 46 2f 2a 74 68 65  (function(F/*the
0010: 20 66 6f 73 73 69 6c 20 6f 62 6a 65 63 74 2a 2f   fossil object*/
0020: 29 7b 0a 20 20 22 75 73 65 20 73 74 72 69 63 74  ){.  "use strict
0030: 22 3b 0a 20 20 2f 2a 2a 0a 20 20 20 20 20 43 6c  ";.  /**.     Cl
0040: 69 65 6e 74 2d 73 69 64 65 20 69 6d 70 6c 65 6d  ient-side implem
0050: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
0060: 2f 77 69 6b 69 65 64 69 74 20 61 70 70 2e 20 52  /wikiedit app. R
0070: 65 71 75 69 72 65 73 20 74 68 61 74 0a 20 20 20  equires that.   
0080: 20 20 74 68 65 20 66 6f 73 73 69 6c 20 4a 53 20    the fossil JS 
0090: 62 6f 6f 74 73 74 72 61 70 70 69 6e 67 20 69 73  bootstrapping is
00a0: 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 20 74 68   complete and th
00b0: 61 74 20 73 65 76 65 72 61 6c 20 66 6f 73 73 69  at several fossi
00c0: 6c 0a 20 20 20 20 20 4a 53 20 41 50 49 73 20 68  l.     JS APIs h
00d0: 61 76 65 20 62 65 65 6e 20 69 6e 73 74 61 6c 6c  ave been install
00e0: 65 64 3a 20 66 6f 73 73 69 6c 2e 66 65 74 63 68  ed: fossil.fetch
00f0: 2c 20 66 6f 73 73 69 6c 2e 64 6f 6d 2c 0a 20 20  , fossil.dom,.  
0100: 20 20 20 66 6f 73 73 69 6c 2e 74 61 62 73 2c 20     fossil.tabs, 
0110: 66 6f 73 73 69 6c 2e 73 74 6f 72 61 67 65 2c 20  fossil.storage, 
0120: 66 6f 73 73 69 6c 2e 63 6f 6e 66 69 72 6d 65 72  fossil.confirmer
0130: 2e 0a 0a 20 20 20 20 20 43 75 73 74 6f 6d 20 65  ...     Custom e
0140: 76 65 6e 74 73 20 77 68 69 63 68 20 63 61 6e 20  vents which can 
0150: 62 65 20 6c 69 73 74 65 6e 65 64 20 66 6f 72 20  be listened for 
0160: 76 69 61 0a 20 20 20 20 20 66 6f 73 73 69 6c 2e  via.     fossil.
0170: 70 61 67 65 2e 61 64 64 45 76 65 6e 74 4c 69 73  page.addEventLis
0180: 74 65 6e 65 72 28 29 3a 0a 0a 20 20 20 20 20 2d  tener():..     -
0190: 20 45 76 65 6e 74 20 27 77 69 6b 69 2d 70 61 67   Event 'wiki-pag
01a0: 65 2d 6c 6f 61 64 65 64 27 3a 20 70 61 73 73 65  e-loaded': passe
01b0: 73 20 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  s on information
01c0: 20 77 68 65 6e 20 69 74 0a 20 20 20 20 20 6c 6f   when it.     lo
01d0: 61 64 73 20 61 20 77 69 6b 69 20 28 77 68 65 74  ads a wiki (whet
01e0: 68 65 72 20 66 72 6f 6d 20 74 68 65 20 6e 65 74  her from the net
01f0: 77 6f 72 6b 20 6f 72 20 69 74 73 20 69 6e 74 65  work or its inte
0200: 72 6e 61 6c 20 6c 6f 63 61 6c 2d 65 64 69 74 0a  rnal local-edit.
0210: 20 20 20 20 20 63 61 63 68 65 29 2c 20 69 6e 20       cache), in 
0220: 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 20 22  the form of an "
0230: 77 69 6e 66 6f 22 20 6f 62 6a 65 63 74 3a 0a 0a  winfo" object:..
0240: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 6e 61       {.       na
0250: 6d 65 3a 20 73 74 72 69 6e 67 2c 0a 20 20 20 20  me: string,.    
0260: 20 20 20 6d 69 6d 65 74 79 70 65 3a 20 6d 69 6d     mimetype: mim
0270: 65 74 79 70 65 20 73 74 72 69 6e 67 2c 0a 20 20  etype string,.  
0280: 20 20 20 20 20 74 79 70 65 3a 20 22 6e 6f 72 6d       type: "norm
0290: 61 6c 22 20 7c 20 22 74 61 67 22 20 7c 20 22 63  al" | "tag" | "c
02a0: 68 65 63 6b 69 6e 22 20 7c 20 22 62 72 61 6e 63  heckin" | "branc
02b0: 68 22 20 7c 20 22 73 61 6e 64 62 6f 78 22 2c 0a  h" | "sandbox",.
02c0: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 3a 20         version: 
02d0: 55 55 49 44 20 73 74 72 69 6e 67 20 6f 72 20 6e  UUID string or n
02e0: 75 6c 6c 20 66 6f 72 20 61 20 73 61 6e 64 62 6f  ull for a sandbo
02f0: 78 20 70 61 67 65 2c 0a 20 20 20 20 20 20 20 70  x page,.       p
0300: 61 72 65 6e 74 3a 20 70 61 72 65 6e 74 20 55 55  arent: parent UU
0310: 49 44 20 73 74 72 69 6e 67 20 6f 72 20 6e 75 6c  ID string or nul
0320: 6c 20 69 66 20 6e 6f 20 70 61 72 65 6e 74 2c 0a  l if no parent,.
0330: 20 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 3a 20         content: 
0340: 73 74 72 69 6e 67 0a 20 20 20 20 20 7d 0a 0a 20  string.     }.. 
0350: 20 20 20 20 54 68 65 20 69 6e 74 65 72 6e 61 6c      The internal
0360: 20 64 6f 63 73 20 61 6e 64 20 63 6f 64 65 20 66   docs and code f
0370: 72 65 71 75 65 6e 74 6c 79 20 75 73 65 20 74 68  requently use th
0380: 65 20 74 65 72 6d 20 22 77 69 6e 66 6f 22 2c 20  e term "winfo", 
0390: 61 6e 64 20 73 75 63 68 0a 20 20 20 20 20 72 65  and such.     re
03a0: 66 65 72 65 6e 63 65 73 20 72 65 66 65 72 20 74  ferences refer t
03b0: 6f 20 61 6e 20 6f 62 6a 65 63 74 20 77 69 74 68  o an object with
03c0: 20 74 68 61 74 20 66 6f 72 6d 2e 0a 0a 20 20 20   that form...   
03d0: 20 20 54 68 65 20 66 6f 73 73 69 6c 2e 70 61 67    The fossil.pag
03e0: 65 2e 77 69 6b 69 43 6f 6e 74 65 6e 74 28 29 20  e.wikiContent() 
03f0: 6d 65 74 68 6f 64 20 67 65 74 73 20 6f 72 20 73  method gets or s
0400: 65 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ets the current.
0410: 20 20 20 20 20 66 69 6c 65 20 63 6f 6e 74 65 6e       file conten
0420: 74 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  t for the page..
0430: 0a 20 20 20 20 20 2d 20 45 76 65 6e 74 20 27 77  .     - Event 'w
0440: 69 6b 69 2d 73 61 76 65 64 27 3a 20 69 73 20 66  iki-saved': is f
0450: 69 72 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d  ired when a comm
0460: 69 74 20 63 6f 6d 70 6c 65 74 65 73 2c 0a 20 20  it completes,.  
0470: 20 20 20 70 61 73 73 69 6e 67 20 6f 6e 20 74 68     passing on th
0480: 65 20 73 61 6d 65 20 69 6e 66 6f 20 61 73 20 66  e same info as f
0490: 69 6c 65 65 64 69 74 2d 66 69 6c 65 2d 6c 6f 61  ileedit-file-loa
04a0: 64 65 64 2e 0a 0a 20 20 20 20 20 2d 20 45 76 65  ded...     - Eve
04b0: 6e 74 20 27 77 69 6b 69 2d 63 6f 6e 74 65 6e 74  nt 'wiki-content
04c0: 2d 72 65 70 6c 61 63 65 64 27 3a 20 77 68 65 6e  -replaced': when
04d0: 20 74 68 65 20 65 64 69 74 6f 72 27 73 20 63 6f   the editor's co
04e0: 6e 74 65 6e 74 20 69 73 0a 20 20 20 20 20 72 65  ntent is.     re
04f0: 70 6c 61 63 65 64 2c 20 61 73 20 6f 70 70 6f 73  placed, as oppos
0500: 65 64 20 74 6f 20 69 74 20 62 65 69 6e 67 20 65  ed to it being e
0510: 64 69 74 65 64 20 76 69 61 20 75 73 65 72 0a 20  dited via user. 
0520: 20 20 20 20 69 6e 74 65 72 61 63 74 69 6f 6e 2e      interaction.
0530: 20 54 68 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 68   This normally h
0540: 61 70 70 65 6e 73 20 76 69 61 20 73 65 6c 65 63  appens via selec
0550: 74 69 6e 67 20 61 20 66 69 6c 65 20 74 6f 0a 20  ting a file to. 
0560: 20 20 20 20 6c 6f 61 64 2e 20 54 68 65 20 65 76      load. The ev
0570: 65 6e 74 20 64 65 74 61 69 6c 20 69 73 20 74 68  ent detail is th
0580: 65 20 66 6f 73 73 69 6c 2e 70 61 67 65 20 6f 62  e fossil.page ob
0590: 6a 65 63 74 2c 20 6e 6f 74 20 74 68 65 20 63 75  ject, not the cu
05a0: 72 72 65 6e 74 0a 20 20 20 20 20 66 69 6c 65 20  rrent.     file 
05b0: 63 6f 6e 74 65 6e 74 2e 0a 0a 20 20 20 20 20 2d  content...     -
05c0: 20 45 76 65 6e 74 20 27 77 69 6b 69 2d 70 72 65   Event 'wiki-pre
05d0: 76 69 65 77 2d 75 70 64 61 74 65 64 27 3a 20 77  view-updated': w
05e0: 68 65 6e 20 74 68 65 20 70 72 65 76 69 65 77 20  hen the preview 
05f0: 69 73 20 72 65 66 72 65 73 68 65 64 0a 20 20 20  is refreshed.   
0600: 20 20 66 72 6f 6d 20 74 68 65 20 73 65 72 76 65    from the serve
0610: 72 2c 20 74 68 69 73 20 65 76 65 6e 74 20 70 61  r, this event pa
0620: 73 73 65 73 20 6f 6e 20 69 6e 66 6f 72 6d 61 74  sses on informat
0630: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 70 72  ion about the pr
0640: 65 76 69 65 77 0a 20 20 20 20 20 63 68 61 6e 67  eview.     chang
0650: 65 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66  e in the form of
0660: 20 61 6e 20 6f 62 6a 65 63 74 3a 0a 0a 20 20 20   an object:..   
0670: 20 20 7b 0a 20 20 20 20 20 65 6c 65 6d 65 6e 74    {.     element
0680: 3a 20 74 68 65 20 44 4f 4d 20 65 6c 65 6d 65 6e  : the DOM elemen
0690: 74 20 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73  t which contains
06a0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 70 72 65   the content pre
06b0: 76 69 65 77 2e 0a 20 20 20 20 20 6d 69 6d 65 74  view..     mimet
06c0: 79 70 65 3a 20 74 68 65 20 70 61 67 65 27 73 20  ype: the page's 
06d0: 6d 69 6d 65 74 79 70 65 2e 0a 20 20 20 20 20 7d  mimetype..     }
06e0: 0a 0a 20 20 20 20 20 48 65 72 65 27 73 20 61 6e  ..     Here's an
06f0: 20 65 78 61 6d 70 6c 65 20 77 68 69 63 68 20 63   example which c
0700: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
0710: 74 68 65 20 68 69 67 68 6c 69 67 68 74 6a 73 20  the highlightjs 
0720: 63 6f 64 65 0a 20 20 20 20 20 68 69 67 68 6c 69  code.     highli
0730: 67 68 74 65 72 20 74 6f 20 75 70 64 61 74 65 20  ghter to update 
0740: 74 68 65 20 68 69 67 68 6c 69 67 68 74 69 6e 67  the highlighting
0750: 20 77 68 65 6e 20 74 68 65 20 70 72 65 76 69 65   when the previe
0760: 77 20 69 73 0a 20 20 20 20 20 72 65 66 72 65 73  w is.     refres
0770: 68 65 64 20 69 6e 20 22 77 69 6b 69 22 20 6d 6f  hed in "wiki" mo
0780: 64 65 20 28 77 68 69 63 68 20 69 6e 63 6c 75 64  de (which includ
0790: 65 73 20 66 6f 73 73 69 6c 2d 6e 61 74 69 76 65  es fossil-native
07a0: 20 77 69 6b 69 20 61 6e 64 0a 20 20 20 20 20 6d   wiki and.     m
07b0: 61 72 6b 64 6f 77 6e 29 3a 0a 0a 20 20 20 20 20  arkdown):..     
07c0: 66 6f 73 73 69 6c 2e 70 61 67 65 2e 61 64 64 45  fossil.page.addE
07d0: 76 65 6e 74 4c 69 73 74 65 6e 65 72 28 0a 20 20  ventListener(.  
07e0: 20 20 20 20 20 27 77 69 6b 69 2d 70 72 65 76 69       'wiki-previ
07f0: 65 77 2d 75 70 64 61 74 65 64 27 2c 0a 20 20 20  ew-updated',.   
0800: 20 20 20 20 28 65 76 29 3d 3e 7b 0a 20 20 20 20      (ev)=>{.    
0810: 20 20 20 20 20 69 66 28 65 76 2e 64 65 74 61 69       if(ev.detai
0820: 6c 2e 6d 69 6d 65 74 79 70 65 21 3d 3d 27 74 65  l.mimetype!=='te
0830: 78 74 2f 70 6c 61 69 6e 27 29 7b 0a 20 20 20 20  xt/plain'){.    
0840: 20 20 20 20 20 20 20 65 76 2e 64 65 74 61 69 6c         ev.detail
0850: 2e 65 6c 65 6d 65 6e 74 2e 71 75 65 72 79 53 65  .element.querySe
0860: 6c 65 63 74 6f 72 41 6c 6c 28 0a 20 20 20 20 20  lectorAll(.     
0870: 20 20 20 20 20 20 20 20 27 63 6f 64 65 5b 63 6c          'code[cl
0880: 61 73 73 5e 3d 6c 61 6e 67 75 61 67 65 2d 5d 27  ass^=language-]'
0890: 0a 20 20 20 20 20 20 20 20 20 20 20 29 2e 66 6f  .           ).fo
08a0: 72 45 61 63 68 28 28 65 29 3d 3e 68 6c 6a 73 2e  rEach((e)=>hljs.
08b0: 68 69 67 68 6c 69 67 68 74 42 6c 6f 63 6b 28 65  highlightBlock(e
08c0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a 20  ));.         }. 
08d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 29 3b 0a        }.     );.
08e0: 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 45 20 3d    */.  const E =
08f0: 20 28 73 29 3d 3e 64 6f 63 75 6d 65 6e 74 2e 71   (s)=>document.q
0900: 75 65 72 79 53 65 6c 65 63 74 6f 72 28 73 29 2c  uerySelector(s),
0910: 0a 20 20 20 20 20 20 20 20 44 20 3d 20 46 2e 64  .        D = F.d
0920: 6f 6d 2c 0a 20 20 20 20 20 20 20 20 50 20 3d 20  om,.        P = 
0930: 46 2e 70 61 67 65 3b 0a 0a 20 20 50 2e 63 6f 6e  F.page;..  P.con
0940: 66 69 67 20 3d 20 7b 7d 3b 0a 0a 20 20 2f 2a 2a  fig = {};..  /**
0950: 0a 20 20 20 20 20 24 73 74 61 73 68 20 69 73 20  .     $stash is 
0960: 61 6e 20 69 6e 74 65 72 6e 61 6c 2d 75 73 65 2d  an internal-use-
0970: 6f 6e 6c 79 20 6f 62 6a 65 63 74 20 66 6f 72 20  only object for 
0980: 6d 61 6e 61 67 69 6e 67 20 22 73 74 61 73 68 65  managing "stashe
0990: 64 22 0a 20 20 20 20 20 6c 6f 63 61 6c 20 65 64  d".     local ed
09a0: 69 74 73 2c 20 74 6f 20 68 65 6c 70 20 61 76 6f  its, to help avo
09b0: 69 64 20 74 68 61 74 20 75 73 65 72 73 20 61 63  id that users ac
09c0: 63 69 64 65 6e 74 61 6c 6c 79 20 6c 6f 73 65 20  cidentally lose 
09d0: 63 6f 6e 74 65 6e 74 0a 20 20 20 20 20 62 79 20  content.     by 
09e0: 73 77 69 74 63 68 69 6e 67 20 74 61 62 73 20 6f  switching tabs o
09f0: 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 6e 6b  r following link
0a00: 73 20 6f 72 20 73 6f 6d 65 20 73 75 63 68 2e 20  s or some such. 
0a10: 54 68 65 20 62 61 73 69 63 0a 20 20 20 20 20 74  The basic.     t
0a20: 68 65 6f 72 79 20 6f 66 20 6f 70 65 72 61 74 69  heory of operati
0a30: 6f 6e 20 69 73 2e 2e 2e 0a 0a 20 20 20 20 20 41  on is.....     A
0a40: 6c 6c 20 22 73 74 61 73 68 65 64 22 20 73 74 61  ll "stashed" sta
0a50: 74 65 20 69 73 20 73 74 6f 72 65 64 20 75 73 69  te is stored usi
0a60: 6e 67 20 66 6f 73 73 69 6c 2e 73 74 6f 72 61 67  ng fossil.storag
0a70: 65 2e 0a 0a 20 20 20 20 20 2d 20 57 68 65 6e 20  e...     - When 
0a80: 74 68 65 20 63 75 72 72 65 6e 74 20 77 69 6b 69  the current wiki
0a90: 20 63 6f 6e 74 65 6e 74 20 69 73 20 6d 6f 64 69   content is modi
0aa0: 66 69 65 64 20 62 79 20 74 68 65 20 75 73 65 72  fied by the user
0ab0: 2c 20 74 68 65 0a 20 20 20 20 20 20 20 63 75 72  , the.       cur
0ac0: 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
0ad0: 65 20 70 61 67 65 20 69 73 20 73 74 61 73 68 65  e page is stashe
0ae0: 64 2e 0a 0a 20 20 20 20 20 2d 20 57 68 65 6e 20  d...     - When 
0af0: 73 61 76 69 6e 67 2c 20 74 68 65 20 73 74 61 73  saving, the stas
0b00: 68 65 64 20 65 6e 74 72 79 20 66 6f 72 20 74 68  hed entry for th
0b10: 65 20 70 72 65 76 69 6f 75 73 20 76 65 72 73 69  e previous versi
0b20: 6f 6e 20 69 73 0a 20 20 20 20 20 20 20 72 65 6d  on is.       rem
0b30: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  oved from the st
0b40: 61 73 68 2e 0a 0a 20 20 20 20 20 2d 20 57 68 65  ash...     - Whe
0b50: 6e 20 22 6c 6f 61 64 69 6e 67 22 2c 20 77 65 20  n "loading", we 
0b60: 75 73 65 20 61 6e 79 20 73 74 61 73 68 65 64 20  use any stashed 
0b70: 73 74 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  state for the gi
0b80: 76 65 6e 0a 20 20 20 20 20 20 20 63 68 65 63 6b  ven.       check
0b90: 69 6e 2f 66 69 6c 65 20 63 6f 6d 62 69 6e 61 74  in/file combinat
0ba0: 69 6f 6e 2e 20 57 68 65 6e 20 66 6f 72 63 69 6e  ion. When forcin
0bb0: 67 20 61 20 72 65 2d 6c 6f 61 64 20 6f 66 20 63  g a re-load of c
0bc0: 6f 6e 74 65 6e 74 2c 0a 20 20 20 20 20 20 20 61  ontent,.       a
0bd0: 6e 79 20 73 74 61 73 68 65 64 20 65 6e 74 72 79  ny stashed entry
0be0: 20 66 6f 72 20 74 68 61 74 20 63 6f 6d 62 69 6e   for that combin
0bf0: 61 74 69 6f 6e 20 69 73 20 72 65 6d 6f 76 65 64  ation is removed
0c00: 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20   from the.      
0c10: 20 73 74 61 73 68 2e 0a 0a 20 20 20 20 20 2d 20   stash...     - 
0c20: 45 76 65 72 79 20 74 69 6d 65 20 50 2e 73 74 61  Every time P.sta
0c30: 73 68 43 6f 6e 74 65 6e 74 43 68 61 6e 67 65 28  shContentChange(
0c40: 29 20 75 70 64 61 74 65 73 20 74 68 65 20 73 74  ) updates the st
0c50: 61 73 68 2c 20 69 74 20 69 73 0a 20 20 20 20 20  ash, it is.     
0c60: 20 20 70 72 75 6e 65 64 20 74 6f 20 24 73 74 61    pruned to $sta
0c70: 73 68 2e 70 72 75 6e 65 2e 64 65 66 61 75 6c 74  sh.prune.default
0c80: 4d 61 78 43 6f 75 6e 74 20 6d 6f 73 74 2d 72 65  MaxCount most-re
0c90: 63 65 6e 74 6c 79 2d 75 70 64 61 74 65 64 0a 20  cently-updated. 
0ca0: 20 20 20 20 20 20 65 6e 74 72 69 65 73 2e 0a 0a        entries...
0cb0: 20 20 20 20 20 2d 20 54 68 69 73 20 41 50 49 20       - This API 
0cc0: 6f 66 74 65 6e 20 72 65 66 65 72 73 20 74 6f 20  often refers to 
0cd0: 22 77 69 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 22  "winfo objects."
0ce0: 20 54 68 6f 73 65 20 61 72 65 20 6f 62 6a 65 63   Those are objec
0cf0: 74 73 0a 20 20 20 20 20 20 20 77 69 74 68 20 61  ts.       with a
0d00: 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 7b 70 61 67   minimum of {pag
0d10: 65 2c 6d 69 6d 65 74 79 70 65 7d 20 70 72 6f 70  e,mimetype} prop
0d20: 65 72 74 69 65 73 20 28 77 68 69 63 68 20 6d 75  erties (which mu
0d30: 73 74 20 62 65 0a 20 20 20 20 20 20 20 76 61 6c  st be.       val
0d40: 69 64 29 2c 20 61 6e 64 20 74 68 65 20 70 61 67  id), and the pag
0d50: 65 20 6e 61 6d 65 20 69 73 20 75 73 65 64 20 61  e name is used a
0d60: 73 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20  s basis for the 
0d70: 73 74 61 73 68 20 6b 65 79 73 0a 20 20 20 20 20  stash keys.     
0d80: 20 20 66 6f 72 20 61 6e 79 20 67 69 76 65 6e 20    for any given 
0d90: 70 61 67 65 2e 0a 0a 20 20 20 20 20 54 68 65 20  page...     The 
0da0: 73 74 72 75 63 74 75 72 65 20 6f 66 20 74 68 65  structure of the
0db0: 20 73 74 61 73 68 20 69 73 20 61 20 62 69 74 20   stash is a bit 
0dc0: 63 6f 6e 76 6f 6c 75 74 65 64 20 66 6f 72 20 65  convoluted for e
0dd0: 66 66 69 63 69 65 6e 63 79 27 73 0a 20 20 20 20  fficiency's.    
0de0: 20 73 61 6b 65 3a 20 77 65 20 73 74 6f 72 65 20   sake: we store 
0df0: 61 20 6d 61 70 20 6f 66 20 66 69 6c 65 20 69 6e  a map of file in
0e00: 66 6f 20 28 77 69 6e 66 6f 29 20 6f 62 6a 65 63  fo (winfo) objec
0e10: 74 73 20 73 65 70 61 72 61 74 65 6c 79 20 66 72  ts separately fr
0e20: 6f 6d 0a 20 20 20 20 20 74 68 6f 73 65 20 66 69  om.     those fi
0e30: 6c 65 73 27 20 63 6f 6e 74 65 6e 74 73 20 62 65  les' contents be
0e40: 63 61 75 73 65 20 6f 74 68 65 72 77 69 73 65 20  cause otherwise 
0e50: 77 65 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75  we would be requ
0e60: 69 72 65 64 20 74 6f 0a 20 20 20 20 20 4a 53 4f  ired to.     JSO
0e70: 4e 69 7a 65 2f 64 65 2d 4a 53 4f 4e 69 7a 65 20  Nize/de-JSONize 
0e80: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74  the file content
0e90: 20 77 68 65 6e 20 73 74 61 73 68 69 6e 67 2f 72   when stashing/r
0ea0: 65 73 74 6f 72 69 6e 67 20 69 74 2c 0a 20 20 20  estoring it,.   
0eb0: 20 20 61 6e 64 20 74 68 61 74 20 77 6f 75 6c 64    and that would
0ec0: 20 62 65 20 68 6f 72 72 69 62 6c 79 20 69 6e 65   be horribly ine
0ed0: 66 66 69 63 69 65 6e 74 20 28 6d 65 61 6e 69 6e  fficient (meanin
0ee0: 67 20 22 62 61 74 74 65 72 79 2d 63 6f 6e 73 75  g "battery-consu
0ef0: 6d 69 6e 67 22 0a 20 20 20 20 20 6f 6e 20 6d 6f  ming".     on mo
0f00: 62 69 6c 65 20 64 65 76 69 63 65 73 29 2e 0a 20  bile devices).. 
0f10: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 24 73 74 61   */.  const $sta
0f20: 73 68 20 3d 20 7b 0a 20 20 20 20 6b 65 79 73 3a  sh = {.    keys:
0f30: 20 7b 0a 20 20 20 20 20 20 69 6e 64 65 78 3a 20   {.      index: 
0f40: 46 2e 70 61 67 65 2e 6e 61 6d 65 2b 27 2f 69 6e  F.page.name+'/in
0f50: 64 65 78 27 0a 20 20 20 20 7d 2c 0a 20 20 20 20  dex'.    },.    
0f60: 2f 2a 2a 0a 20 20 20 20 20 20 20 69 6e 64 65 78  /**.       index
0f70: 3a 20 7b 0a 20 20 20 20 20 20 20 22 50 41 47 45  : {.       "PAGE
0f80: 5f 4e 41 4d 45 22 3a 20 7b 77 69 6b 69 20 70 61  _NAME": {wiki pa
0f90: 67 65 20 69 6e 66 6f 20 77 2f 6f 20 63 6f 6e 74  ge info w/o cont
0fa0: 65 6e 74 7d 0a 20 20 20 20 20 20 20 2e 2e 2e 0a  ent}.       ....
0fb0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
0fc0: 20 49 6e 20 46 2e 73 74 6f 72 61 67 65 20 77 65   In F.storage we
0fd0: 2e 2e 2e 0a 0a 20 20 20 20 20 20 20 2d 20 53 74  .....       - St
0fe0: 6f 72 65 20 74 68 69 73 2e 69 6e 64 65 78 20 75  ore this.index u
0ff0: 6e 64 65 72 20 74 68 65 20 6b 65 79 20 74 68 69  nder the key thi
1000: 73 2e 6b 65 79 73 2e 69 6e 64 65 78 2e 0a 0a 20  s.keys.index... 
1010: 20 20 20 20 20 20 2d 20 53 74 6f 72 65 20 65 61        - Store ea
1020: 63 68 20 70 61 67 65 27 73 20 63 6f 6e 74 65 6e  ch page's conten
1030: 74 20 75 6e 64 65 72 20 74 68 65 20 6b 65 79 0a  t under the key.
1040: 20 20 20 20 20 20 20 28 50 2e 6e 61 6d 65 2b 27         (P.name+'
1050: 2f 50 41 47 45 5f 4e 41 4d 45 27 29 2e 20 54 68  /PAGE_NAME'). Th
1060: 65 73 65 20 61 72 65 20 73 74 6f 72 65 64 20 73  ese are stored s
1070: 65 70 61 72 61 74 65 6c 79 20 66 72 6f 6d 20 74  eparately from t
1080: 68 65 0a 20 20 20 20 20 20 20 69 6e 64 65 78 20  he.       index 
1090: 65 6e 74 72 69 65 73 20 74 6f 20 61 76 6f 69 64  entries to avoid
10a0: 20 68 61 76 69 6e 67 20 74 6f 20 4a 53 4f 4e 69   having to JSONi
10b0: 7a 65 2f 64 65 2d 4a 53 4f 4e 69 7a 65 20 74 68  ze/de-JSONize th
10c0: 65 0a 20 20 20 20 20 20 20 63 6f 6e 74 65 6e 74  e.       content
10d0: 2e 20 54 68 65 20 61 73 73 75 6d 70 74 69 6f 6e  . The assumption
10e0: 2f 68 6f 70 65 20 69 73 20 74 68 61 74 20 74 68  /hope is that th
10f0: 65 20 62 72 6f 77 73 65 72 20 63 61 6e 20 73 74  e browser can st
1100: 6f 72 65 0a 20 20 20 20 20 20 20 74 68 6f 73 65  ore.       those
1110: 20 72 65 63 6f 72 64 73 20 22 64 69 72 65 63 74   records "direct
1120: 6c 79 2c 22 20 77 69 74 68 6f 75 74 20 61 6e 79  ly," without any
1130: 20 69 6e 74 65 72 6d 65 64 69 61 72 79 0a 20 20   intermediary.  
1140: 20 20 20 20 20 65 6e 63 6f 64 69 6e 67 2f 64 65       encoding/de
1150: 63 6f 64 69 6e 67 20 67 6f 69 6e 67 20 6f 6e 2e  coding going on.
1160: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 64 65  .    */.    inde
1170: 78 4b 65 79 3a 20 66 75 6e 63 74 69 6f 6e 28 77  xKey: function(w
1180: 69 6e 66 6f 29 7b 72 65 74 75 72 6e 20 77 69 6e  info){return win
1190: 66 6f 2e 6e 61 6d 65 7d 2c 0a 20 20 20 20 2f 2a  fo.name},.    /*
11a0: 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 6b 65  * Returns the ke
11b0: 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 6f  y for storing co
11c0: 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 67 69  ntent for the gi
11d0: 76 65 6e 20 6b 65 79 20 73 75 66 66 69 78 2c 0a  ven key suffix,.
11e0: 20 20 20 20 20 20 20 20 62 79 20 70 72 65 70 65          by prepe
11f0: 6e 64 69 6e 67 20 50 2e 6e 61 6d 65 20 74 6f 20  nding P.name to 
1200: 73 75 66 66 69 78 2e 20 2a 2f 0a 20 20 20 20 63  suffix. */.    c
1210: 6f 6e 74 65 6e 74 4b 65 79 3a 20 66 75 6e 63 74  ontentKey: funct
1220: 69 6f 6e 28 73 75 66 66 69 78 29 7b 72 65 74 75  ion(suffix){retu
1230: 72 6e 20 50 2e 6e 61 6d 65 2b 27 2f 27 2b 73 75  rn P.name+'/'+su
1240: 66 66 69 78 7d 2c 0a 20 20 20 20 2f 2a 2a 20 52  ffix},.    /** R
1250: 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64 65 78  eturns the index
1260: 20 6f 62 6a 65 63 74 2c 20 66 65 74 63 68 69 6e   object, fetchin
1270: 67 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74  g it from the st
1280: 61 73 68 20 6f 72 20 63 72 65 61 74 69 6e 67 0a  ash or creating.
1290: 20 20 20 20 20 20 20 20 69 74 20 61 6e 65 77 20          it anew 
12a0: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  on the first cal
12b0: 6c 2e 20 2a 2f 0a 20 20 20 20 67 65 74 49 6e 64  l. */.    getInd
12c0: 65 78 3a 20 66 75 6e 63 74 69 6f 6e 28 29 7b 0a  ex: function(){.
12d0: 20 20 20 20 20 20 69 66 28 21 74 68 69 73 2e 69        if(!this.i
12e0: 6e 64 65 78 29 7b 0a 20 20 20 20 20 20 20 20 74  ndex){.        t
12f0: 68 69 73 2e 69 6e 64 65 78 20 3d 20 46 2e 73 74  his.index = F.st
1300: 6f 72 61 67 65 2e 67 65 74 4a 53 4f 4e 28 0a 20  orage.getJSON(. 
1310: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6b 65           this.ke
1320: 79 73 2e 69 6e 64 65 78 2c 20 7b 7d 0a 20 20 20  ys.index, {}.   
1330: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
1340: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 69        return thi
1350: 73 2e 69 6e 64 65 78 3b 0a 20 20 20 20 7d 2c 0a  s.index;.    },.
1360: 20 20 20 20 5f 66 69 72 65 53 74 61 73 68 45 76      _fireStashEv
1370: 65 6e 74 3a 20 66 75 6e 63 74 69 6f 6e 28 29 7b  ent: function(){
1380: 0a 20 20 20 20 20 20 69 66 28 74 68 69 73 2e 5f  .      if(this._
1390: 64 69 73 61 62 6c 65 4e 65 78 74 45 76 65 6e 74  disableNextEvent
13a0: 29 20 64 65 6c 65 74 65 20 74 68 69 73 2e 5f 64  ) delete this._d
13b0: 69 73 61 62 6c 65 4e 65 78 74 45 76 65 6e 74 3b  isableNextEvent;
13c0: 0a 20 20 20 20 20 20 65 6c 73 65 20 46 2e 70 61  .      else F.pa
13d0: 67 65 2e 64 69 73 70 61 74 63 68 45 76 65 6e 74  ge.dispatchEvent
13e0: 28 27 77 69 6b 69 2d 73 74 61 73 68 2d 75 70 64  ('wiki-stash-upd
13f0: 61 74 65 64 27 2c 20 74 68 69 73 29 3b 0a 20 20  ated', this);.  
1400: 20 20 7d 2c 0a 20 20 20 20 2f 2a 2a 0a 20 20 20    },.    /**.   
1410: 20 20 20 20 52 65 74 75 72 6e 73 20 74 68 65 20      Returns the 
1420: 73 74 61 73 68 65 64 20 76 65 72 73 69 6f 6e 2c  stashed version,
1430: 20 69 66 20 61 6e 79 2c 20 66 6f 72 20 74 68 65   if any, for the
1440: 20 67 69 76 65 6e 20 77 69 6e 66 6f 20 6f 62 6a   given winfo obj
1450: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
1460: 67 65 74 57 69 6e 66 6f 3a 20 66 75 6e 63 74 69  getWinfo: functi
1470: 6f 6e 28 77 69 6e 66 6f 29 7b 0a 20 20 20 20 20  on(winfo){.     
1480: 20 63 6f 6e 73 74 20 6e 64 78 20 3d 20 74 68 69   const ndx = thi
1490: 73 2e 67 65 74 49 6e 64 65 78 28 29 3b 0a 20 20  s.getIndex();.  
14a0: 20 20 20 20 72 65 74 75 72 6e 20 6e 64 78 5b 74      return ndx[t
14b0: 68 69 73 2e 69 6e 64 65 78 4b 65 79 28 77 69 6e  his.indexKey(win
14c0: 66 6f 29 5d 3b 0a 20 20 20 20 7d 2c 0a 20 20 20  fo)];.    },.   
14d0: 20 2f 2a 2a 20 53 65 72 69 61 6c 69 7a 65 73 20   /** Serializes 
14e0: 74 68 69 73 20 6f 62 6a 65 63 74 27 73 20 69 6e  this object's in
14f0: 64 65 78 20 74 6f 20 46 2e 73 74 6f 72 61 67 65  dex to F.storage
1500: 2e 20 52 65 74 75 72 6e 73 20 74 68 69 73 2e 20  . Returns this. 
1510: 2a 2f 0a 20 20 20 20 73 74 6f 72 65 49 6e 64 65  */.    storeInde
1520: 78 3a 20 66 75 6e 63 74 69 6f 6e 28 29 7b 0a 20  x: function(){. 
1530: 20 20 20 20 20 69 66 28 74 68 69 73 2e 69 6e 64       if(this.ind
1540: 65 78 29 20 46 2e 73 74 6f 72 61 67 65 2e 73 65  ex) F.storage.se
1550: 74 4a 53 4f 4e 28 74 68 69 73 2e 6b 65 79 73 2e  tJSON(this.keys.
1560: 69 6e 64 65 78 2c 74 68 69 73 2e 69 6e 64 65 78  index,this.index
1570: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1580: 74 68 69 73 3b 0a 20 20 20 20 7d 2c 0a 20 20 20  this;.    },.   
1590: 20 2f 2a 2a 20 55 70 64 61 74 65 73 20 74 68 65   /** Updates the
15a0: 20 73 74 61 73 68 20 72 65 63 6f 72 64 20 66 6f   stash record fo
15b0: 72 20 74 68 65 20 67 69 76 65 6e 20 77 69 6e 66  r the given winf
15c0: 6f 0a 20 20 20 20 20 20 20 20 61 6e 64 20 28 6f  o.        and (o
15d0: 70 74 69 6f 6e 61 6c 6c 79 29 20 63 6f 6e 74 65  ptionally) conte
15e0: 6e 74 2e 20 49 66 20 70 61 73 73 65 64 20 31 20  nt. If passed 1 
15f0: 61 72 67 2c 20 6f 6e 6c 79 0a 20 20 20 20 20 20  arg, only.      
1600: 20 20 74 68 65 20 77 69 6e 66 6f 20 73 74 61 73    the winfo stas
1610: 68 20 69 73 20 75 70 64 61 74 65 64 2c 20 65 6c  h is updated, el
1620: 73 65 20 62 6f 74 68 20 74 68 65 20 77 69 6e 66  se both the winf
1630: 6f 0a 20 20 20 20 20 20 20 20 61 6e 64 20 69 74  o.        and it
1640: 73 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 28  s contents are (
1650: 72 65 2d 29 73 74 61 73 68 65 64 2e 20 52 65 74  re-)stashed. Ret
1660: 75 72 6e 73 20 74 68 69 73 2e 0a 20 20 20 20 2a  urns this..    *
1670: 2f 0a 20 20 20 20 75 70 64 61 74 65 57 69 6e 66  /.    updateWinf
1680: 6f 3a 20 66 75 6e 63 74 69 6f 6e 28 77 69 6e 66  o: function(winf
1690: 6f 2c 63 6f 6e 74 65 6e 74 29 7b 0a 20 20 20 20  o,content){.    
16a0: 20 20 63 6f 6e 73 74 20 6e 64 78 20 3d 20 74 68    const ndx = th
16b0: 69 73 2e 67 65 74 49 6e 64 65 78 28 29 2c 0a 20  is.getIndex(),. 
16c0: 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 20 3d             key =
16d0: 20 74 68 69 73 2e 69 6e 64 65 78 4b 65 79 28 77   this.indexKey(w
16e0: 69 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  info),.         
16f0: 20 20 20 6f 6c 64 20 3d 20 6e 64 78 5b 6b 65 79     old = ndx[key
1700: 5d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 72  ];.      const r
1710: 65 63 6f 72 64 20 3d 20 6f 6c 64 20 7c 7c 20 28  ecord = old || (
1720: 6e 64 78 5b 6b 65 79 5d 3d 7b 0a 20 20 20 20 20  ndx[key]={.     
1730: 20 20 20 6e 61 6d 65 3a 20 77 69 6e 66 6f 2e 6e     name: winfo.n
1740: 61 6d 65 0a 20 20 20 20 20 20 7d 29 3b 0a 20 20  ame.      });.  
1750: 20 20 20 20 72 65 63 6f 72 64 2e 6d 69 6d 65 74      record.mimet
1760: 79 70 65 20 3d 20 77 69 6e 66 6f 2e 6d 69 6d 65  ype = winfo.mime
1770: 74 79 70 65 3b 0a 20 20 20 20 20 20 72 65 63 6f  type;.      reco
1780: 72 64 2e 74 79 70 65 20 3d 20 77 69 6e 66 6f 2e  rd.type = winfo.
1790: 74 79 70 65 3b 0a 20 20 20 20 20 20 72 65 63 6f  type;.      reco
17a0: 72 64 2e 70 61 72 65 6e 74 20 3d 20 77 69 6e 66  rd.parent = winf
17b0: 6f 2e 70 61 72 65 6e 74 3b 0a 20 20 20 20 20 20  o.parent;.      
17c0: 72 65 63 6f 72 64 2e 76 65 72 73 69 6f 6e 20 3d  record.version =
17d0: 20 77 69 6e 66 6f 2e 76 65 72 73 69 6f 6e 3b 20   winfo.version; 
17e0: 20 20 20 20 20 0a 20 20 20 20 20 20 72 65 63 6f       .      reco
17f0: 72 64 2e 73 74 61 73 68 54 69 6d 65 20 3d 20 6e  rd.stashTime = n
1800: 65 77 20 44 61 74 65 28 29 2e 67 65 74 54 69 6d  ew Date().getTim
1810: 65 28 29 3b 0a 20 20 20 20 20 20 74 68 69 73 2e  e();.      this.
1820: 73 74 6f 72 65 49 6e 64 65 78 28 29 3b 0a 20 20  storeIndex();.  
1830: 20 20 20 20 69 66 28 61 72 67 75 6d 65 6e 74 73      if(arguments
1840: 2e 6c 65 6e 67 74 68 3e 31 29 7b 0a 20 20 20 20  .length>1){.    
1850: 20 20 20 20 46 2e 73 74 6f 72 61 67 65 2e 73 65      F.storage.se
1860: 74 28 74 68 69 73 2e 63 6f 6e 74 65 6e 74 4b 65  t(this.contentKe
1870: 79 28 6b 65 79 29 2c 20 63 6f 6e 74 65 6e 74 29  y(key), content)
1880: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1890: 74 68 69 73 2e 5f 66 69 72 65 53 74 61 73 68 45  this._fireStashE
18a0: 76 65 6e 74 28 29 3b 0a 20 20 20 20 20 20 72 65  vent();.      re
18b0: 74 75 72 6e 20 74 68 69 73 3b 0a 20 20 20 20 7d  turn this;.    }
18c0: 2c 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 20  ,.    /**.      
18d0: 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 74 61   Returns the sta
18e0: 73 68 65 64 20 63 6f 6e 74 65 6e 74 2c 20 69 66  shed content, if
18f0: 20 61 6e 79 2c 20 66 6f 72 20 74 68 65 20 67 69   any, for the gi
1900: 76 65 6e 20 77 69 6e 66 6f 0a 20 20 20 20 20 20  ven winfo.      
1910: 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 20   object..    */ 
1920: 20 20 20 20 20 20 0a 20 20 20 20 73 74 61 73 68        .    stash
1930: 65 64 43 6f 6e 74 65 6e 74 3a 20 66 75 6e 63 74  edContent: funct
1940: 69 6f 6e 28 77 69 6e 66 6f 29 7b 0a 20 20 20 20  ion(winfo){.    
1950: 20 20 72 65 74 75 72 6e 20 46 2e 73 74 6f 72 61    return F.stora
1960: 67 65 2e 67 65 74 28 74 68 69 73 2e 63 6f 6e 74  ge.get(this.cont
1970: 65 6e 74 4b 65 79 28 74 68 69 73 2e 69 6e 64 65  entKey(this.inde
1980: 78 4b 65 79 28 77 69 6e 66 6f 29 29 29 3b 0a 20  xKey(winfo)));. 
1990: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 2a 20 52 65     },.    /** Re
19a0: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 77 65  turns true if we
19b0: 20 68 61 76 65 20 73 74 61 73 68 65 64 20 63 6f   have stashed co
19c0: 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 67 69  ntent for the gi
19d0: 76 65 6e 20 77 69 6e 66 6f 0a 20 20 20 20 20 20  ven winfo.      
19e0: 20 20 72 65 63 6f 72 64 20 6f 72 20 70 61 67 65    record or page
19f0: 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 68 61   name. */.    ha
1a00: 73 53 74 61 73 68 65 64 43 6f 6e 74 65 6e 74 3a  sStashedContent:
1a10: 20 66 75 6e 63 74 69 6f 6e 28 77 69 6e 66 6f 29   function(winfo)
1a20: 7b 0a 20 20 20 20 20 20 69 66 28 27 73 74 72 69  {.      if('stri
1a30: 6e 67 27 3d 3d 3d 74 79 70 65 6f 66 20 77 69 6e  ng'===typeof win
1a40: 66 6f 29 20 77 69 6e 66 6f 20 3d 20 7b 6e 61 6d  fo) winfo = {nam
1a50: 65 3a 20 77 69 6e 66 6f 7d 3b 0a 20 20 20 20 20  e: winfo};.     
1a60: 20 72 65 74 75 72 6e 20 46 2e 73 74 6f 72 61 67   return F.storag
1a70: 65 2e 63 6f 6e 74 61 69 6e 73 28 74 68 69 73 2e  e.contains(this.
1a80: 63 6f 6e 74 65 6e 74 4b 65 79 28 74 68 69 73 2e  contentKey(this.
1a90: 69 6e 64 65 78 4b 65 79 28 77 69 6e 66 6f 29 29  indexKey(winfo))
1aa0: 29 3b 0a 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a  );.    },.    /*
1ab0: 2a 20 55 6e 73 74 61 73 68 65 73 20 74 68 65 20  * Unstashes the 
1ac0: 67 69 76 65 6e 20 77 69 6e 66 6f 20 72 65 63 6f  given winfo reco
1ad0: 72 64 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65  rd and its conte
1ae0: 6e 74 2e 0a 20 20 20 20 20 20 20 20 52 65 74 75  nt..        Retu
1af0: 72 6e 73 20 74 68 69 73 2e 20 2a 2f 0a 20 20 20  rns this. */.   
1b00: 20 75 6e 73 74 61 73 68 3a 20 66 75 6e 63 74 69   unstash: functi
1b10: 6f 6e 28 77 69 6e 66 6f 29 7b 0a 20 20 20 20 20  on(winfo){.     
1b20: 20 63 6f 6e 73 74 20 6e 64 78 20 3d 20 74 68 69   const ndx = thi
1b30: 73 2e 67 65 74 49 6e 64 65 78 28 29 2c 0a 20 20  s.getIndex(),.  
1b40: 20 20 20 20 20 20 20 20 20 20 6b 65 79 20 3d 20            key = 
1b50: 74 68 69 73 2e 69 6e 64 65 78 4b 65 79 28 77 69  this.indexKey(wi
1b60: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 64 65 6c 65  nfo);.      dele
1b70: 74 65 20 77 69 6e 66 6f 2e 73 74 61 73 68 54 69  te winfo.stashTi
1b80: 6d 65 3b 0a 20 20 20 20 20 20 64 65 6c 65 74 65  me;.      delete
1b90: 20 6e 64 78 5b 6b 65 79 5d 3b 0a 20 20 20 20 20   ndx[key];.     
1ba0: 20 46 2e 73 74 6f 72 61 67 65 2e 72 65 6d 6f 76   F.storage.remov
1bb0: 65 28 74 68 69 73 2e 63 6f 6e 74 65 6e 74 4b 65  e(this.contentKe
1bc0: 79 28 6b 65 79 29 29 3b 0a 20 20 20 20 20 20 74  y(key));.      t
1bd0: 68 69 73 2e 73 74 6f 72 65 49 6e 64 65 78 28 29  his.storeIndex()
1be0: 3b 0a 20 20 20 20 20 20 74 68 69 73 2e 5f 66 69  ;.      this._fi
1bf0: 72 65 53 74 61 73 68 45 76 65 6e 74 28 29 3b 0a  reStashEvent();.
1c00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 69        return thi
1c10: 73 3b 0a 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a  s;.    },.    /*
1c20: 2a 0a 20 20 20 20 20 20 20 43 6c 65 61 72 73 20  *.       Clears 
1c30: 61 6c 6c 20 24 73 74 61 73 68 20 65 6e 74 72 69  all $stash entri
1c40: 65 73 20 66 72 6f 6d 20 46 2e 73 74 6f 72 61 67  es from F.storag
1c50: 65 2e 20 52 65 74 75 72 6e 73 20 74 68 69 73 2e  e. Returns this.
1c60: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 63 6c 65  .     */.    cle
1c70: 61 72 3a 20 66 75 6e 63 74 69 6f 6e 28 29 7b 0a  ar: function(){.
1c80: 20 20 20 20 20 20 63 6f 6e 73 74 20 6e 64 78 20        const ndx 
1c90: 3d 20 74 68 69 73 2e 67 65 74 49 6e 64 65 78 28  = this.getIndex(
1ca0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ),.            s
1cb0: 65 6c 66 20 3d 20 74 68 69 73 3b 0a 20 20 20 20  elf = this;.    
1cc0: 20 20 6c 65 74 20 63 6f 75 6e 74 20 3d 20 30 3b    let count = 0;
1cd0: 0a 20 20 20 20 20 20 4f 62 6a 65 63 74 2e 6b 65  .      Object.ke
1ce0: 79 73 28 6e 64 78 29 2e 66 6f 72 45 61 63 68 28  ys(ndx).forEach(
1cf0: 66 75 6e 63 74 69 6f 6e 28 6b 29 7b 0a 20 20 20  function(k){.   
1d00: 20 20 20 20 20 2b 2b 63 6f 75 6e 74 3b 0a 20 20       ++count;.  
1d10: 20 20 20 20 20 20 63 6f 6e 73 74 20 65 20 3d 20        const e = 
1d20: 6e 64 78 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  ndx[k];.        
1d30: 64 65 6c 65 74 65 20 6e 64 78 5b 6b 5d 3b 0a 20  delete ndx[k];. 
1d40: 20 20 20 20 20 20 20 46 2e 73 74 6f 72 61 67 65         F.storage
1d50: 2e 72 65 6d 6f 76 65 28 73 65 6c 66 2e 63 6f 6e  .remove(self.con
1d60: 74 65 6e 74 4b 65 79 28 6b 29 29 3b 0a 20 20 20  tentKey(k));.   
1d70: 20 20 20 7d 29 3b 0a 20 20 20 20 20 20 46 2e 73     });.      F.s
1d80: 74 6f 72 61 67 65 2e 72 65 6d 6f 76 65 28 74 68  torage.remove(th
1d90: 69 73 2e 6b 65 79 73 2e 69 6e 64 65 78 29 3b 0a  is.keys.index);.
1da0: 20 20 20 20 20 20 64 65 6c 65 74 65 20 74 68 69        delete thi
1db0: 73 2e 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 69  s.index;.      i
1dc0: 66 28 63 6f 75 6e 74 29 20 74 68 69 73 2e 5f 66  f(count) this._f
1dd0: 69 72 65 53 74 61 73 68 45 76 65 6e 74 28 29 3b  ireStashEvent();
1de0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68  .      return th
1df0: 69 73 3b 0a 20 20 20 20 7d 2c 0a 20 20 20 20 2f  is;.    },.    /
1e00: 2a 2a 0a 20 20 20 20 20 20 20 52 65 6d 6f 76 65  **.       Remove
1e10: 73 20 61 6c 6c 20 62 75 74 20 74 68 65 20 6d 61  s all but the ma
1e20: 78 43 6f 75 6e 74 20 6d 6f 73 74 2d 72 65 63 65  xCount most-rece
1e30: 6e 74 6c 79 2d 75 70 64 61 74 65 64 20 73 74 61  ntly-updated sta
1e40: 73 68 0a 20 20 20 20 20 20 20 65 6e 74 72 69 65  sh.       entrie
1e50: 73 2c 20 77 68 65 72 65 20 6d 61 78 43 6f 75 6e  s, where maxCoun
1e60: 74 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74 68  t defaults to th
1e70: 69 73 2e 70 72 75 6e 65 2e 64 65 66 61 75 6c 74  is.prune.default
1e80: 4d 61 78 43 6f 75 6e 74 2e 0a 20 20 20 20 2a 2f  MaxCount..    */
1e90: 0a 20 20 20 20 70 72 75 6e 65 3a 20 66 75 6e 63  .    prune: func
1ea0: 74 69 6f 6e 20 66 28 6d 61 78 43 6f 75 6e 74 29  tion f(maxCount)
1eb0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 6e 64  {.      const nd
1ec0: 78 20 3d 20 74 68 69 73 2e 67 65 74 49 6e 64 65  x = this.getInde
1ed0: 78 28 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  x();.      const
1ee0: 20 6c 69 20 3d 20 5b 5d 3b 0a 20 20 20 20 20 20   li = [];.      
1ef0: 69 66 28 21 6d 61 78 43 6f 75 6e 74 20 7c 7c 20  if(!maxCount || 
1f00: 6d 61 78 43 6f 75 6e 74 3c 30 29 20 6d 61 78 43  maxCount<0) maxC
1f10: 6f 75 6e 74 20 3d 20 66 2e 64 65 66 61 75 6c 74  ount = f.default
1f20: 4d 61 78 43 6f 75 6e 74 3b 0a 20 20 20 20 20 20  MaxCount;.      
1f30: 4f 62 6a 65 63 74 2e 6b 65 79 73 28 6e 64 78 29  Object.keys(ndx)
1f40: 2e 66 6f 72 45 61 63 68 28 28 6b 29 3d 3e 6c 69  .forEach((k)=>li
1f50: 2e 70 75 73 68 28 6e 64 78 5b 6b 5d 29 29 3b 0a  .push(ndx[k]));.
1f60: 20 20 20 20 20 20 6c 69 2e 73 6f 72 74 28 28 6c        li.sort((l
1f70: 2c 72 29 3d 3e 6c 2e 73 74 61 73 68 54 69 6d 65  ,r)=>l.stashTime
1f80: 20 2d 20 72 2e 73 74 61 73 68 54 69 6d 65 29 3b   - r.stashTime);
1f90: 0a 20 20 20 20 20 20 6c 65 74 20 6e 20 3d 20 30  .      let n = 0
1fa0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 6c 69  ;.      while(li
1fb0: 2e 6c 65 6e 67 74 68 3e 6d 61 78 43 6f 75 6e 74  .length>maxCount
1fc0: 29 7b 0a 20 20 20 20 20 20 20 20 2b 2b 6e 3b 0a  ){.        ++n;.
1fd0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 65 20          const e 
1fe0: 3d 20 6c 69 2e 73 68 69 66 74 28 29 3b 0a 20 20  = li.shift();.  
1ff0: 20 20 20 20 20 20 74 68 69 73 2e 5f 64 69 73 61        this._disa
2000: 62 6c 65 4e 65 78 74 45 76 65 6e 74 20 3d 20 74  bleNextEvent = t
2010: 72 75 65 3b 0a 20 20 20 20 20 20 20 20 74 68 69  rue;.        thi
2020: 73 2e 75 6e 73 74 61 73 68 28 65 29 3b 0a 20 20  s.unstash(e);.  
2030: 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 77 61        console.wa
2040: 72 6e 28 22 50 72 75 6e 65 64 20 6f 6c 64 65 73  rn("Pruned oldes
2050: 74 20 6c 6f 63 61 6c 20 66 69 6c 65 20 65 64 69  t local file edi
2060: 74 20 65 6e 74 72 79 3a 22 2c 65 29 3b 0a 20 20  t entry:",e);.  
2070: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 6e      }.      if(n
2080: 29 20 74 68 69 73 2e 5f 66 69 72 65 53 74 61 73  ) this._fireStas
2090: 68 45 76 65 6e 74 28 29 3b 0a 20 20 20 20 7d 0a  hEvent();.    }.
20a0: 20 20 7d 3b 0a 20 20 24 73 74 61 73 68 2e 70 72    };.  $stash.pr
20b0: 75 6e 65 2e 64 65 66 61 75 6c 74 4d 61 78 43 6f  une.defaultMaxCo
20c0: 75 6e 74 20 3d 20 50 2e 63 6f 6e 66 69 67 2e 64  unt = P.config.d
20d0: 65 66 61 75 6c 74 4d 61 78 53 74 61 73 68 53 69  efaultMaxStashSi
20e0: 7a 65 20 7c 7c 20 31 30 3b 0a 20 20 50 2e 24 73  ze || 10;.  P.$s
20f0: 74 61 73 68 20 3d 20 24 73 74 61 73 68 20 2f 2a  tash = $stash /*
2100: 20 77 65 20 68 61 76 65 20 74 6f 20 65 78 70 6f   we have to expo
2110: 73 65 20 74 68 69 73 20 66 6f 72 20 74 68 65 20  se this for the 
2120: 6e 65 77 2d 70 61 67 65 20 63 61 73 65 20 3a 2f  new-page case :/
2130: 20 2a 2f 3b 0a 20 20 0a 20 20 2f 2a 2a 0a 20 20   */;.  .  /**.  
2140: 20 20 20 49 6e 74 65 72 6e 61 6c 20 77 6f 72 6b     Internal work
2150: 61 72 6f 75 6e 64 20 74 6f 20 73 65 6c 65 63 74  around to select
2160: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 65   the current pre
2170: 76 69 65 77 20 6d 6f 64 65 0a 20 20 20 20 20 61  view mode.     a
2180: 6e 64 20 66 69 72 65 20 61 20 63 68 61 6e 67 65  nd fire a change
2190: 20 65 76 65 6e 74 20 69 66 20 74 68 65 20 76 61   event if the va
21a0: 6c 75 65 20 61 63 74 75 61 6c 6c 79 20 63 68 61  lue actually cha
21b0: 6e 67 65 73 0a 20 20 20 20 20 6f 72 20 69 66 20  nges.     or if 
21c0: 66 6f 72 63 65 45 76 65 6e 74 20 69 73 20 74 72  forceEvent is tr
21d0: 75 74 68 79 2e 0a 20 20 2a 2f 0a 20 20 50 2e 73  uthy..  */.  P.s
21e0: 65 6c 65 63 74 4d 69 6d 65 74 79 70 65 20 3d 20  electMimetype = 
21f0: 66 75 6e 63 74 69 6f 6e 28 6d 6f 64 65 56 61 6c  function(modeVal
2200: 75 65 2c 20 66 6f 72 63 65 45 76 65 6e 74 29 7b  ue, forceEvent){
2210: 0a 20 20 20 20 63 6f 6e 73 74 20 73 20 3d 20 74  .    const s = t
2220: 68 69 73 2e 65 2e 73 65 6c 65 63 74 4d 69 6d 65  his.e.selectMime
2230: 74 79 70 65 3b 0a 20 20 20 20 69 66 28 21 6d 6f  type;.    if(!mo
2240: 64 65 56 61 6c 75 65 29 20 6d 6f 64 65 56 61 6c  deValue) modeVal
2250: 75 65 20 3d 20 73 2e 76 61 6c 75 65 3b 0a 20 20  ue = s.value;.  
2260: 20 20 65 6c 73 65 20 69 66 28 73 2e 76 61 6c 75    else if(s.valu
2270: 65 20 21 3d 20 6d 6f 64 65 56 61 6c 75 65 29 7b  e != modeValue){
2280: 0a 20 20 20 20 20 20 73 2e 76 61 6c 75 65 20 3d  .      s.value =
2290: 20 6d 6f 64 65 56 61 6c 75 65 3b 0a 20 20 20 20   modeValue;.    
22a0: 20 20 66 6f 72 63 65 45 76 65 6e 74 20 3d 20 74    forceEvent = t
22b0: 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rue;.    }.    i
22c0: 66 28 66 6f 72 63 65 45 76 65 6e 74 29 7b 0a 20  f(forceEvent){. 
22d0: 20 20 20 20 20 2f 2f 20 46 6f 72 63 65 20 55 49       // Force UI
22e0: 20 75 70 64 61 74 65 0a 20 20 20 20 20 20 73 2e   update.      s.
22f0: 64 69 73 70 61 74 63 68 45 76 65 6e 74 28 6e 65  dispatchEvent(ne
2300: 77 20 45 76 65 6e 74 28 27 63 68 61 6e 67 65 27  w Event('change'
2310: 2c 7b 74 61 72 67 65 74 3a 73 7d 29 29 3b 0a 20  ,{target:s}));. 
2320: 20 20 20 7d 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e     }.  };..  con
2330: 73 74 20 57 69 6b 69 4c 69 73 74 20 3d 20 7b 0a  st WikiList = {.
2340: 20 20 20 20 65 3a 20 7b 7d 2c 0a 20 20 20 20 2f      e: {},.    /
2350: 2a 2a 20 55 70 64 61 74 65 20 4f 50 54 49 4f 4e  ** Update OPTION
2360: 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 72 65 66   elements to ref
2370: 6c 65 63 74 20 77 68 65 74 68 65 72 20 74 68 65  lect whether the
2380: 20 70 61 67 65 20 68 61 73 0a 20 20 20 20 20 20   page has.      
2390: 20 20 6c 6f 63 61 6c 20 63 68 61 6e 67 65 73 20    local changes 
23a0: 6f 72 20 69 73 20 6e 65 77 2f 75 6e 73 61 76 65  or is new/unsave
23b0: 64 2e 20 2a 2f 0a 20 20 20 20 72 65 66 72 65 73  d. */.    refres
23c0: 68 53 74 61 73 68 4d 61 72 6b 73 3a 20 66 75 6e  hStashMarks: fun
23d0: 63 74 69 6f 6e 28 29 7b 0a 20 20 20 20 20 20 74  ction(){.      t
23e0: 68 69 73 2e 65 2e 73 65 6c 65 63 74 2e 71 75 65  his.e.select.que
23f0: 72 79 53 65 6c 65 63 74 6f 72 41 6c 6c 28 0a 20  rySelectorAll(. 
2400: 20 20 20 20 20 20 20 27 6f 70 74 69 6f 6e 27 0a         'option'.
2410: 20 20 20 20 20 20 29 2e 66 6f 72 45 61 63 68 28        ).forEach(
2420: 66 75 6e 63 74 69 6f 6e 28 6f 29 7b 0a 20 20 20  function(o){.   
2430: 20 20 20 20 20 63 6f 6e 73 74 20 73 74 61 73 68       const stash
2440: 65 64 20 3d 20 24 73 74 61 73 68 2e 67 65 74 57  ed = $stash.getW
2450: 69 6e 66 6f 28 7b 6e 61 6d 65 3a 6f 2e 76 61 6c  info({name:o.val
2460: 75 65 7d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ue});.        if
2470: 28 73 74 61 73 68 65 64 29 7b 0a 20 20 20 20 20  (stashed){.     
2480: 20 20 20 20 20 63 6f 6e 73 74 20 69 73 4e 65 77       const isNew
2490: 20 3d 20 27 73 61 6e 64 62 6f 78 27 3d 3d 3d 73   = 'sandbox'===s
24a0: 74 61 73 68 65 64 2e 74 79 70 65 20 3f 20 66 61  tashed.type ? fa
24b0: 6c 73 65 20 3a 20 21 73 74 61 73 68 65 64 2e 76  lse : !stashed.v
24c0: 65 72 73 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  ersion;.        
24d0: 20 20 44 2e 61 64 64 43 6c 61 73 73 28 6f 2c 20    D.addClass(o, 
24e0: 69 73 4e 65 77 20 3f 20 27 73 74 61 73 68 65 64  isNew ? 'stashed
24f0: 2d 6e 65 77 27 20 3a 27 73 74 61 73 68 65 64 27  -new' :'stashed'
2500: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2510: 7b 0a 20 20 20 20 20 20 20 20 20 20 44 2e 72 65  {.          D.re
2520: 6d 6f 76 65 43 6c 61 73 73 28 6f 2c 20 27 73 74  moveClass(o, 'st
2530: 61 73 68 65 64 27 2c 20 27 73 74 61 73 68 65 64  ashed', 'stashed
2540: 2d 6e 65 77 27 29 3b 0a 20 20 20 20 20 20 20 20  -new');.        
2550: 7d 0a 20 20 20 20 20 20 7d 29 3b 0a 20 20 20 20  }.      });.    
2560: 7d 2c 0a 20 20 20 20 69 6e 69 74 3a 20 66 75 6e  },.    init: fun
2570: 63 74 69 6f 6e 28 70 61 72 65 6e 74 45 6c 65 6d  ction(parentElem
2580: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73  ){.      const s
2590: 65 6c 20 3d 20 44 2e 73 65 6c 65 63 74 28 29 2c  el = D.select(),
25a0: 20 62 74 6e 20 3d 20 44 2e 62 75 74 74 6f 6e 28   btn = D.button(
25b0: 22 52 65 6c 6f 61 64 20 70 61 67 65 20 6c 69 73  "Reload page lis
25c0: 74 22 29 3b 0a 20 20 20 20 20 20 74 68 69 73 2e  t");.      this.
25d0: 65 2e 73 65 6c 65 63 74 20 3d 20 73 65 6c 3b 0a  e.select = sel;.
25e0: 20 20 20 20 20 20 44 2e 61 64 64 43 6c 61 73 73        D.addClass
25f0: 28 70 61 72 65 6e 74 45 6c 65 6d 2c 20 27 77 69  (parentElem, 'wi
2600: 6b 69 65 64 69 74 2d 70 61 67 65 2d 6c 69 73 74  kiedit-page-list
2610: 2d 77 72 61 70 70 65 72 27 29 3b 0a 20 20 20 20  -wrapper');.    
2620: 20 20 44 2e 63 6c 65 61 72 45 6c 65 6d 65 6e 74    D.clearElement
2630: 28 70 61 72 65 6e 74 45 6c 65 6d 29 3b 0a 20 20  (parentElem);.  
2640: 20 20 20 20 44 2e 61 70 70 65 6e 64 28 0a 20 20      D.append(.  
2650: 20 20 20 20 20 20 70 61 72 65 6e 74 45 6c 65 6d        parentElem
2660: 2c 20 62 74 6e 2c 0a 20 20 20 20 20 20 20 20 44  , btn,.        D
2670: 2e 61 70 70 65 6e 64 28 44 2e 73 70 61 6e 28 29  .append(D.span()
2680: 2c 20 22 53 65 6c 65 63 74 20 61 20 70 61 67 65  , "Select a page
2690: 20 74 6f 20 65 64 69 74 3a 22 29 2c 0a 20 20 20   to edit:"),.   
26a0: 20 20 20 20 20 73 65 6c 2c 0a 20 20 20 20 20 20       sel,.      
26b0: 20 20 44 2e 61 70 70 65 6e 64 28 44 2e 73 70 61    D.append(D.spa
26c0: 6e 28 29 2c 20 22 2a 20 3d 20 6c 6f 63 61 6c 20  n(), "* = local 
26d0: 65 64 69 74 73 20 65 78 69 73 74 22 29 2c 0a 20  edits exist"),. 
26e0: 20 20 20 20 20 20 20 44 2e 61 70 70 65 6e 64 28         D.append(
26f0: 44 2e 73 70 61 6e 28 29 2c 20 22 2b 20 3d 20 6e  D.span(), "+ = n
2700: 65 77 2f 75 6e 73 61 76 65 64 20 70 61 67 65 22  ew/unsaved page"
2710: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
2720: 20 44 2e 61 74 74 72 28 73 65 6c 2c 20 27 73 69   D.attr(sel, 'si
2730: 7a 65 27 2c 20 31 30 29 3b 0a 20 20 20 20 20 20  ze', 10);.      
2740: 44 2e 6f 70 74 69 6f 6e 28 44 2e 64 69 73 61 62  D.option(D.disab
2750: 6c 65 28 44 2e 63 6c 65 61 72 45 6c 65 6d 65 6e  le(D.clearElemen
2760: 74 28 73 65 6c 29 29 2c 20 22 4c 6f 61 64 69 6e  t(sel)), "Loadin
2770: 67 2e 2e 2e 22 29 3b 0a 20 20 20 20 20 20 63 6f  g...");.      co
2780: 6e 73 74 20 73 65 6c 66 20 3d 20 74 68 69 73 3b  nst self = this;
2790: 0a 20 20 20 20 20 20 62 74 6e 2e 61 64 64 45 76  .      btn.addEv
27a0: 65 6e 74 4c 69 73 74 65 6e 65 72 28 0a 20 20 20  entListener(.   
27b0: 20 20 20 20 20 27 63 6c 69 63 6b 27 2c 0a 20 20       'click',.  
27c0: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 63        function c
27d0: 6c 69 63 6b 28 29 7b 0a 20 20 20 20 20 20 20 20  lick(){.        
27e0: 20 20 69 66 28 21 63 6c 69 63 6b 2e 73 6f 72 74    if(!click.sort
27f0: 69 63 61 73 65 29 7b 0a 20 20 20 20 20 20 20 20  icase){.        
2800: 20 20 20 20 63 6c 69 63 6b 2e 73 6f 72 74 69 63      click.sortic
2810: 61 73 65 20 3d 20 66 75 6e 63 74 69 6f 6e 28 6c  ase = function(l
2820: 2c 72 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ,r){.           
2830: 20 20 20 6c 20 3d 20 6c 2e 74 6f 4c 6f 77 65 72     l = l.toLower
2840: 43 61 73 65 28 29 3b 0a 20 20 20 20 20 20 20 20  Case();.        
2850: 20 20 20 20 20 20 72 20 3d 20 72 2e 74 6f 4c 6f        r = r.toLo
2860: 77 65 72 43 61 73 65 28 29 3b 0a 20 20 20 20 20  werCase();.     
2870: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2880: 6c 3c 3d 72 20 3f 20 2d 31 20 3a 20 31 3b 0a 20  l<=r ? -1 : 1;. 
2890: 20 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 20 20             };.  
28a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28b0: 20 20 20 20 46 2e 66 65 74 63 68 28 27 77 69 6b      F.fetch('wik
28c0: 69 61 6a 61 78 2f 6c 69 73 74 27 2c 7b 0a 20 20  iajax/list',{.  
28d0: 20 20 20 20 20 20 20 20 20 20 72 65 73 70 6f 6e            respon
28e0: 73 65 54 79 70 65 3a 20 27 6a 73 6f 6e 27 2c 0a  seType: 'json',.
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 6c 6f              onlo
2900: 61 64 3a 20 66 75 6e 63 74 69 6f 6e 28 6c 69 73  ad: function(lis
2910: 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t){.            
2920: 20 20 2f 2a 20 4a 75 6d 70 20 74 68 72 6f 75 67    /* Jump throug
2930: 68 20 73 6f 6d 65 20 68 6f 6f 70 73 20 74 6f 20  h some hoops to 
2940: 69 6e 74 65 67 72 61 74 65 20 6e 65 77 2f 75 6e  integrate new/un
2950: 73 61 76 65 64 0a 20 20 20 20 20 20 20 20 20 20  saved.          
2960: 20 20 20 20 20 20 20 70 61 67 65 73 20 69 6e 74         pages int
2970: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78  o the list of ex
2980: 69 73 74 69 6e 67 20 70 61 67 65 73 2e 2e 2e 20  isting pages... 
2990: 57 65 20 75 73 65 20 61 20 6d 61 70 0a 20 20 20  We use a map.   
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
29b0: 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 72 79   an intermediary
29c0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 69 6c   in order to fil
29d0: 74 65 72 20 6f 75 74 20 61 6e 79 20 6c 6f 63 61  ter out any loca
29e0: 6c 2d 73 74 61 73 68 0a 20 20 20 20 20 20 20 20  l-stash.        
29f0: 20 20 20 20 20 20 20 20 20 64 75 70 65 73 20 66           dupes f
2a00: 72 6f 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20  rom server-side 
2a10: 63 6f 70 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20  copies. */.     
2a20: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 6d           const m
2a30: 61 70 20 3d 20 7b 7d 2c 20 6e 64 78 20 3d 20 24  ap = {}, ndx = $
2a40: 73 74 61 73 68 2e 67 65 74 49 6e 64 65 78 28 29  stash.getIndex()
2a50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a60: 44 2e 63 6c 65 61 72 45 6c 65 6d 65 6e 74 28 73  D.clearElement(s
2a70: 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  el);.           
2a80: 20 20 20 6c 69 73 74 2e 66 6f 72 45 61 63 68 28     list.forEach(
2a90: 28 6e 61 6d 65 29 3d 3e 6d 61 70 5b 6e 61 6d 65  (name)=>map[name
2aa0: 5d 20 3d 20 74 72 75 65 29 3b 0a 20 20 20 20 20  ] = true);.     
2ab0: 20 20 20 20 20 20 20 20 20 4f 62 6a 65 63 74 2e           Object.
2ac0: 6b 65 79 73 28 6e 64 78 29 2e 66 6f 72 45 61 63  keys(ndx).forEac
2ad0: 68 28 66 75 6e 63 74 69 6f 6e 28 6b 65 79 29 7b  h(function(key){
2ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2af0: 20 63 6f 6e 73 74 20 77 69 6e 66 6f 20 3d 20 6e   const winfo = n
2b00: 64 78 5b 6b 65 79 5d 3b 0a 20 20 20 20 20 20 20  dx[key];.       
2b10: 20 20 20 20 20 20 20 20 20 69 66 28 21 77 69 6e           if(!win
2b20: 66 6f 2e 76 65 72 73 69 6f 6e 2f 2a 6e 65 77 20  fo.version/*new 
2b30: 70 61 67 65 2a 2f 29 20 6d 61 70 5b 77 69 6e 66  page*/) map[winf
2b40: 6f 2e 6e 61 6d 65 5d 20 3d 20 74 72 75 65 3b 0a  o.name] = true;.
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 29                })
2b60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2b70: 4f 62 6a 65 63 74 2e 6b 65 79 73 28 6d 61 70 29  Object.keys(map)
2b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b90: 20 2e 73 6f 72 74 28 63 6c 69 63 6b 2e 73 6f 72   .sort(click.sor
2ba0: 74 69 63 61 73 65 29 0a 20 20 20 20 20 20 20 20  ticase).        
2bb0: 20 20 20 20 20 20 20 20 2e 66 6f 72 45 61 63 68          .forEach
2bc0: 28 28 6e 61 6d 65 29 3d 3e 44 2e 6f 70 74 69 6f  ((name)=>D.optio
2bd0: 6e 28 73 65 6c 2c 20 6e 61 6d 65 29 29 3b 0a 20  n(sel, name));. 
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 2e 65               D.e
2bf0: 6e 61 62 6c 65 28 73 65 6c 29 3b 0a 20 20 20 20  nable(sel);.    
2c00: 20 20 20 20 20 20 20 20 20 20 69 66 28 50 2e 77            if(P.w
2c10: 69 6e 66 6f 29 20 73 65 6c 2e 76 61 6c 75 65 20  info) sel.value 
2c20: 3d 20 50 2e 77 69 6e 66 6f 2e 6e 61 6d 65 3b 0a  = P.winfo.name;.
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
2c40: 6c 66 2e 72 65 66 72 65 73 68 53 74 61 73 68 4d  lf.refreshStashM
2c50: 61 72 6b 73 28 29 3b 0a 20 20 20 20 20 20 20 20  arks();.        
2c60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c70: 7d 29 3b 0a 20 20 20 20 20 20 20 20 7d 2c 0a 20  });.        },. 
2c80: 20 20 20 20 20 20 20 66 61 6c 73 65 0a 20 20 20         false.   
2c90: 20 20 20 29 3b 0a 20 20 20 20 20 20 62 74 6e 2e     );.      btn.
2ca0: 63 6c 69 63 6b 28 29 3b 0a 20 20 20 20 20 20 73  click();.      s
2cb0: 65 6c 2e 61 64 64 45 76 65 6e 74 4c 69 73 74 65  el.addEventListe
2cc0: 6e 65 72 28 0a 20 20 20 20 20 20 20 20 27 63 68  ner(.        'ch
2cd0: 61 6e 67 65 27 2c 0a 20 20 20 20 20 20 20 20 28  ange',.        (
2ce0: 65 29 3d 3e 50 2e 6c 6f 61 64 50 61 67 65 28 65  e)=>P.loadPage(e
2cf0: 2e 74 61 72 67 65 74 2e 76 61 6c 75 65 29 2c 0a  .target.value),.
2d00: 20 20 20 20 20 20 20 20 66 61 6c 73 65 0a 20 20          false.  
2d10: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 46 2e 70      );.      F.p
2d20: 61 67 65 2e 61 64 64 45 76 65 6e 74 4c 69 73 74  age.addEventList
2d30: 65 6e 65 72 28 0a 20 20 20 20 20 20 20 20 27 77  ener(.        'w
2d40: 69 6b 69 2d 73 74 61 73 68 2d 75 70 64 61 74 65  iki-stash-update
2d50: 64 27 2c 0a 20 20 20 20 20 20 20 20 28 29 3d 3e  d',.        ()=>
2d60: 74 68 69 73 2e 72 65 66 72 65 73 68 53 74 61 73  this.refreshStas
2d70: 68 4d 61 72 6b 73 28 29 2c 0a 20 20 20 20 20 20  hMarks(),.      
2d80: 20 20 66 61 6c 73 65 0a 20 20 20 20 20 20 29 3b    false.      );
2d90: 0a 20 20 20 20 7d 0a 20 20 7d 3b 0a 0a 20 20 2f  .    }.  };..  /
2da0: 2a 2a 0a 20 20 20 20 20 4b 65 65 70 20 74 72 61  **.     Keep tra
2db0: 63 6b 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20 69  ck of how many i
2dc0: 6e 2d 66 6c 69 67 68 74 20 41 4a 41 58 20 72 65  n-flight AJAX re
2dd0: 71 75 65 73 74 73 20 74 68 65 72 65 20 61 72 65  quests there are
2de0: 20 73 6f 20 77 65 0a 20 20 20 20 20 63 61 6e 20   so we.     can 
2df0: 64 69 73 61 62 6c 65 20 69 6e 70 75 74 20 65 6c  disable input el
2e00: 65 6d 65 6e 74 73 20 77 68 69 6c 65 20 61 6e 79  ements while any
2e10: 20 61 72 65 20 70 65 6e 64 69 6e 67 2e 20 46 6f   are pending. Fo
2e20: 72 0a 20 20 20 20 20 73 69 6d 70 6c 69 63 69 74  r.     simplicit
2e30: 79 27 73 20 73 61 6b 65 20 77 65 20 73 69 6d 70  y's sake we simp
2e40: 6c 79 20 64 69 73 61 62 6c 65 20 41 4c 4c 20 4f  ly disable ALL O
2e50: 46 20 49 54 20 77 68 69 6c 65 20 61 6e 79 20 41  F IT while any A
2e60: 4a 41 58 20 69 73 0a 20 20 20 20 20 70 65 6e 64  JAX is.     pend
2e70: 69 6e 67 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ing, rather than
2e80: 20 64 69 73 61 62 6c 69 6e 67 20 6f 70 65 72 61   disabling opera
2e90: 74 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 55 49  tion-specific UI
2ea0: 20 65 6c 65 6d 65 6e 74 73 2c 0a 20 20 20 20 20   elements,.     
2eb0: 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 61  which would be a
2ec0: 20 68 75 67 65 20 6d 61 69 6e 74 65 6e 61 6e 63   huge maintenanc
2ed0: 65 20 68 61 73 73 6c 65 2e 0a 0a 20 20 20 20 20  e hassle...     
2ee0: 4e 6f 74 69 6e 67 2c 20 68 6f 77 65 76 65 72 2c  Noting, however,
2ef0: 20 74 68 61 74 20 74 68 69 73 20 67 6c 6f 62 61   that this globa
2f00: 6c 20 6f 6e 2f 6f 66 66 20 69 73 20 6e 6f 74 20  l on/off is not 
2f10: 2a 71 75 69 74 65 2a 0a 20 20 20 20 20 70 65 64  *quite*.     ped
2f20: 61 6e 74 69 63 61 6c 6c 79 20 63 6f 72 72 65 63  antically correc
2f30: 74 2e 20 50 65 64 61 6e 74 69 63 61 6c 6c 79 20  t. Pedantically 
2f40: 73 70 65 61 6b 69 6e 67 2e 20 49 66 20 61 6e 20  speaking. If an 
2f50: 65 6c 65 6d 65 6e 74 20 69 73 0a 20 20 20 20 20  element is.     
2f60: 64 69 73 61 62 6c 65 64 20 62 65 66 6f 72 65 20  disabled before 
2f70: 61 6e 20 58 48 52 20 73 74 61 72 74 73 2c 20 74  an XHR starts, t
2f80: 68 69 73 20 63 6f 64 65 20 22 73 68 6f 75 6c 64  his code "should
2f90: 22 20 6e 6f 74 69 63 65 20 74 68 61 74 20 61 6e  " notice that an
2fa0: 64 0a 20 20 20 20 20 6e 6f 74 20 69 6e 63 6c 75  d.     not inclu
2fb0: 64 65 20 69 74 20 69 6e 20 74 68 65 20 74 6f 2d  de it in the to-
2fc0: 72 65 2d 65 6e 61 62 6c 65 20 6c 69 73 74 2e 20  re-enable list. 
2fd0: 54 68 61 74 20 77 6f 75 6c 64 20 62 65 20 61 6e  That would be an
2fe0: 6e 6f 79 69 6e 67 0a 20 20 20 20 20 74 6f 20 64  noying.     to d
2ff0: 6f 2c 20 61 6e 64 20 62 65 63 6f 6d 65 73 20 69  o, and becomes i
3000: 6d 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20  mpossible to do 
3010: 70 72 6f 70 65 72 6c 79 20 6f 6e 63 65 20 6d 75  properly once mu
3020: 6c 74 69 70 6c 65 20 58 48 52 73 0a 20 20 20 20  ltiple XHRs.    
3030: 20 61 72 65 20 69 6e 20 74 72 61 6e 73 69 74 20   are in transit 
3040: 61 6e 64 20 61 6e 20 65 6c 65 6d 65 6e 74 20 69  and an element i
3050: 73 20 64 69 73 61 62 6c 65 64 20 73 65 70 72 61  s disabled sepra
3060: 74 65 6c 79 20 62 65 74 77 65 65 6e 20 74 77 6f  tely between two
3070: 0a 20 20 20 20 20 6f 66 20 74 68 6f 73 65 20 69  .     of those i
3080: 6e 2d 74 72 61 6e 73 69 74 20 72 65 71 75 65 73  n-transit reques
3090: 74 73 20 28 74 68 61 74 20 77 6f 75 6c 64 20 62  ts (that would b
30a0: 65 20 61 6e 20 75 6e 6c 69 6b 65 6c 79 2c 20 62  e an unlikely, b
30b0: 75 74 0a 20 20 20 20 20 70 6f 73 73 69 62 6c 65  ut.     possible
30c0: 2c 20 63 6f 72 6e 65 72 20 63 61 73 65 29 2e 0a  , corner case)..
30d0: 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 61 6a 61    */.  const aja
30e0: 78 53 74 61 74 65 20 3d 20 7b 0a 20 20 20 20 63  xState = {.    c
30f0: 6f 75 6e 74 3a 20 30 20 2f 2a 20 69 6e 2d 66 6c  ount: 0 /* in-fl
3100: 69 67 68 74 20 46 2e 66 65 74 63 68 28 29 20 72  ight F.fetch() r
3110: 65 71 75 65 73 74 73 20 2a 2f 2c 0a 20 20 20 20  equests */,.    
3120: 74 6f 44 69 73 61 62 6c 65 3a 20 75 6e 64 65 66  toDisable: undef
3130: 69 6e 65 64 20 2f 2a 20 65 6c 65 6d 65 6e 74 73  ined /* elements
3140: 20 74 6f 20 64 69 73 61 62 6c 65 20 64 75 72 69   to disable duri
3150: 6e 67 20 61 6a 61 78 20 61 63 74 69 76 69 74 79  ng ajax activity
3160: 20 2a 2f 0a 20 20 7d 3b 0a 20 20 46 2e 66 65 74   */.  };.  F.fet
3170: 63 68 2e 62 65 66 6f 72 65 73 65 6e 64 20 3d 20  ch.beforesend = 
3180: 66 75 6e 63 74 69 6f 6e 20 66 28 29 7b 0a 20 20  function f(){.  
3190: 20 20 69 66 28 21 61 6a 61 78 53 74 61 74 65 2e    if(!ajaxState.
31a0: 74 6f 44 69 73 61 62 6c 65 29 7b 0a 20 20 20 20  toDisable){.    
31b0: 20 20 61 6a 61 78 53 74 61 74 65 2e 74 6f 44 69    ajaxState.toDi
31c0: 73 61 62 6c 65 20 3d 20 64 6f 63 75 6d 65 6e 74  sable = document
31d0: 2e 71 75 65 72 79 53 65 6c 65 63 74 6f 72 41 6c  .querySelectorAl
31e0: 6c 28 0a 20 20 20 20 20 20 20 20 5b 27 62 75 74  l(.        ['but
31f0: 74 6f 6e 3a 6e 6f 74 28 5b 64 69 73 61 62 6c 65  ton:not([disable
3200: 64 5d 29 27 2c 0a 20 20 20 20 20 20 20 20 20 27  d])',.         '
3210: 69 6e 70 75 74 3a 6e 6f 74 28 5b 64 69 73 61 62  input:not([disab
3220: 6c 65 64 5d 29 27 2c 0a 20 20 20 20 20 20 20 20  led])',.        
3230: 20 27 73 65 6c 65 63 74 3a 6e 6f 74 28 5b 64 69   'select:not([di
3240: 73 61 62 6c 65 64 5d 29 27 2c 0a 20 20 20 20 20  sabled])',.     
3250: 20 20 20 20 27 74 65 78 74 61 72 65 61 3a 6e 6f      'textarea:no
3260: 74 28 5b 64 69 73 61 62 6c 65 64 5d 29 27 0a 20  t([disabled])'. 
3270: 20 20 20 20 20 20 20 5d 2e 6a 6f 69 6e 28 27 2c         ].join(',
3280: 27 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ').      );.    
3290: 7d 0a 20 20 20 20 69 66 28 31 3d 3d 3d 2b 2b 61  }.    if(1===++a
32a0: 6a 61 78 53 74 61 74 65 2e 63 6f 75 6e 74 29 7b  jaxState.count){
32b0: 0a 20 20 20 20 20 20 44 2e 61 64 64 43 6c 61 73  .      D.addClas
32c0: 73 28 64 6f 63 75 6d 65 6e 74 2e 62 6f 64 79 2c  s(document.body,
32d0: 20 27 77 61 69 74 69 6e 67 27 29 3b 0a 20 20 20   'waiting');.   
32e0: 20 20 20 44 2e 64 69 73 61 62 6c 65 28 61 6a 61     D.disable(aja
32f0: 78 53 74 61 74 65 2e 74 6f 44 69 73 61 62 6c 65  xState.toDisable
3300: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 3b 0a 20 20  );.    }.  };.  
3310: 46 2e 66 65 74 63 68 2e 61 66 74 65 72 73 65 6e  F.fetch.aftersen
3320: 64 20 3d 20 66 75 6e 63 74 69 6f 6e 28 29 7b 0a  d = function(){.
3330: 20 20 20 20 69 66 28 30 3d 3d 3d 2d 2d 61 6a 61      if(0===--aja
3340: 78 53 74 61 74 65 2e 63 6f 75 6e 74 29 7b 0a 20  xState.count){. 
3350: 20 20 20 20 20 44 2e 72 65 6d 6f 76 65 43 6c 61       D.removeCla
3360: 73 73 28 64 6f 63 75 6d 65 6e 74 2e 62 6f 64 79  ss(document.body
3370: 2c 20 27 77 61 69 74 69 6e 67 27 29 3b 0a 20 20  , 'waiting');.  
3380: 20 20 20 20 44 2e 65 6e 61 62 6c 65 28 61 6a 61      D.enable(aja
3390: 78 53 74 61 74 65 2e 74 6f 44 69 73 61 62 6c 65  xState.toDisable
33a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 3b 0a 0a 20  );.    }.  };.. 
33b0: 20 46 2e 6f 6e 50 61 67 65 4c 6f 61 64 28 66 75   F.onPageLoad(fu
33c0: 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 64  nction() {.    d
33d0: 6f 63 75 6d 65 6e 74 2e 62 6f 64 79 2e 63 6c 61  ocument.body.cla
33e0: 73 73 4c 69 73 74 2e 61 64 64 28 27 77 69 6b 69  ssList.add('wiki
33f0: 65 64 69 74 27 29 3b 0a 20 20 20 20 50 2e 62 61  edit');.    P.ba
3400: 73 65 20 3d 20 7b 74 61 67 3a 20 45 28 27 62 61  se = {tag: E('ba
3410: 73 65 27 29 2c 20 77 69 6b 69 55 72 6c 3a 20 46  se'), wikiUrl: F
3420: 2e 72 65 70 6f 55 72 6c 28 27 77 69 6b 69 27 29  .repoUrl('wiki')
3430: 7d 3b 0a 20 20 20 20 50 2e 62 61 73 65 2e 6f 72  };.    P.base.or
3440: 69 67 69 6e 61 6c 48 72 65 66 20 3d 20 50 2e 62  iginalHref = P.b
3450: 61 73 65 2e 74 61 67 2e 68 72 65 66 3b 0a 20 20  ase.tag.href;.  
3460: 20 20 50 2e 74 61 62 73 20 3d 20 6e 65 77 20 66    P.tabs = new f
3470: 6f 73 73 69 6c 2e 54 61 62 4d 61 6e 61 67 65 72  ossil.TabManager
3480: 28 27 23 77 69 6b 69 65 64 69 74 2d 74 61 62 73  ('#wikiedit-tabs
3490: 27 29 3b 0a 20 20 20 20 50 2e 65 20 3d 20 7b 20  ');.    P.e = { 
34a0: 2f 2a 20 76 61 72 69 6f 75 73 20 44 4f 4d 20 65  /* various DOM e
34b0: 6c 65 6d 65 6e 74 73 20 77 65 20 77 6f 72 6b 20  lements we work 
34c0: 77 69 74 68 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20  with... */.     
34d0: 20 74 61 45 64 69 74 6f 72 3a 20 45 28 27 23 77   taEditor: E('#w
34e0: 69 6b 69 65 64 69 74 2d 63 6f 6e 74 65 6e 74 2d  ikiedit-content-
34f0: 65 64 69 74 6f 72 27 29 2c 0a 2f 2f 20 20 20 20  editor'),.//    
3500: 20 20 62 74 6e 43 6f 6d 6d 69 74 3a 20 45 28 22    btnCommit: E("
3510: 23 77 69 6b 69 65 64 69 74 2d 62 74 6e 2d 63 6f  #wikiedit-btn-co
3520: 6d 6d 69 74 22 29 2c 0a 20 20 20 20 20 20 62 74  mmit"),.      bt
3530: 6e 52 65 6c 6f 61 64 3a 20 45 28 22 23 77 69 6b  nReload: E("#wik
3540: 69 65 64 69 74 2d 74 61 62 2d 63 6f 6e 74 65 6e  iedit-tab-conten
3550: 74 20 62 75 74 74 6f 6e 2e 77 69 6b 69 65 64 69  t button.wikiedi
3560: 74 2d 63 6f 6e 74 65 6e 74 2d 72 65 6c 6f 61 64  t-content-reload
3570: 22 29 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  "),.      select
3580: 4d 69 6d 65 74 79 70 65 3a 20 45 28 27 73 65 6c  Mimetype: E('sel
3590: 65 63 74 5b 6e 61 6d 65 3d 6d 69 6d 65 74 79 70  ect[name=mimetyp
35a0: 65 5d 27 29 2c 0a 20 20 20 20 20 20 73 65 6c 65  e]'),.      sele
35b0: 63 74 46 6f 6e 74 53 69 7a 65 57 72 61 70 3a 20  ctFontSizeWrap: 
35c0: 45 28 27 23 73 65 6c 65 63 74 2d 66 6f 6e 74 2d  E('#select-font-
35d0: 73 69 7a 65 27 29 2c 0a 2f 2f 20 20 20 20 20 20  size'),.//      
35e0: 73 65 6c 65 63 74 44 69 66 66 57 53 3a 20 20 45  selectDiffWS:  E
35f0: 28 27 73 65 6c 65 63 74 5b 6e 61 6d 65 3d 64 69  ('select[name=di
3600: 66 66 5f 77 73 5d 27 29 2c 0a 20 20 20 20 20 20  ff_ws]'),.      
3610: 63 62 41 75 74 6f 50 72 65 76 69 65 77 3a 20 45  cbAutoPreview: E
3620: 28 27 23 63 62 2d 70 72 65 76 69 65 77 2d 61 75  ('#cb-preview-au
3630: 74 6f 75 70 64 61 74 65 20 3e 20 69 6e 70 75 74  toupdate > input
3640: 5b 74 79 70 65 3d 63 68 65 63 6b 62 6f 78 5d 27  [type=checkbox]'
3650: 29 2c 0a 20 20 20 20 20 20 70 72 65 76 69 65 77  ),.      preview
3660: 54 61 72 67 65 74 3a 20 45 28 27 23 77 69 6b 69  Target: E('#wiki
3670: 65 64 69 74 2d 74 61 62 2d 70 72 65 76 69 65 77  edit-tab-preview
3680: 2d 77 72 61 70 70 65 72 27 29 2c 0a 20 20 20 20  -wrapper'),.    
3690: 20 20 64 69 66 66 54 61 72 67 65 74 3a 20 45 28    diffTarget: E(
36a0: 27 23 77 69 6b 69 65 64 69 74 2d 74 61 62 2d 64  '#wikiedit-tab-d
36b0: 69 66 66 2d 77 72 61 70 70 65 72 27 29 2c 0a 20  iff-wrapper'),. 
36c0: 20 20 20 20 20 74 61 62 73 3a 7b 0a 20 20 20 20       tabs:{.    
36d0: 20 20 20 20 70 61 67 65 4c 69 73 74 3a 20 45 28      pageList: E(
36e0: 27 23 77 69 6b 69 65 64 69 74 2d 74 61 62 2d 70  '#wikiedit-tab-p
36f0: 61 67 65 73 27 29 2c 0a 20 20 20 20 20 20 20 20  ages'),.        
3700: 63 6f 6e 74 65 6e 74 3a 20 45 28 27 23 77 69 6b  content: E('#wik
3710: 69 65 64 69 74 2d 74 61 62 2d 63 6f 6e 74 65 6e  iedit-tab-conten
3720: 74 27 29 2c 0a 20 20 20 20 20 20 20 20 70 72 65  t'),.        pre
3730: 76 69 65 77 3a 20 45 28 27 23 77 69 6b 69 65 64  view: E('#wikied
3740: 69 74 2d 74 61 62 2d 70 72 65 76 69 65 77 27 29  it-tab-preview')
3750: 2c 0a 20 20 20 20 20 20 20 20 64 69 66 66 3a 20  ,.        diff: 
3760: 45 28 27 23 77 69 6b 69 65 64 69 74 2d 74 61 62  E('#wikiedit-tab
3770: 2d 64 69 66 66 27 29 0a 20 20 20 20 20 20 20 20  -diff').        
3780: 2f 2f 63 6f 6d 6d 69 74 3a 20 45 28 27 23 77 69  //commit: E('#wi
3790: 6b 69 65 64 69 74 2d 74 61 62 2d 63 6f 6d 6d 69  kiedit-tab-commi
37a0: 74 27 29 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t').      }.    
37b0: 7d 3b 0a 0a 20 20 20 20 50 2e 74 61 62 73 2e 65  };..    P.tabs.e
37c0: 2e 63 6f 6e 74 61 69 6e 65 72 2e 69 6e 73 65 72  .container.inser
37d0: 74 42 65 66 6f 72 65 28 0a 20 20 20 20 20 20 2f  tBefore(.      /
37e0: 2a 20 4d 6f 76 65 20 74 68 65 20 73 74 61 74 75  * Move the statu
37f0: 73 20 62 61 72 20 62 65 74 77 65 65 6e 20 74 68  s bar between th
3800: 65 20 74 61 62 20 62 75 74 74 6f 6e 73 20 61 6e  e tab buttons an
3810: 64 0a 20 20 20 20 20 20 20 20 20 74 61 62 20 70  d.         tab p
3820: 61 6e 65 6c 73 2e 20 53 65 65 6d 73 20 74 6f 20  anels. Seems to 
3830: 62 65 20 74 68 65 20 62 65 73 74 20 66 69 74 20  be the best fit 
3840: 69 6e 20 74 65 72 6d 73 20 6f 66 0a 20 20 20 20  in terms of.    
3850: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 61 6c 69       functionali
3860: 74 79 20 61 6e 64 20 76 69 73 69 62 69 6c 69 74  ty and visibilit
3870: 79 2e 20 2a 2f 0a 20 20 20 20 20 20 45 28 27 23  y. */.      E('#
3880: 66 6f 73 73 69 6c 2d 73 74 61 74 75 73 2d 62 61  fossil-status-ba
3890: 72 27 29 2c 20 50 2e 74 61 62 73 2e 65 2e 74 61  r'), P.tabs.e.ta
38a0: 62 73 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 50  bs.    );..    P
38b0: 2e 74 61 62 73 2e 61 64 64 45 76 65 6e 74 4c 69  .tabs.addEventLi
38c0: 73 74 65 6e 65 72 28 0a 20 20 20 20 20 20 2f 2a  stener(.      /*
38d0: 20 53 65 74 20 75 70 20 61 75 74 6f 2d 72 65 66   Set up auto-ref
38e0: 72 65 73 68 20 6f 66 20 74 68 65 20 70 72 65 76  resh of the prev
38f0: 69 65 77 20 74 61 62 2e 2e 2e 20 2a 2f 0a 20 20  iew tab... */.  
3900: 20 20 20 20 27 62 65 66 6f 72 65 2d 73 77 69 74      'before-swit
3910: 63 68 2d 74 6f 27 2c 20 66 75 6e 63 74 69 6f 6e  ch-to', function
3920: 28 65 76 29 7b 0a 20 20 20 20 20 20 20 20 69 66  (ev){.        if
3930: 28 65 76 2e 64 65 74 61 69 6c 3d 3d 3d 50 2e 65  (ev.detail===P.e
3940: 2e 74 61 62 73 2e 70 72 65 76 69 65 77 29 7b 0a  .tabs.preview){.
3950: 20 20 20 20 20 20 20 20 20 20 50 2e 62 61 73 65            P.base
3960: 48 72 65 66 46 6f 72 57 69 6b 69 28 29 3b 0a 20  HrefForWiki();. 
3970: 20 20 20 20 20 20 20 20 20 69 66 28 50 2e 70 72           if(P.pr
3980: 65 76 69 65 77 4e 65 65 64 73 55 70 64 61 74 65  eviewNeedsUpdate
3990: 20 26 26 20 50 2e 65 2e 63 62 41 75 74 6f 50 72   && P.e.cbAutoPr
39a0: 65 76 69 65 77 2e 63 68 65 63 6b 65 64 29 20 50  eview.checked) P
39b0: 2e 70 72 65 76 69 65 77 28 29 3b 0a 20 20 20 20  .preview();.    
39c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 65 76 2e      }else if(ev.
39d0: 64 65 74 61 69 6c 3d 3d 3d 50 2e 65 2e 74 61 62  detail===P.e.tab
39e0: 73 2e 64 69 66 66 29 7b 0a 20 20 20 20 20 20 20  s.diff){.       
39f0: 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e     /* Work aroun
3a00: 64 20 61 20 77 65 69 72 64 20 62 75 67 20 77 68  d a weird bug wh
3a10: 65 72 65 20 74 68 65 20 70 61 67 65 20 67 65 74  ere the page get
3a20: 73 20 77 69 64 65 72 20 74 68 61 6e 0a 20 20 20  s wider than.   
3a30: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 77 69            the wi
3a40: 6e 64 6f 77 20 77 68 65 6e 20 74 68 65 20 64 69  ndow when the di
3a50: 66 66 20 74 61 62 20 69 73 20 4e 4f 54 20 69 6e  ff tab is NOT in
3a60: 20 76 69 65 77 20 61 6e 64 20 74 68 65 0a 20 20   view and the.  
3a70: 20 20 20 20 20 20 20 20 20 20 20 63 75 72 72 65             curre
3a80: 6e 74 20 53 42 53 20 64 69 66 66 20 77 69 64 67  nt SBS diff widg
3a90: 65 74 20 69 73 20 77 69 64 65 72 20 74 68 61 6e  et is wider than
3aa0: 20 74 68 65 20 77 69 6e 64 6f 77 2e 20 57 68 65   the window. Whe
3ab0: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 74  n.             t
3ac0: 68 65 20 64 69 66 66 20 49 53 20 69 6e 20 76 69  he diff IS in vi
3ad0: 65 77 20 74 68 65 6e 20 43 53 53 20 6f 76 65 72  ew then CSS over
3ae0: 66 6c 6f 77 20 6d 61 67 69 63 61 6c 6c 79 20 72  flow magically r
3af0: 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20 20  educes.         
3b00: 20 20 20 20 74 68 65 20 70 61 67 65 20 73 69 7a      the page siz
3b10: 65 20 61 67 61 69 6e 2e 20 57 65 69 72 64 2e 20  e again. Weird. 
3b20: 4d 61 79 62 65 20 46 46 2d 73 70 65 63 69 66 69  Maybe FF-specifi
3b30: 63 2e 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  c. Note that.   
3b40: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 20 77            this w
3b50: 65 69 72 64 6e 65 73 73 20 68 61 70 70 65 6e 73  eirdness happens
3b60: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 50 2e 65   even though P.e
3b70: 2e 64 69 66 66 54 61 72 67 65 74 27 73 20 70 61  .diffTarget's pa
3b80: 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20  rent.           
3b90: 20 20 69 73 20 68 69 64 64 65 6e 20 28 61 6e 64    is hidden (and
3ba0: 20 74 68 65 72 65 66 6f 72 65 20 50 2e 65 2e 64   therefore P.e.d
3bb0: 69 66 66 54 61 72 67 65 74 20 69 73 20 61 6c 73  iffTarget is als
3bc0: 6f 20 68 69 64 64 65 6e 29 2e 0a 20 20 20 20 20  o hidden)..     
3bd0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
3be0: 20 20 44 2e 72 65 6d 6f 76 65 43 6c 61 73 73 28    D.removeClass(
3bf0: 50 2e 65 2e 64 69 66 66 54 61 72 67 65 74 2c 20  P.e.diffTarget, 
3c00: 27 68 69 64 64 65 6e 27 29 3b 0a 20 20 20 20 20  'hidden');.     
3c10: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3c20: 20 29 3b 0a 20 20 20 20 50 2e 74 61 62 73 2e 61   );.    P.tabs.a
3c30: 64 64 45 76 65 6e 74 4c 69 73 74 65 6e 65 72 28  ddEventListener(
3c40: 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 75 70  .      /* Set up
3c50: 20 61 75 74 6f 2d 72 65 66 72 65 73 68 20 6f 66   auto-refresh of
3c60: 20 74 68 65 20 70 72 65 76 69 65 77 20 74 61 62   the preview tab
3c70: 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 27 62 65  ... */.      'be
3c80: 66 6f 72 65 2d 73 77 69 74 63 68 2d 66 72 6f 6d  fore-switch-from
3c90: 27 2c 20 66 75 6e 63 74 69 6f 6e 28 65 76 29 7b  ', function(ev){
3ca0: 0a 20 20 20 20 20 20 20 20 69 66 28 65 76 2e 64  .        if(ev.d
3cb0: 65 74 61 69 6c 3d 3d 3d 50 2e 65 2e 74 61 62 73  etail===P.e.tabs
3cc0: 2e 70 72 65 76 69 65 77 29 7b 0a 20 20 20 20 20  .preview){.     
3cd0: 20 20 20 20 20 50 2e 62 61 73 65 48 72 65 66 52       P.baseHrefR
3ce0: 65 73 74 6f 72 65 28 29 3b 0a 20 20 20 20 20 20  estore();.      
3cf0: 20 20 7d 65 6c 73 65 20 69 66 28 65 76 2e 64 65    }else if(ev.de
3d00: 74 61 69 6c 3d 3d 3d 50 2e 65 2e 74 61 62 73 2e  tail===P.e.tabs.
3d10: 64 69 66 66 29 7b 0a 20 20 20 20 20 20 20 20 20  diff){.         
3d20: 20 2f 2a 20 53 65 65 20 6e 6f 74 65 73 20 69 6e   /* See notes in
3d30: 20 74 68 65 20 62 65 66 6f 72 65 2d 73 77 69 74   the before-swit
3d40: 63 68 2d 74 6f 20 68 61 6e 64 6c 65 72 2e 20 2a  ch-to handler. *
3d50: 2f 0a 20 20 20 20 20 20 20 20 20 20 44 2e 61 64  /.          D.ad
3d60: 64 43 6c 61 73 73 28 50 2e 65 2e 64 69 66 66 54  dClass(P.e.diffT
3d70: 61 72 67 65 74 2c 20 27 68 69 64 64 65 6e 27 29  arget, 'hidden')
3d80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3d90: 20 20 7d 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20    }.    );..    
3da0: 46 2e 63 6f 6e 6e 65 63 74 50 61 67 65 50 72 65  F.connectPagePre
3db0: 76 69 65 77 65 72 73 28 0a 20 20 20 20 20 20 50  viewers(.      P
3dc0: 2e 65 2e 74 61 62 73 2e 70 72 65 76 69 65 77 2e  .e.tabs.preview.
3dd0: 71 75 65 72 79 53 65 6c 65 63 74 6f 72 28 0a 20  querySelector(. 
3de0: 20 20 20 20 20 20 20 27 23 62 74 6e 2d 70 72 65         '#btn-pre
3df0: 76 69 65 77 2d 72 65 66 72 65 73 68 27 0a 20 20  view-refresh'.  
3e00: 20 20 20 20 29 0a 20 20 20 20 29 3b 0a 0a 20 20      ).    );..  
3e10: 20 20 63 6f 6e 73 74 20 64 69 66 66 42 75 74 74    const diffButt
3e20: 6f 6e 73 20 3d 20 45 28 27 23 77 69 6b 69 65 64  ons = E('#wikied
3e30: 69 74 2d 74 61 62 2d 64 69 66 66 2d 62 75 74 74  it-tab-diff-butt
3e40: 6f 6e 73 27 29 3b 0a 20 20 20 20 64 69 66 66 42  ons');.    diffB
3e50: 75 74 74 6f 6e 73 2e 71 75 65 72 79 53 65 6c 65  uttons.querySele
3e60: 63 74 6f 72 28 27 62 75 74 74 6f 6e 2e 73 62 73  ctor('button.sbs
3e70: 27 29 2e 61 64 64 45 76 65 6e 74 4c 69 73 74 65  ').addEventListe
3e80: 6e 65 72 28 0a 20 20 20 20 20 20 22 63 6c 69 63  ner(.      "clic
3e90: 6b 22 2c 28 65 29 3d 3e 50 2e 64 69 66 66 28 74  k",(e)=>P.diff(t
3ea0: 72 75 65 29 2c 20 66 61 6c 73 65 0a 20 20 20 20  rue), false.    
3eb0: 29 3b 0a 20 20 20 20 64 69 66 66 42 75 74 74 6f  );.    diffButto
3ec0: 6e 73 2e 71 75 65 72 79 53 65 6c 65 63 74 6f 72  ns.querySelector
3ed0: 28 27 62 75 74 74 6f 6e 2e 75 6e 69 66 69 65 64  ('button.unified
3ee0: 27 29 2e 61 64 64 45 76 65 6e 74 4c 69 73 74 65  ').addEventListe
3ef0: 6e 65 72 28 0a 20 20 20 20 20 20 22 63 6c 69 63  ner(.      "clic
3f00: 6b 22 2c 28 65 29 3d 3e 50 2e 64 69 66 66 28 66  k",(e)=>P.diff(f
3f10: 61 6c 73 65 29 2c 20 66 61 6c 73 65 0a 20 20 20  alse), false.   
3f20: 20 29 3b 0a 20 20 20 20 69 66 28 30 29 20 50 2e   );.    if(0) P.
3f30: 65 2e 62 74 6e 43 6f 6d 6d 69 74 2e 61 64 64 45  e.btnCommit.addE
3f40: 76 65 6e 74 4c 69 73 74 65 6e 65 72 28 0a 20 20  ventListener(.  
3f50: 20 20 20 20 22 63 6c 69 63 6b 22 2c 28 65 29 3d      "click",(e)=
3f60: 3e 50 2e 63 6f 6d 6d 69 74 28 29 2c 20 66 61 6c  >P.commit(), fal
3f70: 73 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 46 2e  se.    );.    F.
3f80: 63 6f 6e 66 69 72 6d 65 72 28 50 2e 65 2e 62 74  confirmer(P.e.bt
3f90: 6e 52 65 6c 6f 61 64 2c 20 7b 0a 20 20 20 20 20  nReload, {.     
3fa0: 20 63 6f 6e 66 69 72 6d 54 65 78 74 3a 20 22 52   confirmText: "R
3fb0: 65 61 6c 6c 79 20 72 65 6c 6f 61 64 2c 20 6c 6f  eally reload, lo
3fc0: 73 69 6e 67 20 65 64 69 74 73 3f 22 2c 0a 20 20  sing edits?",.  
3fd0: 20 20 20 20 6f 6e 63 6f 6e 66 69 72 6d 3a 20 66      onconfirm: f
3fe0: 75 6e 63 74 69 6f 6e 28 65 29 7b 0a 20 20 20 20  unction(e){.    
3ff0: 20 20 20 20 63 6f 6e 73 74 20 77 20 3d 20 50 2e      const w = P.
4000: 77 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 69  winfo;.        i
4010: 66 28 21 77 29 7b 0a 20 20 20 20 20 20 20 20 20  f(!w){.         
4020: 20 46 2e 65 72 72 6f 72 28 22 4e 6f 20 70 61 67   F.error("No pag
4030: 65 20 6c 6f 61 64 65 64 2e 22 29 3b 0a 20 20 20  e loaded.");.   
4040: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
4050: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
4060: 21 77 2e 76 65 72 73 69 6f 6e 29 7b 0a 20 20 20  !w.version){.   
4070: 20 20 20 20 20 20 20 46 2e 65 72 72 6f 72 28 22         F.error("
4080: 43 61 6e 6e 6f 74 20 72 65 6c 6f 61 64 20 61 20  Cannot reload a 
4090: 6e 65 77 2f 75 6e 73 61 76 65 64 20 70 61 67 65  new/unsaved page
40a0: 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  .");.          r
40b0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
40c0: 0a 20 20 20 20 20 20 20 20 50 2e 75 6e 73 74 61  .        P.unsta
40d0: 73 68 43 6f 6e 74 65 6e 74 28 29 2e 6c 6f 61 64  shContent().load
40e0: 50 61 67 65 28 29 3b 0a 20 20 20 20 20 20 7d 2c  Page();.      },
40f0: 0a 20 20 20 20 20 20 74 69 63 6b 73 3a 20 33 0a  .      ticks: 3.
4100: 20 20 20 20 7d 29 3b 0a 20 20 20 20 50 2e 65 2e      });.    P.e.
4110: 74 61 45 64 69 74 6f 72 2e 61 64 64 45 76 65 6e  taEditor.addEven
4120: 74 4c 69 73 74 65 6e 65 72 28 0a 20 20 20 20 20  tListener(.     
4130: 20 27 63 68 61 6e 67 65 27 2c 20 28 29 3d 3e 50   'change', ()=>P
4140: 2e 73 74 61 73 68 43 6f 6e 74 65 6e 74 43 68 61  .stashContentCha
4150: 6e 67 65 28 29 2c 20 66 61 6c 73 65 0a 20 20 20  nge(), false.   
4160: 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 50 2e 73   );.    .    P.s
4170: 65 6c 65 63 74 4d 69 6d 65 74 79 70 65 28 66 61  electMimetype(fa
4180: 6c 73 65 2c 20 74 72 75 65 29 3b 0a 20 20 20 20  lse, true);.    
4190: 50 2e 65 2e 73 65 6c 65 63 74 4d 69 6d 65 74 79  P.e.selectMimety
41a0: 70 65 2e 61 64 64 45 76 65 6e 74 4c 69 73 74 65  pe.addEventListe
41b0: 6e 65 72 28 0a 20 20 20 20 20 20 27 63 68 61 6e  ner(.      'chan
41c0: 67 65 27 2c 0a 20 20 20 20 20 20 66 75 6e 63 74  ge',.      funct
41d0: 69 6f 6e 28 65 29 7b 0a 20 20 20 20 20 20 20 20  ion(e){.        
41e0: 69 66 28 50 2e 77 69 6e 66 6f 29 7b 0a 20 20 20  if(P.winfo){.   
41f0: 20 20 20 20 20 20 20 50 2e 77 69 6e 66 6f 2e 6d         P.winfo.m
4200: 69 6d 65 74 79 70 65 20 3d 20 65 2e 74 61 72 67  imetype = e.targ
4210: 65 74 2e 76 61 6c 75 65 3b 0a 20 20 20 20 20 20  et.value;.      
4220: 20 20 20 20 50 2e 73 74 61 73 68 43 6f 6e 74 65      P.stashConte
4230: 6e 74 43 68 61 6e 67 65 28 74 72 75 65 29 3b 0a  ntChange(true);.
4240: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4250: 7d 2c 0a 20 20 20 20 20 20 66 61 6c 73 65 0a 20  },.      false. 
4260: 20 20 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 63     );.    .    c
4270: 6f 6e 73 74 20 73 65 6c 65 63 74 46 6f 6e 74 53  onst selectFontS
4280: 69 7a 65 20 3d 20 45 28 27 73 65 6c 65 63 74 5b  ize = E('select[
4290: 6e 61 6d 65 3d 65 64 69 74 6f 72 5f 66 6f 6e 74  name=editor_font
42a0: 5f 73 69 7a 65 5d 27 29 3b 0a 20 20 20 20 69 66  _size]');.    if
42b0: 28 73 65 6c 65 63 74 46 6f 6e 74 53 69 7a 65 29  (selectFontSize)
42c0: 7b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 46 6f  {.      selectFo
42d0: 6e 74 53 69 7a 65 2e 61 64 64 45 76 65 6e 74 4c  ntSize.addEventL
42e0: 69 73 74 65 6e 65 72 28 0a 20 20 20 20 20 20 20  istener(.       
42f0: 20 22 63 68 61 6e 67 65 22 2c 66 75 6e 63 74 69   "change",functi
4300: 6f 6e 28 65 29 7b 0a 20 20 20 20 20 20 20 20 20  on(e){.         
4310: 20 63 6f 6e 73 74 20 65 64 20 3d 20 50 2e 65 2e   const ed = P.e.
4320: 74 61 45 64 69 74 6f 72 3b 0a 20 20 20 20 20 20  taEditor;.      
4330: 20 20 20 20 65 64 2e 63 6c 61 73 73 4e 61 6d 65      ed.className
4340: 20 3d 20 65 64 2e 63 6c 61 73 73 4e 61 6d 65 2e   = ed.className.
4350: 72 65 70 6c 61 63 65 28 0a 20 20 20 20 20 20 20  replace(.       
4360: 20 20 20 20 20 20 20 2f 5c 62 66 6f 6e 74 2d 73         /\bfont-s
4370: 69 7a 65 2d 5c 64 2b 2f 67 2c 20 27 27 20 29 3b  ize-\d+/g, '' );
4380: 0a 20 20 20 20 20 20 20 20 20 20 65 64 2e 63 6c  .          ed.cl
4390: 61 73 73 4c 69 73 74 2e 61 64 64 28 27 66 6f 6e  assList.add('fon
43a0: 74 2d 73 69 7a 65 2d 27 2b 65 2e 74 61 72 67 65  t-size-'+e.targe
43b0: 74 2e 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  t.value);.      
43c0: 20 20 7d 2c 20 66 61 6c 73 65 0a 20 20 20 20 20    }, false.     
43d0: 20 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74   );.      select
43e0: 46 6f 6e 74 53 69 7a 65 2e 64 69 73 70 61 74 63  FontSize.dispatc
43f0: 68 45 76 65 6e 74 28 0a 20 20 20 20 20 20 20 20  hEvent(.        
4400: 2f 2f 20 46 6f 72 63 65 20 55 49 20 75 70 64 61  // Force UI upda
4410: 74 65 0a 20 20 20 20 20 20 20 20 6e 65 77 20 45  te.        new E
4420: 76 65 6e 74 28 27 63 68 61 6e 67 65 27 2c 7b 74  vent('change',{t
4430: 61 72 67 65 74 3a 73 65 6c 65 63 74 46 6f 6e 74  arget:selectFont
4440: 53 69 7a 65 7d 29 0a 20 20 20 20 20 20 29 3b 0a  Size}).      );.
4450: 20 20 20 20 7d 0a 0a 20 20 20 20 50 2e 61 64 64      }..    P.add
4460: 45 76 65 6e 74 4c 69 73 74 65 6e 65 72 28 0a 20  EventListener(. 
4470: 20 20 20 20 20 2f 2f 20 43 6c 65 61 72 20 63 65       // Clear ce
4480: 72 74 61 69 6e 20 76 69 65 77 73 20 77 68 65 6e  rtain views when
4490: 20 6e 65 77 20 63 6f 6e 74 65 6e 74 20 69 73 20   new content is 
44a0: 6c 6f 61 64 65 64 2f 73 65 74 0a 20 20 20 20 20  loaded/set.     
44b0: 20 27 77 69 6b 69 2d 63 6f 6e 74 65 6e 74 2d 72   'wiki-content-r
44c0: 65 70 6c 61 63 65 64 27 2c 0a 20 20 20 20 20 20  eplaced',.      
44d0: 28 29 3d 3e 7b 0a 20 20 20 20 20 20 20 20 50 2e  ()=>{.        P.
44e0: 70 72 65 76 69 65 77 4e 65 65 64 73 55 70 64 61  previewNeedsUpda
44f0: 74 65 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  te = true;.     
4500: 20 20 20 44 2e 63 6c 65 61 72 45 6c 65 6d 65 6e     D.clearElemen
4510: 74 28 50 2e 65 2e 64 69 66 66 54 61 72 67 65 74  t(P.e.diffTarget
4520: 2c 20 50 2e 65 2e 70 72 65 76 69 65 77 54 61 72  , P.e.previewTar
4530: 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  get);.      }.  
4540: 20 20 29 3b 0a 20 20 20 20 50 2e 61 64 64 45 76    );.    P.addEv
4550: 65 6e 74 4c 69 73 74 65 6e 65 72 28 0a 20 20 20  entListener(.   
4560: 20 20 20 2f 2f 20 43 6c 65 61 72 20 63 65 72 74     // Clear cert
4570: 61 69 6e 20 76 69 65 77 73 20 61 66 74 65 72 20  ain views after 
4580: 61 20 73 61 76 65 0a 20 20 20 20 20 20 27 77 69  a save.      'wi
4590: 6b 69 2d 73 61 76 65 64 27 2c 0a 20 20 20 20 20  ki-saved',.     
45a0: 20 28 65 29 3d 3e 7b 0a 20 20 20 20 20 20 20 20   (e)=>{.        
45b0: 44 2e 63 6c 65 61 72 45 6c 65 6d 65 6e 74 28 50  D.clearElement(P
45c0: 2e 65 2e 64 69 66 66 54 61 72 67 65 74 2c 20 50  .e.diffTarget, P
45d0: 2e 65 2e 70 72 65 76 69 65 77 54 61 72 67 65 74  .e.previewTarget
45e0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2f 20 54 4f  );.        // TO
45f0: 44 4f 3a 20 72 65 70 6c 61 63 65 20 70 72 65 76  DO: replace prev
4600: 69 65 77 20 77 69 74 68 20 6e 65 77 20 63 6f 6e  iew with new con
4610: 74 65 6e 74 0a 20 20 20 20 20 20 7d 0a 20 20 20  tent.      }.   
4620: 20 29 3b 0a 20 20 20 20 57 69 6b 69 4c 69 73 74   );.    WikiList
4630: 2e 69 6e 69 74 28 20 50 2e 65 2e 74 61 62 73 2e  .init( P.e.tabs.
4640: 70 61 67 65 4c 69 73 74 2e 66 69 72 73 74 45 6c  pageList.firstEl
4650: 65 6d 65 6e 74 43 68 69 6c 64 20 29 3b 0a 20 20  ementChild );.  
4660: 20 20 50 2e 61 64 64 45 76 65 6e 74 4c 69 73 74    P.addEventList
4670: 65 6e 65 72 28 0a 20 20 20 20 20 20 2f 2f 20 55  ener(.      // U
4680: 70 64 61 74 65 20 76 61 72 69 6f 75 73 20 73 74  pdate various st
4690: 61 74 65 20 6f 6e 20 77 69 6b 69 20 70 61 67 65  ate on wiki page
46a0: 20 6c 6f 61 64 0a 20 20 20 20 20 20 27 77 69 6b   load.      'wik
46b0: 69 2d 70 61 67 65 2d 6c 6f 61 64 65 64 27 2c 0a  i-page-loaded',.
46c0: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 28 65        function(e
46d0: 76 29 7b 0a 20 20 20 20 20 20 20 20 64 65 6c 65  v){.        dele
46e0: 74 65 20 50 2e 77 69 6e 66 6f 3b 0a 20 20 20 20  te P.winfo;.    
46f0: 20 20 20 20 63 6f 6e 73 74 20 77 69 6e 66 6f 20      const winfo 
4700: 3d 20 65 76 2e 64 65 74 61 69 6c 3b 0a 20 20 20  = ev.detail;.   
4710: 20 20 20 20 20 50 2e 77 69 6e 66 6f 20 3d 20 77       P.winfo = w
4720: 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 50 2e  info;.        P.
4730: 70 72 65 76 69 65 77 4e 65 65 64 73 55 70 64 61  previewNeedsUpda
4740: 74 65 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  te = true;.     
4750: 20 20 20 50 2e 65 2e 73 65 6c 65 63 74 4d 69 6d     P.e.selectMim
4760: 65 74 79 70 65 2e 76 61 6c 75 65 20 3d 20 77 69  etype.value = wi
4770: 6e 66 6f 2e 6d 69 6d 65 74 79 70 65 3b 0a 20 20  nfo.mimetype;.  
4780: 20 20 20 20 20 20 50 2e 74 61 62 73 2e 73 77 69        P.tabs.swi
4790: 74 63 68 54 6f 54 61 62 28 50 2e 65 2e 74 61 62  tchToTab(P.e.tab
47a0: 73 2e 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  s.content);.    
47b0: 20 20 20 20 50 2e 77 69 6b 69 43 6f 6e 74 65 6e      P.wikiConten
47c0: 74 28 77 69 6e 66 6f 2e 63 6f 6e 74 65 6e 74 20  t(winfo.content 
47d0: 7c 7c 20 27 27 29 3b 0a 20 20 20 20 20 20 20 20  || '');.        
47e0: 57 69 6b 69 4c 69 73 74 2e 65 2e 73 65 6c 65 63  WikiList.e.selec
47f0: 74 2e 76 61 6c 75 65 20 3d 20 77 69 6e 66 6f 2e  t.value = winfo.
4800: 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  name;.        if
4810: 28 21 77 69 6e 66 6f 2e 76 65 72 73 69 6f 6e 29  (!winfo.version)
4820: 7b 0a 20 20 20 20 20 20 20 20 20 20 46 2e 65 72  {.          F.er
4830: 72 6f 72 28 27 59 6f 75 20 61 72 65 20 65 64 69  ror('You are edi
4840: 74 69 6e 67 20 61 20 6e 65 77 2c 20 75 6e 73 61  ting a new, unsa
4850: 76 65 64 20 70 61 67 65 3a 27 2c 77 69 6e 66 6f  ved page:',winfo
4860: 2e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  .name);.        
4870: 7d 0a 20 20 20 20 20 20 20 20 50 2e 75 70 64 61  }.        P.upda
4880: 74 65 50 61 67 65 54 69 74 6c 65 28 29 3b 0a 20  tePageTitle();. 
4890: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 66 61       },.      fa
48a0: 6c 73 65 0a 20 20 20 20 29 3b 0a 20 20 7d 2f 2a  lse.    );.  }/*
48b0: 46 2e 6f 6e 50 61 67 65 4c 6f 61 64 28 29 2a 2f  F.onPageLoad()*/
48c0: 29 3b 0a 0a 20 20 2f 2a 2a 0a 20 20 20 20 20 52  );..  /**.     R
48d0: 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 66  eturns true if f
48e0: 6f 73 73 69 6c 2e 70 61 67 65 2e 77 69 6e 66 6f  ossil.page.winfo
48f0: 20 69 73 20 73 65 74 2c 20 69 6e 64 69 63 61 74   is set, indicat
4900: 69 6e 67 20 74 68 61 74 20 61 20 70 61 67 65 0a  ing that a page.
4910: 20 20 20 20 20 68 61 73 20 62 65 65 6e 20 6c 6f       has been lo
4920: 61 64 65 64 2c 20 65 6c 73 65 20 69 74 20 72 65  aded, else it re
4930: 70 6f 72 74 73 20 61 6e 20 65 72 72 6f 72 20 61  ports an error a
4940: 6e 64 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  nd returns false
4950: 2e 0a 0a 20 20 20 20 20 49 66 20 70 61 73 73 65  ...     If passe
4960: 64 20 61 20 74 72 75 74 68 79 20 76 61 6c 75 65  d a truthy value
4970: 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
4980: 67 65 20 61 62 6f 75 74 20 6e 6f 74 20 68 61 76  ge about not hav
4990: 69 6e 67 0a 20 20 20 20 20 61 20 77 69 6b 69 20  ing.     a wiki 
49a0: 70 61 67 65 20 6c 6f 61 64 65 64 20 69 73 20 73  page loaded is s
49b0: 75 70 70 72 65 73 73 65 64 2e 0a 20 20 2a 2f 0a  uppressed..  */.
49c0: 20 20 63 6f 6e 73 74 20 61 66 66 69 72 6d 50 61    const affirmPa
49d0: 67 65 4c 6f 61 64 65 64 20 3d 20 66 75 6e 63 74  geLoaded = funct
49e0: 69 6f 6e 28 71 75 69 65 74 29 7b 0a 20 20 20 20  ion(quiet){.    
49f0: 69 66 28 21 50 2e 77 69 6e 66 6f 20 26 26 20 21  if(!P.winfo && !
4a00: 71 75 69 65 74 29 20 46 2e 65 72 72 6f 72 28 22  quiet) F.error("
4a10: 4e 6f 20 77 69 6b 69 20 70 61 67 65 20 69 73 20  No wiki page is 
4a20: 6c 6f 61 64 65 64 2e 22 29 3b 0a 20 20 20 20 72  loaded.");.    r
4a30: 65 74 75 72 6e 20 21 21 50 2e 77 69 6e 66 6f 3b  eturn !!P.winfo;
4a40: 0a 20 20 7d 3b 0a 0a 20 20 2f 2a 2a 0a 20 20 20  .  };..  /**.   
4a50: 20 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67    Update the pag
4a60: 65 20 74 69 74 6c 65 20 61 6e 64 20 68 65 61 64  e title and head
4a70: 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  er based on the 
4a80: 73 74 61 74 65 0a 20 20 20 20 20 6f 66 20 74 68  state.     of th
4a90: 69 73 2e 77 69 6e 66 6f 2e 20 41 20 6e 6f 2d 6f  is.winfo. A no-o
4aa0: 70 20 69 66 20 74 68 69 73 2e 77 69 6e 66 6f 20  p if this.winfo 
4ab0: 69 73 20 6e 6f 74 20 73 65 74 2e 0a 20 20 2a 2f  is not set..  */
4ac0: 0a 20 20 50 2e 75 70 64 61 74 65 50 61 67 65 54  .  P.updatePageT
4ad0: 69 74 6c 65 20 3d 20 66 75 6e 63 74 69 6f 6e 20  itle = function 
4ae0: 66 28 29 7b 0a 20 20 20 20 69 66 28 21 61 66 66  f(){.    if(!aff
4af0: 69 72 6d 50 61 67 65 4c 6f 61 64 65 64 28 74 72  irmPageLoaded(tr
4b00: 75 65 29 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ue)) return;.   
4b10: 20 69 66 28 21 66 2e 74 69 74 6c 65 45 6c 65 6d   if(!f.titleElem
4b20: 65 6e 74 29 7b 0a 20 20 20 20 20 20 66 2e 74 69  ent){.      f.ti
4b30: 74 6c 65 45 6c 65 6d 65 6e 74 20 3d 20 64 6f 63  tleElement = doc
4b40: 75 6d 65 6e 74 2e 68 65 61 64 2e 71 75 65 72 79  ument.head.query
4b50: 53 65 6c 65 63 74 6f 72 28 27 74 69 74 6c 65 27  Selector('title'
4b60: 29 3b 0a 20 20 20 20 20 20 66 2e 70 61 67 65 54  );.      f.pageT
4b70: 69 74 6c 65 48 65 61 64 65 72 20 3d 20 64 6f 63  itleHeader = doc
4b80: 75 6d 65 6e 74 2e 71 75 65 72 79 53 65 6c 65 63  ument.querySelec
4b90: 74 6f 72 28 27 64 69 76 2e 68 65 61 64 65 72 20  tor('div.header 
4ba0: 2e 74 69 74 6c 65 27 29 3b 0a 20 20 20 20 7d 0a  .title');.    }.
4bb0: 20 20 20 20 76 61 72 20 74 69 74 6c 65 20 3d 20      var title = 
4bc0: 5b 27 57 69 6b 69 20 45 64 69 74 6f 72 3a 27 5d  ['Wiki Editor:']
4bd0: 3b 0a 20 20 20 20 69 66 28 21 50 2e 77 69 6e 66  ;.    if(!P.winf
4be0: 6f 2e 76 65 72 73 69 6f 6e 29 20 74 69 74 6c 65  o.version) title
4bf0: 2e 70 75 73 68 28 27 5b 2b 5d 27 29 3b 0a 20 20  .push('[+]');.  
4c00: 20 20 65 6c 73 65 20 69 66 28 24 73 74 61 73 68    else if($stash
4c10: 2e 67 65 74 57 69 6e 66 6f 28 50 2e 77 69 6e 66  .getWinfo(P.winf
4c20: 6f 29 29 20 74 69 74 6c 65 2e 70 75 73 68 28 27  o)) title.push('
4c30: 5b 2a 5d 27 29 0a 20 20 20 20 74 69 74 6c 65 2e  [*]').    title.
4c40: 70 75 73 68 28 50 2e 77 69 6e 66 6f 2e 6e 61 6d  push(P.winfo.nam
4c50: 65 29 3b 0a 20 20 20 20 74 69 74 6c 65 20 3d 20  e);.    title = 
4c60: 74 69 74 6c 65 2e 6a 6f 69 6e 28 27 20 27 29 3b  title.join(' ');
4c70: 0a 20 20 20 20 66 2e 74 69 74 6c 65 45 6c 65 6d  .    f.titleElem
4c80: 65 6e 74 2e 69 6e 6e 65 72 54 65 78 74 20 3d 20  ent.innerText = 
4c90: 74 69 74 6c 65 3b 0a 20 20 20 20 66 2e 70 61 67  title;.    f.pag
4ca0: 65 54 69 74 6c 65 48 65 61 64 65 72 2e 69 6e 6e  eTitleHeader.inn
4cb0: 65 72 54 65 78 74 20 3d 20 74 69 74 6c 65 3b 0a  erText = title;.
4cc0: 20 20 7d 3b 0a 20 20 0a 20 20 2f 2a 2a 0a 20 20    };.  .  /**.  
4cd0: 20 20 20 47 65 74 74 65 72 20 28 69 66 20 63 61     Getter (if ca
4ce0: 6c 6c 65 64 20 77 69 74 68 20 6e 6f 20 61 72 67  lled with no arg
4cf0: 73 29 20 6f 72 20 73 65 74 74 65 72 20 28 69 66  s) or setter (if
4d00: 20 70 61 73 73 65 64 20 61 6e 20 61 72 67 29 20   passed an arg) 
4d10: 66 6f 72 0a 20 20 20 20 20 74 68 65 20 63 75 72  for.     the cur
4d20: 72 65 6e 74 20 66 69 6c 65 20 63 6f 6e 74 65 6e  rent file conten
4d30: 74 2e 0a 0a 20 20 20 20 20 54 68 65 20 73 65 74  t...     The set
4d40: 74 65 72 20 66 6f 72 6d 20 73 65 74 73 20 74 68  ter form sets th
4d50: 65 20 63 6f 6e 74 65 6e 74 2c 20 64 69 73 70 61  e content, dispa
4d60: 74 63 68 65 73 20 61 0a 20 20 20 20 20 27 77 69  tches a.     'wi
4d70: 6b 69 2d 63 6f 6e 74 65 6e 74 2d 72 65 70 6c 61  ki-content-repla
4d80: 63 65 64 27 20 65 76 65 6e 74 2c 20 61 6e 64 20  ced' event, and 
4d90: 72 65 74 75 72 6e 73 20 74 68 69 73 20 6f 62 6a  returns this obj
4da0: 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 50 2e 77 69  ect..  */.  P.wi
4db0: 6b 69 43 6f 6e 74 65 6e 74 20 3d 20 66 75 6e 63  kiContent = func
4dc0: 74 69 6f 6e 20 66 28 29 7b 0a 20 20 20 20 69 66  tion f(){.    if
4dd0: 28 30 3d 3d 3d 61 72 67 75 6d 65 6e 74 73 2e 6c  (0===arguments.l
4de0: 65 6e 67 74 68 29 7b 0a 20 20 20 20 20 20 72 65  ength){.      re
4df0: 74 75 72 6e 20 66 2e 67 65 74 28 29 3b 0a 20 20  turn f.get();.  
4e00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
4e10: 2e 73 65 74 28 61 72 67 75 6d 65 6e 74 73 5b 30  .set(arguments[0
4e20: 5d 20 7c 7c 20 27 27 29 3b 0a 20 20 20 20 20 20  ] || '');.      
4e30: 74 68 69 73 2e 64 69 73 70 61 74 63 68 45 76 65  this.dispatchEve
4e40: 6e 74 28 27 77 69 6b 69 2d 63 6f 6e 74 65 6e 74  nt('wiki-content
4e50: 2d 72 65 70 6c 61 63 65 64 27 2c 20 74 68 69 73  -replaced', this
4e60: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
4e70: 74 68 69 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 3b  this;.    }.  };
4e80: 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 67 65  .  /* Default ge
4e90: 74 2f 73 65 74 20 69 6d 70 6c 73 20 66 6f 72 20  t/set impls for 
4ea0: 66 69 6c 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  file content */.
4eb0: 20 20 50 2e 77 69 6b 69 43 6f 6e 74 65 6e 74 2e    P.wikiContent.
4ec0: 67 65 74 20 3d 20 66 75 6e 63 74 69 6f 6e 28 29  get = function()
4ed0: 7b 72 65 74 75 72 6e 20 50 2e 65 2e 74 61 45 64  {return P.e.taEd
4ee0: 69 74 6f 72 2e 76 61 6c 75 65 7d 3b 0a 20 20 50  itor.value};.  P
4ef0: 2e 77 69 6b 69 43 6f 6e 74 65 6e 74 2e 73 65 74  .wikiContent.set
4f00: 20 3d 20 66 75 6e 63 74 69 6f 6e 28 63 6f 6e 74   = function(cont
4f10: 65 6e 74 29 7b 50 2e 65 2e 74 61 45 64 69 74 6f  ent){P.e.taEdito
4f20: 72 2e 76 61 6c 75 65 20 3d 20 63 6f 6e 74 65 6e  r.value = conten
4f30: 74 7d 3b 0a 0a 20 20 2f 2a 2a 0a 20 20 20 20 20  t};..  /**.     
4f40: 46 6f 72 20 75 73 65 20 77 68 65 6e 20 69 6e 73  For use when ins
4f50: 74 61 6c 6c 69 6e 67 20 61 20 63 75 73 74 6f 6d  talling a custom
4f60: 20 65 64 69 74 6f 72 20 77 69 64 67 65 74 2e 20   editor widget. 
4f70: 50 61 73 73 20 69 74 20 74 68 65 0a 20 20 20 20  Pass it the.    
4f80: 20 67 65 74 74 65 72 20 61 6e 64 20 73 65 74 74   getter and sett
4f90: 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 74 6f 20  er callbacks to 
4fa0: 66 65 74 63 68 20 72 65 73 70 2e 20 73 65 74 20  fetch resp. set 
4fb0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
4fc0: 68 65 0a 20 20 20 20 20 63 75 73 74 6f 6d 20 77  he.     custom w
4fd0: 69 64 67 65 74 2e 20 54 68 65 79 20 77 69 6c 6c  idget. They will
4fe0: 20 62 65 20 74 72 69 67 67 65 72 65 64 20 76 69   be triggered vi
4ff0: 61 0a 20 20 20 20 20 50 2e 77 69 6b 69 43 6f 6e  a.     P.wikiCon
5000: 74 65 6e 74 28 29 2e 20 52 65 74 75 72 6e 73 20  tent(). Returns 
5010: 74 68 69 73 20 6f 62 6a 65 63 74 2e 0a 20 20 2a  this object..  *
5020: 2f 0a 20 20 50 2e 73 65 74 43 6f 6e 74 65 6e 74  /.  P.setContent
5030: 4d 65 74 68 6f 64 73 20 3d 20 66 75 6e 63 74 69  Methods = functi
5040: 6f 6e 28 67 65 74 74 65 72 2c 20 73 65 74 74 65  on(getter, sette
5050: 72 29 7b 0a 20 20 20 20 74 68 69 73 2e 77 69 6b  r){.    this.wik
5060: 69 43 6f 6e 74 65 6e 74 2e 67 65 74 20 3d 20 67  iContent.get = g
5070: 65 74 74 65 72 3b 0a 20 20 20 20 74 68 69 73 2e  etter;.    this.
5080: 77 69 6b 69 43 6f 6e 74 65 6e 74 2e 73 65 74 20  wikiContent.set 
5090: 3d 20 73 65 74 74 65 72 3b 0a 20 20 20 20 72 65  = setter;.    re
50a0: 74 75 72 6e 20 74 68 69 73 3b 0a 20 20 7d 3b 0a  turn this;.  };.
50b0: 0a 20 20 2f 2a 2a 0a 20 20 20 20 20 52 65 6d 6f  .  /**.     Remo
50c0: 76 65 73 20 74 68 65 20 64 65 66 61 75 6c 74 20  ves the default 
50d0: 65 64 69 74 6f 72 20 77 69 64 67 65 74 20 28 61  editor widget (a
50e0: 6e 64 20 61 6e 79 20 64 65 70 65 6e 64 65 6e 74  nd any dependent
50f0: 20 65 6c 65 6d 65 6e 74 73 29 0a 20 20 20 20 20   elements).     
5100: 66 72 6f 6d 20 74 68 65 20 44 4f 4d 2c 20 61 64  from the DOM, ad
5110: 64 73 20 74 68 65 20 67 69 76 65 6e 20 65 6c 65  ds the given ele
5120: 6d 65 6e 74 20 69 6e 20 69 74 73 20 70 6c 61 63  ment in its plac
5130: 65 2c 20 72 65 6d 6f 76 65 73 20 74 68 69 73 0a  e, removes this.
5140: 20 20 20 20 20 6d 65 74 68 6f 64 20 66 72 6f 6d       method from
5150: 20 74 68 69 73 20 6f 62 6a 65 63 74 2c 20 61 6e   this object, an
5160: 64 20 72 65 74 75 72 6e 73 20 74 68 69 73 20 6f  d returns this o
5170: 62 6a 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 50 2e  bject..  */.  P.
5180: 72 65 70 6c 61 63 65 45 64 69 74 6f 72 45 6c 65  replaceEditorEle
5190: 6d 65 6e 74 20 3d 20 66 75 6e 63 74 69 6f 6e 28  ment = function(
51a0: 6e 65 77 45 64 69 74 6f 72 29 7b 0a 20 20 20 20  newEditor){.    
51b0: 50 2e 65 2e 74 61 45 64 69 74 6f 72 2e 70 61 72  P.e.taEditor.par
51c0: 65 6e 74 4e 6f 64 65 2e 69 6e 73 65 72 74 42 65  entNode.insertBe
51d0: 66 6f 72 65 28 6e 65 77 45 64 69 74 6f 72 2c 20  fore(newEditor, 
51e0: 50 2e 65 2e 74 61 45 64 69 74 6f 72 29 3b 0a 20  P.e.taEditor);. 
51f0: 20 20 20 50 2e 65 2e 74 61 45 64 69 74 6f 72 2e     P.e.taEditor.
5200: 72 65 6d 6f 76 65 28 29 3b 0a 20 20 20 20 50 2e  remove();.    P.
5210: 65 2e 73 65 6c 65 63 74 46 6f 6e 74 53 69 7a 65  e.selectFontSize
5220: 57 72 61 70 2e 72 65 6d 6f 76 65 28 29 3b 0a 20  Wrap.remove();. 
5230: 20 20 20 64 65 6c 65 74 65 20 74 68 69 73 2e 72     delete this.r
5240: 65 70 6c 61 63 65 45 64 69 74 6f 72 45 6c 65 6d  eplaceEditorElem
5250: 65 6e 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ent;.    return 
5260: 50 3b 0a 20 20 7d 3b 0a 0a 20 20 2f 2a 2a 0a 20  P;.  };..  /**. 
5270: 20 20 20 20 53 65 74 73 20 74 68 65 20 63 75 72      Sets the cur
5280: 72 65 6e 74 20 70 61 67 65 27 73 20 62 61 73 65  rent page's base
5290: 2e 68 72 65 66 20 74 6f 20 7b 67 2e 7a 54 6f 70  .href to {g.zTop
52a0: 7d 2f 77 69 6b 69 2e 0a 20 20 2a 2f 0a 20 20 50  }/wiki..  */.  P
52b0: 2e 62 61 73 65 48 72 65 66 46 6f 72 57 69 6b 69  .baseHrefForWiki
52c0: 20 3d 20 66 75 6e 63 74 69 6f 6e 20 66 28 29 7b   = function f(){
52d0: 0a 20 20 20 20 74 68 69 73 2e 62 61 73 65 2e 74  .    this.base.t
52e0: 61 67 2e 68 72 65 66 20 3d 20 74 68 69 73 2e 62  ag.href = this.b
52f0: 61 73 65 2e 77 69 6b 69 55 72 6c 3b 0a 20 20 20  ase.wikiUrl;.   
5300: 20 72 65 74 75 72 6e 20 74 68 69 73 3b 0a 20 20   return this;.  
5310: 7d 3b 0a 0a 20 20 2f 2a 2a 0a 20 20 20 20 20 53  };..  /**.     S
5320: 65 74 73 20 74 68 65 20 64 6f 63 75 6d 65 6e 74  ets the document
5330: 27 73 20 62 61 73 65 2e 68 72 65 66 20 76 61 6c  's base.href val
5340: 75 65 20 74 6f 20 69 74 73 20 70 61 67 65 2d 6c  ue to its page-l
5350: 6f 61 64 2d 74 69 6d 65 0a 20 20 20 20 20 73 65  oad-time.     se
5360: 74 74 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 50 2e  tting..  */.  P.
5370: 62 61 73 65 48 72 65 66 52 65 73 74 6f 72 65 20  baseHrefRestore 
5380: 3d 20 66 75 6e 63 74 69 6f 6e 28 29 7b 0a 20 20  = function(){.  
5390: 20 20 74 68 69 73 2e 62 61 73 65 2e 74 61 67 2e    this.base.tag.
53a0: 68 72 65 66 20 3d 20 74 68 69 73 2e 62 61 73 65  href = this.base
53b0: 2e 6f 72 69 67 69 6e 61 6c 48 72 65 66 3b 0a 20  .originalHref;. 
53c0: 20 7d 3b 0a 20 20 0a 0a 20 20 2f 2a 2a 0a 20 20   };.  ..  /**.  
53d0: 20 20 20 6c 6f 61 64 50 61 67 65 28 29 20 6c 6f     loadPage() lo
53e0: 61 64 73 20 74 68 65 20 67 69 76 65 6e 20 77 69  ads the given wi
53f0: 6b 69 20 70 61 67 65 20 61 6e 64 20 75 70 64 61  ki page and upda
5400: 74 65 73 20 74 68 65 20 72 65 6c 65 76 61 6e 74  tes the relevant
5410: 0a 20 20 20 20 20 55 49 20 65 6c 65 6d 65 6e 74  .     UI element
5420: 73 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65  s to reflect the
5430: 20 6c 6f 61 64 65 64 20 73 74 61 74 65 2e 20 49   loaded state. I
5440: 66 20 70 61 73 73 65 64 20 6e 6f 20 61 72 67 75  f passed no argu
5450: 6d 65 6e 74 73 0a 20 20 20 20 20 74 68 65 6e 20  ments.     then 
5460: 69 74 20 72 65 2d 75 73 65 73 20 74 68 65 20 76  it re-uses the v
5470: 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20 63  alues from the c
5480: 75 72 72 65 6e 74 6c 79 2d 6c 6f 61 64 65 64 20  urrently-loaded 
5490: 70 61 67 65 2c 20 72 65 6c 6f 61 64 69 6e 67 0a  page, reloading.
54a0: 20 20 20 20 20 69 74 20 28 65 6d 69 74 74 69 6e       it (emittin
54b0: 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  g an error messa
54c0: 67 65 20 69 66 20 6e 6f 20 66 69 6c 65 20 69 73  ge if no file is
54d0: 20 6c 6f 61 64 65 64 29 2e 0a 0a 20 20 20 20 20   loaded)...     
54e0: 52 65 74 75 72 6e 73 20 74 68 69 73 20 6f 62 6a  Returns this obj
54f0: 65 63 74 2c 20 6e 6f 74 69 6e 67 20 74 68 61 74  ect, noting that
5500: 20 74 68 65 20 6c 6f 61 64 20 69 73 20 61 73 79   the load is asy
5510: 6e 63 2e 20 41 66 74 65 72 20 6c 6f 61 64 69 6e  nc. After loadin
5520: 67 0a 20 20 20 20 20 69 74 20 74 72 69 67 67 65  g.     it trigge
5530: 72 73 20 61 20 27 77 69 6b 69 2d 70 61 67 65 2d  rs a 'wiki-page-
5540: 6c 6f 61 64 65 64 27 20 65 76 65 6e 74 2c 20 70  loaded' event, p
5550: 61 73 73 69 6e 67 20 69 74 20 74 68 69 73 2e 77  assing it this.w
5560: 69 6e 66 6f 2e 0a 0a 20 20 20 20 20 49 66 20 61  info...     If a
5570: 20 6c 6f 63 61 6c 6c 79 2d 65 64 69 74 65 64 20   locally-edited 
5580: 63 6f 70 79 20 6f 66 20 74 68 65 20 67 69 76 65  copy of the give
5590: 6e 20 66 69 6c 65 2f 72 65 76 20 69 73 20 66 6f  n file/rev is fo
55a0: 75 6e 64 2c 20 74 68 61 74 0a 20 20 20 20 20 63  und, that.     c
55b0: 6f 70 79 20 69 73 20 75 73 65 64 20 69 6e 73 74  opy is used inst
55c0: 65 61 64 20 6f 66 20 6f 6e 65 20 66 65 74 63 68  ead of one fetch
55d0: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 65 72 76  ed from the serv
55e0: 65 72 2c 20 62 75 74 20 69 74 20 69 73 0a 20 20  er, but it is.  
55f0: 20 20 20 73 74 69 6c 6c 20 74 72 65 61 74 65 64     still treated
5600: 20 61 73 20 61 20 6c 6f 61 64 20 65 76 65 6e 74   as a load event
5610: 2e 0a 0a 20 20 20 20 20 41 6c 74 65 72 6e 61 74  ...     Alternat
5620: 65 20 63 61 6c 6c 20 66 6f 72 6d 73 3a 0a 0a 20  e call forms:.. 
5630: 20 20 20 20 2d 20 6e 6f 20 61 72 67 75 6d 65 6e      - no argumen
5640: 74 73 3a 20 72 65 2d 6c 6f 61 64 73 20 66 72 6f  ts: re-loads fro
5650: 6d 20 74 68 69 73 2e 77 69 6e 66 6f 2e 0a 0a 20  m this.winfo... 
5660: 20 20 20 20 2d 20 31 20 6e 6f 6e 2d 73 74 72 69      - 1 non-stri
5670: 6e 67 20 61 72 67 75 6d 65 6e 74 3a 20 61 73 73  ng argument: ass
5680: 75 6d 65 64 20 74 6f 20 62 65 20 61 6e 20 77 69  umed to be an wi
5690: 6e 66 6f 2d 73 74 79 6c 65 0a 20 20 20 20 20 6f  nfo-style.     o
56a0: 62 6a 65 63 74 2e 20 4d 75 73 74 20 68 61 76 65  bject. Must have
56b0: 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 7b 6e   at least the {n
56c0: 61 6d 65 7d 20 70 72 6f 70 65 72 74 79 2c 20 62  ame} property, b
56d0: 75 74 20 6e 65 65 64 20 6e 6f 74 20 68 61 76 65  ut need not have
56e0: 0a 20 20 20 20 20 6f 74 68 65 72 20 77 69 6e 66  .     other winf
56f0: 6f 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  o state..  */.  
5700: 50 2e 6c 6f 61 64 50 61 67 65 20 3d 20 66 75 6e  P.loadPage = fun
5710: 63 74 69 6f 6e 28 6e 61 6d 65 29 7b 0a 20 20 20  ction(name){.   
5720: 20 69 66 28 30 3d 3d 3d 61 72 67 75 6d 65 6e 74   if(0===argument
5730: 73 2e 6c 65 6e 67 74 68 29 7b 0a 20 20 20 20 20  s.length){.     
5740: 20 2f 2a 20 52 65 6c 6f 61 64 20 66 72 6f 6d 20   /* Reload from 
5750: 74 68 69 73 2e 77 69 6e 66 6f 20 2a 2f 0a 20 20  this.winfo */.  
5760: 20 20 20 20 69 66 28 21 61 66 66 69 72 6d 50 61      if(!affirmPa
5770: 67 65 4c 6f 61 64 65 64 28 29 29 20 72 65 74 75  geLoaded()) retu
5780: 72 6e 20 74 68 69 73 3b 0a 20 20 20 20 20 20 6e  rn this;.      n
5790: 61 6d 65 20 3d 20 74 68 69 73 2e 77 69 6e 66 6f  ame = this.winfo
57a0: 2e 6e 61 6d 65 3b 0a 20 20 20 20 7d 65 6c 73 65  .name;.    }else
57b0: 20 69 66 28 31 3d 3d 3d 61 72 67 75 6d 65 6e 74   if(1===argument
57c0: 73 2e 6c 65 6e 67 74 68 20 26 26 20 27 73 74 72  s.length && 'str
57d0: 69 6e 67 27 20 21 3d 3d 20 74 79 70 65 6f 66 20  ing' !== typeof 
57e0: 6e 61 6d 65 29 7b 0a 20 20 20 20 20 20 2f 2a 20  name){.      /* 
57f0: 41 73 73 75 6d 65 20 77 69 6e 66 6f 2d 6c 69 6b  Assume winfo-lik
5800: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  e object */.    
5810: 20 20 63 6f 6e 73 74 20 61 72 67 20 3d 20 61 72    const arg = ar
5820: 67 75 6d 65 6e 74 73 5b 30 5d 3b 0a 20 20 20 20  guments[0];.    
5830: 20 20 6e 61 6d 65 20 3d 20 61 72 67 2e 6e 61 6d    name = arg.nam
5840: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 6e  e;.    }.    con
5850: 73 74 20 6f 6e 6c 6f 61 64 20 3d 20 28 72 29 3d  st onload = (r)=
5860: 3e 74 68 69 73 2e 64 69 73 70 61 74 63 68 45 76  >this.dispatchEv
5870: 65 6e 74 28 27 77 69 6b 69 2d 70 61 67 65 2d 6c  ent('wiki-page-l
5880: 6f 61 64 65 64 27 2c 20 72 29 3b 0a 20 20 20 20  oaded', r);.    
5890: 63 6f 6e 73 74 20 73 74 61 73 68 57 69 6e 66 6f  const stashWinfo
58a0: 20 3d 20 74 68 69 73 2e 67 65 74 53 74 61 73 68   = this.getStash
58b0: 65 64 57 69 6e 66 6f 28 7b 6e 61 6d 65 3a 20 6e  edWinfo({name: n
58c0: 61 6d 65 7d 29 3b 0a 20 20 20 20 69 66 28 73 74  ame});.    if(st
58d0: 61 73 68 57 69 6e 66 6f 29 7b 20 2f 2f 20 66 61  ashWinfo){ // fa
58e0: 6b 65 20 61 20 72 65 73 70 6f 6e 73 65 20 66 72  ke a response fr
58f0: 6f 6d 20 74 68 65 20 73 74 61 73 68 2e 2e 2e 0a  om the stash....
5900: 20 20 20 20 20 20 6f 6e 6c 6f 61 64 28 7b 0a 20        onload({. 
5910: 20 20 20 20 20 20 20 6e 61 6d 65 3a 20 73 74 61         name: sta
5920: 73 68 57 69 6e 66 6f 2e 6e 61 6d 65 2c 0a 20 20  shWinfo.name,.  
5930: 20 20 20 20 20 20 6d 69 6d 65 74 79 70 65 3a 20        mimetype: 
5940: 73 74 61 73 68 57 69 6e 66 6f 2e 6d 69 6d 65 74  stashWinfo.mimet
5950: 79 70 65 2c 0a 20 20 20 20 20 20 20 20 74 79 70  ype,.        typ
5960: 65 3a 20 73 74 61 73 68 57 69 6e 66 6f 2e 74 79  e: stashWinfo.ty
5970: 70 65 2c 0a 20 20 20 20 20 20 20 20 76 65 72 73  pe,.        vers
5980: 69 6f 6e 3a 20 73 74 61 73 68 57 69 6e 66 6f 2e  ion: stashWinfo.
5990: 76 65 72 73 69 6f 6e 2c 0a 20 20 20 20 20 20 20  version,.       
59a0: 20 70 61 72 65 6e 74 3a 20 73 74 61 73 68 57 69   parent: stashWi
59b0: 6e 66 6f 2e 70 61 72 65 6e 74 2c 0a 20 20 20 20  nfo.parent,.    
59c0: 20 20 20 20 63 6f 6e 74 65 6e 74 3a 20 24 73 74      content: $st
59d0: 61 73 68 2e 73 74 61 73 68 65 64 43 6f 6e 74 65  ash.stashedConte
59e0: 6e 74 28 73 74 61 73 68 57 69 6e 66 6f 29 0a 20  nt(stashWinfo). 
59f0: 20 20 20 20 20 7d 29 3b 0a 20 20 20 20 20 20 46       });.      F
5a00: 2e 6d 65 73 73 61 67 65 28 22 46 65 74 63 68 65  .message("Fetche
5a10: 64 20 66 72 6f 6d 20 74 68 65 20 6c 6f 63 61 6c  d from the local
5a20: 2d 65 64 69 74 20 73 74 6f 72 61 67 65 3a 22 2c  -edit storage:",
5a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5a40: 20 73 74 61 73 68 57 69 6e 66 6f 2e 6e 61 6d 65   stashWinfo.name
5a50: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
5a60: 74 68 69 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  this;.    }.    
5a70: 46 2e 6d 65 73 73 61 67 65 28 0a 20 20 20 20 20  F.message(.     
5a80: 20 22 4c 6f 61 64 69 6e 67 20 63 6f 6e 74 65 6e   "Loading conten
5a90: 74 2e 2e 2e 22 0a 20 20 20 20 29 2e 66 65 74 63  t...".    ).fetc
5aa0: 68 28 27 77 69 6b 69 61 6a 61 78 2f 66 65 74 63  h('wikiajax/fetc
5ab0: 68 27 2c 7b 0a 20 20 20 20 20 20 75 72 6c 50 61  h',{.      urlPa
5ac0: 72 61 6d 73 3a 20 7b 0a 20 20 20 20 20 20 20 20  rams: {.        
5ad0: 70 61 67 65 3a 20 6e 61 6d 65 0a 20 20 20 20 20  page: name.     
5ae0: 20 7d 2c 0a 20 20 20 20 20 20 72 65 73 70 6f 6e   },.      respon
5af0: 73 65 54 79 70 65 3a 20 27 6a 73 6f 6e 27 2c 0a  seType: 'json',.
5b00: 20 20 20 20 20 20 6f 6e 6c 6f 61 64 3a 28 72 29        onload:(r)
5b10: 3d 3e 7b 0a 20 20 20 20 20 20 20 20 6f 6e 6c 6f  =>{.        onlo
5b20: 61 64 28 72 29 3b 0a 20 20 20 20 20 20 20 20 46  ad(r);.        F
5b30: 2e 6d 65 73 73 61 67 65 28 27 4c 6f 61 64 65 64  .message('Loaded
5b40: 20 70 61 67 65 20 5b 27 2b 72 2e 6e 61 6d 65 2b   page ['+r.name+
5b50: 27 5d 2e 27 29 3b 0a 20 20 20 20 20 20 7d 0a 20  '].');.      }. 
5b60: 20 20 20 7d 29 3b 0a 20 20 20 20 72 65 74 75 72     });.    retur
5b70: 6e 20 74 68 69 73 3b 0a 20 20 7d 3b 0a 20 20 0a  n this;.  };.  .
5b80: 20 20 2f 2a 2a 0a 20 20 20 20 20 46 65 74 63 68    /**.     Fetch
5b90: 65 73 20 74 68 65 20 70 61 67 65 20 70 72 65 76  es the page prev
5ba0: 69 65 77 20 62 61 73 65 64 20 6f 6e 20 74 68 65  iew based on the
5bb0: 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 73 65   contents and se
5bc0: 74 74 69 6e 67 73 20 6f 66 0a 20 20 20 20 20 74  ttings of.     t
5bd0: 68 69 73 20 70 61 67 65 27 73 20 69 6e 70 75 74  his page's input
5be0: 20 66 69 65 6c 64 73 2c 20 61 6e 64 20 75 70 64   fields, and upd
5bf0: 61 74 65 73 20 74 68 65 20 55 49 20 77 69 74 68  ates the UI with
5c00: 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 20 70   with the.     p
5c10: 72 65 76 69 65 77 2e 0a 0a 20 20 20 20 20 52 65  review...     Re
5c20: 74 75 72 6e 73 20 74 68 69 73 20 6f 62 6a 65 63  turns this objec
5c30: 74 2c 20 6e 6f 74 69 6e 67 20 74 68 61 74 20 74  t, noting that t
5c40: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
5c50: 61 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 50 2e  async..  */.  P.
5c60: 70 72 65 76 69 65 77 20 3d 20 66 75 6e 63 74 69  preview = functi
5c70: 6f 6e 20 66 28 73 77 69 74 63 68 54 6f 54 61 62  on f(switchToTab
5c80: 29 7b 0a 20 20 20 20 69 66 28 21 61 66 66 69 72  ){.    if(!affir
5c90: 6d 50 61 67 65 4c 6f 61 64 65 64 28 29 29 20 72  mPageLoaded()) r
5ca0: 65 74 75 72 6e 20 74 68 69 73 3b 0a 20 20 20 20  eturn this;.    
5cb0: 63 6f 6e 73 74 20 74 61 72 67 65 74 20 3d 20 74  const target = t
5cc0: 68 69 73 2e 65 2e 70 72 65 76 69 65 77 54 61 72  his.e.previewTar
5cd0: 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 73  get,.          s
5ce0: 65 6c 66 20 3d 20 74 68 69 73 3b 0a 20 20 20 20  elf = this;.    
5cf0: 63 6f 6e 73 74 20 75 70 64 61 74 65 56 69 65 77  const updateView
5d00: 20 3d 20 66 75 6e 63 74 69 6f 6e 28 63 29 7b 0a   = function(c){.
5d10: 20 20 20 20 20 20 44 2e 63 6c 65 61 72 45 6c 65        D.clearEle
5d20: 6d 65 6e 74 28 74 61 72 67 65 74 29 3b 0a 20 20  ment(target);.  
5d30: 20 20 20 20 69 66 28 27 73 74 72 69 6e 67 27 3d      if('string'=
5d40: 3d 3d 74 79 70 65 6f 66 20 63 29 20 74 61 72 67  ==typeof c) targ
5d50: 65 74 2e 69 6e 6e 65 72 48 54 4d 4c 20 3d 20 63  et.innerHTML = c
5d60: 3b 0a 20 20 20 20 20 20 69 66 28 73 77 69 74 63  ;.      if(switc
5d70: 68 54 6f 54 61 62 29 20 73 65 6c 66 2e 74 61 62  hToTab) self.tab
5d80: 73 2e 73 77 69 74 63 68 54 6f 54 61 62 28 73 65  s.switchToTab(se
5d90: 6c 66 2e 65 2e 74 61 62 73 2e 70 72 65 76 69 65  lf.e.tabs.previe
5da0: 77 29 3b 0a 20 20 20 20 7d 3b 0a 20 20 20 20 72  w);.    };.    r
5db0: 65 74 75 72 6e 20 74 68 69 73 2e 5f 70 6f 73 74  eturn this._post
5dc0: 50 72 65 76 69 65 77 28 74 68 69 73 2e 77 69 6b  Preview(this.wik
5dd0: 69 43 6f 6e 74 65 6e 74 28 29 2c 20 75 70 64 61  iContent(), upda
5de0: 74 65 56 69 65 77 29 3b 0a 20 20 7d 3b 0a 0a 20  teView);.  };.. 
5df0: 20 2f 2a 2a 0a 20 20 20 20 20 43 61 6c 6c 62 61   /**.     Callba
5e00: 63 6b 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  ck for use with 
5e10: 46 2e 63 6f 6e 6e 65 63 74 50 61 67 65 50 72 65  F.connectPagePre
5e20: 76 69 65 77 65 72 73 28 29 0a 20 20 2a 2f 0a 20  viewers().  */. 
5e30: 20 50 2e 5f 70 6f 73 74 50 72 65 76 69 65 77 20   P._postPreview 
5e40: 3d 20 66 75 6e 63 74 69 6f 6e 28 63 6f 6e 74 65  = function(conte
5e50: 6e 74 2c 63 61 6c 6c 62 61 63 6b 29 7b 0a 20 20  nt,callback){.  
5e60: 20 20 69 66 28 21 61 66 66 69 72 6d 50 61 67 65    if(!affirmPage
5e70: 4c 6f 61 64 65 64 28 29 29 20 72 65 74 75 72 6e  Loaded()) return
5e80: 20 74 68 69 73 3b 0a 20 20 20 20 69 66 28 21 63   this;.    if(!c
5e90: 6f 6e 74 65 6e 74 29 7b 0a 20 20 20 20 20 20 63  ontent){.      c
5ea0: 61 6c 6c 62 61 63 6b 28 63 6f 6e 74 65 6e 74 29  allback(content)
5eb0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
5ec0: 68 69 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  his;.    }.    c
5ed0: 6f 6e 73 74 20 66 64 20 3d 20 6e 65 77 20 46 6f  onst fd = new Fo
5ee0: 72 6d 44 61 74 61 28 29 3b 0a 20 20 20 20 63 6f  rmData();.    co
5ef0: 6e 73 74 20 6d 69 6d 65 74 79 70 65 20 3d 20 74  nst mimetype = t
5f00: 68 69 73 2e 65 2e 73 65 6c 65 63 74 4d 69 6d 65  his.e.selectMime
5f10: 74 79 70 65 2e 76 61 6c 75 65 3b 0a 20 20 20 20  type.value;.    
5f20: 66 64 2e 61 70 70 65 6e 64 28 27 70 61 67 65 27  fd.append('page'
5f30: 2c 20 74 68 69 73 2e 77 69 6e 66 6f 2e 6e 61 6d  , this.winfo.nam
5f40: 65 29 3b 0a 20 20 20 20 66 64 2e 61 70 70 65 6e  e);.    fd.appen
5f50: 64 28 27 6d 69 6d 65 74 79 70 65 27 2c 6d 69 6d  d('mimetype',mim
5f60: 65 74 79 70 65 29 3b 0a 20 20 20 20 66 64 2e 61  etype);.    fd.a
5f70: 70 70 65 6e 64 28 27 63 6f 6e 74 65 6e 74 27 2c  ppend('content',
5f80: 63 6f 6e 74 65 6e 74 20 7c 7c 20 27 27 29 3b 0a  content || '');.
5f90: 20 20 20 20 46 2e 6d 65 73 73 61 67 65 28 0a 20      F.message(. 
5fa0: 20 20 20 20 20 22 46 65 74 63 68 69 6e 67 20 70       "Fetching p
5fb0: 72 65 76 69 65 77 2e 2e 2e 22 0a 20 20 20 20 29  review...".    )
5fc0: 2e 66 65 74 63 68 28 27 77 69 6b 69 61 6a 61 78  .fetch('wikiajax
5fd0: 2f 70 72 65 76 69 65 77 27 2c 7b 0a 20 20 20 20  /preview',{.    
5fe0: 20 20 70 61 79 6c 6f 61 64 3a 20 66 64 2c 0a 20    payload: fd,. 
5ff0: 20 20 20 20 20 6f 6e 6c 6f 61 64 3a 20 28 72 2c       onload: (r,
6000: 68 65 61 64 65 72 29 3d 3e 7b 0a 20 20 20 20 20  header)=>{.     
6010: 20 20 20 63 61 6c 6c 62 61 63 6b 28 72 29 3b 0a     callback(r);.
6020: 20 20 20 20 20 20 20 20 46 2e 6d 65 73 73 61 67          F.messag
6030: 65 28 27 55 70 64 61 74 65 64 20 70 72 65 76 69  e('Updated previ
6040: 65 77 2e 27 29 3b 0a 20 20 20 20 20 20 20 20 50  ew.');.        P
6050: 2e 70 72 65 76 69 65 77 4e 65 65 64 73 55 70 64  .previewNeedsUpd
6060: 61 74 65 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20  ate = false;.   
6070: 20 20 20 20 20 50 2e 64 69 73 70 61 74 63 68 45       P.dispatchE
6080: 76 65 6e 74 28 27 77 69 6b 69 2d 70 72 65 76 69  vent('wiki-previ
6090: 65 77 2d 75 70 64 61 74 65 64 27 2c 7b 0a 20 20  ew-updated',{.  
60a0: 20 20 20 20 20 20 20 20 6d 69 6d 65 74 79 70 65          mimetype
60b0: 3a 20 6d 69 6d 65 74 79 70 65 2c 0a 20 20 20 20  : mimetype,.    
60c0: 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 3a 20 50        element: P
60d0: 2e 65 2e 70 72 65 76 69 65 77 54 61 72 67 65 74  .e.previewTarget
60e0: 0a 20 20 20 20 20 20 20 20 7d 29 3b 0a 20 20 20  .        });.   
60f0: 20 20 20 7d 2c 0a 20 20 20 20 20 20 6f 6e 65 72     },.      oner
6100: 72 6f 72 3a 20 28 65 29 3d 3e 7b 0a 20 20 20 20  ror: (e)=>{.    
6110: 20 20 20 20 66 6f 73 73 69 6c 2e 66 65 74 63 68      fossil.fetch
6120: 2e 6f 6e 65 72 72 6f 72 28 65 29 3b 0a 20 20 20  .onerror(e);.   
6130: 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 28 22 45       callback("E
6140: 72 72 6f 72 20 66 65 74 63 68 69 6e 67 20 70 72  rror fetching pr
6150: 65 76 69 65 77 3a 20 22 2b 65 29 3b 0a 20 20 20  eview: "+e);.   
6160: 20 20 20 7d 0a 20 20 20 20 7d 29 3b 0a 20 20 20     }.    });.   
6170: 20 72 65 74 75 72 6e 20 74 68 69 73 3b 0a 20 20   return this;.  
6180: 7d 3b 0a 0a 20 20 2f 2a 2a 0a 20 20 20 20 20 55  };..  /**.     U
6190: 6e 64 6f 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ndo some of the 
61a0: 53 42 53 20 64 69 66 66 2d 72 65 6e 64 65 72 69  SBS diff-renderi
61b0: 6e 67 20 62 69 74 73 20 77 68 69 63 68 20 68 75  ng bits which hu
61c0: 72 74 20 75 73 20 6d 6f 72 65 20 74 68 61 6e 0a  rt us more than.
61d0: 20 20 20 20 20 74 68 65 79 20 68 65 6c 70 2e 2e       they help..
61e0: 2e 0a 20 20 2a 2f 0a 20 20 50 2e 74 77 65 61 6b  ..  */.  P.tweak
61f0: 53 62 73 44 69 66 66 73 32 20 3d 20 66 75 6e 63  SbsDiffs2 = func
6200: 74 69 6f 6e 28 29 7b 0a 20 20 20 20 69 66 28 31  tion(){.    if(1
6210: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 64  ){.      const d
6220: 74 20 3d 20 74 68 69 73 2e 65 2e 64 69 66 66 54  t = this.e.diffT
6230: 61 72 67 65 74 3b 0a 20 20 20 20 20 20 64 74 2e  arget;.      dt.
6240: 71 75 65 72 79 53 65 6c 65 63 74 6f 72 41 6c 6c  querySelectorAll
6250: 28 27 2e 73 62 73 64 69 66 66 63 6f 6c 73 20 2e  ('.sbsdiffcols .
6260: 64 69 66 66 74 78 74 63 6f 6c 27 29 2e 66 6f 72  difftxtcol').for
6270: 45 61 63 68 28 0a 20 20 20 20 20 20 20 20 28 64  Each(.        (d
6280: 74 63 29 3d 3e 7b 0a 20 20 20 20 20 20 20 20 20  tc)=>{.         
6290: 20 63 6f 6e 73 74 20 70 72 65 20 3d 20 64 74 63   const pre = dtc
62a0: 2e 71 75 65 72 79 53 65 6c 65 63 74 6f 72 28 27  .querySelector('
62b0: 70 72 65 27 29 3b 0a 20 20 20 20 20 20 20 20 20  pre');.         
62c0: 20 70 72 65 2e 73 74 79 6c 65 2e 77 69 64 74 68   pre.style.width
62d0: 20 3d 20 27 69 6e 69 74 69 61 6c 27 3b 0a 20 20   = 'initial';.  
62e0: 20 20 20 20 20 20 20 20 2f 2f 70 72 65 2e 72 65          //pre.re
62f0: 6d 6f 76 65 41 74 74 72 69 62 75 74 65 28 27 73  moveAttribute('s
6300: 74 79 6c 65 27 29 3b 0a 20 20 20 20 20 20 20 20  tyle');.        
6310: 20 20 2f 2f 63 6f 6e 73 6f 6c 65 2e 64 65 62 75    //console.debu
6320: 67 28 22 70 72 65 20 77 69 64 74 68 20 3d 22 2c  g("pre width =",
6330: 70 72 65 2e 73 74 79 6c 65 2e 77 69 64 74 68 29  pre.style.width)
6340: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6350: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74    );.    }.    t
6360: 68 69 73 2e 74 77 65 61 6b 53 62 73 44 69 66 66  his.tweakSbsDiff
6370: 73 28 29 3b 0a 20 20 7d 3b 0a 0a 20 20 2f 2a 2a  s();.  };..  /**
6380: 0a 20 20 20 20 20 46 65 74 63 68 65 73 20 74 68  .     Fetches th
6390: 65 20 63 6f 6e 74 65 6e 74 20 64 69 66 66 20 62  e content diff b
63a0: 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
63b0: 65 6e 74 73 20 61 6e 64 20 73 65 74 74 69 6e 67  ents and setting
63c0: 73 20 6f 66 0a 20 20 20 20 20 74 68 69 73 20 70  s of.     this p
63d0: 61 67 65 27 73 20 69 6e 70 75 74 20 66 69 65 6c  age's input fiel
63e0: 64 73 2c 20 61 6e 64 20 75 70 64 61 74 65 73 20  ds, and updates 
63f0: 74 68 65 20 55 49 20 77 69 74 68 20 74 68 65 20  the UI with the 
6400: 64 69 66 66 20 76 69 65 77 2e 0a 0a 20 20 20 20  diff view...    
6410: 20 52 65 74 75 72 6e 73 20 74 68 69 73 20 6f 62   Returns this ob
6420: 6a 65 63 74 2c 20 6e 6f 74 69 6e 67 20 74 68 61  ject, noting tha
6430: 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  t the operation 
6440: 69 73 20 61 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20  is async..  */. 
6450: 20 50 2e 64 69 66 66 20 3d 20 66 75 6e 63 74 69   P.diff = functi
6460: 6f 6e 20 66 28 73 62 73 29 7b 0a 20 20 20 20 69  on f(sbs){.    i
6470: 66 28 21 61 66 66 69 72 6d 50 61 67 65 4c 6f 61  f(!affirmPageLoa
6480: 64 65 64 28 29 29 20 72 65 74 75 72 6e 20 74 68  ded()) return th
6490: 69 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 6f  is;.    const co
64a0: 6e 74 65 6e 74 20 3d 20 74 68 69 73 2e 77 69 6b  ntent = this.wik
64b0: 69 43 6f 6e 74 65 6e 74 28 29 2c 0a 20 20 20 20  iContent(),.    
64c0: 20 20 20 20 20 20 73 65 6c 66 20 3d 20 74 68 69        self = thi
64d0: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 74 61 72  s,.          tar
64e0: 67 65 74 20 3d 20 74 68 69 73 2e 65 2e 64 69 66  get = this.e.dif
64f0: 66 54 61 72 67 65 74 3b 0a 20 20 20 20 63 6f 6e  fTarget;.    con
6500: 73 74 20 66 64 20 3d 20 6e 65 77 20 46 6f 72 6d  st fd = new Form
6510: 44 61 74 61 28 29 3b 0a 20 20 20 20 66 64 2e 61  Data();.    fd.a
6520: 70 70 65 6e 64 28 27 70 61 67 65 27 2c 74 68 69  ppend('page',thi
6530: 73 2e 77 69 6e 66 6f 2e 6e 61 6d 65 29 3b 0a 20  s.winfo.name);. 
6540: 20 20 20 66 64 2e 61 70 70 65 6e 64 28 27 73 62     fd.append('sb
6550: 73 27 2c 20 73 62 73 20 3f 20 31 20 3a 20 30 29  s', sbs ? 1 : 0)
6560: 3b 0a 20 20 20 20 66 64 2e 61 70 70 65 6e 64 28  ;.    fd.append(
6570: 27 63 6f 6e 74 65 6e 74 27 2c 63 6f 6e 74 65 6e  'content',conten
6580: 74 29 3b 0a 20 20 20 20 69 66 28 74 68 69 73 2e  t);.    if(this.
6590: 65 2e 73 65 6c 65 63 74 44 69 66 66 57 53 29 20  e.selectDiffWS) 
65a0: 66 64 2e 61 70 70 65 6e 64 28 27 77 73 27 2c 74  fd.append('ws',t
65b0: 68 69 73 2e 65 2e 73 65 6c 65 63 74 44 69 66 66  his.e.selectDiff
65c0: 57 53 2e 76 61 6c 75 65 29 3b 0a 20 20 20 20 46  WS.value);.    F
65d0: 2e 6d 65 73 73 61 67 65 28 0a 20 20 20 20 20 20  .message(.      
65e0: 22 46 65 74 63 68 69 6e 67 20 64 69 66 66 2e 2e  "Fetching diff..
65f0: 2e 22 0a 20 20 20 20 29 2e 66 65 74 63 68 28 27  .".    ).fetch('
6600: 77 69 6b 69 61 6a 61 78 2f 64 69 66 66 27 2c 7b  wikiajax/diff',{
6610: 0a 20 20 20 20 20 20 70 61 79 6c 6f 61 64 3a 20  .      payload: 
6620: 66 64 2c 0a 20 20 20 20 20 20 6f 6e 6c 6f 61 64  fd,.      onload
6630: 3a 20 66 75 6e 63 74 69 6f 6e 28 63 29 7b 0a 20  : function(c){. 
6640: 20 20 20 20 20 20 20 74 61 72 67 65 74 2e 69 6e         target.in
6650: 6e 65 72 48 54 4d 4c 20 3d 20 5b 0a 20 20 20 20  nerHTML = [.    
6660: 20 20 20 20 20 20 22 3c 64 69 76 3e 44 69 66 66        "<div>Diff
6670: 20 3c 63 6f 64 65 3e 5b 22 2c 0a 20 20 20 20 20   <code>[",.     
6680: 20 20 20 20 20 73 65 6c 66 2e 77 69 6e 66 6f 2e       self.winfo.
6690: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
66a0: 22 5d 3c 2f 63 6f 64 65 3e 20 26 72 61 72 72 3b  "]</code> &rarr;
66b0: 20 4c 6f 63 61 6c 20 45 64 69 74 73 3c 2f 64 69   Local Edits</di
66c0: 76 3e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 63  v>",.          c
66d0: 7c 7c 27 4e 6f 20 63 68 61 6e 67 65 73 2e 27 0a  ||'No changes.'.
66e0: 20 20 20 20 20 20 20 20 5d 2e 6a 6f 69 6e 28 27          ].join('
66f0: 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 73  ');.        if(s
6700: 62 73 29 20 50 2e 74 77 65 61 6b 53 62 73 44 69  bs) P.tweakSbsDi
6710: 66 66 73 32 28 29 3b 0a 20 20 20 20 20 20 20 20  ffs2();.        
6720: 46 2e 6d 65 73 73 61 67 65 28 27 55 70 64 61 74  F.message('Updat
6730: 65 64 20 64 69 66 66 2e 27 29 3b 0a 20 20 20 20  ed diff.');.    
6740: 20 20 20 20 73 65 6c 66 2e 74 61 62 73 2e 73 77      self.tabs.sw
6750: 69 74 63 68 54 6f 54 61 62 28 73 65 6c 66 2e 65  itchToTab(self.e
6760: 2e 74 61 62 73 2e 64 69 66 66 29 3b 0a 20 20 20  .tabs.diff);.   
6770: 20 20 20 7d 0a 20 20 20 20 7d 29 3b 0a 20 20 20     }.    });.   
6780: 20 72 65 74 75 72 6e 20 74 68 69 73 3b 0a 20 20   return this;.  
6790: 7d 3b 0a 0a 20 20 2f 2a 2a 0a 20 20 20 20 20 55  };..  /**.     U
67a0: 70 64 61 74 65 73 20 50 2e 77 69 6e 66 6f 20 66  pdates P.winfo f
67b0: 6f 72 20 63 65 72 74 61 69 6e 20 73 74 61 74 65  or certain state
67c0: 20 61 6e 64 20 73 74 61 73 68 65 73 20 50 2e 77   and stashes P.w
67d0: 69 6e 66 6f 2c 20 77 69 74 68 20 74 68 65 0a 20  info, with the. 
67e0: 20 20 20 20 63 75 72 72 65 6e 74 20 63 6f 6e 74      current cont
67f0: 65 6e 74 20 66 65 74 63 68 65 64 20 76 69 61 20  ent fetched via 
6800: 50 2e 77 69 6b 69 43 6f 6e 74 65 6e 74 28 29 2e  P.wikiContent().
6810: 0a 0a 20 20 20 20 20 49 66 20 70 61 73 73 65 64  ..     If passed
6820: 20 74 72 75 74 68 79 20 41 4e 44 20 74 68 65 20   truthy AND the 
6830: 73 74 61 73 68 20 61 6c 72 65 61 64 79 20 68 61  stash already ha
6840: 73 20 73 74 61 73 68 65 64 20 63 6f 6e 74 65 6e  s stashed conten
6850: 74 20 66 6f 72 0a 20 20 20 20 20 74 68 65 20 63  t for.     the c
6860: 75 72 72 65 6e 74 20 70 61 67 65 2c 20 6f 6e 6c  urrent page, onl
6870: 79 20 74 68 65 20 73 74 61 73 68 65 64 20 77 69  y the stashed wi
6880: 6e 66 6f 20 72 65 63 6f 72 64 20 69 73 20 75 70  nfo record is up
6890: 64 61 74 65 64 2c 20 65 6c 73 65 0a 20 20 20 20  dated, else.    
68a0: 20 62 6f 74 68 20 74 68 65 20 77 69 6e 66 6f 20   both the winfo 
68b0: 61 6e 64 20 63 6f 6e 74 65 6e 74 20 61 72 65 20  and content are 
68c0: 75 70 64 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  updated..  */.  
68d0: 50 2e 73 74 61 73 68 43 6f 6e 74 65 6e 74 43 68  P.stashContentCh
68e0: 61 6e 67 65 20 3d 20 66 75 6e 63 74 69 6f 6e 28  ange = function(
68f0: 6f 6e 6c 79 57 69 6e 66 6f 29 7b 0a 20 20 20 20  onlyWinfo){.    
6900: 69 66 28 61 66 66 69 72 6d 50 61 67 65 4c 6f 61  if(affirmPageLoa
6910: 64 65 64 28 74 72 75 65 29 29 7b 0a 20 20 20 20  ded(true)){.    
6920: 20 20 63 6f 6e 73 74 20 77 69 20 3d 20 74 68 69    const wi = thi
6930: 73 2e 77 69 6e 66 6f 3b 0a 20 20 20 20 20 20 77  s.winfo;.      w
6940: 69 2e 6d 69 6d 65 74 79 70 65 20 3d 20 50 2e 65  i.mimetype = P.e
6950: 2e 73 65 6c 65 63 74 4d 69 6d 65 74 79 70 65 2e  .selectMimetype.
6960: 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 69 66 28  value;.      if(
6970: 6f 6e 6c 79 57 69 6e 66 6f 20 26 26 20 24 73 74  onlyWinfo && $st
6980: 61 73 68 2e 68 61 73 53 74 61 73 68 65 64 43 6f  ash.hasStashedCo
6990: 6e 74 65 6e 74 28 77 69 29 29 7b 0a 20 20 20 20  ntent(wi)){.    
69a0: 20 20 20 20 24 73 74 61 73 68 2e 75 70 64 61 74      $stash.updat
69b0: 65 57 69 6e 66 6f 28 77 69 29 3b 0a 20 20 20 20  eWinfo(wi);.    
69c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
69d0: 20 24 73 74 61 73 68 2e 75 70 64 61 74 65 57 69   $stash.updateWi
69e0: 6e 66 6f 28 77 69 2c 20 50 2e 77 69 6b 69 43 6f  nfo(wi, P.wikiCo
69f0: 6e 74 65 6e 74 28 29 29 3b 0a 20 20 20 20 20 20  ntent());.      
6a00: 7d 0a 20 20 20 20 20 20 46 2e 6d 65 73 73 61 67  }.      F.messag
6a10: 65 28 22 53 74 61 73 68 65 64 20 63 68 61 6e 67  e("Stashed chang
6a20: 65 28 73 29 20 74 6f 20 70 61 67 65 20 5b 22 2b  e(s) to page ["+
6a30: 77 69 2e 6e 61 6d 65 2b 22 5d 2e 22 29 3b 0a 20  wi.name+"].");. 
6a40: 20 20 20 20 20 50 2e 75 70 64 61 74 65 50 61 67       P.updatePag
6a50: 65 54 69 74 6c 65 28 29 3b 0a 20 20 20 20 20 20  eTitle();.      
6a60: 24 73 74 61 73 68 2e 70 72 75 6e 65 28 29 3b 0a  $stash.prune();.
6a70: 20 20 20 20 20 20 74 68 69 73 2e 70 72 65 76 69        this.previ
6a80: 65 77 4e 65 65 64 73 55 70 64 61 74 65 20 3d 20  ewNeedsUpdate = 
6a90: 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  true;.    }.    
6aa0: 72 65 74 75 72 6e 20 74 68 69 73 3b 0a 20 20 7d  return this;.  }
6ab0: 3b 0a 0a 20 20 2f 2a 2a 0a 20 20 20 20 20 52 65  ;..  /**.     Re
6ac0: 6d 6f 76 65 73 20 61 6e 79 20 73 74 61 73 68 65  moves any stashe
6ad0: 64 20 73 74 61 74 65 20 66 6f 72 20 74 68 65 20  d state for the 
6ae0: 63 75 72 72 65 6e 74 20 50 2e 77 69 6e 66 6f 20  current P.winfo 
6af0: 28 69 66 20 73 65 74 29 20 66 72 6f 6d 0a 20 20  (if set) from.  
6b00: 20 20 20 46 2e 73 74 6f 72 61 67 65 2e 20 52 65     F.storage. Re
6b10: 74 75 72 6e 73 20 74 68 69 73 2e 0a 20 20 2a 2f  turns this..  */
6b20: 0a 20 20 50 2e 75 6e 73 74 61 73 68 43 6f 6e 74  .  P.unstashCont
6b30: 65 6e 74 20 3d 20 66 75 6e 63 74 69 6f 6e 28 29  ent = function()
6b40: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 77 69 6e 66  {.    const winf
6b50: 6f 20 3d 20 61 72 67 75 6d 65 6e 74 73 5b 30 5d  o = arguments[0]
6b60: 20 7c 7c 20 74 68 69 73 2e 77 69 6e 66 6f 3b 0a   || this.winfo;.
6b70: 20 20 20 20 69 66 28 77 69 6e 66 6f 29 7b 0a 20      if(winfo){. 
6b80: 20 20 20 20 20 74 68 69 73 2e 70 72 65 76 69 65       this.previe
6b90: 77 4e 65 65 64 73 55 70 64 61 74 65 20 3d 20 74  wNeedsUpdate = t
6ba0: 72 75 65 3b 0a 20 20 20 20 20 20 24 73 74 61 73  rue;.      $stas
6bb0: 68 2e 75 6e 73 74 61 73 68 28 77 69 6e 66 6f 29  h.unstash(winfo)
6bc0: 3b 0a 20 20 20 20 20 20 2f 2f 63 6f 6e 73 6f 6c  ;.      //consol
6bd0: 65 2e 64 65 62 75 67 28 22 55 6e 73 74 61 73 68  e.debug("Unstash
6be0: 65 64 22 2c 77 69 6e 66 6f 29 3b 0a 20 20 20 20  ed",winfo);.    
6bf0: 20 20 46 2e 6d 65 73 73 61 67 65 28 22 55 6e 73    F.message("Uns
6c00: 74 61 73 68 65 64 20 70 61 67 65 20 5b 22 2b 77  tashed page ["+w
6c10: 69 6e 66 6f 2e 6e 61 6d 65 2b 22 5d 2e 22 29 3b  info.name+"].");
6c20: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
6c30: 6e 20 74 68 69 73 3b 0a 20 20 7d 3b 0a 0a 20 20  n this;.  };..  
6c40: 2f 2a 2a 0a 20 20 20 20 20 43 6c 65 61 72 73 20  /**.     Clears 
6c50: 61 6c 6c 20 73 74 61 73 68 65 64 20 66 69 6c 65  all stashed file
6c60: 20 73 74 61 74 65 20 66 72 6f 6d 20 46 2e 73 74   state from F.st
6c70: 6f 72 61 67 65 2e 20 52 65 74 75 72 6e 73 20 74  orage. Returns t
6c80: 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 50 2e 63 6c  his..  */.  P.cl
6c90: 65 61 72 53 74 61 73 68 20 3d 20 66 75 6e 63 74  earStash = funct
6ca0: 69 6f 6e 28 29 7b 0a 20 20 20 20 24 73 74 61 73  ion(){.    $stas
6cb0: 68 2e 63 6c 65 61 72 28 29 3b 0a 20 20 20 20 72  h.clear();.    r
6cc0: 65 74 75 72 6e 20 74 68 69 73 3b 0a 20 20 7d 3b  eturn this;.  };
6cd0: 0a 0a 20 20 2f 2a 2a 0a 20 20 20 20 20 49 66 20  ..  /**.     If 
6ce0: 73 74 61 73 68 65 64 20 63 6f 6e 74 65 6e 74 20  stashed content 
6cf0: 66 6f 72 20 50 2e 77 69 6e 66 6f 20 65 78 69 73  for P.winfo exis
6d00: 74 73 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e  ts, it is return
6d10: 65 64 2c 20 65 6c 73 65 0a 20 20 20 20 20 75 6e  ed, else.     un
6d20: 64 65 66 69 6e 65 64 20 69 73 20 72 65 74 75 72  defined is retur
6d30: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 50 2e 63 6f  ned..  */.  P.co
6d40: 6e 74 65 6e 74 46 72 6f 6d 53 74 61 73 68 20 3d  ntentFromStash =
6d50: 20 66 75 6e 63 74 69 6f 6e 28 29 7b 0a 20 20 20   function(){.   
6d60: 20 72 65 74 75 72 6e 20 61 66 66 69 72 6d 50 61   return affirmPa
6d70: 67 65 4c 6f 61 64 65 64 28 74 72 75 65 29 20 3f  geLoaded(true) ?
6d80: 20 24 73 74 61 73 68 2e 73 74 61 73 68 65 64 43   $stash.stashedC
6d90: 6f 6e 74 65 6e 74 28 74 68 69 73 2e 77 69 6e 66  ontent(this.winf
6da0: 6f 29 20 3a 20 75 6e 64 65 66 69 6e 65 64 3b 0a  o) : undefined;.
6db0: 20 20 7d 3b 0a 0a 20 20 2f 2a 2a 0a 20 20 20 20    };..  /**.    
6dc0: 20 49 66 20 61 20 73 74 61 73 68 65 64 20 76 65   If a stashed ve
6dd0: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 67 69 76  rsion of the giv
6de0: 65 6e 20 77 69 6e 66 6f 20 6f 62 6a 65 63 74 20  en winfo object 
6df0: 65 78 69 73 74 73 20 28 73 61 6d 65 0a 20 20 20  exists (same.   
6e00: 20 20 66 69 6c 65 6e 61 6d 65 2f 63 68 65 63 6b    filename/check
6e10: 69 6e 20 76 61 6c 75 65 73 29 2c 20 72 65 74 75  in values), retu
6e20: 72 6e 20 69 74 2c 20 65 6c 73 65 20 72 65 74 75  rn it, else retu
6e30: 72 6e 20 75 6e 64 65 66 69 6e 65 64 2e 0a 20 20  rn undefined..  
6e40: 2a 2f 0a 20 20 50 2e 67 65 74 53 74 61 73 68 65  */.  P.getStashe
6e50: 64 57 69 6e 66 6f 20 3d 20 66 75 6e 63 74 69 6f  dWinfo = functio
6e60: 6e 28 77 69 6e 66 6f 29 7b 0a 20 20 20 20 72 65  n(winfo){.    re
6e70: 74 75 72 6e 20 24 73 74 61 73 68 2e 67 65 74 57  turn $stash.getW
6e80: 69 6e 66 6f 28 77 69 6e 66 6f 29 3b 0a 20 20 7d  info(winfo);.  }
6e90: 3b 0a 20 20 0a 7d 29 28 77 69 6e 64 6f 77 2e 66  ;.  .})(window.f
6ea0: 6f 73 73 69 6c 29 3b 0a                          ossil);.