nicholas@2861: /* globals document, angular, window, Promise, XMLHttpRequest, Specification, XMLSerializer, Blob, DOMParser*/ nicholas@2851: function get(url) { nicholas@2851: // Return a new promise. nicholas@2851: return new Promise(function (resolve, reject) { nicholas@2851: // Do the usual XHR stuff nicholas@2851: var req = new XMLHttpRequest(); nicholas@2851: req.open('GET', url); nickjillings@1370: nicholas@2851: req.onload = function () { nicholas@2851: // This is called even on 404 etc nicholas@2851: // so check the status nicholas@2851: if (req.status == 200) { nicholas@2851: // Resolve the promise with the response text nicholas@2851: resolve(req.response); nicholas@2851: } else { nicholas@2851: // Otherwise reject with the status text nicholas@2851: // which will hopefully be a meaningful error nicholas@2851: reject(Error(req.statusText)); nicholas@2851: } nicholas@2851: }; nicholas@2851: nicholas@2851: // Handle network errors nicholas@2851: req.onerror = function () { nicholas@2851: reject(Error("Network Error")); nicholas@2851: }; nicholas@2851: nicholas@2851: // Make the request nicholas@2851: req.send(); nicholas@2851: }); nickjillings@1370: } nickjillings@1370: nicholas@2851: var AngularInterface = angular.module("creator", []); nickjillings@1370: nicholas@2851: var specification = new Specification(); nickjillings@1370: nicholas@2535: window.onload = function () { nicholas@2851: // Get the test interface specifications nicholas@2535: nicholas@2851: }; nicholas@2535: nicholas@2861: function handleFiles(event) { nicholas@2861: var s = angular.element(event.currentTarget).scope(); nicholas@2861: s.handleFiles(event); nicholas@2861: s.$apply(); nicholas@2861: } nicholas@2861: nicholas@2851: AngularInterface.controller("view", ['$scope', '$element', '$window', function ($s, $e, $w) { nicholas@2851: $s.popupVisible = true; nickjillings@1370: nicholas@2851: $s.showPopup = function () { nicholas@2851: $s.popupVisible = true; nicholas@2851: }; nicholas@2851: $s.hidePopup = function () { nicholas@2851: $s.popupVisible = false; nicholas@2851: }; nicholas@2851: $s.globalSchema = undefined; nicholas@2851: get("xml/test-schema.xsd").then(function (text) { nicholas@2851: specification.processSchema(text); nicholas@2851: $s.globalSchema = specification.getSchema(); nicholas@2851: }); nicholas@2851: $s.specification = specification; nicholas@2857: nicholas@2857: $s.addPage = function () { nicholas@2857: $s.specification.createNewPage(); nicholas@2859: }; nicholas@2860: nicholas@2860: $s.exportXML = function () { nicholas@2860: var s = new XMLSerializer(); nicholas@2860: var doc = specification.encode(); nicholas@2860: var bb = new Blob([s.serializeToString(doc)], { nicholas@2860: type: 'application/xml' nicholas@2860: }); nicholas@2860: var dnlk = window.URL.createObjectURL(bb); nicholas@2860: window.location.href = dnlk; nicholas@2861: }; nicholas@2851: }]); nickjillings@1370: nicholas@2851: AngularInterface.controller("introduction", ['$scope', '$element', '$window', function ($s, $e, $w) { nicholas@2851: $s.state = 0; nicholas@2851: $s.next = function () { nicholas@2851: $s.state++; nicholas@2861: if ($s.state > 1 || $s.file) { nicholas@2851: $s.hidePopup(); nicholas@2851: } nicholas@2851: }; nicholas@2851: $s.back = function () { nicholas@2851: $s.state--; nicholas@2851: }; nicholas@2851: $s.mouseover = function (name) { nicholas@2851: var obj = $s.interfaces.find(function (i) { nicholas@2851: return i.name == name; nicholas@2851: }); nicholas@2851: if (obj) { nicholas@2851: $s.description = obj.description.en; nicholas@2851: } nicholas@2851: }; nicholas@2851: $s.initialise = function (name) { nicholas@2851: var obj = $s.interfaces.find(function (i) { nicholas@2851: return i.name == name; nicholas@2851: }); nicholas@2851: specification.interface = obj.interface; nicholas@2851: }; nicholas@2851: // Get the test interface specifications nicholas@2851: $s.interfaces = {}; nicholas@2861: $s.file = undefined; nicholas@2851: $s.description = ""; nicholas@2851: var interfaceCollection = new Promise(function (resolve, reject) { nicholas@2851: var xml = new XMLHttpRequest(); nicholas@2851: xml.open("GET", "test_create/interfaces/specifications.json"); nicholas@2851: xml.onload = function () { nicholas@2851: if (xml.status === 200) { nicholas@2851: resolve(xml.responseText); nicholas@2851: return; nicholas@2851: } nicholas@2851: reject(xml.status); nicholas@2851: }; nicholas@2851: xml.onerror = function () { nicholas@2851: reject(new Error("Network Error")); nicholas@2851: }; nicholas@2851: xml.send(); nicholas@2851: }).then(JSON.parse).then(function (data) { nicholas@2851: $s.interfaces = data.interfaces; nicholas@2851: $s.$apply(); nicholas@2851: }); nicholas@2861: nicholas@2861: $s.handleFiles = function ($event) { nicholas@2861: $s.file = $event.currentTarget.files[0]; nicholas@2861: var r = new FileReader(); nicholas@2861: r.onload = function () { nicholas@2861: var p = new DOMParser(); nicholas@2861: specification.decode(p.parseFromString(r.result, "text/xml")); nicholas@2861: $s.$apply(); nicholas@2861: } nicholas@2861: r.readAsText($s.file); nicholas@2861: }; nicholas@2851: }]); nickjillings@1370: nicholas@2851: AngularInterface.controller("setup", ['$scope', '$element', '$window', function ($s, $e, $w) { nicholas@2851: function initialise() { nicholas@2851: if ($s.globalSchema) { nicholas@2851: $s.schema = $s.globalSchema.querySelector("[name=setup]"); nickjillings@1385: } nickjillings@1370: } nicholas@2851: $s.schema = undefined; nicholas@2851: $s.attributes = []; nickjillings@1370: nicholas@2851: $s.$watch("globalSchema", initialise); nicholas@2853: $s.$watch("specification.metrics.enabled.length", function () { nicholas@2853: var metricsNode = document.getElementById("metricsNode"); nicholas@2853: if (!$s.specification.metrics) { nicholas@2853: return; nicholas@2853: } nicholas@2853: metricsNode.querySelectorAll("input").forEach(function (DOM) { nicholas@2853: DOM.checked = false; nicholas@2853: }); nicholas@2853: $s.specification.metrics.enabled.forEach(function (metric) { nicholas@2853: var DOM = metricsNode.querySelector("[value=" + metric + "]"); nicholas@2853: if (DOM) { nicholas@2853: DOM.checked = true; nicholas@2853: } nicholas@2853: }); nicholas@2855: }); nicholas@2853: nicholas@2853: $s.enableMetric = function ($event) { nicholas@2853: var metric = $event.currentTarget.value; nicholas@2853: var index = specification.metrics.enabled.findIndex(function (a) { nicholas@2853: return a == metric; nicholas@2853: }); nicholas@2853: if ($event.currentTarget.checked) { nicholas@2853: if (index == -1) { nicholas@2853: specification.metrics.enabled.push(metric); nicholas@2853: } nicholas@2853: } else { nicholas@2853: if (index >= 0) { nicholas@2853: specification.metrics.enabled.splice(index, 1); nicholas@2853: } nicholas@2853: } nicholas@2855: }; nicholas@2851: }]); nicholas@2853: nicholas@2858: AngularInterface.controller("survey", ['$scope', '$element', '$window', function ($s, $e, $w) { nicholas@2858: $s.addSurveyEntry = function () { nicholas@2858: $s.survey.addOption(); nicholas@2858: }; nicholas@2858: $s.removeSurveyEntry = function (entry) { nicholas@2858: var index = $s.survey.options.findIndex(function (a) { nicholas@2858: return a == entry; nicholas@2858: }); nicholas@2858: if (index === -1) { nicholas@2858: throw ("Invalid Entry"); nicholas@2858: } nicholas@2858: $s.survey.options.splice(index, 1); nicholas@2858: }; nicholas@2858: }]); nicholas@2858: nicholas@2853: AngularInterface.controller("surveyOption", ['$scope', '$element', '$window', function ($s, $e, $w) { nicholas@2853: nicholas@2853: $s.removeOption = function (option) { nicholas@2853: var index = $s.opt.options.findIndex(function (a) { nicholas@2853: return a == option; nicholas@2853: }); nicholas@2853: if (index === -1) { nicholas@2853: throw ("Invalid option"); nicholas@2853: } nicholas@2853: $s.opt.options.splice(index, 1); nicholas@2853: }; nicholas@2853: $s.addOption = function () { nicholas@2853: $s.opt.options.push({ nicholas@2853: name: "", nicholas@2853: text: "" nicholas@2853: }); nicholas@2855: }; nicholas@2857: nicholas@2857: $s.addCondition = function () { nicholas@2857: $s.opt.conditions.push({ nicholas@2857: check: "equals", nicholas@2857: value: "", nicholas@2857: jumpToOnPass: undefined, nicholas@2857: jumpToOnFail: undefined nicholas@2857: }); nicholas@2857: }; nicholas@2857: nicholas@2857: $s.removeCondition = function (condition) { nicholas@2857: var index = $s.opt.conditions.findIndex(function (c) { nicholas@2857: return c == condition; nicholas@2857: }); nicholas@2857: if (index === -1) { nicholas@2857: throw ("Invalid Condition"); nicholas@2857: } nicholas@2857: $s.opt.conditions.splice(index, 1); nicholas@2857: }; nicholas@2855: }]); nicholas@2855: nicholas@2855: AngularInterface.controller("interfaceNode", ['$scope', '$element', '$window', function ($s, $e, $w) { nicholas@2855: $s.$watch("interface.options.length", function () { nicholas@2855: if (!$s.interface || !$s.interface.options) { nicholas@2855: return; nicholas@2855: } nicholas@2855: var options = $e[0].querySelector(".interfaceOptions").querySelectorAll(".attribute"); nicholas@2855: options.forEach(function (option) { nicholas@2855: var name = option.getAttribute("name"); nicholas@2855: var index = $s.interface.options.findIndex(function (io) { nicholas@2855: return io.name == name; nicholas@2855: }); nicholas@2855: option.querySelector("input").checked = (index >= 0); nicholas@2855: if (name == "scalerange" && index >= 0) { nicholas@2855: option.querySelector("[name=min]").value = $s.interface.options[index].min; nicholas@2855: option.querySelector("[name=max]").value = $s.interface.options[index].max; nicholas@2855: } nicholas@2855: }); nicholas@2855: }); nicholas@2855: $s.enableInterfaceOption = function ($event) { nicholas@2855: var name = $event.currentTarget.parentElement.getAttribute("name"); nicholas@2855: var type = $event.currentTarget.parentElement.getAttribute("type"); nicholas@2855: var index = $s.interface.options.findIndex(function (io) { nicholas@2855: return io.name == name; nicholas@2855: }); nicholas@2855: if (index == -1 && $event.currentTarget.checked) { nicholas@2855: var obj = $s.interface.options.push({ nicholas@2855: name: name, nicholas@2855: type: type nicholas@2855: }); nicholas@2855: if (name == "scalerange") { nicholas@2855: obj.min = $event.currentTarget.parentElement.querySelector("[name=min]").value; nicholas@2855: obj.max = $event.currentTarget.parentElement.querySelector("[name=max]").value; nicholas@2855: } nicholas@2855: } else if (index >= 0 && !$event.currentTarget.checked) { nicholas@2855: $s.interface.options.splice(index, 1); nicholas@2855: } nicholas@2857: }; nicholas@2857: $s.removeScale = function (scale) { nicholas@2857: var index = $s.interface.scales.findIndex(function (s) { nicholas@2857: return s == scale; nicholas@2857: }); nicholas@2857: if (index >= 0) { nicholas@2857: $s.interface.scales.splice(index, 1); nicholas@2857: } nicholas@2857: }; nicholas@2857: $s.addScale = function () { nicholas@2857: $s.interface.scales.push({ nicholas@2857: position: undefined, nicholas@2857: text: undefined nicholas@2857: }); nicholas@2857: }; nicholas@2853: }]); nicholas@2859: AngularInterface.controller("page", ['$scope', '$element', '$window', function ($s, $e, $w) { nicholas@2859: $s.addInterface = function () { nicholas@2859: $s.page.addInterface(); nicholas@2859: }; nicholas@2859: $s.removeInterface = function (node) { nicholas@2859: var index = $s.page.interfaces.findIndex(function (a) { nicholas@2859: return a == node; nicholas@2859: }); nicholas@2859: if (index === -1) { nicholas@2859: throw ("Invalid node"); nicholas@2859: } nicholas@2859: $s.page.interfaces.splice(index, 1); nicholas@2859: }; nicholas@2859: nicholas@2859: $s.addCommentQuestion = function () { nicholas@2859: $s.page.addCommentQuestion(); nicholas@2859: }; nicholas@2859: $s.removeCommentQuestion = function (node) { nicholas@2859: var index = $s.page.commentQuestions.findIndex(function (a) { nicholas@2859: return a == node; nicholas@2859: }); nicholas@2859: if (index === -1) { nicholas@2859: throw ("Invalid node"); nicholas@2859: } nicholas@2859: $s.page.commentQuestions.splice(index, 1); nicholas@2859: }; nicholas@2859: $s.addAudioElement = function () { nicholas@2859: $s.page.addAudioElement(); nicholas@2859: }; nicholas@2859: $s.removeAudioElement = function (element) { nicholas@2859: var index = $s.page.audioElements.findIndex(function (a) { nicholas@2859: return a == element; nicholas@2859: }); nicholas@2859: if (index === -1) { nicholas@2859: throw ("Invalid node"); nicholas@2859: } nicholas@2859: $s.page.audioElements.splice(index, 1); nicholas@2859: }; nicholas@2859: }]);