Mercurial > hg > webaudioevaluationtool
comparison core.js @ 1526:0782ef068046
Bug #1389: Popup now auto-height and auto-scrolling for long options.
author | Nicholas Jillings <nickjillings@users.noreply.github.com> |
---|---|
date | Tue, 15 Sep 2015 10:13:20 +0100 |
parents | b92bdfcbf61c |
children | 57708aa826bb |
comparison
equal
deleted
inserted
replaced
1525:b92bdfcbf61c | 1526:0782ef068046 |
---|---|
47 | 47 |
48 function interfacePopup() { | 48 function interfacePopup() { |
49 // Creates an object to manage the popup | 49 // Creates an object to manage the popup |
50 this.popup = null; | 50 this.popup = null; |
51 this.popupContent = null; | 51 this.popupContent = null; |
52 this.popupTitle = null; | |
53 this.popupResponse = null; | |
52 this.buttonProceed = null; | 54 this.buttonProceed = null; |
53 this.buttonPrevious = null; | 55 this.buttonPrevious = null; |
54 this.popupOptions = null; | 56 this.popupOptions = null; |
55 this.currentIndex = null; | 57 this.currentIndex = null; |
56 this.responses = null; | 58 this.responses = null; |
68 this.popup.style.left = (window.innerWidth/2)-250 + 'px'; | 70 this.popup.style.left = (window.innerWidth/2)-250 + 'px'; |
69 this.popup.style.top = (window.innerHeight/2)-125 + 'px'; | 71 this.popup.style.top = (window.innerHeight/2)-125 + 'px'; |
70 | 72 |
71 this.popupContent = document.createElement('div'); | 73 this.popupContent = document.createElement('div'); |
72 this.popupContent.id = 'popupContent'; | 74 this.popupContent.id = 'popupContent'; |
73 this.popupContent.style.marginTop = '25px'; | 75 this.popupContent.style.marginTop = '20px'; |
74 this.popupContent.align = 'center'; | 76 this.popupContent.align = 'center'; |
75 this.popup.appendChild(this.popupContent); | 77 this.popup.appendChild(this.popupContent); |
76 | 78 |
79 var titleHolder = document.createElement('div'); | |
80 titleHolder.id = 'popupTitleHolder'; | |
81 titleHolder.style.width = 'inherit'; | |
82 titleHolder.style.height = '25px'; | |
83 titleHolder.style.marginBottom = '5px'; | |
84 | |
85 this.popupTitle = document.createElement('span'); | |
86 this.popupTitle.id = 'popupTitle'; | |
87 titleHolder.appendChild(this.popupTitle); | |
88 this.popupContent.appendChild(titleHolder); | |
89 | |
90 this.popupResponse = document.createElement('div'); | |
91 this.popupResponse.id = 'popupResponse'; | |
92 this.popupResponse.style.width = 'inherit'; | |
93 this.popupResponse.style.minHeight = '170px'; | |
94 this.popupResponse.style.maxHeight = '320px'; | |
95 this.popupResponse.style.overflow = 'auto'; | |
96 this.popupContent.appendChild(this.popupResponse); | |
97 | |
98 var buttonHolder = document.createElement('div'); | |
99 buttonHolder.id='buttonHolder'; | |
100 buttonHolder.width = 'inherit'; | |
101 buttonHolder.style.height= '30px'; | |
102 buttonHolder.align = 'left'; | |
103 this.popupContent.appendChild(buttonHolder); | |
104 | |
77 this.buttonProceed = document.createElement('button'); | 105 this.buttonProceed = document.createElement('button'); |
78 this.buttonProceed.className = 'popupButton'; | 106 this.buttonProceed.className = 'popupButton'; |
79 this.buttonProceed.style.left = '440px'; | 107 this.buttonProceed.style.left = '390px'; |
80 this.buttonProceed.style.top = '215px'; | 108 this.buttonProceed.style.top = '2px'; |
81 this.buttonProceed.innerHTML = 'Next'; | 109 this.buttonProceed.innerHTML = 'Next'; |
82 this.buttonProceed.onclick = function(){popup.proceedClicked();}; | 110 this.buttonProceed.onclick = function(){popup.proceedClicked();}; |
83 | 111 |
84 this.buttonPrevious = document.createElement('button'); | 112 this.buttonPrevious = document.createElement('button'); |
85 this.buttonPrevious.className = 'popupButton'; | 113 this.buttonPrevious.className = 'popupButton'; |
86 this.buttonPrevious.style.left = '10px'; | 114 this.buttonPrevious.style.left = '10px'; |
87 this.buttonPrevious.style.top = '215px'; | 115 this.buttonPrevious.style.top = '2px'; |
88 this.buttonPrevious.innerHTML = 'Back'; | 116 this.buttonPrevious.innerHTML = 'Back'; |
89 this.buttonPrevious.onclick = function(){popup.previousClick();}; | 117 this.buttonPrevious.onclick = function(){popup.previousClick();}; |
118 | |
119 buttonHolder.appendChild(this.buttonPrevious); | |
120 buttonHolder.appendChild(this.buttonProceed); | |
90 | 121 |
91 this.popup.style.zIndex = -1; | 122 this.popup.style.zIndex = -1; |
92 this.popup.style.visibility = 'hidden'; | 123 this.popup.style.visibility = 'hidden'; |
93 blank.style.zIndex = -2; | 124 blank.style.zIndex = -2; |
94 blank.style.visibility = 'hidden'; | 125 blank.style.visibility = 'hidden'; |
124 this.popup.style.zIndex = -1; | 155 this.popup.style.zIndex = -1; |
125 this.popup.style.visibility = 'hidden'; | 156 this.popup.style.visibility = 'hidden'; |
126 var blank = document.getElementsByClassName('testHalt')[0]; | 157 var blank = document.getElementsByClassName('testHalt')[0]; |
127 blank.style.zIndex = -2; | 158 blank.style.zIndex = -2; |
128 blank.style.visibility = 'hidden'; | 159 blank.style.visibility = 'hidden'; |
160 this.buttonPrevious.style.visibility = 'inherit'; | |
129 }; | 161 }; |
130 | 162 |
131 this.postNode = function() { | 163 this.postNode = function() { |
132 // This will take the node from the popupOptions and display it | 164 // This will take the node from the popupOptions and display it |
133 var node = this.popupOptions[this.currentIndex]; | 165 var node = this.popupOptions[this.currentIndex]; |
134 this.popupContent.innerHTML = null; | 166 this.popupResponse.innerHTML = null; |
135 if (node.type == 'statement') { | 167 if (node.type == 'statement') { |
136 var span = document.createElement('span'); | 168 this.popupTitle.textContent = node.statement; |
137 span.textContent = node.statement; | |
138 this.popupContent.appendChild(span); | |
139 } else if (node.type == 'question') { | 169 } else if (node.type == 'question') { |
140 var span = document.createElement('span'); | 170 this.popupTitle.textContent = node.question; |
141 span.textContent = node.question; | |
142 var textArea = document.createElement('textarea'); | 171 var textArea = document.createElement('textarea'); |
143 switch (node.boxsize) { | 172 switch (node.boxsize) { |
144 case 'small': | 173 case 'small': |
145 textArea.cols = "20"; | 174 textArea.cols = "20"; |
146 textArea.rows = "1"; | 175 textArea.rows = "1"; |
156 case 'huge': | 185 case 'huge': |
157 textArea.cols = "50"; | 186 textArea.cols = "50"; |
158 textArea.rows = "10"; | 187 textArea.rows = "10"; |
159 break; | 188 break; |
160 } | 189 } |
161 var br = document.createElement('br'); | 190 this.popupResponse.appendChild(textArea); |
162 this.popupContent.appendChild(span); | 191 textArea.focus(); |
163 this.popupContent.appendChild(br); | |
164 this.popupContent.appendChild(textArea); | |
165 this.popupContent.childNodes[2].focus(); | |
166 } else if (node.type == 'checkbox') { | 192 } else if (node.type == 'checkbox') { |
167 var span = document.createElement('span'); | 193 this.popupTitle.textContent = node.statement; |
168 span.textContent = node.statement; | 194 var optHold = this.popupResponse; |
169 this.popupContent.appendChild(span); | |
170 var optHold = document.createElement('div'); | |
171 optHold.id = 'option-holder'; | |
172 optHold.align = 'left'; | |
173 for (var i=0; i<node.options.length; i++) { | 195 for (var i=0; i<node.options.length; i++) { |
174 var option = node.options[i]; | 196 var option = node.options[i]; |
175 var input = document.createElement('input'); | 197 var input = document.createElement('input'); |
176 input.id = option.id; | 198 input.id = option.id; |
177 input.type = 'checkbox'; | 199 input.type = 'checkbox'; |
178 var span = document.createElement('span'); | 200 var span = document.createElement('span'); |
179 span.textContent = option.text; | 201 span.textContent = option.text; |
180 var hold = document.createElement('div'); | 202 var hold = document.createElement('div'); |
181 hold.setAttribute('name','option'); | 203 hold.setAttribute('name','option'); |
182 hold.style.float = 'left'; | |
183 hold.style.padding = '4px'; | 204 hold.style.padding = '4px'; |
184 hold.appendChild(input); | 205 hold.appendChild(input); |
185 hold.appendChild(span); | 206 hold.appendChild(span); |
186 optHold.appendChild(hold); | 207 optHold.appendChild(hold); |
187 } | 208 } |
188 this.popupContent.appendChild(optHold); | |
189 } else if (node.type == 'radio') { | 209 } else if (node.type == 'radio') { |
190 var span = document.createElement('span'); | 210 this.popupTitle.textContent = node.statement; |
191 span.textContent = node.statement; | 211 var optHold = this.popupResponse; |
192 this.popupContent.appendChild(span); | |
193 var optHold = document.createElement('div'); | |
194 optHold.id = 'option-holder'; | |
195 optHold.align = 'none'; | |
196 optHold.style.float = 'left'; | |
197 optHold.style.width = "100%"; | |
198 for (var i=0; i<node.options.length; i++) { | 212 for (var i=0; i<node.options.length; i++) { |
199 var option = node.options[i]; | 213 var option = node.options[i]; |
200 var input = document.createElement('input'); | 214 var input = document.createElement('input'); |
201 input.id = option.name; | 215 input.id = option.name; |
202 input.type = 'radio'; | 216 input.type = 'radio'; |
208 hold.style.padding = '4px'; | 222 hold.style.padding = '4px'; |
209 hold.appendChild(input); | 223 hold.appendChild(input); |
210 hold.appendChild(span); | 224 hold.appendChild(span); |
211 optHold.appendChild(hold); | 225 optHold.appendChild(hold); |
212 } | 226 } |
213 this.popupContent.appendChild(optHold); | |
214 } else if (node.type == 'number') { | 227 } else if (node.type == 'number') { |
215 var span = document.createElement('span'); | 228 this.popupTitle.textContent = node.statement; |
216 span.textContent = node.statement; | |
217 this.popupContent.appendChild(span); | |
218 this.popupContent.appendChild(document.createElement('br')); | |
219 var input = document.createElement('input'); | 229 var input = document.createElement('input'); |
220 input.type = 'textarea'; | 230 input.type = 'textarea'; |
221 if (node.min != null) {input.min = node.min;} | 231 if (node.min != null) {input.min = node.min;} |
222 if (node.max != null) {input.max = node.max;} | 232 if (node.max != null) {input.max = node.max;} |
223 if (node.step != null) {input.step = node.step;} | 233 if (node.step != null) {input.step = node.step;} |
224 this.popupContent.appendChild(input); | 234 this.popupResponse.appendChild(input); |
225 } | 235 } |
226 this.popupContent.appendChild(this.buttonProceed); | |
227 if(this.currentIndex+1 == this.popupOptions.length) { | 236 if(this.currentIndex+1 == this.popupOptions.length) { |
228 if (this.responses.nodeName == "PRETEST") { | 237 if (this.responses.nodeName == "PRETEST") { |
229 this.buttonProceed.textContent = 'Start'; | 238 this.buttonProceed.textContent = 'Start'; |
230 } else { | 239 } else { |
231 this.buttonProceed.textContent = 'Submit'; | 240 this.buttonProceed.textContent = 'Submit'; |
232 } | 241 } |
233 } else { | 242 } else { |
234 this.buttonProceed.textContent = 'Next'; | 243 this.buttonProceed.textContent = 'Next'; |
235 } | 244 } |
236 if(this.currentIndex > 0) | 245 if(this.currentIndex > 0) |
237 this.popupContent.appendChild(this.buttonPrevious); | 246 this.buttonPrevious.style.visibility = 'visible'; |
247 else | |
248 this.buttonPrevious.style.visibility = 'hidden'; | |
238 }; | 249 }; |
239 | 250 |
240 this.initState = function(node) { | 251 this.initState = function(node) { |
241 //Call this with your preTest and postTest nodes when needed to | 252 //Call this with your preTest and postTest nodes when needed to |
242 // initialise the popup procedure. | 253 // initialise the popup procedure. |
276 console.log("Question Response: "+ textArea.value); | 287 console.log("Question Response: "+ textArea.value); |
277 this.responses.appendChild(hold); | 288 this.responses.appendChild(hold); |
278 } | 289 } |
279 } else if (node.type == 'checkbox') { | 290 } else if (node.type == 'checkbox') { |
280 // Must extract checkbox data | 291 // Must extract checkbox data |
281 var optHold = document.getElementById('option-holder'); | 292 var optHold = this.popupResponse; |
282 var hold = document.createElement('checkbox'); | 293 var hold = document.createElement('checkbox'); |
283 console.log("Checkbox: "+ node.statement); | 294 console.log("Checkbox: "+ node.statement); |
284 hold.id = node.id; | 295 hold.id = node.id; |
285 for (var i=0; i<optHold.childElementCount; i++) { | 296 for (var i=0; i<optHold.childElementCount; i++) { |
286 var input = optHold.childNodes[i].getElementsByTagName('input')[0]; | 297 var input = optHold.childNodes[i].getElementsByTagName('input')[0]; |
291 hold.appendChild(response); | 302 hold.appendChild(response); |
292 console.log(input.id +': '+ input.checked); | 303 console.log(input.id +': '+ input.checked); |
293 } | 304 } |
294 this.responses.appendChild(hold); | 305 this.responses.appendChild(hold); |
295 } else if (node.type == "radio") { | 306 } else if (node.type == "radio") { |
296 var optHold = document.getElementById('option-holder'); | 307 var optHold = this.popupResponse; |
297 var hold = document.createElement('radio'); | 308 var hold = document.createElement('radio'); |
298 var responseID = null; | 309 var responseID = null; |
299 var i=0; | 310 var i=0; |
300 while(responseID == null) { | 311 while(responseID == null) { |
301 var input = optHold.childNodes[i].getElementsByTagName('input')[0]; | 312 var input = optHold.childNodes[i].getElementsByTagName('input')[0]; |