liquid_feedback_frontend
view static/js/voting.js @ 111:bf885faf3452
add initiator support in delegation
if a delegation is issued from the initiative view, the initiators
from that one are added to the delegation target list. this makes it easier to delegate to the author without the need to add him to the contact list.
if a delegation is issued from the initiative view, the initiators
from that one are added to the delegation target list. this makes it easier to delegate to the author without the need to add him to the contact list.
author | Daniel Poelzleithner <poelzi@poelzi.org> |
---|---|
date | Mon Sep 20 20:32:04 2010 +0200 (2010-09-20) |
parents | 00d1004545f1 |
children | 7492497005bd |
line source
1 voting_text_approval_single = "Approval"
2 voting_text_approval_multi = "Approval"
3 voting_text_first_preference_single = "Approval (first preference)"
4 voting_text_first_preference_multi = "Approval (first preference)"
5 voting_text_second_preference_single = "Approval (second preference)"
6 voting_text_second_preference_multi = "Approval (second preference)"
7 voting_text_third_preference_single = "Approval (third preference)"
8 voting_text_third_preference_multi = "Approval (third preference)"
9 voting_text_numeric_preference_single = "Approval (#th preference)"
10 voting_text_numeric_preference_multi = "Approval (#th preference)"
11 voting_text_abstention_single = "Abstention"
12 voting_text_abstention_multi = "Abstention"
13 voting_text_disapproval_above_one_single = "Disapproval (prefer to lower block)"
14 voting_text_disapproval_above_one_multi = "Disapproval (prefer to lower block)"
15 voting_text_disapproval_above_many_single = "Disapproval (prefer to lower blocks)"
16 voting_text_disapproval_above_many_multi = "Disapproval (prefer to lower blocks)"
17 voting_text_disapproval_above_last_single = "Disapproval (prefer to last block)"
18 voting_text_disapproval_above_last_multi = "Disapproval (prefer to last block)"
19 voting_text_disapproval_single = "Disapproval"
20 voting_text_disapproval_multi = "Disapproval"
22 function voting_setCategoryHeadings() {
23 var approvalCount = 0;
24 var disapprovalCount = 0;
25 var sections = document.getElementById("voting").childNodes;
26 for (var i=0; i<sections.length; i++) {
27 var section = sections[i];
28 if (section.className == "approval") approvalCount++;
29 if (section.className == "disapproval") disapprovalCount++;
30 }
31 var approvalIndex = 0;
32 var disapprovalIndex = 0;
33 for (var i=0; i<sections.length; i++) {
34 var section = sections[i];
35 if (
36 section.className == "approval" ||
37 section.className == "abstention" ||
38 section.className == "disapproval"
39 ) {
40 var setHeading = function(heading) {
41 var headingNodes = section.childNodes;
42 for (var j=0; j<headingNodes.length; j++) {
43 var headingNode = headingNodes[j];
44 if (headingNode.className == "cathead") {
45 headingNode.textContent = heading;
46 }
47 }
48 }
49 var count = 0;
50 var entries = section.childNodes;
51 for (var j=0; j<entries.length; j++) {
52 var entry = entries[j];
53 if (entry.className == "movable") count++;
54 }
55 if (section.className == "approval") {
56 if (approvalCount > 1) {
57 if (approvalIndex == 0) {
58 if (count == 1) setHeading(voting_text_first_preference_single);
59 else setHeading(voting_text_first_preference_multi);
60 } else if (approvalIndex == 1) {
61 if (count == 1) setHeading(voting_text_second_preference_single);
62 else setHeading(voting_text_second_preference_multi);
63 } else if (approvalIndex == 2) {
64 if (count == 1) setHeading(voting_text_third_preference_single);
65 else setHeading(voting_text_third_preference_multi);
66 } else {
67 var text;
68 if (count == 1) text = voting_text_numeric_preference_single;
69 else text = voting_text_numeric_preference_multi;
70 text = text.replace(/#/, "" + (approvalIndex + 1))
71 setHeading(text);
72 }
73 } else {
74 if (count == 1) setHeading(voting_text_approval_single);
75 else setHeading(voting_text_approval_multi);
76 }
77 approvalIndex++;
78 } else if (section.className == "abstention") {
79 if (count == 1) setHeading(voting_text_abstention_single);
80 else setHeading(voting_text_abstention_multi);
81 } else if (section.className == "disapproval") {
82 if (disapprovalCount > disapprovalIndex + 2) {
83 if (count == 1) setHeading(voting_text_disapproval_above_many_single);
84 else setHeading(voting_text_disapproval_above_many_multi);
85 } else if (disapprovalCount == 2 && disapprovalIndex == 0) {
86 if (count == 1) setHeading(voting_text_disapproval_above_one_single);
87 else setHeading(voting_text_disapproval_above_one_multi);
88 } else if (disapprovalIndex == disapprovalCount - 2) {
89 if (count == 1) setHeading(voting_text_disapproval_above_last_single);
90 else setHeading(voting_text_disapproval_above_last_multi);
91 } else {
92 if (count == 1) setHeading(voting_text_disapproval_single);
93 else setHeading(voting_text_disapproval_multi);
94 }
95 disapprovalIndex++;
96 }
97 }
98 }
99 }
100 function voting_move(element, up, dropX, dropY) {
101 if (typeof(element) == "string") element = document.getElementById(element);
102 var mouse = (up == null);
103 var oldParent = element.parentNode;
104 if (mouse) var centerY = dropY + element.clientHeight / 2;
105 var approvalCount = 0;
106 var disapprovalCount = 0;
107 var mainDiv = document.getElementById("voting");
108 var sections = mainDiv.childNodes;
109 for (var i=0; i<sections.length; i++) {
110 var section = sections[i];
111 if (section.className == "approval") approvalCount++;
112 if (section.className == "disapproval") disapprovalCount++;
113 }
114 if (mouse) {
115 for (var i=0; i<sections.length; i++) {
116 var section = sections[i];
117 if (
118 section.className == "approval" ||
119 section.className == "abstention" ||
120 section.className == "disapproval"
121 ) {
122 if (
123 centerY >= section.offsetTop &&
124 centerY < section.offsetTop + section.clientHeight
125 ) {
126 var entries = section.childNodes;
127 for (var j=0; j<entries.length; j++) {
128 var entry = entries[j];
129 if (entry.className == "movable") {
130 if (centerY < entry.offsetTop + entry.clientHeight / 2) {
131 if (element != entry) {
132 oldParent.removeChild(element);
133 section.insertBefore(element, entry);
134 }
135 break;
136 }
137 }
138 }
139 if (j == entries.length) {
140 oldParent.removeChild(element);
141 section.appendChild(element);
142 }
143 break;
144 }
145 }
146 }
147 if (i == sections.length) {
148 var newSection = document.createElement("div");
149 var cathead = document.createElement("div");
150 cathead.setAttribute("class", "cathead");
151 newSection.appendChild(cathead);
152 for (var i=0; i<sections.length; i++) {
153 var section = sections[i];
154 if (
155 section.className == "approval" ||
156 section.className == "abstention" ||
157 section.className == "disapproval"
158 ) {
159 if (centerY < section.offsetTop + section.clientHeight / 2) {
160 if (section.className == "disapproval") {
161 newSection.setAttribute("class", "disapproval");
162 disapprovalCount++;
163 } else {
164 newSection.setAttribute("class", "approval");
165 approvalCount++;
166 }
167 mainDiv.insertBefore(newSection, section);
168 break;
169 }
170 }
171 }
172 if (i == sections.length) {
173 newSection.setAttribute("class", "disapproval");
174 disapprovalCount++;
175 mainDiv.appendChild(newSection);
176 }
177 oldParent.removeChild(element);
178 newSection.appendChild(element);
179 }
180 } else {
181 var oldFound = false;
182 var prevSection = null;
183 var nextSection = null;
184 for (var i=0; i<sections.length; i++) {
185 var section = sections[i];
186 if (
187 section.className == "approval" ||
188 section.className == "abstention" ||
189 section.className == "disapproval"
190 ) {
191 if (oldFound) {
192 nextSection = section;
193 break;
194 } else if (section == oldParent) {
195 oldFound = true;
196 } else {
197 prevSection = section;
198 }
199 }
200 }
201 var create;
202 if (oldParent.className == "abstention") {
203 create = true;
204 } else {
205 create = false;
206 for (var i=0; i<oldParent.childNodes.length; i++) {
207 var entry = oldParent.childNodes[i];
208 if (entry.className == "movable") {
209 if (entry != element) {
210 create = true;
211 break;
212 }
213 }
214 }
215 }
216 var newSection;
217 if (create) {
218 newSection = document.createElement("div");
219 var cathead = document.createElement("div");
220 cathead.setAttribute("class", "cathead");
221 newSection.appendChild(cathead);
222 if (
223 oldParent.className == "approval" ||
224 (oldParent.className == "abstention" && up)
225 ) {
226 newSection.setAttribute("class", "approval");
227 approvalCount++;
228 } else {
229 newSection.setAttribute("class", "disapproval");
230 disapprovalCount++;
231 }
232 if (up) {
233 mainDiv.insertBefore(newSection, oldParent);
234 } else {
235 if (nextSection) mainDiv.insertBefore(newSection, nextSection);
236 else mainDiv.appendChild(newSection);
237 }
238 } else {
239 if (up) newSection = prevSection;
240 else newSection = nextSection;
241 }
242 if (newSection) {
243 oldParent.removeChild(element);
244 if (create || up) {
245 newSection.appendChild(element);
246 } else {
247 var inserted = false;
248 for (var i=0; i<newSection.childNodes.length; i++) {
249 var entry = newSection.childNodes[i];
250 if (entry.className == "movable") {
251 newSection.insertBefore(element, entry);
252 inserted = true;
253 break;
254 }
255 }
256 if (!inserted) newSection.appendChild(element);
257 }
258 }
259 }
260 // sections = mainDiv.childNodes;
261 for (i=0; i<sections.length; i++) {
262 var section = sections[i];
263 if (
264 (section.className == "approval" && approvalCount > 1) ||
265 (section.className == "disapproval" && disapprovalCount > 1)
266 ) {
267 var entries = section.childNodes;
268 for (var j=0; j<entries.length; j++) {
269 var entry = entries[j];
270 if (entry.className == "movable") break;
271 }
272 if (j == entries.length) {
273 section.parentNode.removeChild(section);
274 }
275 }
276 }
277 voting_setCategoryHeadings();
278 }
279 function elementDropped(element, dropX, dropY) {
280 voting_move(element, null, dropX, dropY);
281 }
282 window.addEventListener("load", function(event) {
283 voting_setCategoryHeadings();
284 var mainDiv = document.getElementById("voting");
285 var form = document.getElementById("voting_form");
286 var elements = document.getElementsByTagName("input");
287 for (var i=0; i<elements.length; i++) {
288 var element = elements[i];
289 if (element.className == "voting_done") {
290 element.addEventListener("click", function(event) {
291 var scoringString = "";
292 var approvalCount = 0;
293 var disapprovalCount = 0;
294 var sections = mainDiv.childNodes;
295 for (var j=0; j<sections.length; j++) {
296 var section = sections[j];
297 if (section.className == "approval") approvalCount++;
298 if (section.className == "disapproval") disapprovalCount++;
299 }
300 var approvalIndex = 0;
301 var disapprovalIndex = 0;
302 for (var j=0; j<sections.length; j++) {
303 var section = sections[j];
304 if (
305 section.className == "approval" ||
306 section.className == "abstention" ||
307 section.className == "disapproval"
308 ) {
309 var score;
310 if (section.className == "approval") {
311 score = approvalCount - approvalIndex;
312 approvalIndex++;
313 } else if (section.className == "abstention") {
314 score = 0;
315 } else if (section.className == "disapproval") {
316 score = -1 - disapprovalIndex;
317 disapprovalIndex++;
318 }
319 var entries = section.childNodes;
320 for (var k=0; k<entries.length; k++) {
321 var entry = entries[k];
322 if (entry.className == "movable") {
323 var id = entry.id.match(/[0-9]+/);
324 var field = document.createElement("input");
325 scoringString += id + ":" + score + ";";
326 }
327 }
328 }
329 }
330 var fields = form.childNodes;
331 for (var j=0; j<fields.length; j++) {
332 var field = fields[j];
333 if (field.name == "scoring") {
334 field.setAttribute("value", scoringString);
335 form.submit();
336 return;
337 }
338 }
339 alert('Hidden input field named "scoring" not found.');
340 }, false);
341 }
342 }
343 }, false);
344 function voting_moveUp(element) {
345 return voting_move(element, true);
346 }
347 function voting_moveDown(element) {
348 return voting_move(element, false);
349 }