var tiny = tiny || { }; tiny.epic = (function () { var panel, token, version, epic = "Epic.Clinical.Informatics.Web."; /** Copied from TinyJS ******************************************** */ function get(d, id) { id = id.split('.'); while (id.length > 1) {d = d[id.shift()]; } return d[id]; } function translateItems(data, list) { for (var i = 0; i < list.length; i++) { if (data === list[i].id) { return list[i].label; } } return ''; } function translateGroups(data, list) { var i, group, found; for (i = 0; i < list.length; i++) { group = list[i].items; found = translateItems(data, group); if (found) {return found; } } return ''; } function translateList(data, list) { if (list[0].items) { return translateGroups(data, list); } else { return translateItems(data, list); } } function translateTable(value, rows) { for (var i = 0; i < rows.length; i++) { if (value === rows[i][0]) { return rows[i][1]; } } return ''; } function translate(value, map) { if (typeof map === "function") { return map(value); } if (Array.isArray(map)) { if (Array.isArray(map[0])) { return translateTable(value, map); } else { return translateList(value, map); } } return value; } function mapQuestion(d, build) { var value, object = {}; object.Key = build.key; if (build.parent) { object.ParentQuestion = build.parent; } else {object.ParentQuestion = 0; } object.Answers = {}; if (build.constant) { object.Answers.Answer = build.constant; } else { value = get(d, build.data); object.Answers.Answer = translate(value, build.map); } return object; } function generateQuestions(d, build) { var i, q, queue = []; for (i = 0; i < build.length; i++) { queue.push(mapQuestion(d, build[i])); } return queue; } /** This seems like it should be AGL-generic, if possible */ function generateMessage(d, build) { var msg = {}; msg.OrderKey = build.OrderKey; // if (build.Frequency) { // msg.Frequency = // generateFrequency(d, build.Frequency); } if (build.AdminInstructions) { msg.AdminInstructions = generateAdmin(d, build.AdminInstructions); } if (build.OrderSpecificQuestions) { msg.OrderSpecificQuestions = generateQuestions(d, build.OrderSpecificQuestions); } if (build.MixtureComponents) { msg.MixtureComponents = generateMixture(d, build.MixtureComponents); } return msg; } /**** These two functions are needed for sending orders to the Hyperspace window via AGL API *******/ /** post one order at a time */ function postNext() { var order; if (panel.length > 0) { order = panel.shift(); window.parent.postMessage( { token: token, action: epic + "PostOrder", args: order }, "*"); } } /** This is the window listener */ function Listener(event) { for (var type in event.data) { var payload = event.data[type]; switch (type) { case "token": token = payload; break; case "error": alert("Error: " + payload); break; case "version": version = payload; break; case "actionExecuted": postNext(); // post orders until order panel empty break; case "errorCodes": break; default: break; } } } return { init: function () { window.addEventListener("message", Listener, false); window.parent.postMessage( { action: epic + "InitiateHandshake"}, "*"); }, generateOrder(data, build) { return generateMessage(data, build); }, sendPanel(orders) { panel = orders; postNext(); }, postOrderPanel: function (dnp, last) { console.log(JSON.stringify(dnp)); prepareOrderPanel(dnp, last); console.log(JSON.stringify(panel)); // window.addEventListener("message", Listener, false); // window.parent.postMessage( // { action: epic + "InitiateHandshake"}, "*"); } }; }()); // immediate invocation