nickjillings@1370
|
1 var interfaceSpecs;
|
nickjillings@1370
|
2 var xmlHttp;
|
nickjillings@1370
|
3 var popupObject;
|
nickjillings@1370
|
4 var popupStateNodes;
|
nickjillings@1370
|
5 var specification;
|
nickjillings@1370
|
6 var convert;
|
nickjillings@1370
|
7 var attributeText;
|
nicholas@2355
|
8 var page_lang = "en";
|
nickjillings@1370
|
9
|
nickjillings@1370
|
10 // Firefox does not have an XMLDocument.prototype.getElementsByName
|
nickjillings@1370
|
11 // and there is no searchAll style command, this custom function will
|
nickjillings@1370
|
12 // search all children recusrively for the name. Used for XSD where all
|
nickjillings@1370
|
13 // element nodes must have a name and therefore can pull the schema node
|
nickjillings@1370
|
14 XMLDocument.prototype.getAllElementsByName = function(name)
|
nickjillings@1370
|
15 {
|
nickjillings@1370
|
16 name = String(name);
|
nickjillings@1370
|
17 var selected = this.documentElement.getAllElementsByName(name);
|
nickjillings@1370
|
18 return selected;
|
nickjillings@1370
|
19 }
|
nickjillings@1370
|
20
|
nickjillings@1370
|
21 Element.prototype.getAllElementsByName = function(name)
|
nickjillings@1370
|
22 {
|
nickjillings@1370
|
23 name = String(name);
|
nickjillings@1370
|
24 var selected = [];
|
nickjillings@1370
|
25 var node = this.firstElementChild;
|
nickjillings@1370
|
26 while(node != null)
|
nickjillings@1370
|
27 {
|
nickjillings@1370
|
28 if (node.getAttribute('name') == name)
|
nickjillings@1370
|
29 {
|
nickjillings@1370
|
30 selected.push(node);
|
nickjillings@1370
|
31 }
|
nickjillings@1370
|
32 if (node.childElementCount > 0)
|
nickjillings@1370
|
33 {
|
nickjillings@1370
|
34 selected = selected.concat(node.getAllElementsByName(name));
|
nickjillings@1370
|
35 }
|
nickjillings@1370
|
36 node = node.nextElementSibling;
|
nickjillings@1370
|
37 }
|
nickjillings@1370
|
38 return selected;
|
nickjillings@1370
|
39 }
|
nickjillings@1370
|
40
|
nickjillings@1370
|
41 XMLDocument.prototype.getAllElementsByTagName = function(name)
|
nickjillings@1370
|
42 {
|
nickjillings@1370
|
43 name = String(name);
|
nickjillings@1370
|
44 var selected = this.documentElement.getAllElementsByTagName(name);
|
nickjillings@1370
|
45 return selected;
|
nickjillings@1370
|
46 }
|
nickjillings@1370
|
47
|
nickjillings@1370
|
48 Element.prototype.getAllElementsByTagName = function(name)
|
nickjillings@1370
|
49 {
|
nickjillings@1370
|
50 name = String(name);
|
nickjillings@1370
|
51 var selected = [];
|
nickjillings@1370
|
52 var node = this.firstElementChild;
|
nickjillings@1370
|
53 while(node != null)
|
nickjillings@1370
|
54 {
|
nickjillings@1370
|
55 if (node.nodeName == name)
|
nickjillings@1370
|
56 {
|
nickjillings@1370
|
57 selected.push(node);
|
nickjillings@1370
|
58 }
|
nickjillings@1370
|
59 if (node.childElementCount > 0)
|
nickjillings@1370
|
60 {
|
nickjillings@1370
|
61 selected = selected.concat(node.getAllElementsByTagName(name));
|
nickjillings@1370
|
62 }
|
nickjillings@1370
|
63 node = node.nextElementSibling;
|
nickjillings@1370
|
64 }
|
nickjillings@1370
|
65 return selected;
|
nickjillings@1370
|
66 }
|
nickjillings@1370
|
67
|
nickjillings@1370
|
68 // Firefox does not have an XMLDocument.prototype.getElementsByName
|
nickjillings@1370
|
69 if (typeof XMLDocument.prototype.getElementsByName != "function") {
|
nickjillings@1370
|
70 XMLDocument.prototype.getElementsByName = function(name)
|
nickjillings@1370
|
71 {
|
nickjillings@1370
|
72 name = String(name);
|
nickjillings@1370
|
73 var node = this.documentElement.firstElementChild;
|
nickjillings@1370
|
74 var selected = [];
|
nickjillings@1370
|
75 while(node != null)
|
nickjillings@1370
|
76 {
|
nickjillings@1370
|
77 if (node.getAttribute('name') == name)
|
nickjillings@1370
|
78 {
|
nickjillings@1370
|
79 selected.push(node);
|
nickjillings@1370
|
80 }
|
nickjillings@1370
|
81 node = node.nextElementSibling;
|
nickjillings@1370
|
82 }
|
nickjillings@1370
|
83 return selected;
|
nickjillings@1370
|
84 }
|
nickjillings@1370
|
85 }
|
nickjillings@1370
|
86
|
nickjillings@1370
|
87 window.onload = function()
|
nickjillings@1370
|
88 {
|
nickjillings@1370
|
89 specification = new Specification();
|
nickjillings@1370
|
90 convert = new SpecificationToHTML();
|
nickjillings@1370
|
91 xmlHttp = new XMLHttpRequest();
|
nicholas@2224
|
92 xmlHttp.open("GET","test_create/interface-specs.xml",true);
|
nickjillings@1370
|
93 xmlHttp.onload = function()
|
nickjillings@1370
|
94 {
|
nickjillings@1370
|
95 var parse = new DOMParser();
|
nickjillings@1370
|
96 interfaceSpecs = parse.parseFromString(xmlHttp.response,'text/xml');
|
nickjillings@1370
|
97 buildPage();
|
nickjillings@1370
|
98 popupObject.postNode(popupStateNodes.state[0])
|
nickjillings@1370
|
99 }
|
nickjillings@1370
|
100 xmlHttp.send();
|
nickjillings@1370
|
101
|
nickjillings@1370
|
102 var xsdGet = new XMLHttpRequest();
|
nicholas@2224
|
103 xsdGet.open("GET","xml/test-schema.xsd",true);
|
nickjillings@1370
|
104 xsdGet.onload = function()
|
nickjillings@1370
|
105 {
|
nickjillings@1370
|
106 var parse = new DOMParser();
|
nickjillings@1370
|
107 specification.schema = parse.parseFromString(xsdGet.response,'text/xml');;
|
nickjillings@1370
|
108 }
|
nickjillings@1370
|
109 xsdGet.send();
|
nickjillings@1370
|
110
|
nickjillings@1370
|
111 var jsonAttribute = new XMLHttpRequest();
|
nicholas@2224
|
112 jsonAttribute.open("GET","test_create/attributes.json",true);
|
nickjillings@1370
|
113 jsonAttribute.onload = function()
|
nickjillings@1370
|
114 {
|
nickjillings@1370
|
115 attributeText = JSON.parse(jsonAttribute.response)
|
nickjillings@1370
|
116 }
|
nickjillings@1370
|
117 jsonAttribute.send();
|
nickjillings@1370
|
118 }
|
nickjillings@1370
|
119
|
nickjillings@1370
|
120 function buildPage()
|
nickjillings@1370
|
121 {
|
nickjillings@1370
|
122 popupObject = new function() {
|
nickjillings@1370
|
123 this.object = document.getElementById("popupHolder");
|
nickjillings@1370
|
124 this.blanket = document.getElementById("blanket");
|
nickjillings@1370
|
125
|
nickjillings@1370
|
126 this.popupTitle = document.createElement("div");
|
nickjillings@1370
|
127 this.popupTitle.id = "popup-title-holder";
|
nickjillings@1370
|
128 this.popupTitle.align = "center";
|
nickjillings@1370
|
129 this.titleDOM = document.createElement("span");
|
nickjillings@1370
|
130 this.titleDOM.id = "popup-title";
|
nickjillings@1370
|
131 this.popupTitle.appendChild(this.titleDOM);
|
nickjillings@1370
|
132 this.object.appendChild(this.popupTitle);
|
nickjillings@1370
|
133
|
nickjillings@1370
|
134 this.popupContent = document.createElement("div");
|
nickjillings@1370
|
135 this.popupContent.id = "popup-content";
|
nickjillings@1370
|
136 this.object.appendChild(this.popupContent);
|
nickjillings@1370
|
137
|
nickjillings@1370
|
138 this.proceedButton = document.createElement("button");
|
nickjillings@1370
|
139 this.proceedButton.id = "popup-proceed";
|
nickjillings@2108
|
140 this.proceedButton.className = "popup-button";
|
nickjillings@1370
|
141 this.proceedButton.textContent = "Next";
|
nickjillings@1370
|
142 this.proceedButton.onclick = function()
|
nickjillings@1370
|
143 {
|
nickjillings@1370
|
144 popupObject.popupContent.innerHTML = null;
|
nickjillings@2110
|
145 if(typeof popupObject.shownObject.continue == "function") {
|
nickjillings@2110
|
146 popupObject.shownObject.continue();
|
nickjillings@2110
|
147 } else {
|
nickjillings@2110
|
148 popupObject.hide();
|
nickjillings@2110
|
149 }
|
nickjillings@1370
|
150 };
|
nickjillings@1370
|
151 this.object.appendChild(this.proceedButton);
|
nickjillings@1370
|
152
|
nickjillings@2108
|
153 this.backButton = document.createElement("button");
|
nickjillings@2108
|
154 this.backButton.id = "popup-back";
|
nickjillings@2108
|
155 this.backButton.className = "popup-button";
|
nickjillings@2108
|
156 this.backButton.textContent = "Back";
|
nickjillings@2108
|
157 this.backButton.onclick = function()
|
nickjillings@2108
|
158 {
|
nickjillings@2108
|
159 popupObject.popupContent.innerHTML = null;
|
nickjillings@2108
|
160 popupObject.shownObject.back();
|
nickjillings@2108
|
161 };
|
nickjillings@2108
|
162 this.object.appendChild(this.backButton);
|
nickjillings@2108
|
163
|
nickjillings@1370
|
164 this.shownObject;
|
nickjillings@1370
|
165
|
nickjillings@1370
|
166 this.resize = function()
|
nickjillings@1370
|
167 {
|
nickjillings@1370
|
168 var w = window.innerWidth;
|
nickjillings@1370
|
169 var h = window.innerHeight;
|
nickjillings@1370
|
170 this.object.style.left = Math.floor((w-750)/2) + 'px';
|
nickjillings@1370
|
171 this.object.style.top = Math.floor((h-500)/2) + 'px';
|
nickjillings@1370
|
172 }
|
nickjillings@1370
|
173
|
nickjillings@1370
|
174 this.show = function()
|
nickjillings@1370
|
175 {
|
nickjillings@1370
|
176 this.object.style.visibility = "visible";
|
nickjillings@1370
|
177 this.blanket.style.visibility = "visible";
|
nickjillings@2108
|
178 if (typeof this.shownObject.back == "function") {
|
nickjillings@2108
|
179 this.backButton.style.visibility = "visible";
|
nickjillings@2108
|
180 } else {
|
nickjillings@2108
|
181 this.backButton.style.visibility = "hidden";
|
nickjillings@2108
|
182 }
|
nickjillings@1370
|
183 }
|
nickjillings@1370
|
184
|
nickjillings@1370
|
185 this.hide = function()
|
nickjillings@1370
|
186 {
|
nickjillings@1370
|
187 this.object.style.visibility = "hidden";
|
nickjillings@1370
|
188 this.blanket.style.visibility = "hidden";
|
nickjillings@2108
|
189 this.backButton.style.visibility = "hidden";
|
nickjillings@1370
|
190 }
|
nickjillings@1370
|
191
|
nickjillings@1370
|
192 this.postNode = function(postObject)
|
nickjillings@1370
|
193 {
|
nickjillings@1370
|
194 //Passed object must have the following:
|
nickjillings@1370
|
195 // Title: text to show in the title
|
nickjillings@1370
|
196 // Content: HTML DOM to show on the page
|
nickjillings@1370
|
197 // On complete this HTML DOM is destroyed so make sure it is referenced elsewhere for processing
|
nickjillings@1370
|
198 this.titleDOM.textContent = postObject.title;
|
nickjillings@1370
|
199 this.popupContent.appendChild(postObject.content);
|
nickjillings@1370
|
200 this.shownObject = postObject;
|
nickjillings@2108
|
201 if (typeof this.shownObject.back == "function") {
|
nickjillings@2108
|
202 this.backButton.style.visibility = "visible";
|
nickjillings@2108
|
203 } else {
|
nickjillings@2108
|
204 this.backButton.style.visibility = "hidden";
|
nickjillings@2108
|
205 }
|
nickjillings@2110
|
206 if (typeof this.shownObject.continue == "function") {
|
nickjillings@2110
|
207 this.proceedButton.textContent = "Next";
|
nickjillings@2110
|
208 } else {
|
nickjillings@2110
|
209 this.proceedButton.textContent = "Finish";
|
nickjillings@2110
|
210 }
|
nickjillings@2108
|
211 this.show();
|
nickjillings@1370
|
212 }
|
nickjillings@1370
|
213
|
nickjillings@1370
|
214 this.resize();
|
nickjillings@1370
|
215 this.hide();
|
nickjillings@1370
|
216 };
|
nickjillings@1370
|
217
|
nickjillings@1370
|
218 popupStateNodes = new function()
|
nickjillings@1370
|
219 {
|
nickjillings@1370
|
220 // This defines the several popup states wanted
|
nickjillings@1370
|
221 this.state = [];
|
nickjillings@1370
|
222 this.state[0] = new function()
|
nickjillings@1370
|
223 {
|
nickjillings@1370
|
224 this.title = "Welcome";
|
nickjillings@1370
|
225 this.content = document.createElement("div");
|
nickjillings@1370
|
226 this.content.id = "state-0";
|
nickjillings@1370
|
227 var span = document.createElement("span");
|
nickjillings@1370
|
228 span.textContent = "Welcome to the WAET test creator tool. This will allow you to create a new test from scratch to suit your testing needs. If you wish to update a test file, please drag and drop the XML document into the area below for processing, otherwise press 'Next' to start a new test. This tool generates files for the WAET 1.2.0 version."
|
nickjillings@1370
|
229 this.content.appendChild(span);
|
nickjillings@1370
|
230 this.dragArea = document.createElement("div");
|
nickjillings@1373
|
231 this.dragArea.className = "drag-area";
|
nickjillings@1373
|
232 this.dragArea.id = "project-drop";
|
nickjillings@1370
|
233 this.content.appendChild(this.dragArea);
|
nickjillings@1373
|
234
|
nickjillings@1374
|
235 this.dragArea.addEventListener('dragover',function(e){
|
nickjillings@1373
|
236 e.stopPropagation();
|
nickjillings@1373
|
237 e.preventDefault();
|
nickjillings@1373
|
238 e.dataTransfer.dropEffect = 'copy';
|
nickjillings@1373
|
239 e.currentTarget.className = "drag-area drag-over";
|
nickjillings@1373
|
240 });
|
nickjillings@1373
|
241
|
nickjillings@1373
|
242 this.dragArea.addEventListener('dragexit',function(e){
|
nickjillings@1373
|
243 e.stopPropagation();
|
nickjillings@1373
|
244 e.preventDefault();
|
nickjillings@1373
|
245 e.dataTransfer.dropEffect = 'copy';
|
nickjillings@1373
|
246 e.currentTarget.className = "drag-area";
|
nickjillings@1373
|
247 });
|
nickjillings@1373
|
248
|
nickjillings@1373
|
249 this.dragArea.addEventListener('drop',function(e){
|
nickjillings@1373
|
250 e.stopPropagation();
|
nickjillings@1373
|
251 e.preventDefault();
|
nickjillings@1373
|
252 e.currentTarget.className = "drag-area drag-dropped";
|
nickjillings@1373
|
253 var files = e.dataTransfer.files[0];
|
nickjillings@1374
|
254 var reader = new FileReader();
|
nickjillings@1374
|
255 reader.onload = function(decoded) {
|
nickjillings@1374
|
256 var parse = new DOMParser();
|
nickjillings@1374
|
257 specification.decode(parse.parseFromString(decoded.target.result,'text/xml'));
|
nickjillings@1374
|
258 popupObject.hide();
|
nickjillings@1375
|
259 popupObject.popupContent.innerHTML = null;
|
nickjillings@1374
|
260 convert.convert(document.getElementById('content'));
|
nickjillings@1374
|
261 }
|
nickjillings@1374
|
262 reader.readAsText(files);
|
nickjillings@1373
|
263 });
|
nickjillings@1373
|
264
|
nickjillings@1370
|
265
|
nickjillings@1370
|
266 this.continue = function()
|
nickjillings@1370
|
267 {
|
nickjillings@1370
|
268 popupObject.postNode(popupStateNodes.state[1]);
|
nickjillings@1370
|
269 }
|
nickjillings@1370
|
270 }
|
nickjillings@1370
|
271 this.state[1] = new function()
|
nickjillings@1370
|
272 {
|
nickjillings@1370
|
273 this.title = "Select your interface";
|
nickjillings@1370
|
274 this.content = document.createElement("div");
|
nickjillings@1370
|
275 this.content.id = "state-1";
|
nickjillings@1370
|
276 var spnH = document.createElement('div');
|
nickjillings@1370
|
277 var span = document.createElement("span");
|
nickjillings@1370
|
278 span.textContent = "Please select your interface from the list shown below. This will define the various options which are available. This can later be changed.";
|
nickjillings@1370
|
279 spnH.appendChild(span);
|
nickjillings@1370
|
280 this.content.appendChild(spnH);
|
nickjillings@1370
|
281 this.select = document.createElement("select");
|
nicholas@2355
|
282 this.content.appendChild(this.select);
|
nicholas@2355
|
283 this.description = document.createElement("p");
|
nicholas@2355
|
284 this.content.appendChild(this.description);
|
nicholas@2390
|
285 this.testsXML = interfaceSpecs.getElementsByTagName('tests')[0].getElementsByTagName('test');
|
nickjillings@1370
|
286 for (var i=0; i<this.testsXML.length; i++)
|
nickjillings@1370
|
287 {
|
nickjillings@1370
|
288 var option = document.createElement('option');
|
nickjillings@1370
|
289 option.value = this.testsXML[i].getAttribute('name');
|
nickjillings@1370
|
290 option.textContent = this.testsXML[i].getAttribute('name');
|
nickjillings@1370
|
291 this.select.appendChild(option);
|
nickjillings@1370
|
292 }
|
nicholas@2355
|
293 this.handleEvent = function(event) {
|
nicholas@2355
|
294 var testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(this.select.value)[0];
|
nicholas@2355
|
295 var descriptors = testXML.getAllElementsByTagName("description");
|
nicholas@2355
|
296 this.description.textContent = "";
|
nicholas@2355
|
297 for (var i=0; i<descriptors.length; i++) {
|
nicholas@2355
|
298 if (descriptors[i].getAttribute("lang") == page_lang) {
|
nicholas@2355
|
299 this.description.textContent = descriptors[i].textContent;
|
nicholas@2355
|
300 }
|
nicholas@2355
|
301 }
|
nicholas@2355
|
302 }
|
nicholas@2355
|
303 this.select.addEventListener("change",this);
|
nicholas@2355
|
304 this.handleEvent();
|
nickjillings@1370
|
305 this.continue = function()
|
nickjillings@1370
|
306 {
|
nickjillings@1370
|
307 var testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(this.select.value)[0];
|
nickjillings@1370
|
308 specification.interface = testXML.getAttribute("interface");
|
nickjillings@2108
|
309 if (specification.interfaces == null)
|
nickjillings@2108
|
310 {
|
nickjillings@2194
|
311 specification.interfaces = new specification.interfaceNode(specification);
|
nickjillings@2108
|
312 }
|
nickjillings@2108
|
313 if (specification.metrics == null) {
|
nickjillings@2108
|
314 specification.metrics = new specification.metricNode();
|
nickjillings@2108
|
315 }
|
nickjillings@1370
|
316 popupStateNodes.state[2].generate();
|
nickjillings@1370
|
317 popupObject.postNode(popupStateNodes.state[2]);
|
nickjillings@1370
|
318 }
|
nickjillings@2108
|
319 this.back = function() {
|
nickjillings@2108
|
320 popupObject.postNode(popupStateNodes.state[0]);
|
nickjillings@2108
|
321 }
|
nickjillings@1370
|
322 }
|
nickjillings@1370
|
323 this.state[2] = new function()
|
nickjillings@1370
|
324 {
|
nickjillings@1370
|
325 this.title = "Test Checks & Restrictions";
|
nickjillings@1370
|
326 this.content = document.createElement("div");
|
nickjillings@1370
|
327 this.content.id = "state-1";
|
nickjillings@1370
|
328 var spnH = document.createElement('div');
|
nickjillings@1370
|
329 var span = document.createElement("span");
|
nickjillings@1370
|
330 span.textContent = "Select your test checks and restrictions. Greyed out items are fixed by the test/interface and cannot be changed";
|
nickjillings@1370
|
331 spnH.appendChild(span);
|
nickjillings@1370
|
332 this.content.appendChild(spnH);
|
nickjillings@1370
|
333 var holder = document.createElement("div");
|
nickjillings@1370
|
334 this.options = [];
|
nickjillings@1370
|
335 this.testXML = null;
|
nickjillings@1370
|
336 this.interfaceXML = null;
|
nickjillings@2108
|
337 this.dynamicContent = document.createElement("div");
|
nickjillings@2108
|
338 this.content.appendChild(this.dynamicContent);
|
nickjillings@1370
|
339 this.generate = function()
|
nickjillings@1370
|
340 {
|
nickjillings@2108
|
341 this.options = [];
|
nickjillings@2108
|
342 this.dynamicContent.innerHTML = null;
|
nickjillings@1370
|
343 var interfaceName = popupStateNodes.state[1].select.value;
|
nickjillings@1370
|
344 this.checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("checks")[0];
|
nickjillings@1370
|
345 this.testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
|
nickjillings@1370
|
346 this.interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(this.testXML.getAttribute("interface"))[0].getAllElementsByTagName("checks")[0];
|
nickjillings@1370
|
347 this.testXML = this.testXML.getAllElementsByTagName("checks");
|
nicholas@2390
|
348 var interfaceXMLChildren = this.interfaceXML.getElementsByTagName('entry');
|
nicholas@2390
|
349 for (var i=0; i<interfaceXMLChildren.length; i++)
|
nickjillings@1370
|
350 {
|
nicholas@2390
|
351 var interfaceNode = interfaceXMLChildren[i];
|
nickjillings@1370
|
352 var checkName = interfaceNode.getAttribute('name');
|
nickjillings@1370
|
353 var testNode
|
nickjillings@1370
|
354 if (this.testXML.length > 0)
|
nickjillings@1370
|
355 {
|
nickjillings@1370
|
356 testNode = this.testXML[0].getAllElementsByName(checkName);
|
nickjillings@1370
|
357 if(testNode.length != 0) {testNode = testNode[0];}
|
nickjillings@1370
|
358 else {testNode = undefined;}
|
nickjillings@1370
|
359 } else {
|
nickjillings@1370
|
360 testNode = undefined;
|
nickjillings@1370
|
361 }
|
nickjillings@2108
|
362 var obj = {
|
nickjillings@2108
|
363 root: document.createElement("div"),
|
nickjillings@2109
|
364 text: document.createElement("label"),
|
nickjillings@2108
|
365 input: document.createElement("input"),
|
nickjillings@2108
|
366 parent: this,
|
nickjillings@2108
|
367 name: checkName,
|
nickjillings@2108
|
368 handleEvent: function(event) {
|
nickjillings@2108
|
369 if (this.input.checked) {
|
nickjillings@2108
|
370 // Add to specification.interfaces.option
|
nickjillings@2108
|
371 var included = specification.interfaces.options.find(function(element,index,array){
|
nickjillings@2108
|
372 if (element.name == this.name) {return true;} else {return false;}
|
nickjillings@2108
|
373 },this);
|
nickjillings@2108
|
374 if (included == null) {
|
nickjillings@2108
|
375 specification.interfaces.options.push({type:"check",name:this.name});
|
nickjillings@2108
|
376 }
|
nickjillings@2108
|
377 } else {
|
nickjillings@2108
|
378 // Remove from specification.interfaces.option
|
nickjillings@2108
|
379 var position = specification.interfaces.options.findIndex(function(element,index,array){
|
nickjillings@2108
|
380 if (element.name == this.name) {return true;} else {return false;}
|
nickjillings@2108
|
381 },this);
|
nickjillings@2108
|
382 if (position >= 0) {
|
nickjillings@2108
|
383 specification.interfaces.options.splice(position,1);
|
nickjillings@2108
|
384 }
|
nickjillings@2108
|
385 }
|
nickjillings@2108
|
386 }
|
nickjillings@1370
|
387 }
|
nickjillings@2108
|
388
|
nickjillings@2108
|
389 obj.input.addEventListener("click",obj);
|
nickjillings@2108
|
390 obj.root.className = "popup-checkbox";
|
nickjillings@2108
|
391 obj.input.type = "checkbox";
|
nickjillings@2109
|
392 obj.input.setAttribute('id',checkName);
|
nickjillings@2109
|
393 obj.text.setAttribute("for",checkName);
|
nickjillings@2108
|
394 obj.text.textContent = this.checkText.getAllElementsByName(checkName)[0].textContent;
|
nickjillings@2108
|
395 obj.root.appendChild(obj.input);
|
nickjillings@2108
|
396 obj.root.appendChild(obj.text);
|
nickjillings@1370
|
397 if(testNode != undefined)
|
nickjillings@1370
|
398 {
|
nickjillings@2108
|
399 if (testNode.getAttribute('default') == 'on')
|
nickjillings@1370
|
400 {
|
nickjillings@2108
|
401 obj.input.checked = true;
|
nickjillings@1370
|
402 }
|
nickjillings@1370
|
403 if (testNode.getAttribute('support') == "none")
|
nickjillings@1370
|
404 {
|
nickjillings@2108
|
405 obj.input.disabled = true;
|
nickjillings@2108
|
406 obj.input.checked = false;
|
nickjillings@2108
|
407 obj.root.className = "popup-checkbox disabled";
|
nickjillings@1370
|
408 }else if (interfaceNode.getAttribute('support') == "mandatory")
|
nickjillings@1370
|
409 {
|
nickjillings@2108
|
410 obj.input.disabled = true;
|
nickjillings@2108
|
411 obj.input.checked = true;
|
nickjillings@2108
|
412 obj.root.className = "popup-checkbox disabled";
|
nickjillings@2108
|
413 }
|
nickjillings@2108
|
414 } else {
|
nickjillings@2108
|
415 if (interfaceNode.getAttribute('default') == 'on')
|
nickjillings@2108
|
416 {
|
nickjillings@2108
|
417 obj.input.checked = true;
|
nickjillings@2108
|
418 }
|
nickjillings@2108
|
419 if (interfaceNode.getAttribute('support') == "none")
|
nickjillings@2108
|
420 {
|
nickjillings@2108
|
421 obj.input.disabled = true;
|
nickjillings@2108
|
422 obj.input.checked = false;
|
nickjillings@2108
|
423 obj.root.className = "popup-checkbox disabled";
|
nickjillings@2108
|
424 } else if (interfaceNode.getAttribute('support') == "mandatory")
|
nickjillings@2108
|
425 {
|
nickjillings@2108
|
426 obj.input.disabled = true;
|
nickjillings@2108
|
427 obj.input.checked = true;
|
nickjillings@2108
|
428 obj.root.className = "popup-checkbox disabled";
|
nickjillings@1370
|
429 }
|
nickjillings@1370
|
430 }
|
nickjillings@2108
|
431 var included = specification.interfaces.options.find(function(element,index,array){
|
nickjillings@2108
|
432 if (element.name == this.name) {return true;} else {return false;}
|
nickjillings@2108
|
433 },obj);
|
nickjillings@2108
|
434 if (included != undefined) {
|
nickjillings@2108
|
435 obj.input.checked = true;
|
nickjillings@2108
|
436 }
|
nickjillings@2108
|
437 obj.handleEvent();
|
nickjillings@2108
|
438 this.options.push(obj);
|
nickjillings@2108
|
439 this.dynamicContent.appendChild(obj.root);
|
nickjillings@1370
|
440 }
|
nickjillings@1370
|
441 }
|
nickjillings@1370
|
442 this.continue = function()
|
nickjillings@1370
|
443 {
|
nickjillings@1370
|
444 popupStateNodes.state[3].generate();
|
nickjillings@1370
|
445 popupObject.postNode(popupStateNodes.state[3]);
|
nickjillings@1370
|
446 }
|
nickjillings@2108
|
447 this.back = function() {
|
nickjillings@2108
|
448 popupObject.postNode(popupStateNodes.state[1]);
|
nickjillings@2108
|
449 }
|
nickjillings@1370
|
450 }
|
nickjillings@1370
|
451 this.state[3] = new function()
|
nickjillings@1370
|
452 {
|
nickjillings@1370
|
453 this.title = "Test Metrics";
|
nickjillings@1370
|
454 this.content = document.createElement("div");
|
nickjillings@1370
|
455 this.content.id = "state-1";
|
nickjillings@1370
|
456 var spnH = document.createElement('div');
|
nickjillings@1370
|
457 var span = document.createElement("span");
|
nickjillings@1370
|
458 span.textContent = "Select which data points to include in the exported results XML. Some of this is required for certain post script analysis. See the documentation for further details";
|
nickjillings@1370
|
459 spnH.appendChild(span);
|
nickjillings@1370
|
460 this.content.appendChild(spnH);
|
nickjillings@1370
|
461 this.options = [];
|
nickjillings@1370
|
462 this.checkText;
|
nickjillings@1370
|
463 this.testXML;
|
nickjillings@1370
|
464 this.interfaceXML;
|
nickjillings@2108
|
465 this.dynamicContent = document.createElement("div");
|
nickjillings@2108
|
466 this.content.appendChild(this.dynamicContent);
|
nickjillings@1370
|
467 this.generate = function()
|
nickjillings@1370
|
468 {
|
nickjillings@2108
|
469 this.options = [];
|
nickjillings@2108
|
470 this.dynamicContent.innerHTML = null;
|
nickjillings@1370
|
471 var interfaceName = popupStateNodes.state[1].select.value;
|
nickjillings@1370
|
472 this.checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("metrics")[0];
|
nickjillings@1370
|
473 this.testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
|
nickjillings@1370
|
474 this.interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(this.testXML.getAttribute("interface"))[0].getAllElementsByTagName("metrics")[0];
|
nickjillings@1370
|
475 this.testXML = this.testXML.getAllElementsByTagName("metrics");
|
nicholas@2390
|
476 var interfaceXMLChildren = this.interfaceXML.getElementsByTagName('entry');
|
nicholas@2390
|
477 for (var i=0; i<interfaceXMLChildren.length; i++)
|
nickjillings@1370
|
478 {
|
nicholas@2390
|
479 var interfaceNode = interfaceXMLChildren[i];
|
nickjillings@1370
|
480 var checkName = interfaceNode.getAttribute('name');
|
nickjillings@1370
|
481 var testNode
|
nickjillings@1370
|
482 if (this.testXML.length > 0)
|
nickjillings@1370
|
483 {
|
nickjillings@1370
|
484 testNode = this.testXML[0].getAllElementsByName(checkName);
|
nickjillings@1370
|
485 if(testNode.length != 0) {testNode = testNode[0];}
|
nickjillings@1370
|
486 else {testNode = undefined;}
|
nickjillings@1370
|
487 } else {
|
nickjillings@1370
|
488 testNode = undefined;
|
nickjillings@1370
|
489 }
|
nickjillings@2108
|
490 var obj = {
|
nickjillings@2108
|
491 root: document.createElement("div"),
|
nickjillings@2109
|
492 text: document.createElement("label"),
|
nickjillings@2108
|
493 input: document.createElement("input"),
|
nickjillings@2108
|
494 parent: this,
|
nickjillings@2108
|
495 name: checkName,
|
nickjillings@2108
|
496 handleEvent: function(event) {
|
nickjillings@2108
|
497 if (this.input.checked) {
|
nickjillings@2108
|
498 // Add to specification.interfaces.option
|
nickjillings@2108
|
499 var included = specification.metrics.enabled.find(function(element,index,array){
|
nickjillings@2108
|
500 if (element == this.name) {return true;} else {return false;}
|
nickjillings@2108
|
501 },this);
|
nickjillings@2108
|
502 if (included == null) {
|
nickjillings@2108
|
503 specification.metrics.enabled.push(this.name);
|
nickjillings@2108
|
504 }
|
nickjillings@2108
|
505 } else {
|
nickjillings@2108
|
506 // Remove from specification.interfaces.option
|
nickjillings@2108
|
507 var position = specification.metrics.enabled.findIndex(function(element,index,array){
|
nickjillings@2108
|
508 if (element == this.name) {return true;} else {return false;}
|
nickjillings@2108
|
509 },this);
|
nickjillings@2108
|
510 if (position >= 0) {
|
nickjillings@2108
|
511 specification.metrics.enabled.splice(position,1);
|
nickjillings@2108
|
512 }
|
nickjillings@2108
|
513 }
|
nickjillings@2108
|
514 }
|
nickjillings@1370
|
515 }
|
nickjillings@2108
|
516
|
nickjillings@2108
|
517 obj.input.addEventListener("click",obj);
|
nickjillings@2108
|
518 obj.root.className = "popup-checkbox";
|
nickjillings@2108
|
519 obj.input.type = "checkbox";
|
nickjillings@2109
|
520 obj.input.setAttribute('id',checkName);
|
nickjillings@2109
|
521 obj.text.setAttribute("for",checkName);
|
nickjillings@2108
|
522 obj.text.textContent = this.checkText.getAllElementsByName(checkName)[0].textContent;
|
nickjillings@2108
|
523 obj.root.appendChild(obj.input);
|
nickjillings@2108
|
524 obj.root.appendChild(obj.text);
|
nickjillings@1370
|
525 if(testNode != undefined)
|
nickjillings@1370
|
526 {
|
nickjillings@2108
|
527 if (testNode.getAttribute('default') == 'on')
|
nickjillings@1370
|
528 {
|
nickjillings@2108
|
529 obj.input.checked = true;
|
nickjillings@1370
|
530 }
|
nickjillings@1370
|
531 if (testNode.getAttribute('support') == "none")
|
nickjillings@1370
|
532 {
|
nickjillings@2108
|
533 obj.input.disabled = true;
|
nickjillings@2108
|
534 obj.input.checked = false;
|
nickjillings@2108
|
535 obj.root.className = "popup-checkbox disabled";
|
nickjillings@1370
|
536 }else if (interfaceNode.getAttribute('support') == "mandatory")
|
nickjillings@1370
|
537 {
|
nickjillings@2108
|
538 obj.input.disabled = true;
|
nickjillings@2108
|
539 obj.input.checked = true;
|
nickjillings@2108
|
540 obj.root.className = "popup-checkbox disabled";
|
nickjillings@2108
|
541 }
|
nickjillings@2108
|
542 } else {
|
nickjillings@2108
|
543 if (interfaceNode.getAttribute('default') == 'on')
|
nickjillings@2108
|
544 {
|
nickjillings@2108
|
545 obj.input.checked = true;
|
nickjillings@2108
|
546 }
|
nickjillings@2108
|
547 if (interfaceNode.getAttribute('support') == "none")
|
nickjillings@2108
|
548 {
|
nickjillings@2108
|
549 obj.input.disabled = true;
|
nickjillings@2108
|
550 obj.input.checked = false;
|
nickjillings@2108
|
551 obj.root.className = "popup-checkbox disabled";
|
nickjillings@2108
|
552 } else if (interfaceNode.getAttribute('support') == "mandatory")
|
nickjillings@2108
|
553 {
|
nickjillings@2108
|
554 obj.input.disabled = true;
|
nickjillings@2108
|
555 obj.input.checked = true;
|
nickjillings@2108
|
556 obj.root.className = "popup-checkbox disabled";
|
nickjillings@1370
|
557 }
|
nickjillings@1370
|
558 }
|
nickjillings@2108
|
559 var included = specification.metrics.enabled.find(function(element,index,array){
|
nickjillings@2108
|
560 if (element == this.name) {return true;} else {return false;}
|
nickjillings@2108
|
561 },obj);
|
nickjillings@2108
|
562 obj.handleEvent();
|
nickjillings@2108
|
563 if (included != undefined) {
|
nickjillings@2108
|
564 obj.input.checked = true;
|
nickjillings@2108
|
565 }
|
nickjillings@2108
|
566 this.options.push(obj);
|
nickjillings@2108
|
567 this.dynamicContent.appendChild(obj.root);
|
nickjillings@1370
|
568 }
|
nickjillings@1370
|
569 }
|
nickjillings@1370
|
570 this.continue = function()
|
nickjillings@1370
|
571 {
|
nickjillings@1370
|
572 popupStateNodes.state[4].generate();
|
nickjillings@1370
|
573 popupObject.postNode(popupStateNodes.state[4]);
|
nickjillings@1370
|
574 }
|
nickjillings@2108
|
575 this.back = function() {
|
nickjillings@2108
|
576 popupObject.postNode(popupStateNodes.state[2]);
|
nickjillings@2108
|
577 }
|
nickjillings@1370
|
578 }
|
nickjillings@1370
|
579 this.state[4] = new function()
|
nickjillings@1370
|
580 {
|
nickjillings@1370
|
581 this.title = "Test Visuals";
|
nickjillings@1370
|
582 this.content = document.createElement("div");
|
nickjillings@1370
|
583 this.content.id = "state-1";
|
nickjillings@1370
|
584 var spnH = document.createElement('div');
|
nickjillings@1370
|
585 var span = document.createElement("span");
|
nickjillings@1370
|
586 span.textContent = "You can display extra visual content with your interface for the test user to interact with. Select from the available options below. Greyed out options are unavailable for your selected interface";
|
nickjillings@1370
|
587 spnH.appendChild(span);
|
nickjillings@1370
|
588 this.content.appendChild(spnH);
|
nickjillings@1370
|
589 this.options = [];
|
nickjillings@1370
|
590 this.checkText;
|
nickjillings@1370
|
591 this.testXML;
|
nickjillings@1370
|
592 this.interfaceXML;
|
nickjillings@2108
|
593 this.dynamicContent = document.createElement("div");
|
nickjillings@2108
|
594 this.content.appendChild(this.dynamicContent);
|
nickjillings@1370
|
595 this.generate = function()
|
nickjillings@1370
|
596 {
|
nickjillings@2108
|
597 this.options = [];
|
nickjillings@2108
|
598 this.dynamicContent.innerHTML = null;
|
nickjillings@1370
|
599 var interfaceName = popupStateNodes.state[1].select.value;
|
nickjillings@1370
|
600 this.checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("show")[0];
|
nickjillings@1370
|
601 this.testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
|
nickjillings@1370
|
602 this.interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(this.testXML.getAttribute("interface"))[0].getAllElementsByTagName("show")[0];
|
nickjillings@2108
|
603 this.testXML = this.testXML.getAllElementsByTagName("show");
|
nicholas@2390
|
604 var interfaceXMLChildren = this.interfaceXML.getElementsByTagName('entry');
|
nicholas@2390
|
605 for (var i=0; i<interfaceXMLChildren.length; i++)
|
nickjillings@1370
|
606 {
|
nicholas@2390
|
607 var interfaceNode = interfaceXMLChildren[i];
|
nickjillings@1370
|
608 var checkName = interfaceNode.getAttribute('name');
|
nickjillings@1370
|
609 var testNode
|
nickjillings@1370
|
610 if (this.testXML.length > 0)
|
nickjillings@1370
|
611 {
|
nickjillings@1370
|
612 testNode = this.testXML[0].getAllElementsByName(checkName);
|
nickjillings@1370
|
613 if(testNode.length != 0) {testNode = testNode[0];}
|
nickjillings@1370
|
614 else {testNode = undefined;}
|
nickjillings@1370
|
615 } else {
|
nickjillings@1370
|
616 testNode = undefined;
|
nickjillings@1370
|
617 }
|
nickjillings@2108
|
618 var obj = {
|
nickjillings@2108
|
619 root: document.createElement("div"),
|
nickjillings@2109
|
620 text: document.createElement("label"),
|
nickjillings@2108
|
621 input: document.createElement("input"),
|
nickjillings@2108
|
622 parent: this,
|
nickjillings@2108
|
623 name: checkName,
|
nickjillings@2108
|
624 handleEvent: function(event) {
|
nickjillings@2108
|
625 if (this.input.checked) {
|
nickjillings@2108
|
626 // Add to specification.interfaces.option
|
nickjillings@2108
|
627 var included = specification.interfaces.options.find(function(element,index,array){
|
nickjillings@2108
|
628 if (element.name == this.name) {return true;} else {return false;}
|
nickjillings@2108
|
629 },this);
|
nickjillings@2108
|
630 if (included == null) {
|
nickjillings@2108
|
631 specification.interfaces.options.push({type:"show",name:this.name});
|
nickjillings@2108
|
632 }
|
nickjillings@2108
|
633 } else {
|
nickjillings@2108
|
634 // Remove from specification.interfaces.option
|
nickjillings@2108
|
635 var position = specification.interfaces.options.findIndex(function(element,index,array){
|
nickjillings@2108
|
636 if (element.name == this.name) {return true;} else {return false;}
|
nickjillings@2108
|
637 },this);
|
nickjillings@2108
|
638 if (position >= 0) {
|
nickjillings@2108
|
639 specification.interfaces.options.splice(position,1);
|
nickjillings@2108
|
640 }
|
nickjillings@2108
|
641 }
|
nickjillings@2108
|
642 }
|
nickjillings@1370
|
643 }
|
nickjillings@2108
|
644
|
nickjillings@2108
|
645 obj.input.addEventListener("click",obj);
|
nickjillings@2108
|
646 obj.root.className = "popup-checkbox";
|
nickjillings@2108
|
647 obj.input.type = "checkbox";
|
nickjillings@2109
|
648 obj.input.setAttribute('id',checkName);
|
nickjillings@2109
|
649 obj.text.setAttribute("for",checkName);
|
nickjillings@2108
|
650 obj.text.textContent = this.checkText.getAllElementsByName(checkName)[0].textContent;
|
nickjillings@2108
|
651 obj.root.appendChild(obj.input);
|
nickjillings@2108
|
652 obj.root.appendChild(obj.text);
|
nickjillings@1370
|
653 if(testNode != undefined)
|
nickjillings@1370
|
654 {
|
nickjillings@2108
|
655 if (testNode.getAttribute('default') == 'on')
|
nickjillings@1370
|
656 {
|
nickjillings@2108
|
657 obj.input.checked = true;
|
nickjillings@1370
|
658 }
|
nickjillings@1370
|
659 if (testNode.getAttribute('support') == "none")
|
nickjillings@1370
|
660 {
|
nickjillings@2108
|
661 obj.input.disabled = true;
|
nickjillings@2108
|
662 obj.input.checked = false;
|
nickjillings@2108
|
663 obj.root.className = "popup-checkbox disabled";
|
nickjillings@1370
|
664 }else if (interfaceNode.getAttribute('support') == "mandatory")
|
nickjillings@1370
|
665 {
|
nickjillings@2108
|
666 obj.input.disabled = true;
|
nickjillings@2108
|
667 obj.input.checked = true;
|
nickjillings@2108
|
668 obj.root.className = "popup-checkbox disabled";
|
nickjillings@2108
|
669 }
|
nickjillings@2108
|
670 } else {
|
nickjillings@2108
|
671 if (interfaceNode.getAttribute('default') == 'on')
|
nickjillings@2108
|
672 {
|
nickjillings@2108
|
673 obj.input.checked = true;
|
nickjillings@2108
|
674 }
|
nickjillings@2108
|
675 if (interfaceNode.getAttribute('support') == "none")
|
nickjillings@2108
|
676 {
|
nickjillings@2108
|
677 obj.input.disabled = true;
|
nickjillings@2108
|
678 obj.input.checked = false;
|
nickjillings@2108
|
679 obj.root.className = "popup-checkbox disabled";
|
nickjillings@2108
|
680 } else if (interfaceNode.getAttribute('support') == "mandatory")
|
nickjillings@2108
|
681 {
|
nickjillings@2108
|
682 obj.input.disabled = true;
|
nickjillings@2108
|
683 obj.input.checked = true;
|
nickjillings@2108
|
684 obj.root.className = "popup-checkbox disabled";
|
nickjillings@1370
|
685 }
|
nickjillings@1370
|
686 }
|
nickjillings@2108
|
687 var included = specification.interfaces.options.find(function(element,index,array){
|
nickjillings@2108
|
688 if (element.name == this.name) {return true;} else {return false;}
|
nickjillings@2108
|
689 },obj);
|
nickjillings@2108
|
690 if (included != undefined) {
|
nickjillings@2108
|
691 obj.input.checked = true;
|
nickjillings@2108
|
692 }
|
nickjillings@2108
|
693 obj.handleEvent();
|
nickjillings@2108
|
694 this.options.push(obj);
|
nickjillings@2108
|
695 this.dynamicContent.appendChild(obj.root);
|
nickjillings@1370
|
696 }
|
nickjillings@1370
|
697 }
|
nickjillings@1370
|
698 this.continue = function()
|
nickjillings@1370
|
699 {
|
nickjillings@1370
|
700 popupObject.hide();
|
nickjillings@1370
|
701 convert.convert(document.getElementById('content'));
|
nickjillings@1370
|
702 }
|
nickjillings@2108
|
703 this.back = function() {
|
nickjillings@2108
|
704 popupObject.postNode(popupStateNodes.state[3]);
|
nickjillings@2108
|
705 }
|
nickjillings@1370
|
706 }
|
nickjillings@1370
|
707 this.state[5] = new function() {
|
nickjillings@1370
|
708 this.title = "Add/Edit Survey Element";
|
nickjillings@1370
|
709 this.content = document.createElement("div");
|
nickjillings@1370
|
710 this.content.id = "state-1";
|
nickjillings@1370
|
711 var spnH = document.createElement('div');
|
nickjillings@1370
|
712 var span = document.createElement("span");
|
nickjillings@1370
|
713 span.textContent = "You can configure your survey element here. Press 'Continue' to complete your changes.";
|
nickjillings@1370
|
714 spnH.appendChild(span);
|
nickjillings@1370
|
715 this.content.appendChild(spnH);
|
nickjillings@1370
|
716 this.dynamic = document.createElement("div");
|
nickjillings@1370
|
717 this.option = null;
|
nickjillings@1370
|
718 this.parent = null;
|
nickjillings@1375
|
719 this.optionLists = [];
|
nickjillings@2158
|
720 this.select = document.createElement("select");
|
nickjillings@2158
|
721 this.select.setAttribute("name","type");
|
nickjillings@2158
|
722 this.select.addEventListener("change",this,false);
|
nickjillings@2158
|
723 this.content.appendChild(this.select);
|
nickjillings@1370
|
724 this.content.appendChild(this.dynamic);
|
nickjillings@1370
|
725 this.generate = function(option, parent)
|
nickjillings@1370
|
726 {
|
nickjillings@1370
|
727 this.option = option;
|
nickjillings@1370
|
728 this.parent = parent;
|
nickjillings@2158
|
729 if (this.select.childElementCount == 0) {
|
nickjillings@2158
|
730 var optionList = specification.schema.getAllElementsByName("survey")[0].getAllElementsByName("type")[0].getAllElementsByTagName("xs:enumeration");
|
nickjillings@2158
|
731 for (var i=0; i<optionList.length; i++)
|
nickjillings@2158
|
732 {
|
nickjillings@2158
|
733 var selectOption = document.createElement("option");
|
nickjillings@2158
|
734 selectOption.value = optionList[i].getAttribute("value");
|
nickjillings@2158
|
735 selectOption.textContent = selectOption.value;
|
nickjillings@2158
|
736 this.select.appendChild(selectOption);
|
nickjillings@2158
|
737 }
|
nickjillings@1370
|
738 }
|
nickjillings@1370
|
739 if (this.option.type != undefined){
|
nickjillings@2158
|
740 this.select.value = this.option.type
|
nickjillings@1370
|
741 } else {
|
nickjillings@2158
|
742 this.select.value = "statement";
|
nickjillings@1370
|
743 this.option.type = "statement";
|
nickjillings@1370
|
744 }
|
nickjillings@1370
|
745
|
nickjillings@1370
|
746 this.dynamic.innerHTML = null;
|
nickjillings@1370
|
747 var statement = document.createElement("div");
|
nickjillings@1370
|
748 var statementText = document.createElement("span");
|
nickjillings@2159
|
749 var statementEntry = document.createElement("input");
|
nickjillings@1370
|
750 statement.appendChild(statementText);
|
nickjillings@1370
|
751 statement.appendChild(statementEntry);
|
nickjillings@2159
|
752 statement.className = "survey-entry-attribute";
|
nickjillings@1370
|
753 statementText.textContent = "Statement/Question";
|
nickjillings@2159
|
754 statementEntry.style.width = "500px";
|
nickjillings@1370
|
755 statementEntry.addEventListener("change",this,false);
|
nickjillings@1370
|
756 statementEntry.setAttribute("name","statement");
|
nickjillings@1370
|
757 statementEntry.value = this.option.statement;
|
nickjillings@1370
|
758 this.dynamic.appendChild(statement);
|
nickjillings@1375
|
759
|
nickjillings@1375
|
760 var id = document.createElement("div");
|
nickjillings@1375
|
761 var idText = document.createElement("span");
|
nickjillings@1375
|
762 var idEntry = document.createElement("input");
|
nickjillings@1375
|
763 id.appendChild(idText);
|
nickjillings@1375
|
764 id.appendChild(idEntry);
|
nickjillings@2159
|
765 id.className = "survey-entry-attribute";
|
nickjillings@1375
|
766 idText.textContent = "ID: ";
|
nickjillings@1375
|
767 idEntry.addEventListener("change",this,false);
|
nickjillings@1375
|
768 idEntry.setAttribute("name","id");
|
nickjillings@1375
|
769 idEntry.value = this.option.id;
|
nickjillings@1375
|
770
|
nickjillings@2158
|
771 this.dynamic.appendChild(id);
|
nickjillings@2158
|
772
|
nickjillings@1370
|
773 switch(this.option.type)
|
nickjillings@1370
|
774 {
|
nickjillings@1370
|
775 case "statement":
|
nickjillings@1370
|
776 break;
|
nickjillings@1370
|
777 case "question":
|
nickjillings@1370
|
778 var boxsizeSelect = document.createElement("select");
|
nickjillings@1370
|
779 var optionList = specification.schema.getAllElementsByName("survey")[0].getAllElementsByName("boxsize")[0].getAllElementsByTagName("xs:enumeration");
|
nickjillings@1370
|
780 for (var i=0; i<optionList.length; i++)
|
nickjillings@1370
|
781 {
|
nickjillings@1370
|
782 var selectOption = document.createElement("option");
|
nickjillings@1370
|
783 selectOption.value = optionList[i].getAttribute("value");
|
nickjillings@1370
|
784 selectOption.textContent = selectOption.value;
|
nickjillings@1370
|
785 boxsizeSelect.appendChild(selectOption);
|
nickjillings@1370
|
786 }
|
nickjillings@1370
|
787 if(this.option.boxsize != undefined) {
|
nickjillings@1370
|
788 boxsizeSelect.value = this.option.boxsize;
|
nickjillings@1370
|
789 } else {
|
nickjillings@1370
|
790 boxsizeSelect.value = "normal";
|
nickjillings@1370
|
791 this.option.boxsize = "normal";
|
nickjillings@1370
|
792 }
|
nickjillings@1370
|
793 boxsizeSelect.setAttribute("name","boxsize");
|
nickjillings@1370
|
794 boxsizeSelect.addEventListener("change",this,false);
|
nickjillings@1370
|
795 var boxsize = document.createElement("div");
|
nickjillings@1370
|
796 var boxsizeText = document.createElement("span");
|
nickjillings@1370
|
797 boxsizeText.textContent = "Entry Size: ";
|
nickjillings@1370
|
798 boxsize.appendChild(boxsizeText);
|
nickjillings@1370
|
799 boxsize.appendChild(boxsizeSelect);
|
nickjillings@2159
|
800 boxsize.className = "survey-entry-attribute";
|
nickjillings@1370
|
801 this.dynamic.appendChild(boxsize);
|
nickjillings@1370
|
802
|
nickjillings@1370
|
803 var mandatory = document.createElement("div");
|
nickjillings@1370
|
804 var mandatoryInput = document.createElement("input");
|
nickjillings@1370
|
805 var mandatoryText = document.createElement("span");
|
nickjillings@1370
|
806 mandatoryText.textContent = "Mandatory: ";
|
nickjillings@1370
|
807 mandatory.appendChild(mandatoryText);
|
nickjillings@1370
|
808 mandatory.appendChild(mandatoryInput);
|
nickjillings@2159
|
809 mandatory.className = "survey-entry-attribute";
|
nickjillings@1370
|
810 mandatoryInput.type = "checkbox";
|
nickjillings@1370
|
811 if (this.option.mandatory) {mandatoryInput.checked = true;} else {mandatoryInput.checked = false;}
|
nickjillings@1370
|
812 mandatoryInput.setAttribute("name","mandatory");
|
nickjillings@1370
|
813 mandatoryInput.addEventListener("change",this,false);
|
nickjillings@1375
|
814 this.dynamic.appendChild(mandatory);
|
nickjillings@1375
|
815 break;
|
nickjillings@1375
|
816 case "number":
|
nickjillings@1375
|
817 this.dynamic.appendChild(id);
|
nickjillings@1375
|
818
|
nickjillings@1375
|
819 var mandatory = document.createElement("div");
|
nickjillings@1375
|
820 var mandatoryInput = document.createElement("input");
|
nickjillings@1375
|
821 var mandatoryText = document.createElement("span");
|
nickjillings@1375
|
822 mandatoryText.textContent = "Mandatory: ";
|
nickjillings@1370
|
823 mandatory.appendChild(mandatoryText);
|
nickjillings@1370
|
824 mandatory.appendChild(mandatoryInput);
|
nickjillings@2159
|
825 mandatory.className = "survey-entry-attribute";
|
nickjillings@1375
|
826 mandatoryInput.type = "checkbox";
|
nickjillings@1375
|
827 if (this.option.mandatory) {mandatoryInput.checked = true;} else {mandatoryInput.checked = false;}
|
nickjillings@1375
|
828 mandatoryInput.setAttribute("name","mandatory");
|
nickjillings@1375
|
829 mandatoryInput.addEventListener("change",this,false);
|
nickjillings@1370
|
830 this.dynamic.appendChild(mandatory);
|
nickjillings@1375
|
831
|
nickjillings@1375
|
832 var minimum = document.createElement("div");
|
nickjillings@1375
|
833 var minimumEntry = document.createElement("input");
|
nickjillings@1375
|
834 var minimumText = document.createElement("span");
|
nickjillings@1375
|
835 minimumText.textContent = "Minimum: ";
|
nickjillings@1375
|
836 minimum.appendChild(minimumText);
|
nickjillings@1375
|
837 minimum.appendChild(minimumEntry);
|
nickjillings@2159
|
838 minimum.className = "survey-entry-attribute";
|
nickjillings@1375
|
839 minimumEntry.type = "number";
|
nickjillings@1375
|
840 minimumEntry.setAttribute("name","min");
|
nickjillings@1375
|
841 minimumEntry.addEventListener("change",this,false);
|
nickjillings@1375
|
842 minimumEntry.value = this.option.min;
|
nickjillings@1375
|
843 this.dynamic.appendChild(minimum);
|
nickjillings@1375
|
844
|
nickjillings@1375
|
845 var maximum = document.createElement("div");
|
nickjillings@1375
|
846 var maximumEntry = document.createElement("input");
|
nickjillings@1375
|
847 var maximumText = document.createElement("span");
|
nickjillings@1375
|
848 maximumText.textContent = "Maximum: ";
|
nickjillings@1375
|
849 maximum.appendChild(maximumText);
|
nickjillings@1375
|
850 maximum.appendChild(maximumEntry);
|
nickjillings@2159
|
851 maximum.className = "survey-entry-attribute";
|
nickjillings@1375
|
852 maximumEntry.type = "number";
|
nickjillings@1375
|
853 maximumEntry.setAttribute("name","max");
|
nickjillings@1375
|
854 maximumEntry.addEventListener("change",this,false);
|
nickjillings@1375
|
855 maximumEntry.value = this.option.max;
|
nickjillings@1375
|
856 this.dynamic.appendChild(maximum);
|
nickjillings@1370
|
857 break;
|
nicholas@2562
|
858 case "video":
|
nicholas@2562
|
859 case "youtube":
|
nicholas@2562
|
860 this.dynamic.appendChild(id);
|
nicholas@2562
|
861
|
nicholas@2562
|
862 var mandatory = document.createElement("div");
|
nicholas@2562
|
863 var mandatoryInput = document.createElement("input");
|
nicholas@2562
|
864 var mandatoryText = document.createElement("span");
|
nicholas@2562
|
865 mandatoryText.textContent = "Mandatory: ";
|
nicholas@2562
|
866 mandatory.appendChild(mandatoryText);
|
nicholas@2562
|
867 mandatory.appendChild(mandatoryInput);
|
nicholas@2562
|
868 mandatory.className = "survey-entry-attribute";
|
nicholas@2562
|
869 mandatoryInput.type = "checkbox";
|
nicholas@2562
|
870 if (this.option.mandatory) {mandatoryInput.checked = true;} else {mandatoryInput.checked = false;}
|
nicholas@2562
|
871 mandatoryInput.setAttribute("name","mandatory");
|
nicholas@2562
|
872 mandatoryInput.addEventListener("change",this,false);
|
nicholas@2562
|
873 this.dynamic.appendChild(mandatory);
|
nicholas@2562
|
874
|
nicholas@2562
|
875 var url = document.createElement("div");
|
nicholas@2562
|
876 var urlInput = document.createElement("input");
|
nicholas@2562
|
877 var urlText = document.createElement("span");
|
nicholas@2562
|
878 urlText.textContent = "URL: ";
|
nicholas@2562
|
879 url.appendChild(urlText);
|
nicholas@2562
|
880 url.appendChild(urlInput);
|
nicholas@2562
|
881 url.className = "survey-entry-attribute";
|
nicholas@2562
|
882 urlInput.type = "text";
|
nicholas@2562
|
883 if (this.option.mandatory) {urlInput.value = this.option.mandatory;} else {urlInput.value = "";}
|
nicholas@2562
|
884 urlInput.setAttribute("name","url");
|
nicholas@2562
|
885 urlInput.addEventListener("change",this,false);
|
nicholas@2562
|
886 this.dynamic.appendChild(url);
|
nicholas@2562
|
887 break;
|
nickjillings@1375
|
888 case "checkbox":
|
nickjillings@1375
|
889 case "radio":
|
nickjillings@1375
|
890 this.dynamic.appendChild(id);
|
nickjillings@1375
|
891 var optionHolder = document.createElement("div");
|
nickjillings@1375
|
892 optionHolder.className = 'node';
|
nickjillings@1375
|
893 optionHolder.id = 'popup-option-holder';
|
nickjillings@1375
|
894 var optionObject = function(parent,option) {
|
nickjillings@1375
|
895 this.rootDOM = document.createElement("div");
|
nickjillings@1375
|
896 this.rootDOM.className = "popup-option-entry";
|
nickjillings@1375
|
897 this.inputName = document.createElement("input");
|
nickjillings@1375
|
898 this.inputName.setAttribute("name","name");
|
nickjillings@1375
|
899 this.inputLabel = document.createElement("input");
|
nickjillings@1375
|
900 this.inputLabel.setAttribute("name","text");
|
nickjillings@1375
|
901 this.specification = option;
|
nickjillings@1375
|
902 this.parent = parent;
|
nickjillings@1375
|
903 this.handleEvent = function()
|
nickjillings@1375
|
904 {
|
nickjillings@1375
|
905 var target = event.currentTarget.getAttribute("name");
|
nickjillings@1375
|
906 eval("this.specification."+target+" = event.currentTarget.value");
|
nickjillings@1375
|
907 };
|
nickjillings@1375
|
908
|
nickjillings@1375
|
909 var nameText = document.createElement("span");
|
nickjillings@1375
|
910 nameText.textContent = "Name: ";
|
nickjillings@1375
|
911 var labelText = document.createElement("span");
|
nickjillings@1375
|
912 labelText.textContent = "Label: ";
|
nickjillings@1375
|
913 this.rootDOM.appendChild(nameText);
|
nickjillings@1375
|
914 this.rootDOM.appendChild(this.inputName);
|
nickjillings@1375
|
915 this.rootDOM.appendChild(labelText);
|
nickjillings@1375
|
916 this.rootDOM.appendChild(this.inputLabel);
|
nickjillings@1375
|
917 this.inputName.addEventListener("change",this,false);
|
nickjillings@1375
|
918 this.inputLabel.addEventListener("change",this,false);
|
nickjillings@1375
|
919 this.inputName.value = this.specification.name;
|
nickjillings@1375
|
920 this.inputLabel.value = this.specification.text;
|
nickjillings@2180
|
921 this.inputLabel.style.width = "350px";
|
nickjillings@1375
|
922
|
nickjillings@1375
|
923 this.deleteEntry = {
|
nickjillings@1375
|
924 root: document.createElement("button"),
|
nickjillings@1375
|
925 parent: this,
|
nickjillings@1375
|
926 handleEvent: function() {
|
nickjillings@1375
|
927 document.getElementById("popup-option-holder").removeChild(this.parent.rootDOM);
|
nickjillings@1375
|
928 var index = this.parent.parent.option.options.findIndex(function(element,index,array){
|
nickjillings@1375
|
929 if (element == this.parent.specification)
|
nickjillings@1375
|
930 return true;
|
nickjillings@1375
|
931 else
|
nickjillings@1375
|
932 return false;
|
nickjillings@1375
|
933 },this);
|
nickjillings@1375
|
934 var optionList = this.parent.parent.option.options;
|
nickjillings@1375
|
935 if (index == optionList.length-1) {
|
nickjillings@1375
|
936 optionList = optionList.slice(0,index);
|
nickjillings@1375
|
937 } else {
|
nickjillings@1375
|
938 optionList = optionList.slice(0,index).concat(optionList.slice(index+1));
|
nickjillings@1375
|
939 }
|
nickjillings@1375
|
940 this.parent.parent.option.options = optionList;
|
nickjillings@1375
|
941 }
|
nickjillings@1375
|
942 };
|
nickjillings@1375
|
943 this.deleteEntry.root.textContent = "Delete Option";
|
nickjillings@1375
|
944 this.deleteEntry.root.addEventListener("click",this.deleteEntry,false);
|
nickjillings@1375
|
945 this.rootDOM.appendChild(this.deleteEntry.root);
|
nickjillings@1375
|
946 }
|
nickjillings@2158
|
947 this.addEntry = {
|
nickjillings@2158
|
948 parent: this,
|
nickjillings@2158
|
949 root: document.createElement("button"),
|
nickjillings@2158
|
950 handleEvent: function() {
|
nickjillings@2158
|
951 var node = {name: "name", text: "text"};
|
nickjillings@2158
|
952 var optionsList = this.parent.option.options;
|
nickjillings@2158
|
953 optionsList.push(node);
|
nickjillings@2158
|
954 var obj = new optionObject(this.parent,optionsList[optionsList.length-1]);
|
nickjillings@2158
|
955 this.parent.optionLists.push(obj);
|
nickjillings@2158
|
956 document.getElementById("popup-option-holder").appendChild(obj.rootDOM);
|
nickjillings@2158
|
957 }
|
nickjillings@2158
|
958 }
|
nickjillings@2158
|
959 this.addEntry.root.textContent = "Add Option";
|
nickjillings@2158
|
960 this.addEntry.root.addEventListener("click",this.addEntry);
|
nickjillings@2158
|
961 this.dynamic.appendChild(this.addEntry.root);
|
nickjillings@1375
|
962 for (var i=0; i<this.option.options.length; i++)
|
nickjillings@1375
|
963 {
|
nickjillings@1375
|
964 var obj = new optionObject(this,this.option.options[i]);
|
nickjillings@1375
|
965 this.optionLists.push(obj);
|
nickjillings@1375
|
966 optionHolder.appendChild(obj.rootDOM);
|
nickjillings@1375
|
967 }
|
nickjillings@1375
|
968 this.dynamic.appendChild(optionHolder);
|
nickjillings@1370
|
969 }
|
nickjillings@1370
|
970 }
|
nicholas@2562
|
971 this.handleEvent = function(event)
|
nickjillings@1370
|
972 {
|
nickjillings@1370
|
973 var name = event.currentTarget.getAttribute("name");
|
nickjillings@2159
|
974 var nodeName = event.currentTarget.nodeName;
|
nickjillings@2159
|
975 if (name == "type" && nodeName == "SELECT") {
|
nickjillings@2159
|
976 // If type has changed, we may need to rebuild the entire state node
|
nickjillings@2159
|
977 if (event.currentTarget.value != this.option.name)
|
nickjillings@2159
|
978 {
|
nickjillings@2159
|
979 this.option.type = event.currentTarget.value;
|
nickjillings@2159
|
980 this.generate(this.option,this.parent);
|
nickjillings@2159
|
981 }
|
nickjillings@2159
|
982 return;
|
nickjillings@2159
|
983 }
|
nickjillings@2162
|
984 switch(event.currentTarget.getAttribute("type")) {
|
nickjillings@2159
|
985 case "checkbox":
|
nickjillings@2159
|
986 eval("this.option."+name+" = event.currentTarget.checked");
|
nickjillings@1370
|
987 break;
|
nickjillings@2159
|
988 default:
|
nickjillings@2159
|
989 eval("this.option."+name+" = event.currentTarget.value");
|
nickjillings@1370
|
990 break;
|
nickjillings@1370
|
991 }
|
nickjillings@1370
|
992 }
|
nickjillings@1370
|
993 this.continue = function()
|
nickjillings@1370
|
994 {
|
nickjillings@1375
|
995 if (this.parent.type == "surveyNode")
|
nickjillings@1375
|
996 {
|
nickjillings@1375
|
997 var newNode = new this.parent.surveyEntryNode(this.parent,this.option);
|
nickjillings@1375
|
998 this.parent.children.push(newNode);
|
nickjillings@1375
|
999 this.parent.childrenDOM.appendChild(newNode.rootDOM);
|
nickjillings@1375
|
1000 } else if (this.parent.type == "surveyEntryNode") {
|
nickjillings@1375
|
1001 this.parent.build();
|
nickjillings@1375
|
1002 }
|
nickjillings@1370
|
1003 popupObject.hide();
|
nickjillings@1370
|
1004 }
|
nickjillings@1370
|
1005 }
|
nickjillings@1385
|
1006 this.state[6] = new function() {
|
nickjillings@1385
|
1007 this.title = "Edit Scale Markers";
|
nickjillings@1385
|
1008 this.content = document.createElement("div");
|
nickjillings@1385
|
1009 this.content.id = "state-6";
|
nickjillings@1385
|
1010 var spnH = document.createElement('div');
|
nickjillings@1385
|
1011 var span = document.createElement("span");
|
nickjillings@1385
|
1012 span.textContent = "You can edit your scale markers here for the selected interface.";
|
nickjillings@1385
|
1013 spnH.appendChild(span);
|
nickjillings@1385
|
1014 this.scaleRoot;
|
nickjillings@1385
|
1015 this.parent;
|
nickjillings@1385
|
1016 this.markerNodes =[];
|
nickjillings@1385
|
1017 this.preset = {
|
nickjillings@1385
|
1018 input: document.createElement("select"),
|
nickjillings@1385
|
1019 parent: this,
|
nickjillings@1385
|
1020 handleEvent: function(event) {
|
nickjillings@1385
|
1021 this.parent.scaleRoot.scales = [];
|
nickjillings@1385
|
1022 var protoScale = interfaceSpecs.getAllElementsByTagName('scaledefinitions')[0].getAllElementsByName(event.currentTarget.value)[0];
|
nicholas@2390
|
1023 var protoMarkers = protoScale.getElementsByTagName("scale");
|
nickjillings@1385
|
1024 for (var i=0; i<protoMarkers.length; i++)
|
nickjillings@1385
|
1025 {
|
nickjillings@1385
|
1026 var marker = {
|
nickjillings@1385
|
1027 position: protoMarkers[i].getAttribute("position"),
|
nickjillings@1385
|
1028 text: protoMarkers[i].textContent
|
nickjillings@1385
|
1029 }
|
nickjillings@1385
|
1030 this.parent.scaleRoot.scales.push(marker);
|
nickjillings@1385
|
1031 }
|
nickjillings@1385
|
1032 this.parent.buildMarkerList();
|
nickjillings@1385
|
1033 }
|
nickjillings@1385
|
1034 }
|
nickjillings@1385
|
1035 this.preset.input.addEventListener("change",this.preset);
|
nickjillings@1385
|
1036 this.content.appendChild(this.preset.input);
|
nickjillings@1385
|
1037 var optionHolder = document.createElement("div");
|
nickjillings@1385
|
1038 optionHolder.className = 'node';
|
nickjillings@1385
|
1039 optionHolder.id = 'popup-option-holder';
|
nickjillings@1385
|
1040 this.content.appendChild(optionHolder);
|
nickjillings@1385
|
1041 this.generate = function(scaleRoot,parent)
|
nickjillings@1385
|
1042 {
|
nickjillings@1385
|
1043 this.scaleRoot = scaleRoot;
|
nickjillings@1385
|
1044 this.parent = parent;
|
nickjillings@1385
|
1045
|
nickjillings@1385
|
1046 // Generate Pre-Set dropdown
|
nicholas@2390
|
1047 var protoScales = interfaceSpecs.getAllElementsByTagName('scaledefinitions')[0].getElementsByTagName("scale");
|
nickjillings@1385
|
1048 this.preset.input.innerHTML = "";
|
nickjillings@1385
|
1049
|
nickjillings@1385
|
1050 for (var i=0; i<protoScales.length; i++)
|
nickjillings@1385
|
1051 {
|
nickjillings@1385
|
1052 var selectOption = document.createElement("option");
|
nickjillings@1385
|
1053 var scaleName = protoScales[i].getAttribute("name");
|
nickjillings@1385
|
1054 selectOption.setAttribute("name",scaleName);
|
nickjillings@1385
|
1055 selectOption.textContent = scaleName;
|
nickjillings@1385
|
1056 this.preset.input.appendChild(selectOption);
|
nickjillings@1385
|
1057 }
|
nickjillings@1385
|
1058
|
nickjillings@2115
|
1059 this.addMarker = {
|
nickjillings@2115
|
1060 root: document.createElement("button"),
|
nickjillings@2115
|
1061 parent: this,
|
nickjillings@2115
|
1062 handleEvent: function() {
|
nickjillings@2115
|
1063 var marker = {
|
nickjillings@2115
|
1064 position: 0,
|
nickjillings@2115
|
1065 text: "text"
|
nickjillings@2115
|
1066 };
|
nickjillings@2115
|
1067 this.parent.scaleRoot.scales.push(marker);
|
nickjillings@2115
|
1068 var markerNode = new this.parent.buildMarkerNode(this.parent,marker);
|
nickjillings@2115
|
1069 document.getElementById("popup-option-holder").appendChild(markerNode.root);
|
nickjillings@2115
|
1070 this.parent.markerNodes.push(markerNode);
|
nickjillings@2115
|
1071 }
|
nickjillings@2115
|
1072 };
|
nickjillings@2115
|
1073 this.addMarker.root.textContent = "Add Marker";
|
nickjillings@2115
|
1074 this.addMarker.root.addEventListener("click",this.addMarker);
|
nickjillings@2115
|
1075 this.content.appendChild(this.addMarker.root);
|
nickjillings@2115
|
1076
|
nickjillings@1385
|
1077 // Create Marker List
|
nickjillings@1385
|
1078 this.buildMarkerList();
|
nickjillings@1385
|
1079 }
|
nickjillings@1385
|
1080 this.buildMarkerList = function() {
|
nickjillings@1385
|
1081 var markerInject = document.getElementById("popup-option-holder");
|
nickjillings@1385
|
1082 markerInject.innerHTML = "";
|
nickjillings@1385
|
1083 this.markerNodes = [];
|
nickjillings@1385
|
1084 for (var i=0; i<this.scaleRoot.scales.length; i++)
|
nickjillings@1385
|
1085 {
|
nickjillings@2115
|
1086 var markerNode = new this.buildMarkerNode(this,this.scaleRoot.scales[i]);
|
nickjillings@1385
|
1087 markerInject.appendChild(markerNode.root);
|
nickjillings@1385
|
1088 this.markerNodes.push(markerNode);
|
nickjillings@1385
|
1089
|
nickjillings@1385
|
1090 }
|
nickjillings@1385
|
1091 }
|
nickjillings@2115
|
1092
|
nickjillings@2115
|
1093 this.buildMarkerNode = function(parent,specification) {
|
nickjillings@2115
|
1094 this.root = document.createElement("div");
|
nickjillings@2115
|
1095 this.root.className = "popup-option-entry";
|
nickjillings@2115
|
1096 this.positionInput = document.createElement("input");
|
nickjillings@2115
|
1097 this.positionInput.min = 0;
|
nickjillings@2115
|
1098 this.positionInput.max = 100;
|
nickjillings@2115
|
1099 this.positionInput.value = specification.position;
|
nickjillings@2115
|
1100 this.positionInput.setAttribute("name","position");
|
nickjillings@2115
|
1101 this.textInput = document.createElement("input");
|
nickjillings@2115
|
1102 this.textInput.setAttribute("name","text");
|
nickjillings@2180
|
1103 this.textInput.style.width = "300px";
|
nickjillings@2115
|
1104 this.textInput.value = specification.text;
|
nickjillings@2115
|
1105 this.specification = specification;
|
nickjillings@2115
|
1106 this.parent = parent;
|
nickjillings@2115
|
1107 this.handleEvent = function(event) {
|
nickjillings@2115
|
1108 switch(event.currentTarget.getAttribute("name"))
|
nickjillings@2115
|
1109 {
|
nickjillings@2115
|
1110 case "position":
|
nickjillings@2115
|
1111 this.specification.position = Number(event.currentTarget.value);
|
nickjillings@2115
|
1112 break;
|
nickjillings@2115
|
1113 case "text":
|
nickjillings@2115
|
1114 this.specification.text = event.currentTarget.value;
|
nickjillings@2115
|
1115 break;
|
nickjillings@2115
|
1116 }
|
nickjillings@2115
|
1117 }
|
nickjillings@2115
|
1118 this.positionInput.addEventListener("change",this,false);
|
nickjillings@2115
|
1119 this.textInput.addEventListener("change",this,false);
|
nickjillings@2115
|
1120
|
nickjillings@2115
|
1121 var posText = document.createElement("span");
|
nickjillings@2115
|
1122 posText.textContent = "Position: ";
|
nickjillings@2115
|
1123 var textText = document.createElement("span");
|
nickjillings@2115
|
1124 textText.textContent = "Text: ";
|
nickjillings@2115
|
1125 this.root.appendChild(posText);
|
nickjillings@2115
|
1126 this.root.appendChild(this.positionInput);
|
nickjillings@2115
|
1127 this.root.appendChild(textText);
|
nickjillings@2115
|
1128 this.root.appendChild(this.textInput);
|
nickjillings@2115
|
1129
|
nickjillings@2115
|
1130 this.deleteMarker = {
|
nickjillings@2115
|
1131 root: document.createElement("button"),
|
nickjillings@2115
|
1132 parent: this,
|
nickjillings@2115
|
1133 handleEvent: function() {
|
nickjillings@2115
|
1134 var index = this.parent.parent.scaleRoot.scales.findIndex(function(element,index,array){
|
nickjillings@2115
|
1135 if (element == this) {return true;} else {return false;}
|
nickjillings@2115
|
1136 },this.parent.specification)
|
nickjillings@2115
|
1137 if (index >= 0) {
|
nickjillings@2115
|
1138 this.parent.parent.scaleRoot.scales.splice(index,1);
|
nickjillings@2115
|
1139 }
|
nickjillings@2115
|
1140 document.getElementById("popup-option-holder").removeChild(this.parent.root);
|
nickjillings@2115
|
1141 }
|
nickjillings@2115
|
1142 }
|
nickjillings@2115
|
1143 this.deleteMarker.root.addEventListener("click",this.deleteMarker);
|
nickjillings@2115
|
1144 this.deleteMarker.root.textContent = "Delete Marker"
|
nickjillings@2115
|
1145 this.root.appendChild(this.deleteMarker.root);
|
nickjillings@2115
|
1146 }
|
nickjillings@1385
|
1147 }
|
nickjillings@1370
|
1148 }
|
nickjillings@1370
|
1149 }
|
nickjillings@1370
|
1150
|
nickjillings@1370
|
1151 function SpecificationToHTML()
|
nickjillings@1370
|
1152 {
|
nickjillings@1370
|
1153 // This takes the specification node and converts it to an on-page HTML object
|
nickjillings@1370
|
1154 // Each Specification Node is given its own JS object which listens to the XSD for instant verification
|
nickjillings@1370
|
1155 // Once generated, it directly binds into the specification object to update with changes
|
nickjillings@1370
|
1156 // Fixed DOM entries
|
nickjillings@1370
|
1157 this.injectDOM;
|
nickjillings@1370
|
1158 this.setupDOM;
|
nickjillings@1370
|
1159 this.pages = [];
|
nickjillings@1370
|
1160
|
nickjillings@1370
|
1161 // Self-contained generators
|
nickjillings@1370
|
1162 this.createGeneralNodeDOM = function(name,id,parent)
|
nickjillings@1370
|
1163 {
|
nickjillings@1375
|
1164 this.type = name;
|
nickjillings@1370
|
1165 var root = document.createElement('div');
|
nickjillings@1370
|
1166 root.id = id;
|
nickjillings@1370
|
1167 root.className = "node";
|
nickjillings@1370
|
1168
|
nickjillings@1370
|
1169 var titleDiv = document.createElement('div');
|
nickjillings@1370
|
1170 titleDiv.className = "node-title";
|
nickjillings@1370
|
1171 var title = document.createElement('span');
|
nickjillings@1370
|
1172 title.className = "node-title";
|
nickjillings@1370
|
1173 title.textContent = name;
|
nickjillings@1370
|
1174 titleDiv.appendChild(title);
|
nickjillings@1370
|
1175
|
nickjillings@1370
|
1176 var attributeDiv = document.createElement('div');
|
nickjillings@1370
|
1177 attributeDiv.className = "node-attributes";
|
nickjillings@1370
|
1178
|
nickjillings@1370
|
1179 var childrenDiv = document.createElement('div');
|
nickjillings@1370
|
1180 childrenDiv.className = "node-children";
|
nickjillings@1370
|
1181
|
nickjillings@1370
|
1182 var buttonsDiv = document.createElement('div');
|
nickjillings@1370
|
1183 buttonsDiv.className = "node-buttons";
|
nickjillings@1370
|
1184
|
nickjillings@1370
|
1185 root.appendChild(titleDiv);
|
nickjillings@1370
|
1186 root.appendChild(attributeDiv);
|
nickjillings@1370
|
1187 root.appendChild(childrenDiv);
|
nickjillings@1370
|
1188 root.appendChild(buttonsDiv);
|
nickjillings@1370
|
1189
|
nickjillings@1370
|
1190 var obj = {
|
nickjillings@1370
|
1191 rootDOM: root,
|
nickjillings@1370
|
1192 titleDOM: title,
|
nickjillings@1370
|
1193 attributeDOM: attributeDiv,
|
nickjillings@1370
|
1194 attributes: [],
|
nickjillings@1370
|
1195 childrenDOM: childrenDiv,
|
nickjillings@1370
|
1196 children: [],
|
nickjillings@1370
|
1197 buttonDOM: buttonsDiv,
|
nickjillings@1370
|
1198 parent: parent
|
nickjillings@1370
|
1199 }
|
nickjillings@1370
|
1200 return obj;
|
nickjillings@1370
|
1201 }
|
nickjillings@1370
|
1202
|
nickjillings@1370
|
1203 this.convertAttributeToDOM = function(node,schema)
|
nickjillings@1370
|
1204 {
|
nickjillings@1370
|
1205 // This takes an attribute schema node and returns an object with the input node and any bindings
|
nickjillings@1370
|
1206 if (schema.getAttribute('name') == undefined && schema.getAttribute('ref') != undefined)
|
nickjillings@1370
|
1207 {
|
nickjillings@1370
|
1208 schema = specification.schema.getAllElementsByName(schema.getAttribute('ref'))[0];
|
nickjillings@1370
|
1209 }
|
nickjillings@1370
|
1210 var obj = new function()
|
nickjillings@1370
|
1211 {
|
nickjillings@1370
|
1212 this.input;
|
nickjillings@1370
|
1213 this.name;
|
nickjillings@1370
|
1214 this.owner;
|
nickjillings@1370
|
1215 this.holder;
|
nickjillings@1370
|
1216
|
nickjillings@1370
|
1217 this.name = schema.getAttribute('name');
|
nickjillings@1370
|
1218 this.default = schema.getAttribute('default');
|
nickjillings@1370
|
1219 this.dataType = schema.getAttribute('type');
|
nickjillings@2158
|
1220 if (this.dataType == undefined) {
|
nickjillings@2158
|
1221 if (schema.childElementCount > 0) {
|
nicholas@2390
|
1222 if (schema.firstElementChild.nodeName == "xs:simpleType") {
|
nickjillings@2158
|
1223 this.dataType = schema.getAllElementsByTagName("xs:restriction")[0].getAttribute("base");
|
nickjillings@2158
|
1224 }
|
nickjillings@2158
|
1225 }
|
nickjillings@2158
|
1226 }
|
nickjillings@1370
|
1227 if (typeof this.dataType == "string") { this.dataType = this.dataType.substr(3);}
|
nickjillings@1370
|
1228 else {this.dataType = "string";}
|
nickjillings@1370
|
1229 var minVar = undefined;
|
nickjillings@1370
|
1230 var maxVar = undefined;
|
nickjillings@1370
|
1231 switch(this.dataType)
|
nickjillings@1370
|
1232 {
|
nickjillings@1370
|
1233 case "negativeInteger":
|
nickjillings@1370
|
1234 maxVar = -1;
|
nickjillings@1370
|
1235 break;
|
nickjillings@1370
|
1236 case "positiveInteger":
|
nickjillings@1370
|
1237 minVar = 1;
|
nickjillings@1370
|
1238 break;
|
nickjillings@1370
|
1239 case "nonNegativeInteger":
|
nickjillings@1370
|
1240 minVar = 0;
|
nickjillings@1370
|
1241 break;
|
nickjillings@1370
|
1242 case "nonPositiveInteger":
|
nickjillings@1370
|
1243 maxVar = 0;
|
nickjillings@1370
|
1244 break;
|
nickjillings@1370
|
1245 case "byte":
|
nickjillings@1370
|
1246 minVar = 0;
|
nickjillings@1370
|
1247 maxVar = 256;
|
nickjillings@1370
|
1248 break;
|
nickjillings@1370
|
1249 case "short":
|
nickjillings@1370
|
1250 minVar = 0;
|
nickjillings@1370
|
1251 maxVar = 65536;
|
nickjillings@1370
|
1252 break;
|
nickjillings@1370
|
1253 default:
|
nickjillings@1370
|
1254 break;
|
nickjillings@1370
|
1255 }
|
nickjillings@2174
|
1256
|
nickjillings@2174
|
1257 this.enumeration = schema.getAllElementsByTagName("xs:enumeration");
|
nickjillings@2174
|
1258 if (this.enumeration.length == 0) {
|
nickjillings@2174
|
1259 this.input = document.createElement('input');
|
nickjillings@2174
|
1260 switch(this.dataType)
|
nickjillings@2174
|
1261 {
|
nickjillings@2174
|
1262 case "boolean":
|
nickjillings@2174
|
1263 this.input.type = "checkbox";
|
nickjillings@2174
|
1264 break;
|
nickjillings@2174
|
1265 case "negativeInteger":
|
nickjillings@2174
|
1266 case "positiveInteger":
|
nickjillings@2174
|
1267 case "nonNegativeInteger":
|
nickjillings@2174
|
1268 case "nonPositiveInteger":
|
nickjillings@2174
|
1269 case "integer":
|
nickjillings@2174
|
1270 case "short":
|
nickjillings@2174
|
1271 case "byte":
|
nickjillings@2174
|
1272 this.input.step = 1;
|
nickjillings@2174
|
1273 case "decimal":
|
nickjillings@2174
|
1274 this.input.type = "number";
|
nickjillings@2174
|
1275 this.input.min = minVar;
|
nickjillings@2174
|
1276 this.input.max = maxVar;
|
nickjillings@2174
|
1277 break;
|
nickjillings@2174
|
1278 default:
|
nickjillings@2174
|
1279 break;
|
nickjillings@2174
|
1280 }
|
nickjillings@2174
|
1281 } else {
|
nickjillings@2174
|
1282 this.input = document.createElement("select");
|
nickjillings@2174
|
1283 for (var i=0; i<this.enumeration.length; i++)
|
nickjillings@2174
|
1284 {
|
nickjillings@2174
|
1285 var option = document.createElement("option");
|
nickjillings@2174
|
1286 var value = this.enumeration[i].getAttribute("value");
|
nickjillings@2174
|
1287 option.setAttribute("value",value);
|
nickjillings@2174
|
1288 option.textContent = value;
|
nickjillings@2174
|
1289 this.input.appendChild(option);
|
nickjillings@2174
|
1290 }
|
nickjillings@1370
|
1291 }
|
nickjillings@1370
|
1292 var value;
|
nickjillings@1373
|
1293 eval("value = node."+this.name)
|
nickjillings@2174
|
1294 if (this.default != undefined && value == undefined)
|
nickjillings@1370
|
1295 {
|
nickjillings@2174
|
1296 value = this.default;
|
nickjillings@2174
|
1297 }
|
nickjillings@2174
|
1298 if (this.input.type == "checkbox") {
|
nicholas@2239
|
1299 if (value == "true" || value == "True") {this.input.checked = false;}
|
nicholas@2239
|
1300 else {this.input.checked = false;}
|
nickjillings@2174
|
1301 } else {
|
nickjillings@1370
|
1302 this.input.value = value;
|
nickjillings@1370
|
1303 }
|
nickjillings@1370
|
1304 this.handleEvent = function(event)
|
nickjillings@1370
|
1305 {
|
nickjillings@1370
|
1306 var value;
|
nickjillings@2174
|
1307 if (this.input.nodeName == "INPUT")
|
nickjillings@1370
|
1308 {
|
nickjillings@2174
|
1309 switch(this.input.type)
|
nickjillings@2174
|
1310 {
|
nickjillings@2174
|
1311 case "checkbox":
|
nickjillings@2174
|
1312 value = event.currentTarget.checked;
|
nickjillings@2174
|
1313 break;
|
nickjillings@2174
|
1314 case "number":
|
n@2423
|
1315 if (event.currentTarget.value != "") {
|
n@2423
|
1316 value = Number(event.currentTarget.value);
|
n@2423
|
1317 } else {
|
n@2423
|
1318 value = undefined;
|
n@2423
|
1319 }
|
nickjillings@2174
|
1320 break;
|
nickjillings@2174
|
1321 default:
|
n@2423
|
1322 if (event.currentTarget.value != "") {
|
n@2423
|
1323 value = event.currentTarget.value;
|
n@2423
|
1324 } else {
|
n@2423
|
1325 value = undefined;
|
n@2423
|
1326 }
|
nickjillings@2174
|
1327 break;
|
nickjillings@2174
|
1328 }
|
nickjillings@2174
|
1329 } else if (this.input.nodeName == "SELECT") {
|
nickjillings@2174
|
1330 value = event.currentTarget.value;
|
nickjillings@1370
|
1331 }
|
nickjillings@1370
|
1332 eval("this.owner."+this.name+" = value");
|
nickjillings@1370
|
1333 }
|
nickjillings@1370
|
1334 this.holder = document.createElement('div');
|
nickjillings@1370
|
1335 this.holder.className = "attribute";
|
nickjillings@1370
|
1336 this.holder.setAttribute('name',this.name);
|
nickjillings@1370
|
1337 var text = document.createElement('span');
|
nickjillings@1370
|
1338 eval("text.textContent = attributeText."+this.name+"+': '");
|
nickjillings@1370
|
1339 this.holder.appendChild(text);
|
nickjillings@1370
|
1340 this.holder.appendChild(this.input);
|
nickjillings@1370
|
1341 this.owner = node;
|
nickjillings@1370
|
1342 this.input.addEventListener("change",this,false);
|
nickjillings@1370
|
1343 }
|
nickjillings@1370
|
1344 if (obj.attribute != null)
|
nickjillings@1370
|
1345 {
|
nickjillings@1370
|
1346 obj.input.value = obj.attribute;
|
nickjillings@1370
|
1347 }
|
nickjillings@1370
|
1348 return obj;
|
nickjillings@1370
|
1349 }
|
nickjillings@1370
|
1350
|
nickjillings@1370
|
1351 this.convert = function(root)
|
nickjillings@1370
|
1352 {
|
nickjillings@1370
|
1353 //Performs the actual conversion using the given root DOM as the root
|
nickjillings@1370
|
1354 this.injectDOM = root;
|
nickjillings@1370
|
1355
|
nickjillings@1373
|
1356 // Build the export button
|
nickjillings@1373
|
1357 var exportButton = document.createElement("button");
|
nickjillings@1373
|
1358 exportButton.textContent = "Export to XML";
|
nickjillings@1373
|
1359 exportButton.onclick = function()
|
nickjillings@1373
|
1360 {
|
nickjillings@1373
|
1361 var doc = specification.encode();
|
nickjillings@1373
|
1362 var obj = {};
|
nickjillings@1373
|
1363 obj.title = "Export";
|
nickjillings@1373
|
1364 obj.content = document.createElement("div");
|
nickjillings@1373
|
1365 obj.content.id = "finish";
|
nickjillings@1373
|
1366 var span = document.createElement("span");
|
n@2405
|
1367 span.textContent = "Your XML document is linked below. On most browsers, simply right click on the link and select 'Save As'. Or clicking on the link may download the file directly."
|
n@2405
|
1368 obj.content.appendChild(span);
|
n@2405
|
1369 span = document.createElement("p");
|
n@2405
|
1370 span.textContent = "NOTE FOR SAFARI! You cannot right click on the below link and save it as a file, Safari does not like that at all. Instead click on it to open the XML, the Press Cmd+S to open the save dialogue. Make sure you have 'save as Page Source' selected on the bottom of the window. Currently Safari has no plans to support the HTML 'download' attribute which causes this problem";
|
nickjillings@1373
|
1371 obj.content.appendChild(span);
|
nickjillings@1373
|
1372 var link = document.createElement("div");
|
n@2412
|
1373 link.appendChild(doc.firstChild);
|
nickjillings@1373
|
1374 var file = [link.innerHTML];
|
nickjillings@1373
|
1375 var bb = new Blob(file,{type : 'application/xml'});
|
nickjillings@1373
|
1376 var dnlk = window.URL.createObjectURL(bb);
|
nickjillings@1373
|
1377 var a = document.createElement("a");
|
nickjillings@1373
|
1378 a.hidden = '';
|
nickjillings@1373
|
1379 a.href = dnlk;
|
nickjillings@1373
|
1380 a.download = "project-specification.xml";
|
nickjillings@1373
|
1381 a.textContent = "Save File";
|
nickjillings@1373
|
1382 obj.content.appendChild(a);
|
nickjillings@1373
|
1383 popupObject.show();
|
nickjillings@1373
|
1384 popupObject.postNode(obj);
|
nickjillings@1373
|
1385 }
|
nickjillings@1373
|
1386 this.injectDOM.appendChild(exportButton);
|
nickjillings@1373
|
1387
|
nickjillings@1370
|
1388 // First perform the setupNode;
|
nickjillings@1370
|
1389 var setupSchema = specification.schema.getAllElementsByName('setup')[0];
|
nickjillings@2114
|
1390 this.setupDOM = new this.createGeneralNodeDOM('Global Configuration','setup',null);
|
nickjillings@1370
|
1391 this.injectDOM.appendChild(this.setupDOM.rootDOM);
|
nickjillings@1370
|
1392 var setupAttributes = setupSchema.getAllElementsByTagName('xs:attribute');
|
nickjillings@1370
|
1393 for (var i=0; i<setupAttributes.length; i++)
|
nickjillings@1370
|
1394 {
|
nickjillings@1370
|
1395 var attributeName = setupAttributes[i].getAttribute('name');
|
nickjillings@1370
|
1396 var attrObject = this.convertAttributeToDOM(specification,setupAttributes[i]);
|
nickjillings@1370
|
1397 this.setupDOM.attributeDOM.appendChild(attrObject.holder);
|
nickjillings@1370
|
1398 this.setupDOM.attributes.push(attrObject);
|
nickjillings@1370
|
1399 }
|
nickjillings@1370
|
1400
|
nickjillings@2179
|
1401 // Build the exit Text node
|
nickjillings@2179
|
1402 var exitText = new this.createGeneralNodeDOM("Exit Text","exit-test",this.setupDOM);
|
nickjillings@2179
|
1403 exitText.rootDOM.removeChild(exitText.attributeDOM);
|
nickjillings@2179
|
1404 this.setupDOM.children.push(exitText);
|
nickjillings@2179
|
1405 this.setupDOM.childrenDOM.appendChild(exitText.rootDOM);
|
nickjillings@2179
|
1406 var obj = {
|
nickjillings@2179
|
1407 rootDOM: document.createElement("div"),
|
nickjillings@2179
|
1408 labelDOM: document.createElement("label"),
|
nickjillings@2179
|
1409 inputDOM: document.createElement("textarea"),
|
nickjillings@2179
|
1410 parent: exitText,
|
nickjillings@2179
|
1411 specification: specification,
|
nickjillings@2179
|
1412 handleEvent: function(event) {
|
nickjillings@2179
|
1413 this.specification.exitText = this.inputDOM.value;
|
nickjillings@2179
|
1414 }
|
nickjillings@2179
|
1415 }
|
b@2367
|
1416 var exitWarning = document.createElement("div");
|
b@2367
|
1417 obj.rootDOM.appendChild(exitWarning);
|
b@2367
|
1418 exitWarning.textContent = "Only visible when the above 'On complete redirect URL' field is empty.";
|
nickjillings@2179
|
1419 obj.rootDOM.appendChild(obj.labelDOM);
|
nickjillings@2179
|
1420 obj.rootDOM.appendChild(obj.inputDOM);
|
nickjillings@2179
|
1421 obj.labelDOM.textContent = "Text: ";
|
nickjillings@2179
|
1422 obj.inputDOM.value = obj.specification.exitText;
|
nickjillings@2179
|
1423 obj.inputDOM.addEventListener("change",obj);
|
nickjillings@2179
|
1424 exitText.children.push(obj);
|
nickjillings@2179
|
1425 exitText.childrenDOM.appendChild(obj.rootDOM);
|
nickjillings@2179
|
1426
|
nickjillings@1370
|
1427 // Now we must build the interface Node
|
nickjillings@1370
|
1428 this.interfaceDOM = new this.interfaceNode(this,specification.interfaces);
|
nickjillings@1370
|
1429 this.interfaceDOM.build("Interface","setup-interface",this.setupDOM.rootDOM);
|
nickjillings@1370
|
1430
|
nickjillings@1370
|
1431 // Now build the Metrics selection node
|
nickjillings@2114
|
1432 var metric = this.createGeneralNodeDOM("Session Metrics","setup-metric",this.setupDOM);
|
nickjillings@1370
|
1433 metric.rootDOM.removeChild(metric.attributeDOM);
|
nickjillings@1370
|
1434 this.setupDOM.children.push(metric);
|
nickjillings@1370
|
1435 this.setupDOM.childrenDOM.appendChild(metric.rootDOM);
|
nickjillings@1370
|
1436 var interfaceName = popupStateNodes.state[1].select.value;
|
nickjillings@1370
|
1437 var checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("metrics")[0];
|
nickjillings@1370
|
1438 var testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
|
nickjillings@1370
|
1439 var interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(testXML.getAttribute("interface"))[0].getAllElementsByTagName("metrics")[0];
|
nickjillings@1370
|
1440 testXML = testXML.getAllElementsByTagName("metrics");
|
nicholas@2390
|
1441 var interfaceXMLChild = interfaceXML.firstElementChild;
|
nicholas@2390
|
1442 while(interfaceXMLChild)
|
nickjillings@1370
|
1443 {
|
nickjillings@1370
|
1444 var obj = {
|
nickjillings@1370
|
1445 input: document.createElement('input'),
|
nickjillings@1370
|
1446 root: document.createElement('div'),
|
nickjillings@1370
|
1447 text: document.createElement('span'),
|
nickjillings@1370
|
1448 specification: specification.metrics.enabled,
|
nicholas@2390
|
1449 name: interfaceXMLChild.getAttribute("name"),
|
nickjillings@1370
|
1450 handleEvent: function()
|
nickjillings@1370
|
1451 {
|
nickjillings@1370
|
1452 for (var i=0; i<this.specification.length; i++)
|
nickjillings@1370
|
1453 {
|
nickjillings@1370
|
1454 if (this.specification[i] == this.name)
|
nickjillings@1370
|
1455 {
|
nickjillings@1370
|
1456 var options = this.specification;
|
nickjillings@1370
|
1457 if (this.input.checked == false) {
|
nickjillings@1370
|
1458 if (i == options.length)
|
nickjillings@1370
|
1459 {options = options.slice(0,i);}
|
nickjillings@1370
|
1460 else {
|
nickjillings@1370
|
1461 options = options.slice(0,i).concat(options.slice(i+1));
|
nickjillings@1370
|
1462 }
|
nickjillings@1370
|
1463 } else {
|
nickjillings@1370
|
1464 return;
|
nickjillings@1370
|
1465 }
|
nickjillings@1370
|
1466 this.specification = options;
|
nickjillings@1370
|
1467 break;
|
nickjillings@1370
|
1468 }
|
nickjillings@1370
|
1469 }
|
nickjillings@1370
|
1470 if (this.input.checked) {
|
nickjillings@1370
|
1471 this.specification.push(this.name);
|
nickjillings@1370
|
1472 }
|
nickjillings@1370
|
1473 }
|
nickjillings@1370
|
1474 };
|
nickjillings@1370
|
1475 obj.root.className = "attribute";
|
nickjillings@1370
|
1476 obj.input.type = "checkbox";
|
nickjillings@1370
|
1477 obj.root.appendChild(obj.text);
|
nickjillings@1370
|
1478 obj.root.appendChild(obj.input);
|
nicholas@2390
|
1479 obj.text.textContent = checkText.getAllElementsByName(interfaceXMLChild.getAttribute("name"))[0].textContent;
|
nickjillings@1370
|
1480 metric.children.push(obj);
|
nickjillings@1370
|
1481 metric.childrenDOM.appendChild(obj.root);
|
nickjillings@1314
|
1482 for (var j=0; j<specification.metrics.enabled.length; j++)
|
nickjillings@1370
|
1483 {
|
nickjillings@1314
|
1484 if (specification.metrics.enabled[j] == obj.name)
|
nickjillings@1370
|
1485 {
|
nickjillings@1370
|
1486 obj.input.checked = true;
|
nickjillings@1370
|
1487 break;
|
nickjillings@1370
|
1488 }
|
nickjillings@1370
|
1489 }
|
nicholas@2390
|
1490 interfaceXMLChild = interfaceXMLChild.nextElementSibling;
|
nickjillings@1370
|
1491 }
|
nickjillings@1370
|
1492
|
nickjillings@1370
|
1493 // Now both before and after surveys
|
nickjillings@1370
|
1494 if (specification.preTest == undefined){
|
nickjillings@2194
|
1495 specification.preTest = new specification.surveyNode(specification);
|
nickjillings@1370
|
1496 specification.preTest.location = "pre";
|
nickjillings@1370
|
1497 }
|
nickjillings@1370
|
1498 if (specification.postTest == undefined){
|
nickjillings@2194
|
1499 specification.postTest = new specification.surveyNode(specification);
|
nickjillings@1370
|
1500 specification.postTest.location = "post";
|
nickjillings@1370
|
1501 }
|
nickjillings@1370
|
1502 var surveyBefore = new this.surveyNode(this,specification.preTest,"Pre");
|
nickjillings@1370
|
1503 var surveyAfter = new this.surveyNode(this,specification.postTest,"Post");
|
nickjillings@1370
|
1504 this.setupDOM.children.push(surveyBefore);
|
nickjillings@1370
|
1505 this.setupDOM.children.push(surveyAfter);
|
nickjillings@1370
|
1506 this.setupDOM.childrenDOM.appendChild(surveyBefore.rootDOM);
|
nickjillings@1370
|
1507 this.setupDOM.childrenDOM.appendChild(surveyAfter.rootDOM);
|
nickjillings@1370
|
1508
|
nickjillings@1370
|
1509 // Add in the page creator button
|
nickjillings@1370
|
1510 this.addPage = {
|
nickjillings@1370
|
1511 root: document.createElement("button"),
|
nickjillings@1370
|
1512 parent: this,
|
nickjillings@1370
|
1513 handleEvent: function()
|
nickjillings@1370
|
1514 {
|
nickjillings@2194
|
1515 var pageObj = new specification.page(specification);
|
nickjillings@1370
|
1516 specification.pages.push(pageObj);
|
nickjillings@1370
|
1517 var newPage = new this.parent.pageNode(this.parent,pageObj);
|
nicholas@2315
|
1518 document.getElementById("page-holder").appendChild(newPage.rootDOM);
|
nickjillings@1370
|
1519 this.parent.pages.push(newPage);
|
nickjillings@1370
|
1520 }
|
nickjillings@1370
|
1521 }
|
nickjillings@1370
|
1522 this.addPage.root.textContent = "Add Page";
|
nicholas@2315
|
1523 this.addPage.root.id = "new-page-button";
|
nicholas@2315
|
1524 this.addPage.root.style.float = "left";
|
nickjillings@1370
|
1525 this.addPage.root.addEventListener("click",this.addPage,false);
|
nicholas@2315
|
1526
|
nicholas@2315
|
1527 var pageHolder = document.createElement("div");
|
nicholas@2315
|
1528 pageHolder.id ="page-holder";
|
nicholas@2315
|
1529 this.injectDOM.appendChild(pageHolder);
|
nickjillings@1374
|
1530
|
nickjillings@1374
|
1531 // Build each page
|
nickjillings@1374
|
1532 for (var page of specification.pages)
|
nickjillings@1374
|
1533 {
|
nickjillings@1374
|
1534 var newPage = new this.pageNode(this,page);
|
nicholas@2315
|
1535 pageHolder.appendChild(newPage.rootDOM);
|
nickjillings@1374
|
1536 this.pages.push(newPage);
|
nickjillings@1374
|
1537 }
|
nicholas@2315
|
1538
|
nicholas@2315
|
1539 this.injectDOM.appendChild(this.addPage.root);
|
nickjillings@1370
|
1540 }
|
nickjillings@1370
|
1541
|
nickjillings@1370
|
1542 this.interfaceNode = function(parent,rootObject)
|
nickjillings@1370
|
1543 {
|
nickjillings@1375
|
1544 this.type = "interfaceNode";
|
nickjillings@1370
|
1545 this.rootDOM;
|
nickjillings@1370
|
1546 this.titleDOM;
|
nickjillings@1370
|
1547 this.attributeDOM;
|
nickjillings@1370
|
1548 this.attributes = [];
|
nickjillings@1370
|
1549 this.childrenDOM;
|
nickjillings@1370
|
1550 this.children = [];
|
nickjillings@1370
|
1551 this.buttonDOM;
|
nickjillings@1370
|
1552 this.parent = parent;
|
nickjillings@1370
|
1553 this.HTMLPoint;
|
nickjillings@1370
|
1554 this.specification = rootObject;
|
nickjillings@1370
|
1555 this.schema = specification.schema.getAllElementsByName("interface")[1];
|
nickjillings@1370
|
1556
|
nickjillings@1370
|
1557 this.createIOasAttr = function(name,specification,parent,type) {
|
nickjillings@1370
|
1558 this.root = document.createElement('div');
|
nickjillings@1370
|
1559 this.input = document.createElement("input");
|
nickjillings@1370
|
1560 this.name = name;
|
nickjillings@1370
|
1561 this.type = type;
|
nickjillings@1370
|
1562 this.parent = parent;
|
nickjillings@1370
|
1563 this.specification = specification;
|
nickjillings@1370
|
1564 this.handleEvent = function(event) {
|
nickjillings@1370
|
1565 for (var i=0; i<this.specification.options.length; i++)
|
nickjillings@1370
|
1566 {
|
nickjillings@1370
|
1567 if (this.specification.options[i].name == this.name)
|
nickjillings@1370
|
1568 {
|
nickjillings@1370
|
1569 var options = this.specification.options;
|
nickjillings@1370
|
1570 if (this.input.checked == false) {
|
nickjillings@1370
|
1571 if (i == options.length)
|
nickjillings@1370
|
1572 {options = options.slice(0,i);}
|
nickjillings@1370
|
1573 else {
|
nickjillings@1370
|
1574 options = options.slice(0,i).concat(options.slice(i+1));
|
nickjillings@1370
|
1575 }
|
nickjillings@1370
|
1576 } else {
|
nickjillings@1370
|
1577 return;
|
nickjillings@1370
|
1578 }
|
nickjillings@1370
|
1579 this.specification.options = options;
|
nickjillings@1370
|
1580 break;
|
nickjillings@1370
|
1581 }
|
nickjillings@1370
|
1582 }
|
nickjillings@1370
|
1583 if (this.input.checked) {
|
nickjillings@1370
|
1584 var obj = {
|
nickjillings@1370
|
1585 name: this.name,
|
nickjillings@1370
|
1586 type: this.type
|
nickjillings@1370
|
1587 };
|
nickjillings@1370
|
1588 this.specification.options.push(obj);
|
nickjillings@1370
|
1589 }
|
nickjillings@1370
|
1590 if (this.parent.HTMLPoint.id == "setup")
|
nickjillings@1370
|
1591 {
|
nickjillings@1370
|
1592 // We've changed a global setting, must update all child 'interfaces' and disable them
|
nickjillings@1370
|
1593 for (pages of convert.pages)
|
nickjillings@1370
|
1594 {
|
nickjillings@1370
|
1595 for (interface of pages.interfaces)
|
nickjillings@1370
|
1596 {
|
nickjillings@1370
|
1597 if (this.type == "check")
|
nickjillings@1370
|
1598 {
|
nickjillings@1370
|
1599 for (node of interface.children[0].attributes)
|
nickjillings@1370
|
1600 {
|
nickjillings@1370
|
1601 if (node.name == this.name) {
|
nickjillings@1370
|
1602 if (this.input.checked) {
|
nickjillings@1370
|
1603 node.input.disabled = true;
|
nickjillings@1370
|
1604 node.input.checked = false;
|
nickjillings@1370
|
1605 } else {
|
nickjillings@1370
|
1606 node.input.disabled = false;
|
nickjillings@1370
|
1607 }
|
nickjillings@1370
|
1608 break;
|
nickjillings@1370
|
1609 }
|
nickjillings@1370
|
1610 }
|
nickjillings@1370
|
1611 } else if (this.type == "show")
|
nickjillings@1370
|
1612 {
|
nickjillings@1370
|
1613 for (node of interface.children[1].attributes)
|
nickjillings@1370
|
1614 {
|
nickjillings@1370
|
1615 if (node.name == this.name) {
|
nickjillings@1370
|
1616 if (this.input.checked) {
|
nickjillings@1370
|
1617 node.input.disabled = true;
|
nickjillings@1370
|
1618 } else {
|
nickjillings@1370
|
1619 node.input.disabled = false;
|
nickjillings@1370
|
1620 }
|
nickjillings@1370
|
1621 break;
|
nickjillings@1370
|
1622 }
|
nickjillings@1370
|
1623 }
|
nickjillings@1370
|
1624 }
|
nickjillings@1370
|
1625 }
|
nickjillings@1370
|
1626 }
|
nickjillings@1370
|
1627 }
|
nickjillings@1370
|
1628 };
|
nickjillings@1370
|
1629 this.findIndex = function(element,index,array){
|
nickjillings@1370
|
1630 if (element.name == this.name)
|
nickjillings@1370
|
1631 return true;
|
nickjillings@1370
|
1632 else
|
nickjillings@1370
|
1633 return false;
|
nickjillings@1370
|
1634 };
|
nickjillings@1370
|
1635 this.findNode = function(element,index,array){
|
nickjillings@1370
|
1636 if (element.name == this.name)
|
nickjillings@1370
|
1637 return true;
|
nickjillings@1370
|
1638 else
|
nickjillings@1370
|
1639 return false;
|
nickjillings@1370
|
1640 };
|
nickjillings@1370
|
1641 this.input.type = "checkbox";
|
nickjillings@1370
|
1642 this.input.setAttribute("name",name);
|
nickjillings@1370
|
1643 this.input.addEventListener("change",this,false);
|
nickjillings@1370
|
1644 this.root.appendChild(this.input);
|
nickjillings@1370
|
1645 this.root.className = "attribute";
|
nickjillings@1370
|
1646 return this;
|
nickjillings@1370
|
1647 }
|
nickjillings@1370
|
1648
|
nickjillings@1370
|
1649 this.build = function(name,id,parent)
|
nickjillings@1370
|
1650 {
|
nickjillings@1370
|
1651 var obj = this.parent.createGeneralNodeDOM(name,id,parent);
|
nickjillings@1370
|
1652
|
nickjillings@1370
|
1653 this.rootDOM = obj.rootDOM;
|
nickjillings@1370
|
1654 this.titleDOM = obj.titleDOM;
|
nickjillings@1370
|
1655 this.attributeDOM = obj.attributeDOM;
|
nickjillings@1370
|
1656 this.childrenDOM = obj.childrenDOM;
|
nickjillings@1370
|
1657 this.buttonDOM = obj.buttonsDOM;
|
nickjillings@1370
|
1658 this.HTMLPoint = parent;
|
nickjillings@1370
|
1659 this.rootDOM.removeChild(this.attributeDOM);
|
nicholas@2243
|
1660 if (parent.id != "setup") {
|
nicholas@2243
|
1661 // Put in the <title> node:
|
nicholas@2243
|
1662 this.titleNode = {
|
nicholas@2243
|
1663 root: document.createElement("div"),
|
nicholas@2243
|
1664 label: document.createElement("span"),
|
nicholas@2243
|
1665 input: document.createElement("input"),
|
nicholas@2243
|
1666 parent: this,
|
nicholas@2243
|
1667 handleEvent: function(event) {
|
nicholas@2243
|
1668 this.parent.specification.title = event.currentTarget.value;
|
nicholas@2243
|
1669 }
|
nicholas@2243
|
1670 }
|
nicholas@2243
|
1671 this.titleNode.label.textContent = "Axis Title:";
|
nicholas@2243
|
1672 this.titleNode.root.className = "node-children";
|
nicholas@2243
|
1673 this.titleNode.root.appendChild(this.titleNode.label);
|
nicholas@2243
|
1674 this.titleNode.root.appendChild(this.titleNode.input);
|
nicholas@2243
|
1675 this.titleNode.input.addEventListener("change",this.titleNode,false);
|
nicholas@2243
|
1676 this.titleNode.input.value = this.specification.title;
|
nicholas@2243
|
1677 this.children.push(this.titleNode);
|
nicholas@2243
|
1678 this.childrenDOM.appendChild(this.titleNode.root);
|
nicholas@2243
|
1679 }
|
nicholas@2243
|
1680
|
nickjillings@1370
|
1681 // Put in the check / show options as individual children
|
nickjillings@1370
|
1682 var checks = this.parent.createGeneralNodeDOM("Checks","setup-interface-checks",this);
|
nickjillings@1370
|
1683
|
nickjillings@1370
|
1684 var interfaceName = popupStateNodes.state[1].select.value;
|
nickjillings@1370
|
1685 var checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("checks")[0];
|
nickjillings@1370
|
1686 var testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
|
nickjillings@1370
|
1687 var interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(testXML.getAttribute("interface"))[0].getAllElementsByTagName("checks")[0];
|
nickjillings@1370
|
1688 testXML = testXML.getAllElementsByTagName("checks");
|
nicholas@2390
|
1689 var interfaceXMLChild = interfaceXML.firstElementChild;
|
nicholas@2390
|
1690 while (interfaceXMLChild)
|
nickjillings@1370
|
1691 {
|
nicholas@2390
|
1692 var obj = new this.createIOasAttr(interfaceXMLChild.getAttribute("name"),this.specification,this,"check");
|
nickjillings@1370
|
1693 for (var option of this.specification.options)
|
nickjillings@1370
|
1694 {
|
nickjillings@1370
|
1695 if (option.name == obj.name)
|
nickjillings@1370
|
1696 {
|
nickjillings@1370
|
1697 obj.input.checked = true;
|
nickjillings@1370
|
1698 break;
|
nickjillings@1370
|
1699 }
|
nickjillings@1370
|
1700 }
|
nickjillings@1370
|
1701 if (parent.id != "setup") {
|
nickjillings@1370
|
1702 var node = convert.interfaceDOM.children[0].attributes.find(obj.findNode,obj);
|
nickjillings@1381
|
1703 if (node != undefined) {
|
nickjillings@1381
|
1704 if (node.input.checked) {
|
nickjillings@1381
|
1705 obj.input.checked = false;
|
nickjillings@1381
|
1706 obj.input.disabled = true;
|
nickjillings@1381
|
1707 }
|
nickjillings@1370
|
1708 }
|
nickjillings@1370
|
1709 }
|
nickjillings@1370
|
1710 var text = document.createElement('span');
|
nicholas@2390
|
1711 text.textContent = checkText.getAllElementsByName(interfaceXMLChild.getAttribute("name"))[0].textContent;
|
nickjillings@1370
|
1712 obj.root.appendChild(text);
|
nickjillings@1370
|
1713 checks.attributeDOM.appendChild(obj.root);
|
nickjillings@1370
|
1714 checks.attributes.push(obj);
|
nicholas@2390
|
1715 interfaceXMLChild = interfaceXMLChild.nextElementSibling;
|
nickjillings@1370
|
1716 }
|
nickjillings@1370
|
1717 this.children.push(checks);
|
nickjillings@1370
|
1718 this.childrenDOM.appendChild(checks.rootDOM);
|
nickjillings@1370
|
1719
|
nickjillings@1370
|
1720 var show = this.parent.createGeneralNodeDOM("Show","setup-interface-show",this);
|
nickjillings@1370
|
1721 interfaceName = popupStateNodes.state[1].select.value;
|
nickjillings@1370
|
1722 checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("show")[0];
|
nickjillings@1370
|
1723 testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
|
nickjillings@1370
|
1724 interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(testXML.getAttribute("interface"))[0].getAllElementsByTagName("show")[0];
|
nickjillings@1370
|
1725 testXML = testXML.getAllElementsByTagName("show");
|
nicholas@2390
|
1726 interfaceXMLChild = interfaceXML.firstElementChild;
|
nicholas@2390
|
1727 while(interfaceXMLChild)
|
nickjillings@1370
|
1728 {
|
nicholas@2390
|
1729 var obj = new this.createIOasAttr(interfaceXMLChild.getAttribute("name"),this.specification,this,"show");
|
nickjillings@1370
|
1730 for (var option of this.specification.options)
|
nickjillings@1370
|
1731 {
|
nickjillings@1370
|
1732 if (option.name == obj.name)
|
nickjillings@1370
|
1733 {
|
nickjillings@1370
|
1734 obj.input.checked = true;
|
nickjillings@1370
|
1735 break;
|
nickjillings@1370
|
1736 }
|
nickjillings@1370
|
1737 }
|
nickjillings@1370
|
1738 if (parent.id != "setup") {
|
nickjillings@1370
|
1739 var node = convert.interfaceDOM.children[0].attributes.find(obj.findNode,obj);
|
nickjillings@1381
|
1740 if (node != undefined) {
|
nickjillings@1381
|
1741 if (node.input.checked) {
|
nickjillings@1381
|
1742 obj.input.checked = false;
|
nickjillings@1381
|
1743 obj.input.disabled = true;
|
nickjillings@1381
|
1744 }
|
nickjillings@1370
|
1745 }
|
nickjillings@1370
|
1746 }
|
nickjillings@1370
|
1747 var text = document.createElement('span');
|
nicholas@2390
|
1748 text.textContent = checkText.getAllElementsByName(interfaceXMLChild.getAttribute("name"))[0].textContent;
|
nickjillings@1370
|
1749 obj.root.appendChild(text);
|
nickjillings@1370
|
1750 show.attributeDOM.appendChild(obj.root);
|
nickjillings@1370
|
1751 show.attributes.push(obj);
|
nicholas@2390
|
1752 interfaceXMLChild = interfaceXMLChild.nextElementSibling;
|
nickjillings@1370
|
1753 }
|
nickjillings@1370
|
1754 this.children.push(show);
|
nickjillings@1370
|
1755 this.childrenDOM.appendChild(show.rootDOM);
|
nickjillings@1370
|
1756
|
nickjillings@1370
|
1757 if (parent.id == "setup")
|
nickjillings@1370
|
1758 {
|
nickjillings@1370
|
1759 } else {
|
nickjillings@1370
|
1760 var nameAttr = this.parent.convertAttributeToDOM(this,specification.schema.getAllElementsByName("name")[0]);
|
nickjillings@1370
|
1761 this.attributeDOM.appendChild(nameAttr.holder);
|
nickjillings@1370
|
1762 this.attributes.push(nameAttr);
|
nickjillings@1385
|
1763 var scales = new this.scalesNode(this,this.specification);
|
nickjillings@1385
|
1764 this.children.push(scales);
|
nickjillings@1385
|
1765 this.childrenDOM.appendChild(scales.rootDOM);
|
nickjillings@1370
|
1766 }
|
nickjillings@1370
|
1767 if (parent != undefined)
|
nickjillings@1370
|
1768 {
|
nickjillings@1370
|
1769 parent.appendChild(this.rootDOM);
|
nickjillings@1370
|
1770 }
|
nickjillings@1370
|
1771 }
|
nickjillings@1385
|
1772
|
nickjillings@1385
|
1773 this.scalesNode = function(parent,rootObject)
|
nickjillings@1385
|
1774 {
|
nickjillings@1385
|
1775 this.type = "scalesNode";
|
nickjillings@1385
|
1776 this.rootDOM = document.createElement("div");
|
nickjillings@1385
|
1777 this.titleDOM = document.createElement("span");
|
nickjillings@1385
|
1778 this.attributeDOM = document.createElement("div");
|
nickjillings@1385
|
1779 this.attributes = [];
|
nickjillings@1385
|
1780 this.childrenDOM = document.createElement("div");
|
nickjillings@1385
|
1781 this.children = [];
|
nickjillings@1385
|
1782 this.buttonDOM = document.createElement("div");
|
nickjillings@1385
|
1783 this.parent = parent;
|
nickjillings@1385
|
1784 this.specification = rootObject;
|
nickjillings@1385
|
1785 this.schema = specification.schema.getAllElementsByName("page")[0];
|
nickjillings@1385
|
1786 this.rootDOM.className = "node";
|
nickjillings@1385
|
1787
|
nickjillings@1385
|
1788 var titleDiv = document.createElement('div');
|
nickjillings@1385
|
1789 titleDiv.className = "node-title";
|
nickjillings@1385
|
1790 this.titleDOM.className = "node-title";
|
nickjillings@1385
|
1791 this.titleDOM.textContent = "Interface Scales";
|
nickjillings@1385
|
1792 titleDiv.appendChild(this.titleDOM);
|
nickjillings@1385
|
1793
|
nickjillings@1385
|
1794 this.attributeDOM.className = "node-attributes";
|
nickjillings@1385
|
1795 this.childrenDOM.className = "node-children";
|
nickjillings@1385
|
1796 this.buttonDOM.className = "node-buttons";
|
nickjillings@1385
|
1797
|
nickjillings@1385
|
1798 this.rootDOM.appendChild(titleDiv);
|
nickjillings@1385
|
1799 this.rootDOM.appendChild(this.attributeDOM);
|
nickjillings@1385
|
1800 this.rootDOM.appendChild(this.childrenDOM);
|
nickjillings@1385
|
1801 this.rootDOM.appendChild(this.buttonDOM);
|
nickjillings@1385
|
1802
|
nickjillings@1385
|
1803 this.editButton = {
|
nickjillings@1385
|
1804 button: document.createElement("button"),
|
nickjillings@1385
|
1805 parent: this,
|
nickjillings@1385
|
1806 handleEvent: function(event) {
|
nickjillings@1385
|
1807 popupObject.show();
|
nickjillings@1385
|
1808 popupObject.postNode(popupStateNodes.state[6]);
|
nickjillings@1385
|
1809 popupStateNodes.state[6].generate(this.parent.specification,this.parent);
|
nickjillings@1385
|
1810 }
|
nickjillings@1385
|
1811 };
|
nickjillings@1385
|
1812 this.editButton.button.textContent = "Edit Scales/Markers";
|
nickjillings@1385
|
1813 this.editButton.button.addEventListener("click",this.editButton,false);
|
nickjillings@1385
|
1814 this.buttonDOM.appendChild(this.editButton.button);
|
nickjillings@1385
|
1815 }
|
nickjillings@1370
|
1816 }
|
nickjillings@1370
|
1817
|
nickjillings@1370
|
1818 this.surveyNode = function(parent,rootObject,location)
|
nickjillings@1370
|
1819 {
|
nickjillings@1375
|
1820 this.type = "surveyNode";
|
nickjillings@1370
|
1821 this.rootDOM = document.createElement("div");
|
nickjillings@1370
|
1822 this.titleDOM = document.createElement("span");
|
nickjillings@1370
|
1823 this.attributeDOM = document.createElement("div");
|
nickjillings@1370
|
1824 this.attributes = [];
|
nickjillings@1370
|
1825 this.childrenDOM = document.createElement("div");
|
nickjillings@1370
|
1826 this.children = [];
|
nickjillings@1370
|
1827 this.buttonDOM = document.createElement("div");
|
nickjillings@1370
|
1828 this.parent = parent;
|
nickjillings@1370
|
1829 this.specification = rootObject;
|
nickjillings@1370
|
1830 this.schema = specification.schema.getAllElementsByName("survey")[1];
|
nickjillings@1370
|
1831 this.rootDOM.className = "node";
|
nickjillings@1370
|
1832
|
nickjillings@1370
|
1833 var titleDiv = document.createElement('div');
|
nickjillings@1370
|
1834 titleDiv.className = "node-title";
|
nickjillings@1370
|
1835 this.titleDOM.className = "node-title";
|
nickjillings@1370
|
1836 this.titleDOM.textContent = "Survey";
|
nickjillings@1370
|
1837 titleDiv.appendChild(this.titleDOM);
|
nickjillings@1370
|
1838
|
nickjillings@1370
|
1839 this.attributeDOM.className = "node-attributes";
|
nickjillings@1370
|
1840 var locationAttr = document.createElement("span");
|
nickjillings@1370
|
1841 this.attributeDOM.appendChild(locationAttr);
|
nickjillings@1370
|
1842 if (location == "Pre" || location == "pre") {
|
nickjillings@1370
|
1843 locationAttr.textContent = "Location: Before";
|
nickjillings@1370
|
1844 } else {
|
nickjillings@1370
|
1845 locationAttr.textContent = "Location: After";
|
nickjillings@1370
|
1846 }
|
nickjillings@1370
|
1847 this.childrenDOM.className = "node-children";
|
nickjillings@1370
|
1848 this.buttonDOM.className = "node-buttons";
|
nickjillings@1370
|
1849
|
nickjillings@1370
|
1850 this.rootDOM.appendChild(titleDiv);
|
nickjillings@1370
|
1851 this.rootDOM.appendChild(this.attributeDOM);
|
nickjillings@1370
|
1852 this.rootDOM.appendChild(this.childrenDOM);
|
nickjillings@1370
|
1853 this.rootDOM.appendChild(this.buttonDOM);
|
nickjillings@1370
|
1854
|
nickjillings@1370
|
1855 this.surveyEntryNode = function(parent,rootObject)
|
nickjillings@1370
|
1856 {
|
nickjillings@1375
|
1857 this.type = "surveyEntryNode";
|
nickjillings@1370
|
1858 this.rootDOM = document.createElement("div");
|
nickjillings@1370
|
1859 this.titleDOM = document.createElement("span");
|
nickjillings@1370
|
1860 this.attributeDOM = document.createElement("div");
|
nickjillings@1370
|
1861 this.attributes = [];
|
nickjillings@1370
|
1862 this.childrenDOM = document.createElement("div");
|
nickjillings@1370
|
1863 this.children = [];
|
nickjillings@1370
|
1864 this.buttonDOM = document.createElement("div");
|
nickjillings@1370
|
1865 this.parent = parent;
|
nickjillings@1370
|
1866 this.specification = rootObject;
|
nickjillings@1370
|
1867 this.schema = specification.schema.getAllElementsByName("surveyentry")[1];
|
nickjillings@1370
|
1868
|
nickjillings@1370
|
1869 this.rootDOM.className = "node";
|
nickjillings@1370
|
1870 this.rootDOM.style.minWidth = "50%";
|
nickjillings@1370
|
1871
|
nickjillings@1370
|
1872 var titleDiv = document.createElement('div');
|
nickjillings@1370
|
1873 titleDiv.className = "node-title";
|
nickjillings@1370
|
1874 this.titleDOM.className = "node-title";
|
nickjillings@1370
|
1875 titleDiv.appendChild(this.titleDOM);
|
nickjillings@1370
|
1876
|
nickjillings@1370
|
1877 this.attributeDOM.className = "node-attributes";
|
nickjillings@1370
|
1878 this.childrenDOM.className = "node-children";
|
nickjillings@1370
|
1879 this.buttonDOM.className = "node-buttons";
|
nickjillings@1370
|
1880
|
nickjillings@1370
|
1881 this.rootDOM.appendChild(titleDiv);
|
nickjillings@1370
|
1882 this.rootDOM.appendChild(this.attributeDOM);
|
nickjillings@1370
|
1883 this.rootDOM.appendChild(this.childrenDOM);
|
nickjillings@1370
|
1884 this.rootDOM.appendChild(this.buttonDOM);
|
nickjillings@1370
|
1885
|
nickjillings@1375
|
1886 this.build = function()
|
nickjillings@1375
|
1887 {
|
nickjillings@1375
|
1888 this.attributeDOM.innerHTML = null;
|
nickjillings@1375
|
1889 this.childrenDOM.innerHTML = null;
|
nickjillings@1375
|
1890 var statementRoot = document.createElement("div");
|
nickjillings@1375
|
1891 var statement = document.createElement("span");
|
nickjillings@1375
|
1892 statement.textContent = "Statement / Question: "+this.specification.statement;
|
nickjillings@1375
|
1893 statementRoot.appendChild(statement);
|
nickjillings@1375
|
1894 this.children.push(statementRoot);
|
nickjillings@1375
|
1895 this.childrenDOM.appendChild(statementRoot);
|
nickjillings@1375
|
1896 switch(this.specification.type)
|
nickjillings@1375
|
1897 {
|
nickjillings@1375
|
1898 case "statement":
|
nickjillings@1375
|
1899 this.titleDOM.textContent = "Statement";
|
nickjillings@1375
|
1900 break;
|
nickjillings@1375
|
1901 case "question":
|
nickjillings@1375
|
1902 this.titleDOM.textContent = "Question";
|
nickjillings@1375
|
1903 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
|
nickjillings@1375
|
1904 var mandatory = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("mandatory")[0]);
|
nickjillings@1375
|
1905 var boxsize = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("boxsize")[0]);
|
nickjillings@1375
|
1906 this.attributeDOM.appendChild(id.holder);
|
nickjillings@1375
|
1907 this.attributes.push(id);
|
nickjillings@1375
|
1908 this.attributeDOM.appendChild(mandatory.holder);
|
nickjillings@1375
|
1909 this.attributes.push(mandatory);
|
nickjillings@1375
|
1910 this.attributeDOM.appendChild(boxsize.holder);
|
nickjillings@1375
|
1911 this.attributes.push(boxsize);
|
nickjillings@1375
|
1912 break;
|
nickjillings@1375
|
1913 case "number":
|
nickjillings@1375
|
1914 this.titleDOM.textContent = "Number";
|
nickjillings@1375
|
1915 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
|
nickjillings@1375
|
1916 var mandatory = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("mandatory")[0]);
|
nickjillings@1375
|
1917 var min = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("min")[0]);
|
nickjillings@1375
|
1918 var max = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("max")[0]);
|
nickjillings@1375
|
1919 this.attributeDOM.appendChild(id.holder);
|
nickjillings@1375
|
1920 this.attributes.push(id);
|
nicholas@2562
|
1921 this.attributeDOM.appendChild(mandatory.holder);
|
nicholas@2562
|
1922 this.attributes.push(mandatory);
|
nickjillings@1375
|
1923 this.attributeDOM.appendChild(min.holder);
|
nickjillings@1375
|
1924 this.attributes.push(min);
|
nickjillings@1375
|
1925 this.attributeDOM.appendChild(max.holder);
|
nickjillings@1375
|
1926 this.attributes.push(max);
|
nickjillings@1375
|
1927 break;
|
nickjillings@1375
|
1928 case "checkbox":
|
nickjillings@1375
|
1929 this.titleDOM.textContent = "Checkbox";
|
nickjillings@1375
|
1930 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
|
nickjillings@1375
|
1931 this.attributeDOM.appendChild(id.holder);
|
nickjillings@1375
|
1932 this.attributes.push(id);
|
nickjillings@1375
|
1933 break;
|
nickjillings@1375
|
1934 case "radio":
|
nickjillings@1375
|
1935 this.titleDOM.textContent = "Radio";
|
nickjillings@1375
|
1936 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
|
nickjillings@1375
|
1937 this.attributeDOM.appendChild(id.holder);
|
nickjillings@1375
|
1938 this.attributes.push(id);
|
nickjillings@1375
|
1939 break;
|
nicholas@2562
|
1940 case "video":
|
nicholas@2562
|
1941 this.titleDOM.textContent = "Video";
|
nicholas@2562
|
1942 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
|
nicholas@2562
|
1943 this.attributeDOM.appendChild(id.holder);
|
nicholas@2562
|
1944 this.attributes.push(id);
|
nicholas@2562
|
1945 var mandatory = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("mandatory")[0]);
|
nicholas@2562
|
1946 var url = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("url")[0]);
|
nicholas@2562
|
1947 this.attributeDOM.appendChild(mandatory.holder);
|
nicholas@2562
|
1948 this.attributes.push(mandatory);
|
nicholas@2562
|
1949 this.attributeDOM.appendChild(url.holder);
|
nicholas@2562
|
1950 this.attributes.push(url);
|
nicholas@2562
|
1951 break;
|
nicholas@2562
|
1952 case "youtube":
|
nicholas@2562
|
1953 this.titleDOM.textContent = "YouTube";
|
nicholas@2562
|
1954 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
|
nicholas@2562
|
1955 this.attributeDOM.appendChild(id.holder);
|
nicholas@2562
|
1956 this.attributes.push(id);
|
nicholas@2562
|
1957 var mandatory = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("mandatory")[0]);
|
nicholas@2562
|
1958 var url = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("url")[0]);
|
nicholas@2562
|
1959 this.attributeDOM.appendChild(mandatory.holder);
|
nicholas@2562
|
1960 this.attributes.push(mandatory);
|
nicholas@2562
|
1961 this.attributeDOM.appendChild(url.holder);
|
nicholas@2562
|
1962 this.attributes.push(url);
|
nicholas@2562
|
1963 break;
|
nickjillings@1375
|
1964 }
|
nickjillings@1370
|
1965 }
|
nickjillings@1375
|
1966 this.build();
|
nickjillings@1370
|
1967
|
nickjillings@1370
|
1968 this.editNode = {
|
nickjillings@1370
|
1969 root: document.createElement("button"),
|
nickjillings@1370
|
1970 parent: this,
|
nickjillings@1370
|
1971 handleEvent: function()
|
nickjillings@1370
|
1972 {
|
nickjillings@1370
|
1973 popupObject.show();
|
nickjillings@1375
|
1974 popupStateNodes.state[5].generate(this.parent.specification,this.parent);
|
nickjillings@1370
|
1975 popupObject.postNode(popupStateNodes.state[5]);
|
nickjillings@1370
|
1976 }
|
nickjillings@1370
|
1977 }
|
nickjillings@1370
|
1978 this.editNode.root.textContent = "Edit Entry";
|
nickjillings@1370
|
1979 this.editNode.root.addEventListener("click",this.editNode,false);
|
nickjillings@1370
|
1980 this.buttonDOM.appendChild(this.editNode.root);
|
nickjillings@1370
|
1981
|
nickjillings@1370
|
1982 this.deleteNode = {
|
nickjillings@1370
|
1983 root: document.createElement("button"),
|
nickjillings@1370
|
1984 parent: this,
|
nickjillings@1370
|
1985 handleEvent: function()
|
nickjillings@1370
|
1986 {
|
nickjillings@1370
|
1987 var optionList = this.parent.parent.specification.options;
|
nickjillings@1370
|
1988 var childList = this.parent.parent.children;
|
nickjillings@1370
|
1989 for (var i=0; i <this.parent.parent.specification.options.length; i++)
|
nickjillings@1370
|
1990 {
|
nickjillings@1370
|
1991 var option = this.parent.parent.specification.options[i];
|
nickjillings@1370
|
1992 if (option == this.parent.specification)
|
nickjillings@1370
|
1993 {
|
nickjillings@1370
|
1994 this.parent.parent.childrenDOM.removeChild(this.parent.rootDOM);
|
nickjillings@1370
|
1995 if (i == this.parent.parent.specification.options.length-1)
|
nickjillings@1370
|
1996 {
|
nickjillings@1370
|
1997 optionList = optionList.slice(0,i);
|
nickjillings@1370
|
1998 childList = childList.slice(0,i);
|
nickjillings@1370
|
1999 }
|
nickjillings@1370
|
2000 else {
|
nickjillings@1370
|
2001 optionList = optionList.slice(0,i).concat(optionList.slice(i+1));
|
nickjillings@1370
|
2002 childList = childList.slice(0,i).concat(childList.slice(i+1));
|
nickjillings@1370
|
2003 }
|
nickjillings@1370
|
2004 this.parent.parent.specification.options = optionList;
|
nickjillings@1370
|
2005 this.parent.parent.children = childList;
|
nickjillings@1370
|
2006 }
|
nickjillings@1370
|
2007 }
|
nickjillings@1370
|
2008 }
|
nickjillings@1370
|
2009 }
|
nickjillings@1370
|
2010 this.deleteNode.root.textContent = "Delete Entry";
|
nickjillings@1370
|
2011 this.deleteNode.root.addEventListener("click",this.deleteNode,false);
|
nickjillings@1370
|
2012 this.buttonDOM.appendChild(this.deleteNode.root);
|
n@2414
|
2013
|
n@2416
|
2014 this.moveToPosition = function(new_index){
|
n@2416
|
2015 new_index = Math.min(new_index,this.parent.children.length);
|
n@2416
|
2016 var curr_index = this.parent.children.findIndex(function(elem){
|
n@2416
|
2017 if (elem == this) {return true;} else {return false;}
|
n@2416
|
2018 },this);
|
n@2416
|
2019 // Split at the current location to remove the node and shift all the children up
|
n@2416
|
2020 var tail = this.parent.children.splice(curr_index+1);
|
n@2416
|
2021 this.parent.children.pop();
|
n@2416
|
2022 this.parent.children = this.parent.children.concat(tail);
|
n@2416
|
2023
|
n@2416
|
2024 //Split at the new location and insert the node
|
n@2416
|
2025 tail = this.parent.children.splice(new_index);
|
n@2416
|
2026 this.parent.children.push(this);
|
n@2416
|
2027 this.parent.children = this.parent.children.concat(tail);
|
n@2416
|
2028
|
n@2416
|
2029 // Re-build the specification
|
n@2416
|
2030 this.parent.specification.options = [];
|
n@2416
|
2031 this.parent.childrenDOM.innerHTML = "";
|
n@2416
|
2032 for (var obj of this.parent.children) {
|
n@2416
|
2033 this.parent.specification.options.push(obj.specification);
|
n@2416
|
2034 this.parent.childrenDOM.appendChild(obj.rootDOM);
|
n@2416
|
2035 }
|
n@2420
|
2036 this.parent.children.forEach(function(obj,index){
|
n@2420
|
2037 obj.moveButtons.disable(index);
|
n@2420
|
2038 });
|
n@2414
|
2039 }
|
n@2420
|
2040
|
n@2420
|
2041 this.moveButtons = {
|
n@2420
|
2042 root_up: document.createElement("button"),
|
n@2420
|
2043 root_down: document.createElement("button"),
|
n@2420
|
2044 parent: this,
|
n@2420
|
2045 handleEvent: function(event) {
|
n@2420
|
2046 var index = this.parent.parent.children.indexOf(this.parent);
|
n@2420
|
2047 if (event.currentTarget.getAttribute("direction") == "up") {
|
n@2420
|
2048 index = Math.max(index-1,0);
|
n@2420
|
2049 } else if (event.currentTarget.getAttribute("direction") == "down") {
|
n@2420
|
2050 index = Math.min(index+1,this.parent.parent.children.length-1);
|
n@2420
|
2051 }
|
n@2420
|
2052 this.parent.moveToPosition(index);
|
n@2420
|
2053 this.disable(index);
|
n@2420
|
2054 },
|
n@2420
|
2055 disable: function(index) {
|
n@2420
|
2056 if (index == 0) {
|
n@2420
|
2057 this.root_up.disabled = true;
|
n@2420
|
2058 } else {
|
n@2420
|
2059 this.root_up.disabled = false;
|
n@2420
|
2060 }
|
n@2420
|
2061 if (index == this.parent.parent.children.length-1) {
|
n@2420
|
2062 this.root_down.disabled = true;
|
n@2420
|
2063 } else {
|
n@2420
|
2064 this.root_down.disabled = false;
|
n@2420
|
2065 }
|
n@2420
|
2066 }
|
n@2420
|
2067 }
|
n@2420
|
2068 this.moveButtons.root_up.setAttribute("direction","up");
|
n@2420
|
2069 this.moveButtons.root_down.setAttribute("direction","down");
|
n@2420
|
2070 this.moveButtons.root_up.addEventListener("click",this.moveButtons,false);
|
n@2420
|
2071 this.moveButtons.root_down.addEventListener("click",this.moveButtons,false);
|
n@2420
|
2072 this.moveButtons.root_up.textContent = "Move Up";
|
n@2420
|
2073 this.moveButtons.root_down.textContent = "Move Down";
|
n@2420
|
2074 this.buttonDOM.appendChild(this.moveButtons.root_up);
|
n@2420
|
2075 this.buttonDOM.appendChild(this.moveButtons.root_down);
|
nickjillings@1370
|
2076 }
|
nickjillings@1370
|
2077 this.addNode = {
|
nickjillings@1370
|
2078 root: document.createElement("button"),
|
nickjillings@1370
|
2079 parent: this,
|
nickjillings@1370
|
2080 handleEvent: function()
|
nickjillings@1370
|
2081 {
|
nickjillings@2194
|
2082 var newNode = new this.parent.specification.OptionNode(this.parent.specification);
|
nickjillings@1370
|
2083 this.parent.specification.options.push(newNode);
|
nickjillings@1370
|
2084 popupObject.show();
|
nickjillings@1370
|
2085 popupStateNodes.state[5].generate(newNode,this.parent);
|
nickjillings@1370
|
2086 popupObject.postNode(popupStateNodes.state[5]);
|
nickjillings@1370
|
2087 }
|
nickjillings@1370
|
2088 }
|
nickjillings@1370
|
2089 this.addNode.root.textContent = "Add Survey Entry";
|
nickjillings@1370
|
2090 this.addNode.root.addEventListener("click",this.addNode,false);
|
nickjillings@1370
|
2091 this.buttonDOM.appendChild(this.addNode.root);
|
nickjillings@1370
|
2092
|
nickjillings@1370
|
2093 for (var option of this.specification.options)
|
nickjillings@1370
|
2094 {
|
nickjillings@1370
|
2095 var newNode = new this.surveyEntryNode(this,option);
|
nickjillings@1370
|
2096 this.children.push(newNode);
|
nickjillings@1370
|
2097 this.childrenDOM.appendChild(newNode.rootDOM);
|
nickjillings@1370
|
2098 }
|
n@2420
|
2099
|
n@2420
|
2100 this.children.forEach(function(obj,index){
|
n@2420
|
2101 obj.moveButtons.disable(index);
|
n@2420
|
2102 });
|
nickjillings@1370
|
2103 }
|
nickjillings@1370
|
2104
|
nickjillings@1370
|
2105 this.pageNode = function(parent,rootObject)
|
nickjillings@1370
|
2106 {
|
nickjillings@1375
|
2107 this.type = "pageNode";
|
nickjillings@1370
|
2108 this.rootDOM = document.createElement("div");
|
nickjillings@1370
|
2109 this.titleDOM = document.createElement("span");
|
nickjillings@1370
|
2110 this.attributeDOM = document.createElement("div");
|
nickjillings@1370
|
2111 this.attributes = [];
|
nickjillings@1370
|
2112 this.childrenDOM = document.createElement("div");
|
nickjillings@1370
|
2113 this.children = [];
|
nickjillings@1370
|
2114 this.buttonDOM = document.createElement("div");
|
nickjillings@1370
|
2115 this.parent = parent;
|
nickjillings@1370
|
2116 this.specification = rootObject;
|
nickjillings@1370
|
2117 this.schema = specification.schema.getAllElementsByName("page")[0];
|
nickjillings@1370
|
2118 this.rootDOM.className = "node";
|
nickjillings@1370
|
2119
|
nickjillings@1370
|
2120 var titleDiv = document.createElement('div');
|
nickjillings@1370
|
2121 titleDiv.className = "node-title";
|
nickjillings@1370
|
2122 this.titleDOM.className = "node-title";
|
nickjillings@1370
|
2123 this.titleDOM.textContent = "Test Page";
|
nickjillings@1370
|
2124 titleDiv.appendChild(this.titleDOM);
|
nickjillings@1370
|
2125
|
nickjillings@1370
|
2126 this.attributeDOM.className = "node-attributes";
|
nickjillings@1370
|
2127 this.childrenDOM.className = "node-children";
|
nickjillings@1370
|
2128 this.buttonDOM.className = "node-buttons";
|
nickjillings@1370
|
2129
|
nickjillings@1370
|
2130 this.rootDOM.appendChild(titleDiv);
|
nickjillings@1370
|
2131 this.rootDOM.appendChild(this.attributeDOM);
|
nickjillings@1370
|
2132 this.rootDOM.appendChild(this.childrenDOM);
|
nickjillings@1370
|
2133 this.rootDOM.appendChild(this.buttonDOM);
|
nickjillings@1370
|
2134
|
nickjillings@1370
|
2135 // Do the comment prefix node
|
nickjillings@1370
|
2136 var cpn = this.parent.createGeneralNodeDOM("Comment Prefix",""+this.specification.id+"-commentprefix",this.parent);
|
nickjillings@1370
|
2137 cpn.rootDOM.removeChild(cpn.attributeDOM);
|
nickjillings@1370
|
2138 var obj = {
|
nickjillings@1370
|
2139 root: document.createElement("div"),
|
nickjillings@1370
|
2140 input: document.createElement("input"),
|
nickjillings@1370
|
2141 parent: this,
|
nickjillings@1370
|
2142 handleEvent: function()
|
nickjillings@1370
|
2143 {
|
nickjillings@1370
|
2144 this.parent.specification.commentBoxPrefix = event.currentTarget.value;
|
nickjillings@1370
|
2145 }
|
nickjillings@1370
|
2146 }
|
nickjillings@1370
|
2147 cpn.children.push(obj);
|
nickjillings@1370
|
2148 cpn.childrenDOM.appendChild(obj.root);
|
nickjillings@1370
|
2149 obj.root.appendChild(obj.input);
|
nickjillings@1370
|
2150 obj.input.addEventListener("change",obj,false);
|
nickjillings@1370
|
2151 obj.input.value = this.specification.commentBoxPrefix;
|
nickjillings@1370
|
2152 this.childrenDOM.appendChild(cpn.rootDOM);
|
nickjillings@1370
|
2153 this.children.push(cpn);
|
nickjillings@1370
|
2154
|
nickjillings@1370
|
2155 // Now both before and after surveys
|
nickjillings@1370
|
2156 if (this.specification.preTest == undefined){
|
nickjillings@2194
|
2157 this.specification.preTest = new specification.surveyNode(specification);
|
nickjillings@1370
|
2158 this.specification.preTest.location = "pre";
|
nickjillings@1370
|
2159 }
|
nickjillings@1370
|
2160 if (this.specification.postTest == undefined){
|
nickjillings@2194
|
2161 this.specification.postTest = new specification.surveyNode(specification);
|
nickjillings@1370
|
2162 this.specification.postTest.location = "post";
|
nickjillings@1370
|
2163 }
|
nickjillings@1370
|
2164 var surveyBefore = new this.parent.surveyNode(this,this.specification.preTest,"Pre");
|
nickjillings@1370
|
2165 var surveyAfter = new this.parent.surveyNode(this,this.specification.postTest,"Post");
|
nickjillings@1370
|
2166 this.children.push(surveyBefore);
|
nickjillings@1370
|
2167 this.children.push(surveyAfter);
|
nickjillings@1370
|
2168 this.childrenDOM.appendChild(surveyBefore.rootDOM);
|
nickjillings@1370
|
2169 this.childrenDOM.appendChild(surveyAfter.rootDOM);
|
nickjillings@1370
|
2170
|
nickjillings@1370
|
2171 // Build the attributes
|
nickjillings@1370
|
2172 var attributeList = this.schema.getAllElementsByTagName("xs:attribute");
|
nickjillings@1370
|
2173 for (var i=0; i<attributeList.length; i++)
|
nickjillings@1370
|
2174 {
|
nickjillings@1370
|
2175 var attributeName = attributeList[i].getAttribute('name');
|
nickjillings@1370
|
2176 var attrObject = this.parent.convertAttributeToDOM(rootObject,attributeList[i]);
|
nickjillings@1370
|
2177 this.attributeDOM.appendChild(attrObject.holder);
|
nickjillings@1370
|
2178 this.attributes.push(attrObject);
|
nickjillings@1370
|
2179 }
|
nickjillings@1370
|
2180
|
nickjillings@1370
|
2181 this.interfaces = [];
|
nickjillings@1370
|
2182
|
n@2421
|
2183 this.getAudioElements = function() {
|
n@2421
|
2184 var array = [];
|
n@2421
|
2185 for (var i=0; i<this.children.length; i++) {
|
n@2421
|
2186 if (this.children[i].type == "audioElementNode") {
|
n@2421
|
2187 array[array.length] = this.children[i];
|
n@2421
|
2188 }
|
n@2421
|
2189 }
|
n@2421
|
2190 return array;
|
n@2421
|
2191 }
|
n@2421
|
2192
|
n@2421
|
2193 this.redrawChildren = function() {
|
n@2421
|
2194 this.childrenDOM.innerHTML = "";
|
n@2421
|
2195 for(var child of this.children) {
|
n@2421
|
2196 this.childrenDOM.appendChild(child.rootDOM);
|
n@2421
|
2197 }
|
n@2421
|
2198 }
|
n@2421
|
2199
|
nickjillings@1370
|
2200 this.audioElementNode = function(parent,rootObject)
|
nickjillings@1370
|
2201 {
|
nickjillings@1375
|
2202 this.type = "audioElementNode";
|
nickjillings@1370
|
2203 this.rootDOM = document.createElement("div");
|
nickjillings@1370
|
2204 this.titleDOM = document.createElement("span");
|
nickjillings@1370
|
2205 this.attributeDOM = document.createElement("div");
|
nickjillings@1370
|
2206 this.attributes = [];
|
nickjillings@1370
|
2207 this.childrenDOM = document.createElement("div");
|
nickjillings@1370
|
2208 this.children = [];
|
nickjillings@1370
|
2209 this.buttonDOM = document.createElement("div");
|
nickjillings@1370
|
2210 this.parent = parent;
|
nickjillings@1370
|
2211 this.specification = rootObject;
|
nickjillings@1370
|
2212 this.schema = specification.schema.getAllElementsByName("audioelement")[0];
|
nickjillings@1370
|
2213 this.rootDOM.className = "node";
|
nickjillings@1370
|
2214
|
nickjillings@1370
|
2215 var titleDiv = document.createElement('div');
|
nickjillings@1370
|
2216 titleDiv.className = "node-title";
|
nickjillings@1370
|
2217 this.titleDOM.className = "node-title";
|
nickjillings@1370
|
2218 this.titleDOM.textContent = "Audio Element";
|
nickjillings@1370
|
2219 titleDiv.appendChild(this.titleDOM);
|
nickjillings@1370
|
2220
|
nickjillings@1370
|
2221 this.attributeDOM.className = "node-attributes";
|
nickjillings@1370
|
2222 this.childrenDOM.className = "node-children";
|
nickjillings@1370
|
2223 this.buttonDOM.className = "node-buttons";
|
nickjillings@1370
|
2224
|
nickjillings@1370
|
2225 this.rootDOM.appendChild(titleDiv);
|
nickjillings@1370
|
2226 this.rootDOM.appendChild(this.attributeDOM);
|
nickjillings@1370
|
2227 this.rootDOM.appendChild(this.childrenDOM);
|
nickjillings@1370
|
2228 this.rootDOM.appendChild(this.buttonDOM);
|
nickjillings@1370
|
2229
|
nickjillings@1370
|
2230 // Build the attributes
|
nickjillings@1370
|
2231 var attributeList = this.schema.getAllElementsByTagName("xs:attribute");
|
nickjillings@1370
|
2232 for (var i=0; i<attributeList.length; i++)
|
nickjillings@1370
|
2233 {
|
nickjillings@1370
|
2234 var attributeName = attributeList[i].getAttribute('name');
|
nickjillings@1370
|
2235 var attrObject = this.parent.parent.convertAttributeToDOM(rootObject,attributeList[i]);
|
nickjillings@1370
|
2236 this.attributeDOM.appendChild(attrObject.holder);
|
nickjillings@1370
|
2237 this.attributes.push(attrObject);
|
nickjillings@1370
|
2238 }
|
nickjillings@1370
|
2239
|
nickjillings@1370
|
2240 this.deleteNode = {
|
nickjillings@1370
|
2241 root: document.createElement("button"),
|
nickjillings@1370
|
2242 parent: this,
|
nickjillings@1370
|
2243 handleEvent: function()
|
nickjillings@1370
|
2244 {
|
nickjillings@1370
|
2245 var i = this.parent.parent.specification.audioElements.findIndex(this.findNode,this);
|
nickjillings@1370
|
2246 if (i >= 0) {
|
nickjillings@1370
|
2247 var aeList = this.parent.parent.specification.audioElements;
|
nickjillings@1370
|
2248 if (i < aeList.length-1) {
|
nickjillings@1370
|
2249 aeList = aeList.slice(0,i).concat(aeList.slice(i+1));
|
nickjillings@1370
|
2250 } else {
|
nickjillings@1370
|
2251 aeList = aeList.slice(0,i);
|
nickjillings@1370
|
2252 }
|
nickjillings@1370
|
2253 }
|
nickjillings@1370
|
2254 i = this.parent.parent.children.findIndex(function(element,index,array){
|
nickjillings@1370
|
2255 if (element == this.parent)
|
nickjillings@1370
|
2256 return true;
|
nickjillings@1370
|
2257 else
|
nickjillings@1370
|
2258 return false;
|
nickjillings@1370
|
2259 },this);
|
nickjillings@1370
|
2260 if (i >= 0) {
|
nickjillings@1370
|
2261 var childList = this.parent.children;
|
nickjillings@1370
|
2262 if (i < aeList.length-1) {
|
nickjillings@1370
|
2263 childList = childList.slice(0,i).concat(childList.slice(i+1));
|
nickjillings@1370
|
2264 } else {
|
nickjillings@1370
|
2265 childList = childList.slice(0,i);
|
nickjillings@1370
|
2266 }
|
nickjillings@1370
|
2267 this.parent.parent.childrenDOM.removeChild(this.parent.rootDOM);
|
nickjillings@1370
|
2268 }
|
nickjillings@1370
|
2269 },
|
nickjillings@1370
|
2270 findNode: function(element,index,array){
|
nickjillings@1370
|
2271 if (element == this.parent.specification)
|
nickjillings@1370
|
2272 return true;
|
nickjillings@1370
|
2273 else
|
nickjillings@1370
|
2274 return false;
|
nickjillings@1370
|
2275 }
|
nickjillings@1370
|
2276 }
|
nickjillings@1370
|
2277 this.deleteNode.root.textContent = "Delete Entry";
|
nickjillings@1370
|
2278 this.deleteNode.root.addEventListener("click",this.deleteNode,false);
|
nickjillings@1370
|
2279 this.buttonDOM.appendChild(this.deleteNode.root);
|
n@2421
|
2280
|
n@2421
|
2281 this.moveButtons = {
|
n@2421
|
2282 root_up: document.createElement("button"),
|
n@2421
|
2283 root_down: document.createElement("button"),
|
n@2421
|
2284 parent: this,
|
n@2421
|
2285 handleEvent: function(event) {
|
n@2421
|
2286 var index = this.parent.parent.getAudioElements().indexOf(this.parent);
|
n@2421
|
2287 if (event.currentTarget.getAttribute("direction") == "up") {
|
n@2421
|
2288 index = Math.max(index-1,0);
|
n@2421
|
2289 } else if (event.currentTarget.getAttribute("direction") == "down") {
|
n@2421
|
2290 index = Math.min(index+1,this.parent.parent.getAudioElements().length-1);
|
n@2421
|
2291 }
|
n@2421
|
2292 this.parent.moveToPosition(index);
|
n@2421
|
2293 this.disable(index);
|
n@2421
|
2294 },
|
n@2421
|
2295 disable: function(index) {
|
n@2421
|
2296 if (index == 0) {
|
n@2421
|
2297 this.root_up.disabled = true;
|
n@2421
|
2298 } else {
|
n@2421
|
2299 this.root_up.disabled = false;
|
n@2421
|
2300 }
|
n@2421
|
2301 if (index == this.parent.parent.getAudioElements().length-1) {
|
n@2421
|
2302 this.root_down.disabled = true;
|
n@2421
|
2303 } else {
|
n@2421
|
2304 this.root_down.disabled = false;
|
n@2421
|
2305 }
|
n@2421
|
2306 }
|
n@2421
|
2307 }
|
n@2421
|
2308 this.moveButtons.root_up.setAttribute("direction","up");
|
n@2421
|
2309 this.moveButtons.root_down.setAttribute("direction","down");
|
n@2421
|
2310 this.moveButtons.root_up.addEventListener("click",this.moveButtons,false);
|
n@2421
|
2311 this.moveButtons.root_down.addEventListener("click",this.moveButtons,false);
|
n@2421
|
2312 this.moveButtons.root_up.textContent = "Move Up";
|
n@2421
|
2313 this.moveButtons.root_down.textContent = "Move Down";
|
n@2421
|
2314 this.buttonDOM.appendChild(this.moveButtons.root_up);
|
n@2421
|
2315 this.buttonDOM.appendChild(this.moveButtons.root_down);
|
n@2421
|
2316
|
n@2421
|
2317 this.moveToPosition = function(new_index) {
|
n@2421
|
2318
|
n@2421
|
2319 // Get the zero-th Object
|
n@2421
|
2320 var zero_object = this.parent.getAudioElements()[0];
|
n@2421
|
2321 var parent_children_root_index = this.parent.children.indexOf(zero_object);
|
n@2421
|
2322 // splice out the array for processing
|
n@2421
|
2323 var process_array = this.parent.children.splice(parent_children_root_index);
|
n@2421
|
2324
|
n@2421
|
2325
|
n@2421
|
2326 new_index = Math.min(new_index, process_array.length);
|
n@2421
|
2327 var curr_index = process_array.findIndex(function(elem){
|
n@2421
|
2328 if (elem == this) {return true;} else {return false;}
|
n@2421
|
2329 },this);
|
n@2421
|
2330
|
n@2421
|
2331 // Split at the current location to remove the node and shift all the children up
|
n@2421
|
2332 var tail = process_array.splice(curr_index+1);
|
n@2421
|
2333 process_array.pop();
|
n@2421
|
2334 process_array = process_array.concat(tail);
|
n@2421
|
2335
|
n@2421
|
2336 //Split at the new location and insert the node
|
n@2421
|
2337 tail = process_array.splice(new_index);
|
n@2421
|
2338 process_array.push(this);
|
n@2421
|
2339 process_array = process_array.concat(tail);
|
n@2421
|
2340
|
n@2421
|
2341 // Re-attach to the parent.children
|
n@2421
|
2342 this.parent.children = this.parent.children.concat(process_array);
|
n@2421
|
2343
|
n@2421
|
2344 // Re-build the specification
|
n@2421
|
2345 this.parent.specification.audioElements = [];
|
n@2421
|
2346 for (var obj of process_array) {
|
n@2421
|
2347 this.parent.specification.audioElements.push(obj.specification);
|
n@2421
|
2348 }
|
n@2421
|
2349 this.parent.redrawChildren();
|
n@2421
|
2350
|
n@2421
|
2351 process_array.forEach(function(obj,index){
|
n@2421
|
2352 obj.moveButtons.disable(index);
|
n@2421
|
2353 });
|
n@2421
|
2354
|
n@2421
|
2355 }
|
nickjillings@1370
|
2356 }
|
nickjillings@1370
|
2357
|
nickjillings@1370
|
2358 this.commentQuestionNode = function(parent,rootObject)
|
nickjillings@1370
|
2359 {
|
nickjillings@1375
|
2360 this.type = "commentQuestionNode";
|
nickjillings@1370
|
2361 this.rootDOM = document.createElement("div");
|
nickjillings@1370
|
2362 this.titleDOM = document.createElement("span");
|
nickjillings@1370
|
2363 this.attributeDOM = document.createElement("div");
|
nickjillings@1370
|
2364 this.attributes = [];
|
nickjillings@1370
|
2365 this.childrenDOM = document.createElement("div");
|
nickjillings@1370
|
2366 this.children = [];
|
nickjillings@1370
|
2367 this.buttonDOM = document.createElement("div");
|
nickjillings@1370
|
2368 this.parent = parent;
|
nickjillings@1370
|
2369 this.specification = rootObject;
|
nickjillings@1370
|
2370 this.schema = specification.schema.getAllElementsByName("page")[0];
|
n@2421
|
2371 this.rootDOM.className = "node audio-element";
|
nickjillings@1370
|
2372
|
nickjillings@1370
|
2373 var titleDiv = document.createElement('div');
|
nickjillings@1370
|
2374 titleDiv.className = "node-title";
|
nickjillings@1370
|
2375 this.titleDOM.className = "node-title";
|
nickjillings@1370
|
2376 this.titleDOM.textContent = "Test Page";
|
nickjillings@1370
|
2377 titleDiv.appendChild(this.titleDOM);
|
nickjillings@1370
|
2378
|
nickjillings@1370
|
2379 this.attributeDOM.className = "node-attributes";
|
nickjillings@1370
|
2380 this.childrenDOM.className = "node-children";
|
nickjillings@1370
|
2381 this.buttonDOM.className = "node-buttons";
|
nickjillings@1370
|
2382
|
nickjillings@1370
|
2383 this.rootDOM.appendChild(titleDiv);
|
nickjillings@1370
|
2384 this.rootDOM.appendChild(this.attributeDOM);
|
nickjillings@1370
|
2385 this.rootDOM.appendChild(this.childrenDOM);
|
nickjillings@1370
|
2386 this.rootDOM.appendChild(this.buttonDOM);
|
nickjillings@1370
|
2387
|
nickjillings@1370
|
2388 }
|
nickjillings@1370
|
2389
|
nickjillings@1374
|
2390 // Build the components
|
nickjillings@1310
|
2391 if (this.specification.interfaces.length == 0) {
|
nickjillings@2194
|
2392 this.specification.interfaces.push(new specification.interfaceNode(specification));
|
nickjillings@1310
|
2393 }
|
nickjillings@1381
|
2394 for (var interfaceObj of this.specification.interfaces)
|
nickjillings@1381
|
2395 {
|
nickjillings@1381
|
2396 var newInterface = new this.parent.interfaceNode(this.parent,interfaceObj);
|
nickjillings@1381
|
2397 newInterface.build("Interface",""+this.specification.id+"-interface",this.childrenDOM);
|
nickjillings@1381
|
2398 this.children.push(newInterface);
|
nickjillings@1381
|
2399 this.interfaces.push(newInterface);
|
nickjillings@1381
|
2400 }
|
nickjillings@1381
|
2401
|
nickjillings@1374
|
2402 for (var elements of this.specification.audioElements)
|
nickjillings@1374
|
2403 {
|
nickjillings@1374
|
2404 var audioElementDOM = new this.audioElementNode(this,elements);
|
nickjillings@1374
|
2405 this.children.push(audioElementDOM);
|
nickjillings@1374
|
2406 this.childrenDOM.appendChild(audioElementDOM.rootDOM);
|
nickjillings@1374
|
2407 }
|
nickjillings@1374
|
2408
|
n@2421
|
2409 this.getAudioElements().forEach(function(elem){
|
n@2421
|
2410 elem.moveButtons.disable();
|
n@2421
|
2411 });
|
n@2421
|
2412
|
nickjillings@1370
|
2413 this.addInterface = {
|
nickjillings@1370
|
2414 root: document.createElement("button"),
|
nickjillings@1370
|
2415 parent: this,
|
nickjillings@1370
|
2416 handleEvent: function() {
|
nickjillings@2194
|
2417 var InterfaceObj = new specification.interfaceNode(specification);
|
nickjillings@1370
|
2418 var newInterface = new this.parent.parent.interfaceNode(this.parent.parent,InterfaceObj);
|
nickjillings@1370
|
2419 newInterface.build("Interface",""+this.parent.specification.id+"-interface",this.parent.childrenDOM);
|
nickjillings@1370
|
2420 this.parent.children.push(newInterface);
|
nickjillings@1370
|
2421 this.parent.specification.interfaces.push(InterfaceObj);
|
nickjillings@1370
|
2422 this.parent.interfaces.push(newInterface);
|
nickjillings@1370
|
2423 }
|
nickjillings@1370
|
2424 }
|
nickjillings@1370
|
2425 this.addInterface.root.textContent = "Add Interface";
|
nickjillings@1370
|
2426 this.addInterface.root.addEventListener("click",this.addInterface,false);
|
nickjillings@1370
|
2427 this.buttonDOM.appendChild(this.addInterface.root);
|
nickjillings@1370
|
2428
|
nickjillings@1370
|
2429 this.addAudioElement = {
|
nickjillings@1370
|
2430 root: document.createElement("button"),
|
nickjillings@1370
|
2431 parent: this,
|
nickjillings@1370
|
2432 handleEvent: function() {
|
nickjillings@2194
|
2433 var audioElementObject = new this.parent.specification.audioElementNode(specification);
|
nickjillings@1370
|
2434 var audioElementDOM = new this.parent.audioElementNode(this.parent,audioElementObject);
|
nickjillings@1370
|
2435 this.parent.specification.audioElements.push(audioElementObject);
|
nickjillings@1370
|
2436 this.parent.children.push(audioElementDOM);
|
nickjillings@1370
|
2437 this.parent.childrenDOM.appendChild(audioElementDOM.rootDOM);
|
nickjillings@1370
|
2438 }
|
nickjillings@1370
|
2439 }
|
nickjillings@1370
|
2440 this.addAudioElement.root.textContent = "Add Audio Element";
|
nickjillings@1370
|
2441 this.addAudioElement.root.addEventListener("click",this.addAudioElement,false);
|
nickjillings@1370
|
2442 this.buttonDOM.appendChild(this.addAudioElement.root);
|
nickjillings@1370
|
2443 }
|
nickjillings@1370
|
2444 } |