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