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];