liquid_feedback_frontend
view static/js/voting.js @ 9:0ee1e0c42d4c
Version beta5
Minor security fix: Added missing security filter for admin section. Reading of member listing including login names was possible for all users. Write access has not been possible though.
Changing of name and login is possible while a history of these changes is written and accessible by all users.
Statistics shown in area list
Trimming of user input also converts multiple whitespaces to single space character.
Minor security fix: Added missing security filter for admin section. Reading of member listing including login names was possible for all users. Write access has not been possible though.
Changing of name and login is possible while a history of these changes is written and accessible by all users.
Statistics shown in area list
Trimming of user input also converts multiple whitespaces to single space character.
| author | bsw | 
|---|---|
| date | Mon Jan 04 12:00:00 2010 +0100 (2010-01-04) | 
| parents | afd9f769c7ae | 
| children | 00d1004545f1 | 
 line source
     1 function setCategoryHeadings() {
     2   var approvalCount = 0;
     3   var disapprovalCount = 0;
     4   var sections = document.getElementById("voting").childNodes;
     5   for (var i=0; i<sections.length; i++) {
     6     var section = sections[i];
     7     if (section.className == "approval")       approvalCount++;
     8     if (section.className == "disapproval") disapprovalCount++;
     9   }
    10   var approvalIndex = 0;
    11   var disapprovalIndex = 0;
    12   for (var i=0; i<sections.length; i++) {
    13     var section = sections[i];
    14     if (
    15       section.className == "approval" ||
    16       section.className == "abstention" ||
    17       section.className == "disapproval"
    18     ) {
    19       var setHeading = function(heading) {
    20         var headingNodes = section.childNodes;
    21         for (var j=0; j<headingNodes.length; j++) {
    22           var headingNode = headingNodes[j];
    23           if (headingNode.className == "cathead") {
    24             headingNode.textContent = heading;
    25           }
    26         }
    27       }
    28       var count = 0;
    29       var entries = section.childNodes;
    30       for (var j=0; j<entries.length; j++) {
    31         var entry = entries[j];
    32         if (entry.className == "movable") count++;
    33       }
    34       if (section.className == "approval") {
    35         if (approvalCount > 1) {
    36           if (approvalIndex == 0) {
    37             if (count == 1) setHeading("Zustimmung (Erstwunsch)");
    38             else setHeading("Zustimmung (Erstwünsche)");
    39           } else if (approvalIndex == 1) {
    40             if (count == 1) setHeading("Zustimmung (Zweitwunsch)");
    41             else setHeading("Zustimmung (Zweitwünsche)");
    42           } else if (approvalIndex == 2) {
    43             if (count == 1) setHeading("Zustimmung (Drittwunsch)");
    44             else setHeading("Zustimmung (Drittwünsche)");
    45           } else {
    46             if (count == 1) setHeading("Zustimmung (" + (approvalIndex+1) + ".-Wunsch)");
    47             else setHeading("Zustimmung (" + (approvalIndex+1) + ".-Wünsche)");
    48           }
    49         } else {
    50           setHeading("Zustimmung");
    51         }
    52         approvalIndex++;
    53       } else if (section.className == "abstention") {
    54         setHeading("Enthaltung");
    55       } else if (section.className == "disapproval") {
    56         if (disapprovalCount > disapprovalIndex + 2) {
    57           setHeading("Ablehnung (jedoch Bevorzugung gegenüber unteren Ablehnungsblöcken)")
    58         } else if (disapprovalCount == 2 && disapprovalIndex == 0) {
    59           setHeading("Ablehnung (jedoch Bevorzugung gegenüber unterem Ablehnungsblock)")
    60         } else if (disapprovalIndex == disapprovalCount - 2) {
    61           setHeading("Ablehnung (jedoch Bevorzugung gegenüber letztem Ablehnungsblock)")
    62         } else {
    63           setHeading("Ablehnung");
    64         }
    65         disapprovalIndex++;
    66       }
    67     }
    68   }
    69 }
    70 function elementDropped(element, dropX, dropY) {
    71   var oldParent = element.parentNode;
    72   var centerY = dropY + element.clientHeight / 2
    73   var approvalCount = 0;
    74   var disapprovalCount = 0;
    75   var mainDiv = document.getElementById("voting");
    76   var sections = mainDiv.childNodes;
    77   for (var i=0; i<sections.length; i++) {
    78     var section = sections[i];
    79     if (section.className == "approval")       approvalCount++;
    80     if (section.className == "disapproval") disapprovalCount++;
    81   }
    82   for (var i=0; i<sections.length; i++) {
    83     var section = sections[i];
    84     if (
    85       section.className == "approval" ||
    86       section.className == "abstention" ||
    87       section.className == "disapproval"
    88     ) {
    89       if (
    90         centerY >= section.offsetTop &&
    91         centerY <  section.offsetTop + section.clientHeight
    92       ) {
    93         var entries = section.childNodes;
    94         for (var j=0; j<entries.length; j++) {
    95           var entry = entries[j];
    96           if (entry.className == "movable") {
    97             if (centerY < entry.offsetTop + entry.clientHeight / 2) {
    98               if (element != entry) {
    99                 oldParent.removeChild(element);
   100                 section.insertBefore(element, entry);
   101               }
   102               break;
   103             }
   104           }
   105         }
   106         if (j == entries.length) {
   107           oldParent.removeChild(element);
   108           section.appendChild(element);
   109         }
   110         break;
   111       }
   112     }
   113   }
   114   if (i == sections.length) {
   115     var newSection = document.createElement("div");
   116     var cathead = document.createElement("div");
   117     cathead.setAttribute("class", "cathead");
   118     newSection.appendChild(cathead);
   119     for (var i=0; i<sections.length; i++) {
   120       var section = sections[i];
   121       if (
   122         section.className == "approval" ||
   123         section.className == "abstention" ||
   124         section.className == "disapproval"
   125       ) {
   126         if (centerY < section.offsetTop + section.clientHeight / 2) {
   127           if (section.className == "disapproval") {
   128             newSection.setAttribute("class", "disapproval");
   129             disapprovalCount++;
   130           } else {
   131             newSection.setAttribute("class", "approval");
   132             approvalCount++;
   133           }
   134           mainDiv.insertBefore(newSection, section);
   135           break;
   136         }
   137       }
   138     }
   139     if (i == sections.length) {
   140       newSection.setAttribute("class", "disapproval");
   141       disapprovalCount++;
   142       mainDiv.appendChild(newSection);
   143     }
   144     oldParent.removeChild(element);
   145     newSection.appendChild(element);
   146   }
   147   sections = mainDiv.childNodes;
   148   for (i=0; i<sections.length; i++) {
   149     var section = sections[i];
   150     if (
   151       (section.className == "approval"    &&    approvalCount > 1) ||
   152       (section.className == "disapproval" && disapprovalCount > 1)
   153     ) {
   154       var entries = section.childNodes;
   155       for (var j=0; j<entries.length; j++) {
   156         var entry = entries[j];
   157         if (entry.className == "movable") break;
   158       }
   159       if (j == entries.length) {
   160         section.parentNode.removeChild(section);
   161       }
   162     }
   163   }
   164   setCategoryHeadings();
   165 }
   166 window.addEventListener("load", function(event) {
   167   setCategoryHeadings();
   168   var mainDiv = document.getElementById("voting");
   169   var form = document.getElementById("voting_form");
   170   var elements = document.getElementsByTagName("input");
   171   for (var i=0; i<elements.length; i++) {
   172     var element = elements[i];
   173     if (element.className == "voting_done") {
   174       element.addEventListener("click", function(event) {
   175         var scoringString = "";
   176         var approvalCount = 0;
   177         var disapprovalCount = 0;
   178         var sections = mainDiv.childNodes;
   179         for (var j=0; j<sections.length; j++) {
   180           var section = sections[j];
   181           if (section.className == "approval")       approvalCount++;
   182           if (section.className == "disapproval") disapprovalCount++;
   183         }
   184         var approvalIndex = 0;
   185         var disapprovalIndex = 0;
   186         for (var j=0; j<sections.length; j++) {
   187           var section = sections[j];
   188           if (
   189             section.className == "approval"    ||
   190             section.className == "abstention"  ||
   191             section.className == "disapproval"
   192           ) {
   193             var score;
   194             if (section.className == "approval") {
   195               score = approvalCount - approvalIndex;
   196               approvalIndex++;
   197             } else if (section.className == "abstention") {
   198               score = 0;
   199             } else if (section.className == "disapproval") {
   200               score = -1 - disapprovalIndex;
   201               disapprovalIndex++;
   202             }
   203             var entries = section.childNodes;
   204             for (var k=0; k<entries.length; k++) {
   205               var entry = entries[k];
   206               if (entry.className == "movable") {
   207                 var id = entry.id.match(/[0-9]+/);
   208                 var field = document.createElement("input");
   209                 scoringString += id + ":" + score + ";";
   210               }
   211             }
   212           }
   213         }
   214         var fields = form.childNodes;
   215         for (var j=0; j<fields.length; j++) {
   216           var field = fields[j];
   217           if (field.name == "scoring") {
   218             field.setAttribute("value", scoringString);
   219             form.submit();
   220             return;
   221           }
   222         }
   223         alert('Hidden input field named "scoring" not found.');
   224       }, false);
   225     }
   226   }
   227 }, false);
