d8d1aa1cd8fee0e8af7fec135a332315b92f198b
[lhc/web/wiklou.git] / skins / common / protect.js
1 function protectInitialize(tableId, labelText) {
2 if (document.createTextNode) {
3 var box = document.getElementById(tableId);
4 if (!box)
5 return false;
6
7 var tbody = box.getElementsByTagName('tbody')[0];
8 var row = document.createElement('tr');
9 tbody.appendChild(row);
10
11 row.appendChild(document.createElement('td'));
12 var col2 = document.createElement('td');
13 row.appendChild(col2);
14
15 var check = document.createElement('input');
16 check.id = "mwProtectUnchained";
17 check.type = "checkbox";
18 check.onclick = protectChainUpdate;
19 col2.appendChild(check);
20
21 var space = document.createTextNode(" ");
22 col2.appendChild(space);
23
24 var label = document.createElement('label');
25 label.setAttribute("for", "mwProtectUnchained");
26 label.appendChild(document.createTextNode(labelText));
27 col2.appendChild(label);
28
29 if (protectAllMatch()) {
30 check.checked = false;
31 protectEnable(false);
32 } else {
33 check.checked = true;
34 protectEnable(true);
35 }
36
37 allowCascade();
38
39 return true;
40 }
41 return false;
42 }
43
44 function allowCascade() {
45 var pr_types = document.getElementsByTagName("select");
46 for (var i = 0; i < pr_types.length; i++) {
47 if (pr_types[i].id.match(/^mwProtect-level-/)) {
48 var selected_level = pr_types[i].getElementsByTagName("option")[pr_types[i].selectedIndex].value;
49 if ( !isCascadeableLevel(selected_level) ) {
50 document.getElementById('mwProtect-cascade').checked=false;
51 document.getElementById('mwProtect-cascade').disabled=true;
52 return false;
53 }
54 }
55 }
56 document.getElementById('mwProtect-cascade').disabled=false;
57 return true;
58 }
59
60 function isCascadeableLevel( level ) {
61 for (var k = 0; k < wgCascadeableLevels.length; k++) {
62 if ( wgCascadeableLevels[k] == level ) {
63 return true;
64 }
65 }
66 return false;
67 }
68
69 function protectLevelsUpdate(source) {
70 if (!protectUnchained()) {
71 protectUpdateAll(source.selectedIndex);
72 }
73 allowCascade();
74 }
75
76 function protectChainUpdate() {
77 if (protectUnchained()) {
78 protectEnable(true);
79 } else {
80 protectChain();
81 protectEnable(false);
82 }
83 allowCascade();
84 }
85
86
87 function protectAllMatch() {
88 var values = new Array();
89 protectForSelectors(function(set) {
90 values[values.length] = set.selectedIndex;
91 });
92 for (var i = 1; i < values.length; i++) {
93 if (values[i] != values[0]) {
94 return false;
95 }
96 }
97 return true;
98 }
99
100 function protectUnchained() {
101 var unchain = document.getElementById("mwProtectUnchained");
102 if (!unchain) {
103 alert("This shouldn't happen");
104 return false;
105 }
106 return unchain.checked;
107 }
108
109 function protectChain() {
110 // Find the highest-protected action and bump them all to this level
111 var maxIndex = -1;
112 protectForSelectors(function(set) {
113 if (set.selectedIndex > maxIndex) {
114 maxIndex = set.selectedIndex;
115 }
116 });
117 protectUpdateAll(maxIndex);
118 }
119
120 function protectUpdateAll(index) {
121 protectForSelectors(function(set) {
122 if (set.selectedIndex != index) {
123 set.selectedIndex = index;
124 }
125 });
126 }
127
128 function protectForSelectors(func) {
129 var selectors = protectSelectors();
130 for (var i = 0; i < selectors.length; i++) {
131 func(selectors[i]);
132 }
133 }
134
135 function protectSelectors() {
136 var all = document.getElementsByTagName("select");
137 var ours = new Array();
138 for (var i = 0; i < all.length; i++) {
139 var set = all[i];
140 if (set.id.match(/^mwProtect-level-/)) {
141 ours[ours.length] = set;
142 }
143 }
144 return ours;
145 }
146
147 function protectEnable(val) {
148 // fixme
149 var first = true;
150 protectForSelectors(function(set) {
151 if (first) {
152 first = false;
153 } else {
154 set.disabled = !val;
155 set.style.visible = val ? "visible" : "hidden";
156 }
157 });
158 }