nicholas@2885
|
1 /* globals document, angular, window, Promise, XMLHttpRequest, Specification, XMLSerializer, Blob, DOMParser, FileReader, $*/
|
nicholas@2851
|
2 function get(url) {
|
nicholas@2851
|
3 // Return a new promise.
|
nicholas@2851
|
4 return new Promise(function (resolve, reject) {
|
nicholas@2851
|
5 // Do the usual XHR stuff
|
nicholas@2851
|
6 var req = new XMLHttpRequest();
|
nicholas@2851
|
7 req.open('GET', url);
|
nickjillings@1370
|
8
|
nicholas@2851
|
9 req.onload = function () {
|
nicholas@2851
|
10 // This is called even on 404 etc
|
nicholas@2851
|
11 // so check the status
|
nicholas@2851
|
12 if (req.status == 200) {
|
nicholas@2851
|
13 // Resolve the promise with the response text
|
nicholas@2851
|
14 resolve(req.response);
|
nicholas@2851
|
15 } else {
|
nicholas@2851
|
16 // Otherwise reject with the status text
|
nicholas@2851
|
17 // which will hopefully be a meaningful error
|
nicholas@2851
|
18 reject(Error(req.statusText));
|
nicholas@2851
|
19 }
|
nicholas@2851
|
20 };
|
nicholas@2851
|
21
|
nicholas@2851
|
22 // Handle network errors
|
nicholas@2851
|
23 req.onerror = function () {
|
nicholas@2851
|
24 reject(Error("Network Error"));
|
nicholas@2851
|
25 };
|
nicholas@2851
|
26
|
nicholas@2851
|
27 // Make the request
|
nicholas@2851
|
28 req.send();
|
nicholas@2851
|
29 });
|
nickjillings@1370
|
30 }
|
nickjillings@1370
|
31
|
nicholas@2851
|
32 var AngularInterface = angular.module("creator", []);
|
nickjillings@1370
|
33
|
nicholas@2851
|
34 var specification = new Specification();
|
nickjillings@1370
|
35
|
nicholas@2535
|
36 window.onload = function () {
|
nicholas@2851
|
37 // Get the test interface specifications
|
nicholas@2884
|
38 $(function () {
|
nicholas@2884
|
39 $('[data-toggle="popover"]').popover();
|
nicholas@2884
|
40 });
|
nicholas@2851
|
41 };
|
nicholas@2535
|
42
|
nicholas@2861
|
43 function handleFiles(event) {
|
nicholas@2861
|
44 var s = angular.element(event.currentTarget).scope();
|
nicholas@2861
|
45 s.handleFiles(event);
|
nicholas@2861
|
46 s.$apply();
|
nicholas@2861
|
47 }
|
nicholas@2861
|
48
|
nicholas@2851
|
49 AngularInterface.controller("view", ['$scope', '$element', '$window', function ($s, $e, $w) {
|
nicholas@2851
|
50 $s.popupVisible = true;
|
nicholas@2864
|
51 $s.testSpecifications = {};
|
nicholas@2864
|
52
|
nicholas@2864
|
53 (function () {
|
nicholas@2864
|
54 new Promise(function (resolve, reject) {
|
nicholas@2864
|
55 var xml = new XMLHttpRequest();
|
nicholas@2864
|
56 xml.open("GET", "test_create/interfaces/specifications.json");
|
nicholas@2864
|
57 xml.onload = function () {
|
nicholas@2864
|
58 if (xml.status === 200) {
|
nicholas@2864
|
59 resolve(xml.responseText);
|
nicholas@2864
|
60 return;
|
nicholas@2864
|
61 }
|
nicholas@2864
|
62 reject(xml.status);
|
nicholas@2864
|
63 };
|
nicholas@2864
|
64 xml.onerror = function () {
|
nicholas@2864
|
65 reject(new Error("Network Error"));
|
nicholas@2864
|
66 };
|
nicholas@2864
|
67 xml.send();
|
nicholas@2864
|
68 }).then(JSON.parse).then(function (data) {
|
nicholas@2864
|
69 $s.testSpecifications = data;
|
nicholas@2864
|
70 $s.$apply();
|
nicholas@2865
|
71 });
|
nicholas@2864
|
72 })();
|
nickjillings@1370
|
73
|
nicholas@2851
|
74 $s.showPopup = function () {
|
nicholas@2851
|
75 $s.popupVisible = true;
|
nicholas@2851
|
76 };
|
nicholas@2851
|
77 $s.hidePopup = function () {
|
nicholas@2851
|
78 $s.popupVisible = false;
|
nicholas@2851
|
79 };
|
nicholas@2851
|
80 $s.globalSchema = undefined;
|
nicholas@2851
|
81 get("xml/test-schema.xsd").then(function (text) {
|
nicholas@2851
|
82 specification.processSchema(text);
|
nicholas@2851
|
83 $s.globalSchema = specification.getSchema();
|
nicholas@2851
|
84 });
|
nicholas@2851
|
85 $s.specification = specification;
|
nicholas@2886
|
86 $s.selectedTestPrototype = undefined;
|
nicholas@2886
|
87 $s.setTestPrototype = function (obj) {
|
nicholas@2886
|
88 $s.selectedTestPrototype = obj;
|
nicholas@2886
|
89 $w.specification.interface = obj.interface;
|
nicholas@2886
|
90 }
|
nicholas@2857
|
91
|
nicholas@2857
|
92 $s.addPage = function () {
|
nicholas@2857
|
93 $s.specification.createNewPage();
|
nicholas@2859
|
94 };
|
nicholas@2860
|
95
|
nicholas@2862
|
96 $s.removePage = function (page) {
|
nicholas@2862
|
97 var index = $s.specification.pages.findIndex(function (a) {
|
nicholas@2862
|
98 return a == page;
|
nicholas@2862
|
99 });
|
nicholas@2862
|
100 if (index === -1) {
|
nicholas@2862
|
101 throw ("Invalid Page");
|
nicholas@2862
|
102 }
|
nicholas@2862
|
103 $s.specification.pages.splice(index, 1);
|
nicholas@2862
|
104 };
|
nicholas@2862
|
105
|
nicholas@2860
|
106 $s.exportXML = function () {
|
nicholas@2860
|
107 var s = new XMLSerializer();
|
nicholas@2860
|
108 var doc = specification.encode();
|
nicholas@2860
|
109 var bb = new Blob([s.serializeToString(doc)], {
|
nicholas@2860
|
110 type: 'application/xml'
|
nicholas@2860
|
111 });
|
nicholas@2860
|
112 var dnlk = window.URL.createObjectURL(bb);
|
nicholas@2875
|
113 $w.open(dnlk, "_blank");
|
nicholas@2861
|
114 };
|
nicholas@2851
|
115 }]);
|
nickjillings@1370
|
116
|
nicholas@2851
|
117 AngularInterface.controller("introduction", ['$scope', '$element', '$window', function ($s, $e, $w) {
|
nicholas@2851
|
118 $s.state = 0;
|
nicholas@2851
|
119 $s.next = function () {
|
nicholas@2851
|
120 $s.state++;
|
nicholas@2861
|
121 if ($s.state > 1 || $s.file) {
|
nicholas@2851
|
122 $s.hidePopup();
|
nicholas@2851
|
123 }
|
nicholas@2851
|
124 };
|
nicholas@2851
|
125 $s.back = function () {
|
nicholas@2851
|
126 $s.state--;
|
nicholas@2851
|
127 };
|
nicholas@2851
|
128 $s.mouseover = function (name) {
|
nicholas@2864
|
129 var obj = $s.testSpecifications.interfaces.find(function (i) {
|
nicholas@2851
|
130 return i.name == name;
|
nicholas@2851
|
131 });
|
nicholas@2851
|
132 if (obj) {
|
nicholas@2851
|
133 $s.description = obj.description.en;
|
nicholas@2851
|
134 }
|
nicholas@2851
|
135 };
|
nicholas@2851
|
136 $s.initialise = function (name) {
|
nicholas@2885
|
137 var obj = $s.testSpecifications.interfaces.find(function (i) {
|
nicholas@2851
|
138 return i.name == name;
|
nicholas@2851
|
139 });
|
nicholas@2886
|
140 if (obj === undefined) {
|
nicholas@2886
|
141 throw ("Cannot find specification");
|
nicholas@2886
|
142 }
|
nicholas@2886
|
143 $s.setTestPrototype(obj);
|
nicholas@2851
|
144 };
|
nicholas@2851
|
145 // Get the test interface specifications
|
nicholas@2861
|
146 $s.file = undefined;
|
nicholas@2851
|
147 $s.description = "";
|
nicholas@2861
|
148
|
nicholas@2861
|
149 $s.handleFiles = function ($event) {
|
nicholas@2861
|
150 $s.file = $event.currentTarget.files[0];
|
nicholas@2861
|
151 var r = new FileReader();
|
nicholas@2861
|
152 r.onload = function () {
|
nicholas@2861
|
153 var p = new DOMParser();
|
nicholas@2861
|
154 specification.decode(p.parseFromString(r.result, "text/xml"));
|
nicholas@2861
|
155 $s.$apply();
|
nicholas@2862
|
156 };
|
nicholas@2861
|
157 r.readAsText($s.file);
|
nicholas@2861
|
158 };
|
nicholas@2851
|
159 }]);
|
nickjillings@1370
|
160
|
nicholas@2851
|
161 AngularInterface.controller("setup", ['$scope', '$element', '$window', function ($s, $e, $w) {
|
nicholas@2851
|
162 function initialise() {
|
nicholas@2851
|
163 if ($s.globalSchema) {
|
nicholas@2851
|
164 $s.schema = $s.globalSchema.querySelector("[name=setup]");
|
nickjillings@1385
|
165 }
|
nickjillings@1370
|
166 }
|
nicholas@2851
|
167 $s.schema = undefined;
|
nicholas@2851
|
168 $s.attributes = [];
|
nickjillings@1370
|
169
|
nicholas@2851
|
170 $s.$watch("globalSchema", initialise);
|
nicholas@2853
|
171 $s.$watch("specification.metrics.enabled.length", function () {
|
nicholas@2853
|
172 var metricsNode = document.getElementById("metricsNode");
|
nicholas@2853
|
173 if (!$s.specification.metrics) {
|
nicholas@2853
|
174 return;
|
nicholas@2853
|
175 }
|
nicholas@2853
|
176 metricsNode.querySelectorAll("input").forEach(function (DOM) {
|
nicholas@2853
|
177 DOM.checked = false;
|
nicholas@2853
|
178 });
|
nicholas@2853
|
179 $s.specification.metrics.enabled.forEach(function (metric) {
|
nicholas@2853
|
180 var DOM = metricsNode.querySelector("[value=" + metric + "]");
|
nicholas@2853
|
181 if (DOM) {
|
nicholas@2853
|
182 DOM.checked = true;
|
nicholas@2853
|
183 }
|
nicholas@2853
|
184 });
|
nicholas@2855
|
185 });
|
nicholas@2853
|
186
|
nicholas@2853
|
187 $s.enableMetric = function ($event) {
|
nicholas@2853
|
188 var metric = $event.currentTarget.value;
|
nicholas@2853
|
189 var index = specification.metrics.enabled.findIndex(function (a) {
|
nicholas@2853
|
190 return a == metric;
|
nicholas@2853
|
191 });
|
nicholas@2853
|
192 if ($event.currentTarget.checked) {
|
nicholas@2853
|
193 if (index == -1) {
|
nicholas@2853
|
194 specification.metrics.enabled.push(metric);
|
nicholas@2853
|
195 }
|
nicholas@2853
|
196 } else {
|
nicholas@2853
|
197 if (index >= 0) {
|
nicholas@2853
|
198 specification.metrics.enabled.splice(index, 1);
|
nicholas@2853
|
199 }
|
nicholas@2853
|
200 }
|
nicholas@2855
|
201 };
|
nicholas@2886
|
202
|
nicholas@2886
|
203 $s.configure = function () {}
|
nicholas@2886
|
204
|
nicholas@2886
|
205 $s.$watch("selectedTestPrototype", $s.configure);
|
nicholas@2851
|
206 }]);
|
nicholas@2853
|
207
|
nicholas@2858
|
208 AngularInterface.controller("survey", ['$scope', '$element', '$window', function ($s, $e, $w) {
|
nicholas@2858
|
209 $s.addSurveyEntry = function () {
|
nicholas@2858
|
210 $s.survey.addOption();
|
nicholas@2858
|
211 };
|
nicholas@2858
|
212 $s.removeSurveyEntry = function (entry) {
|
nicholas@2858
|
213 var index = $s.survey.options.findIndex(function (a) {
|
nicholas@2858
|
214 return a == entry;
|
nicholas@2858
|
215 });
|
nicholas@2858
|
216 if (index === -1) {
|
nicholas@2858
|
217 throw ("Invalid Entry");
|
nicholas@2858
|
218 }
|
nicholas@2858
|
219 $s.survey.options.splice(index, 1);
|
nicholas@2858
|
220 };
|
nicholas@2858
|
221 }]);
|
nicholas@2858
|
222
|
nicholas@2853
|
223 AngularInterface.controller("surveyOption", ['$scope', '$element', '$window', function ($s, $e, $w) {
|
nicholas@2853
|
224
|
nicholas@2853
|
225 $s.removeOption = function (option) {
|
nicholas@2853
|
226 var index = $s.opt.options.findIndex(function (a) {
|
nicholas@2853
|
227 return a == option;
|
nicholas@2853
|
228 });
|
nicholas@2853
|
229 if (index === -1) {
|
nicholas@2853
|
230 throw ("Invalid option");
|
nicholas@2853
|
231 }
|
nicholas@2853
|
232 $s.opt.options.splice(index, 1);
|
nicholas@2853
|
233 };
|
nicholas@2853
|
234 $s.addOption = function () {
|
nicholas@2853
|
235 $s.opt.options.push({
|
nicholas@2853
|
236 name: "",
|
nicholas@2853
|
237 text: ""
|
nicholas@2853
|
238 });
|
nicholas@2855
|
239 };
|
nicholas@2857
|
240
|
nicholas@2857
|
241 $s.addCondition = function () {
|
nicholas@2857
|
242 $s.opt.conditions.push({
|
nicholas@2857
|
243 check: "equals",
|
nicholas@2857
|
244 value: "",
|
nicholas@2857
|
245 jumpToOnPass: undefined,
|
nicholas@2857
|
246 jumpToOnFail: undefined
|
nicholas@2857
|
247 });
|
nicholas@2857
|
248 };
|
nicholas@2857
|
249
|
nicholas@2857
|
250 $s.removeCondition = function (condition) {
|
nicholas@2857
|
251 var index = $s.opt.conditions.findIndex(function (c) {
|
nicholas@2857
|
252 return c == condition;
|
nicholas@2857
|
253 });
|
nicholas@2857
|
254 if (index === -1) {
|
nicholas@2857
|
255 throw ("Invalid Condition");
|
nicholas@2857
|
256 }
|
nicholas@2857
|
257 $s.opt.conditions.splice(index, 1);
|
nicholas@2857
|
258 };
|
nicholas@2855
|
259 }]);
|
nicholas@2855
|
260
|
nicholas@2855
|
261 AngularInterface.controller("interfaceNode", ['$scope', '$element', '$window', function ($s, $e, $w) {
|
nicholas@2855
|
262 $s.$watch("interface.options.length", function () {
|
nicholas@2855
|
263 if (!$s.interface || !$s.interface.options) {
|
nicholas@2855
|
264 return;
|
nicholas@2855
|
265 }
|
nicholas@2855
|
266 var options = $e[0].querySelector(".interfaceOptions").querySelectorAll(".attribute");
|
nicholas@2855
|
267 options.forEach(function (option) {
|
nicholas@2855
|
268 var name = option.getAttribute("name");
|
nicholas@2855
|
269 var index = $s.interface.options.findIndex(function (io) {
|
nicholas@2855
|
270 return io.name == name;
|
nicholas@2855
|
271 });
|
nicholas@2855
|
272 option.querySelector("input").checked = (index >= 0);
|
nicholas@2855
|
273 if (name == "scalerange" && index >= 0) {
|
nicholas@2855
|
274 option.querySelector("[name=min]").value = $s.interface.options[index].min;
|
nicholas@2855
|
275 option.querySelector("[name=max]").value = $s.interface.options[index].max;
|
nicholas@2855
|
276 }
|
nicholas@2855
|
277 });
|
nicholas@2855
|
278 });
|
nicholas@2855
|
279 $s.enableInterfaceOption = function ($event) {
|
nicholas@2855
|
280 var name = $event.currentTarget.parentElement.getAttribute("name");
|
nicholas@2855
|
281 var type = $event.currentTarget.parentElement.getAttribute("type");
|
nicholas@2855
|
282 var index = $s.interface.options.findIndex(function (io) {
|
nicholas@2855
|
283 return io.name == name;
|
nicholas@2855
|
284 });
|
nicholas@2855
|
285 if (index == -1 && $event.currentTarget.checked) {
|
nicholas@2855
|
286 var obj = $s.interface.options.push({
|
nicholas@2855
|
287 name: name,
|
nicholas@2855
|
288 type: type
|
nicholas@2855
|
289 });
|
nicholas@2855
|
290 if (name == "scalerange") {
|
nicholas@2855
|
291 obj.min = $event.currentTarget.parentElement.querySelector("[name=min]").value;
|
nicholas@2855
|
292 obj.max = $event.currentTarget.parentElement.querySelector("[name=max]").value;
|
nicholas@2855
|
293 }
|
nicholas@2855
|
294 } else if (index >= 0 && !$event.currentTarget.checked) {
|
nicholas@2855
|
295 $s.interface.options.splice(index, 1);
|
nicholas@2855
|
296 }
|
nicholas@2857
|
297 };
|
nicholas@2886
|
298 $s.scales = [];
|
nicholas@2857
|
299 $s.removeScale = function (scale) {
|
nicholas@2857
|
300 var index = $s.interface.scales.findIndex(function (s) {
|
nicholas@2857
|
301 return s == scale;
|
nicholas@2857
|
302 });
|
nicholas@2857
|
303 if (index >= 0) {
|
nicholas@2857
|
304 $s.interface.scales.splice(index, 1);
|
nicholas@2857
|
305 }
|
nicholas@2857
|
306 };
|
nicholas@2857
|
307 $s.addScale = function () {
|
nicholas@2857
|
308 $s.interface.scales.push({
|
nicholas@2857
|
309 position: undefined,
|
nicholas@2857
|
310 text: undefined
|
nicholas@2857
|
311 });
|
nicholas@2857
|
312 };
|
nicholas@2864
|
313 $s.clearScales = function () {
|
nicholas@2864
|
314 $s.interface.scales = [];
|
nicholas@2864
|
315 };
|
nicholas@2876
|
316 $s.useScales = function (scale) {
|
nicholas@2864
|
317 $s.clearScales();
|
nicholas@2876
|
318 scale.scales.forEach(function (s) {
|
nicholas@2864
|
319 $s.interface.scales.push(s);
|
nicholas@2864
|
320 });
|
nicholas@2886
|
321 $s.selectedScale = scale.name;
|
nicholas@2864
|
322 };
|
nicholas@2886
|
323 $s.selectedScale = undefined;
|
nicholas@2886
|
324
|
nicholas@2886
|
325 $s.configure = function () {
|
nicholas@2886
|
326 if ($s.selectedTestPrototype === undefined) {
|
nicholas@2886
|
327 return;
|
nicholas@2886
|
328 }
|
nicholas@2886
|
329 if ($s.selectedTestPrototype.checks && $s.selectedTestPrototype.checks.length >= 1) {
|
nicholas@2886
|
330 $s.selectedTestPrototype.checks.forEach(function (entry) {
|
nicholas@2886
|
331 var dom = $e[0].querySelector("[name=\"" + entry.name + "\"] input");
|
nicholas@2886
|
332 if (entry.support == "none") {
|
nicholas@2886
|
333 dom.checked = false;
|
nicholas@2886
|
334 dom.disabled = true;
|
nicholas@2886
|
335 }
|
nicholas@2886
|
336 });
|
nicholas@2886
|
337 }
|
nicholas@2886
|
338 if ($s.selectedTestPrototype.show && $s.selectedTestPrototype.show.length >= 1) {
|
nicholas@2886
|
339 $s.selectedTestPrototype.show.forEach(function (entry) {
|
nicholas@2886
|
340 var dom = $e[0].querySelector("[name=\"" + entry.name + "\"] input");
|
nicholas@2886
|
341 if (entry.support == "none") {
|
nicholas@2886
|
342 dom.checked = false;
|
nicholas@2886
|
343 dom.disabled = true;
|
nicholas@2886
|
344 }
|
nicholas@2886
|
345 });
|
nicholas@2886
|
346 }
|
nicholas@2886
|
347 if ($s.interface !== specification.interfaces) {
|
nicholas@2886
|
348 // Page specific interface nodes
|
nicholas@2886
|
349 if ($s.selectedTestPrototype.hasScales !== undefined && ($s.selectedTestPrototype.hasScales == "false" || $s.selectedTestPrototype.hasScales == false)) {
|
nicholas@2886
|
350 var elem = $e[0].querySelector("[name=\"scale-selection\"]")
|
nicholas@2886
|
351 elem.style.visibility = "hidden";
|
nicholas@2886
|
352 elem.style.height = "0px";
|
nicholas@2886
|
353 }
|
nicholas@2886
|
354 if ($s.selectedTestPrototype.scales && $s.selectedTestPrototype.show.length >= 1) {
|
nicholas@2886
|
355 $s.scales = [];
|
nicholas@2886
|
356 $s.selectedTestPrototype.scales.forEach(function (scalename) {
|
nicholas@2886
|
357 var obj = $s.testSpecifications.scales.find(function (a) {
|
nicholas@2886
|
358 return a.name == scalename;
|
nicholas@2886
|
359 });
|
nicholas@2886
|
360 $s.scales.push(obj);
|
nicholas@2886
|
361 });
|
nicholas@2886
|
362 if ($s.selectedTestPrototype.scales.includes($s.selectedScale) == false) {
|
nicholas@2886
|
363 $s.clearScales();
|
nicholas@2886
|
364 }
|
nicholas@2886
|
365 if ($s.scales.length == 1) {
|
nicholas@2886
|
366 $s.clearScales();
|
nicholas@2886
|
367 $s.useScales($s.scales[0]);
|
nicholas@2886
|
368 }
|
nicholas@2886
|
369 } else {
|
nicholas@2886
|
370 $s.scales = $s.testSpecifications.scales;
|
nicholas@2886
|
371 }
|
nicholas@2886
|
372 }
|
nicholas@2886
|
373 };
|
nicholas@2886
|
374
|
nicholas@2886
|
375 $s.$watch("selectedTestPrototype", $s.configure);
|
nicholas@2886
|
376 $s.configure();
|
nicholas@2853
|
377 }]);
|
nicholas@2859
|
378 AngularInterface.controller("page", ['$scope', '$element', '$window', function ($s, $e, $w) {
|
nicholas@2859
|
379 $s.addInterface = function () {
|
nicholas@2859
|
380 $s.page.addInterface();
|
nicholas@2859
|
381 };
|
nicholas@2859
|
382 $s.removeInterface = function (node) {
|
nicholas@2859
|
383 var index = $s.page.interfaces.findIndex(function (a) {
|
nicholas@2859
|
384 return a == node;
|
nicholas@2859
|
385 });
|
nicholas@2859
|
386 if (index === -1) {
|
nicholas@2859
|
387 throw ("Invalid node");
|
nicholas@2859
|
388 }
|
nicholas@2859
|
389 $s.page.interfaces.splice(index, 1);
|
nicholas@2859
|
390 };
|
nicholas@2859
|
391
|
nicholas@2859
|
392 $s.addCommentQuestion = function () {
|
nicholas@2859
|
393 $s.page.addCommentQuestion();
|
nicholas@2859
|
394 };
|
nicholas@2859
|
395 $s.removeCommentQuestion = function (node) {
|
nicholas@2859
|
396 var index = $s.page.commentQuestions.findIndex(function (a) {
|
nicholas@2859
|
397 return a == node;
|
nicholas@2859
|
398 });
|
nicholas@2859
|
399 if (index === -1) {
|
nicholas@2859
|
400 throw ("Invalid node");
|
nicholas@2859
|
401 }
|
nicholas@2859
|
402 $s.page.commentQuestions.splice(index, 1);
|
nicholas@2859
|
403 };
|
nicholas@2859
|
404 $s.addAudioElement = function () {
|
nicholas@2859
|
405 $s.page.addAudioElement();
|
nicholas@2859
|
406 };
|
nicholas@2859
|
407 $s.removeAudioElement = function (element) {
|
nicholas@2859
|
408 var index = $s.page.audioElements.findIndex(function (a) {
|
nicholas@2859
|
409 return a == element;
|
nicholas@2859
|
410 });
|
nicholas@2859
|
411 if (index === -1) {
|
nicholas@2859
|
412 throw ("Invalid node");
|
nicholas@2859
|
413 }
|
nicholas@2859
|
414 $s.page.audioElements.splice(index, 1);
|
nicholas@2859
|
415 };
|
nicholas@2859
|
416 }]);
|