Fossil SCM

fossil-scm / src / fossil.page.whistory.js
Source Blame History 164 lines
6ebf5c7… george 1 /* This script adds interactivity for wiki-history webpages.
6ebf5c7… george 2 *
6ebf5c7… george 3 * The main code is within the 'on-click' handler of the "diff" links.
6ebf5c7… george 4 * Instead of standard redirection it fills-in two hidden inputs with
6ebf5c7… george 5 * the appropriate values and submits the corresponding form.
6ebf5c7… george 6 * A special care should be taken if some intermediate edits are hidden.
6ebf5c7… george 7 *
6ebf5c7… george 8 * For the sake of compatibility with ascetic browsers the code tries
6ebf5c7… george 9 * to avoid modern API and ECMAScript constructs. This makes it less
6ebf5c7… george 10 * readable and may be reconsidered in the future.
6ebf5c7… george 11 */
6ebf5c7… george 12 window.addEventListener( 'load', function() {
6ebf5c7… george 13
abdf280… george 14 var form = document.getElementById("wh-form");
abdf280… george 15 form.method = "GET";
abdf280… george 16 var csrf = form.querySelector("input[name='csrf']");
abdf280… george 17 if( csrf ) form.removeChild( csrf );
6ebf5c7… george 18
6ebf5c7… george 19 var wh_id = document.getElementById("wh-id" );
6ebf5c7… george 20 var wh_pid = document.getElementById("wh-pid");
6ebf5c7… george 21 var wh_cleaner = document.getElementById("wh-cleaner");
6ebf5c7… george 22 var wh_collapser = document.getElementById("wh-collapser");
6ebf5c7… george 23
6ebf5c7… george 24 var wh_radios = []; // user-visible controls for baseline selection
6ebf5c7… george 25 var wh_hidden = 0; // current number of hidden (collapsed) rows
6ebf5c7… george 26 var wh_selected = -1; // index of the currently selected radio-button
6ebf5c7… george 27
6ebf5c7… george 28 var wh_onRadio = function( event ){
6ebf5c7… george 29
6ebf5c7… george 30 var indx = event.target.indx;
6ebf5c7… george 31 if( wh_selected == indx ){
6ebf5c7… george 32
6ebf5c7… george 33 wh_selected = -1;
6ebf5c7… george 34 event.target.checked = false;
6ebf5c7… george 35 }
6ebf5c7… george 36 else wh_selected = indx;
6ebf5c7… george 37 }
6ebf5c7… george 38 var wh_onDifflink = function( event ){
6ebf5c7… george 39
6ebf5c7… george 40 event.preventDefault();
6ebf5c7… george 41 var indx = event.target.indx;
6ebf5c7… george 42 wh_id.value = wh_radios[indx].value;
6ebf5c7… george 43
6ebf5c7… george 44 if( wh_hidden > 0 ){
6ebf5c7… george 45
6ebf5c7… george 46 var p = indx + 1;
6ebf5c7… george 47 if( wh_selected >= 0 ){
6ebf5c7… george 48
6ebf5c7… george 49 var tr = wh_radios[wh_selected].parentElement.parentElement;
6ebf5c7… george 50 if( ! tr.hidden )
6ebf5c7… george 51 p = wh_selected;
6ebf5c7… george 52 }
6ebf5c7… george 53 while( p < wh_radios.length ){
6ebf5c7… george 54
6ebf5c7… george 55 if( ! wh_radios[p].parentElement.parentElement.hidden )
6ebf5c7… george 56 break;
6ebf5c7… george 57 p++;
6ebf5c7… george 58 }
6ebf5c7… george 59 if( p < wh_radios.length ){
6ebf5c7… george 60
6ebf5c7… george 61 wh_pid.value = wh_radios[p].value;
6ebf5c7… george 62 wh_pid.checked = true;
6ebf5c7… george 63 }
6ebf5c7… george 64 else { // just render the wiki for the case of the first major edit
6ebf5c7… george 65
6ebf5c7… george 66 var path = document.location.pathname.split("/");
6ebf5c7… george 67 path.pop();
6ebf5c7… george 68 var newpath = path.join("/") + "/info/" + wh_radios[indx].value;
6ebf5c7… george 69 document.location = document.location.origin + newpath;
6ebf5c7… george 70 return;
6ebf5c7… george 71 }
6ebf5c7… george 72 }
6ebf5c7… george 73 else if( wh_selected >= 0 ) {
6ebf5c7… george 74
6ebf5c7… george 75 wh_pid.value = wh_radios[wh_selected].value;
6ebf5c7… george 76 wh_pid.checked = true;
6ebf5c7… george 77 }
6ebf5c7… george 78 else wh_pid.checked = false;
6ebf5c7… george 79
6ebf5c7… george 80 document.getElementById("wh-form").submit();
6ebf5c7… george 81 }
6ebf5c7… george 82 var wh_onCleaner = function() {
6ebf5c7… george 83
6ebf5c7… george 84 if( wh_selected >= 0 ) {
6ebf5c7… george 85
6ebf5c7… george 86 wh_radios[wh_selected].checked = false;
6ebf5c7… george 87 wh_selected = -1;
6ebf5c7… george 88 }
6ebf5c7… george 89 }
6ebf5c7… george 90 var wh_onCollapser = function( event ){
6ebf5c7… george 91
6ebf5c7… george 92 var collapsing = ( wh_hidden == 0 );
6ebf5c7… george 93 for( var k = 0; k < wh_radios.length; k++ ){
6ebf5c7… george 94
6ebf5c7… george 95 var radio = wh_radios[k];
6ebf5c7… george 96 var tr = radio.parentElement.parentElement;
6ebf5c7… george 97 if( tr.className == "wh-intermediate" ){
6ebf5c7… george 98
6ebf5c7… george 99 if( tr.hidden = ! tr.hidden )
6ebf5c7… george 100 wh_hidden++;
6ebf5c7… george 101 else
6ebf5c7… george 102 wh_hidden--;
6ebf5c7… george 103
6ebf5c7… george 104 } else if( radio.iterspan )
6ebf5c7… george 105 radio.iterspan.hidden = ! collapsing;
6ebf5c7… george 106 }
6ebf5c7… george 107 if( wh_hidden > 0 ) {
6ebf5c7… george 108
6ebf5c7… george 109 wh_collapser.title="Show intermediate edits";
6ebf5c7… george 110 wh_collapser.innerHTML = "&emsp;&#9851; " + wh_hidden;
6ebf5c7… george 111 }
6ebf5c7… george 112 else {
6ebf5c7… george 113
6ebf5c7… george 114 wh_collapser.title="Hide intermediate edits";
6ebf5c7… george 115 wh_collapser.innerHTML = "&emsp;&#9842;"
6ebf5c7… george 116 }
6ebf5c7… george 117 }
6ebf5c7… george 118
6ebf5c7… george 119 var inputs = document.getElementsByTagName("input");
6ebf5c7… george 120 for( var k = 0, indx = 0; k < inputs.length; k++ ) {
6ebf5c7… george 121
6ebf5c7… george 122 var r = inputs[k];
6ebf5c7… george 123 if( r.type == "radio" && r.name == "baseline" ) {
6ebf5c7… george 124
6ebf5c7… george 125 wh_radios.push( r );
6ebf5c7… george 126 r.indx = indx++;
6ebf5c7… george 127 r.addEventListener( "click", wh_onRadio );
6ebf5c7… george 128 r.disabled = false;
6ebf5c7… george 129 var td = r.parentElement.nextElementSibling;
6ebf5c7… george 130 r.iterspan = td.getElementsByTagName("span")[0];
6ebf5c7… george 131 }
6ebf5c7… george 132 }
6ebf5c7… george 133 for( var edits = 0, k = wh_radios.length - 1; k >= 0; k-- ) {
6ebf5c7… george 134
6ebf5c7… george 135 var td = wh_radios[k].parentElement.nextElementSibling;
6ebf5c7… george 136 if( td.parentElement.className == "wh-intermediate" )
6ebf5c7… george 137
6ebf5c7… george 138 edits++;
6ebf5c7… george 139
6ebf5c7… george 140 else if( edits > 0 ){
6ebf5c7… george 141
6ebf5c7… george 142 var span = td.getElementsByTagName("span")[0];
6ebf5c7… george 143 span.innerHTML = "&ensp;&#9842;" + edits;
6ebf5c7… george 144 wh_radios[k].iterspan = span;
6ebf5c7… george 145 edits = 0;
6ebf5c7… george 146 // also: &#8746; (union) &#931; (sigma) &#215; (times)
6ebf5c7… george 147 }
6ebf5c7… george 148 }
6ebf5c7… george 149 var links = document.getElementsByTagName("a");
6ebf5c7… george 150 for( var i = 0, indx = 0; i < links.length; i++ ) {
6ebf5c7… george 151
6ebf5c7… george 152 var l = links[i];
6ebf5c7… george 153 if( l.className == "wh-difflink" ){
6ebf5c7… george 154
6ebf5c7… george 155 l.indx = indx++;
6ebf5c7… george 156 l.addEventListener( "click", wh_onDifflink );
6ebf5c7… george 157 }
6ebf5c7… george 158 }
6ebf5c7… george 159 wh_cleaner.addEventListener( "click", wh_onCleaner );
6ebf5c7… george 160 wh_collapser.addEventListener( "click", wh_onCollapser );
6ebf5c7… george 161 wh_collapser.title="Hide intermediate edits";
6ebf5c7… george 162 wh_collapser.hidden = false;
6ebf5c7… george 163
6ebf5c7… george 164 }); // window.addEventListener( 'load' ...

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button