@@ -798,5 +798,159 @@
798 798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
var txJson = dataObj.textContent || dataObj.innerText;
799 799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
var tx = JSON.parse(txJson);
800 800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TimelineGraph(tx);
801 801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
802 802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}());
803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Timeline keyboard navigation shortcuts:
806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** N - Select next (newer) entry.
808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** M - Select previous (older) entry.
809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** J - View timeline of selected entry.
810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** K - View details of selected entry.
811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** L - Disable keyboard navigation mode.
812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** When navigating to a page with a timeline display, such as /timeline, /info,
814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** or /finfo, keyboard navigation mode needs to be "activated" first, i.e. if no
815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** timeline entry is focused yet, pressing any of the listed keys (except L)
816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sets the visual focus indicator to the highlighted or current (check-out)
817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** entry if available, or to the topmost entry otherwise. A session cookie[0] is
818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** used to direct pages loaded in the future to enable keyboard navigation mode
819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and automatically set the focus indicator to the highlighted, current, or
820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** topmost entry. Pressing N and M on the /timeline page while the topmost or
821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** bottommost entry is focused loads the next or previous page if available,
822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** similar to the [↑ More] and [↓ More] links. Pressing L disables keyboard
823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** navigation, i.e. removes the focus indicator and deletes the session cookie.
824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** When navigating backwards or forwards in browser history, the focused entry
825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is restored using a hidden[1] input field.
826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** [0]: The lifetime and values of cookies can be tracked on the /cookies page.
828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** A session cookie is preferred over other storage APIs because Fossil already
829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** requires cookies to be enabled for reasonable functionality, and it's more
830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** likely that other storage APIs are blocked by users for privacy reasons, for
831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** example.
832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** [1]: This feature only works with a normal (text) input field hidden by CSS
833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** styles, instead of a true hidden (by type) input field, so may cause side
834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** effects, for example with screen readers. Moreover, this feature currently
835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** only works with Chrome, but not with FF or IE.
836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Ideas and TODOs:
838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** o Shortcut to select the topmost or bottommost entry, either by separate
840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** key, or with modifiers (SHIFT+N, SHIFT+M)?
841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** o Improve scrolling the focused element into view for browsers without the
842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Element.scrollIntoViewIfNeeded() function, maybe with a Polyfill, or
843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** something similar to the scrollToSelected() function in this source file.
844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (function(){
846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ window.addEventListener('load',function(){
847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ function focusDefaultId(){
848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var tn = document.querySelector('.timelineSelected .tl-nodemark') ||
849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ document.querySelector('.timelineCurrent .tl-nodemark');
850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return tn ? tn.id : 'm1';
851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ function focusNextId(id,dx){
853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var m = /^m(\d+)$/.exec(id);
854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return m!==null ? 'm' + (parseInt(m[1]) + dx) : null;
855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ function focusRowinfoFromId(id){
857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(var i=0; true; i++){
858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var td = document.getElementById('timeline-data-' + i);
859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !td ) break;
860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var ti = JSON.parse(td.textContent || td.innerText);
861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for( var k=0; k<ti.rowinfo.length; k++ ){
862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( id=='m' + ti.rowinfo[k].id ) return {
863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 'b': ti.baseUrl, 'h': ti.rowinfo[k].h
864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return null;
868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ function focusVisualize(id,scroll){
870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var td = document.querySelector('.timelineFocused');
871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( td ) td.classList.remove('timelineFocused');
872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !id ) return true;
873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var tn = document.getElementById(id);
874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( tn ){
875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ td = tn.parentElement.nextElementSibling;
876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( td ) {
877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ td.classList.add('timelineFocused');
878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( scroll ){
879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( td.scrollIntoViewIfNeeded ) td.scrollIntoViewIfNeeded();
880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else td.scrollIntoView(false);
881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return true;
883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return false;
886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var kf = document.getElementById('timeline-kbfocus');
888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !kf ){
889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ kf = document.createElement('input');
890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ kf.type = 'text';
891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ kf.style = 'display:none;visibility:hidden;';
892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ kf.id = 'timeline-kbfocus';
893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ document.body.appendChild(kf);
894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ document.addEventListener('keydown',function(evt){
896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var
897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ kNEXT = 78 /* N */,
898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ kPREV = 77 /* M */,
899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ kTMLN = 74 /* J */,
900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ kVIEW = 75 /* K */,
901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ kDONE = 76 /* L */;
902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var key = evt.which || evt.keyCode;
903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( evt.target.tagName=='INPUT' ) return;
904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( evt.altKey || evt.ctrlKey || evt.shiftKey ) return;
905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var dx = 0;
906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( key==kPREV ) dx++;
907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else if( key==kNEXT ) dx--;
908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else if( key!=kTMLN && key!=kVIEW && key!=kDONE ) return;
909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var kf = document.getElementById('timeline-kbfocus');
910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( key==kDONE ){
911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ kf.value = '';
912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ focusVisualize(null,false);
913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ document.cookie =
914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 'fossil_timeline_kbnav=;expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/';
915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ document.cookie = 'fossil_timeline_kbnav=1;expires=0;path=/';
918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var id = kf.value;
919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( id && dx==0 ){
920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var ri = focusRowinfoFromId(id);
921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( ri ){
922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var page = ( key==75/*K*/ ) ? '/info/' : '/timeline?c=';
923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var href = ri.b + page + ri.h;
924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( href!=location.href.slice(-href.length) ){
925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ location.href = href;
926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else if ( id && dx!=0 ){
931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id = focusNextId(id,dx);
932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( id && !document.getElementById(id) ){
933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var btn =
934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ document.querySelector('.tl-button-' + ( dx>0 ? 'prev' : 'next' ));
935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( btn ) btn.click();
936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else if ( !id ) id = focusDefaultId();
940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ kf.value = id;
941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ focusVisualize(id,true);
942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }/*,true*/);
943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ window.addEventListener('pageshow',function(evt){
944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var id;
945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var kf = document.getElementById('timeline-kbfocus');
946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( kf ) id = kf.value;
947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !id || !focusVisualize(id,false) ){
948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( document.cookie.match(/fossil_timeline_kbnav=1/) ){
949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id = focusDefaultId();
950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ kf.value = id;
951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( id ) focusVisualize(id,false);
952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },false);
955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },false);
956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }());
803 957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!