Fossil SCM

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

Keyboard Shortcuts

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