Reminder: Do not include any PHI or PII in Confluence. If you require 508 accessibility assistance or any other support for this system, then please send an email to onc-jira-questions@healthit.gov
HTML |
---|
<script type="text/javascript">
//<![CDATA[
var ApiKey = 'AIzaSyDXCinRv4ZCG1bIHZArGyTkAvS7Rg7synU';
var BaseURL = {'sheets':'https://sheets.googleapis.com/v4/spreadsheets/'};
var ComplexDatatypes = {
'CWE_1':true,
'CWE_2':true,
'CWE_3':true,
'CX':true,
'DTM_1':true,
'DTM_2':true,
'DTM_3':true,
'DTM_4':true,
'EI':true,
'FN':true,
'HD_1':true,
'HD_2':true,
'MSG':true,
'PT':true,
'VID':true,
'XCN_1':true,
'XCN_2':true,
'XPN':true};
var CachedSheets = { };
// Generic AJAX GET client, handles variable number of arguments.
// All arguments are then passed to the call-back function,
// with the addition of the HTTP response body (passed as
// the first argument to the call-back function.
var HttpClient = function() {
var args = Array.prototype.slice.call(arguments);
this.get = function(url, callback) {
var httpRequest = new XMLHttpRequest();
httpRequest.onreadystatechange = function() {
if (httpRequest.readyState == 4 && httpRequest.status == 200) {
args.unshift(httpRequest.responseText);
callback.apply(null, args);
}
}
httpRequest.open( "GET", url, true );
httpRequest.send( null );
}
}
// Toggle hidden rows to display/hide details of the object in question
function segToggle(elementId)
{
var row = document.getElementById(elementId);
var itemId = 'Cell_' + elementId;
var expand = document.getElementById(itemId);
if ((row.style.display == 'none') || (row.style.display == ''))
{
row.style.display = 'table-row';
expand.innerText = '\u229f';
}
else
{
row.style.display = 'none';
expand.innerText = '\u229e';
}
}
function _lastWord(source) {
return (""+source).replace(/[\s-]+$/,'').split(/[\s-]/).pop();
}
function _required(reqFlag) {
reqFlag = reqFlag.replace(/[\ ]/g,'');
//simple case of required
if ((reqFlag == 'r') || (reqFlag == 're'))
{
return true;
}
//not required and not conditional
if (reqFlag.charAt(0) != 'c')
{
return false;
}
//handle conditional
var matches = reqFlag.match(/\((.*?)\)/);
if (matches)
{
var conditions = matches[1].split('/');
for (var i = 0; i< conditions.length; i++)
{
if ((conditions[i] == 'r') || (conditions[i] == 're'))
{
return true;
}
}
}
//Conditional, but none of the conditions is required
return false;
}
// Generic toggle function
function JBtoggle(ItemID) {
if( document.getElementById(ItemID).style.display=='none' ) {
document.getElementById(ItemID).style.display = 'block';
}
else {
document.getElementById(ItemID).style.display = 'none';
}
}
//Base Data types
function getBDT(spreadsheetId, sheetName) {
var url = BaseURL.sheets + spreadsheetId + '/values/' + sheetName + '?key=' + ApiKey;
var client = new HttpClient(sheetName);
client.get(url, _processBDTResponse);
}
function _processBDTResponse(response, sheetName) {
var divId = 'div' + sheetName;
var values = JSON.parse(response).values;
var title = values[0][0];
var table = document.createElement('table');
table.setAttribute('class','msgTable');
var tableContent = _setBDTHeader(values);
var colNum = values[1].length;
for (var i=2; i < values.length; i++)
{
tableContent = tableContent + '<tr>\n';
for (var j=0; j < colNum; j++)
{
value = values[i][j];
if (value == null)
{
value="";
}
cellStyle = '<td class="msgTable">';
if (j == 0)
{
cellStyle = '<td class="msgTable bdtAbbr">';
}
else if (j == 2)
{
value = value.replace(/(?:\r\n|\r|\n)/g, '<br />');
}
tableContent = tableContent + cellStyle + value + '<\/td>\n';
}
tableContent = tableContent + '<\/tr>\n';
}
table.innerHTML = tableContent;
var div = document.getElementById(divId);
div.appendChild(table);
}
function _setBDTHeader(values) {
//var content='<tr>\n<td colspan="' + values[1].length + '" class="msgTable title">' + values[0][0] + '<\/td>\n<\/tr>\n<tr>\n';
var content='<tr>\n';
for (var j=0; j < values[1].length; j++)
{
content = content + '<th class="msgTable bdtCol' + j + '">' + values[1][j] + '<\/th>\n';
}
content = content + '<\/tr>\n';
return content;
}
//Manage data types within segments
function storeDatatype(datatypes, type, elementId) {
datatypes.elements[elementId] = type;
}
function getDatatypes(datatypes,level) {
var spreadsheetId = '1p4sajtiJvRppCe3YKDa2WB-YW9azN87NSPUBa_ulRVQ';
var colNum = datatypes.span;
var url = ""
var sheetName = "";
var client = null;
for (var elementId in datatypes.elements)
{
sheetName = datatypes.elements[elementId];
if (sheetName in CachedSheets)
{
_processDatatypeResponse("", elementId, colNum, sheetName, level);
}
else
{
url = BaseURL.sheets + spreadsheetId + '/values/' + sheetName + '?key=' + ApiKey;
getDatatypeDelayed(url, elementId, colNum, sheetName, level);
}
}
}
function getDatatypeDelayed(url, elementId, colNum, sheetName, level) {
window.setTimeout(function() {
if (sheetName in CachedSheets)
{
_processDatatypeResponse("", elementId, colNum, sheetName, level);
}
else
{
var client = new HttpClient(elementId, colNum, sheetName, level);
client.get(url, _processDatatypeResponse);
}
}, 400);
}
function _processDatatypeResponse(response, elementId, span, sheetName, level) {
var result = '<td colspan="' + span + '" class="msgTable dtRow">\n<table class="msgTable dtTable' +level + '">\n';
var values = "";
if (response == "")
{
values = CachedSheets[sheetName];
}
else
{
values = JSON.parse(response).values;
CachedSheets[sheetName] = values;
}
result = result + _setDatatypeHeader(values, level);
var datatype = "";
var isComplexDatatype = false;
var subTypes = new Object;
subTypes.elements = new Object;
var reqFlag = "";
var cellStyle = "";
var value = "";
var typeElementId = "";
var colNum = values[1].length;
subTypes.span = colNum;
for (var i=2; i < values.length; i++)
{
reqFlag = (values[i][3] + "").toLowerCase();
if ((!_required(reqFlag)) && (reqFlag != 'varies')) {
continue;
}
datatype = values[i][2].replace(/[\ ]/g,'').toUpperCase();
isComplexDatatype = datatype in ComplexDatatypes;
result = result + '<tr>\n';
for (var j=0; j < colNum; j++)
{
value = values[i][j];
if (value == null)
{
value="";
}
cellStyle = '<td class="msgTable">';
if (j == 0)
{
cellStyle = '<td class="msgTable segSeq">';
//value = datatype + '_' + value;
if (isComplexDatatype)
{
typeElementId = elementId + '_' + datatype + '_' + i;
value = '<div id="Cell_' + typeElementId + '" class="expand2" onClick="segToggle(\'' + typeElementId + '\')">\u229e<\/div>' + value;
}
}
else if ( (j > 1) && (j < 5) )
{
cellStyle = '<td class="msgTable col' + j + '">';
}
else if (j == 5)
{
value = value.replace(/(?:\r\n|\r|\n)/g, '<br />');
}
result = result + cellStyle + value + '<\/td>\n';
}
result = result + '<\/tr>\n';
if (isComplexDatatype) //build the dataype table
{
result = result + '<tr id="' + typeElementId + '" class="hide"><\/tr>\n';
storeDatatype(subTypes, datatype, typeElementId);
}
}
result = result + '<\/table>\n<\/td>\n';
var row = document.getElementById(elementId);
row.innerHTML = result;
if (Object.keys(subTypes.elements).length>0)
{
getDatatypes(subTypes, level+1);
}
}
function _setDatatypeHeader(values, level) {
var content='<tr>\n';
for (var j=0; j < values[1].length; j++)
{
content = content + '<th class="msgTable dt' + level + 'Col' + j + '">' + values[1][j] + '<\/th>\n';
}
content = content + '<\/tr>\n';
return content;
}
//Manage Messages
function getMessageDelayed(sheetName,factor) {
window.setTimeout(function() {
getMessage(sheetName);
}, factor * 750);
}
function getMessage(sheetName) {
var spreadsheetId = '1etoDlL1LbvFBmIlc0jm4sIR-wv0zFYHZmqx6I8r4hWc';
var url = BaseURL.sheets + spreadsheetId + '/values/' + sheetName + '?key=' + ApiKey;
var client = new HttpClient(sheetName);
client.get(url, _processMsgResponse);
}
function _processMsgResponse(response, sheetName) {
var msgId = sheetName.split('^')[0] + '_' + sheetName.split('^')[1];
var divId = 'div' + msgId;
var values = JSON.parse(response).values;
var title = values[0][0];
var table = document.createElement('table');
table.setAttribute('class','msgTable');
var tableContent = _setTableHeader(values);
var level = 0;
var exLevel = 0;
var exclude = false;
var testWord = "";
var reqFlag = "";
var value="";
var cellStyle=""
var colNum = values[1].length;
var isGroupRow = true;
var segments = new Object;
segments.elements = new Object;
segments.span = colNum;
var segmentId = "";
var elementId = "";
for (var i=2; i < values.length; i++)
{
level = (values[i][0].match(/\u21E8/g) || []).length; //number of leading arrows determines the nesting level
testWord = _lastWord(values[i][1].toLowerCase());
isGroupRow = (testWord == 'begin') || (testWord == 'end');
if (exclude) //we are in an exclusion range, check for end of range
{
if ((level == exLevel) && (testWord == 'end'))
{
exclude = false;
}
continue;
}
reqFlag = (values[i][2] + "").toLowerCase();
if (!_required(reqFlag))
{
if (testWord == 'begin') //start exclusion range
{
exLevel = level;
exclude = true;
}
if (testWord != 'end') //catch closure of non-excluded group
{
continue;
}
}
tableContent = tableContent + '<tr>\n';
for (var j=0; j < colNum; j++)
{
value = values[i][j];
if (value == null)
{
value="";
}
cellStyle = '<td class="msgTable">';
if ( (j == 2) || j == 3)
{
cellStyle = '<td class="msgTable col' + j + '">';
}
if ( (j == 1) && isGroupRow)
{
cellStyle = '<td class="msgTable group">';
}
if ( (j == 0) && (!isGroupRow))
{
segmentId = value.substring(level).replace(/[\[\]\ {}]/g,'');
elementId = '360X_'+ msgId + '_' + segmentId + '_' + i;
value = value + '<div id="Cell_' + elementId + '" class="expand" onClick="segToggle(\'' + elementId + '\')">\u229e<\/div>';
}
if (j == 4 )
{
value = value.replace(/(?:\r\n|\r|\n)/g, '<br />');
}
tableContent = tableContent + cellStyle + value + '<\/td>\n';
}
tableContent = tableContent + '<\/tr>\n';
if (!isGroupRow) //build the segment table
{
tableContent = tableContent + '<tr id="' + elementId + '" class="hide"><\/tr>\n';
storeSegment(segments, segmentId, elementId);
}
}
//appendPre(tableContent);
table.innerHTML = tableContent;
var div = document.getElementById(divId);
div.appendChild(table);
getSegments(segments);
}
function _setTableHeader(values) {
var content='<tr>\n<td colspan="' + values[1].length + '" class="msgTable title">' + values[0][0] + '<\/td>\n<\/tr>\n<tr>\n';
for (var j=0; j < values[1].length; j++)
{
content = content + '<th class="msgTable col' + j + '">' + values[1][j] + '<\/th>\n';
}
content = content + '<\/tr>\n';
return content;
}
//Manage segments within messages
function storeSegment(segments, segmentId, elementId) {
segments.elements[elementId]=segmentId;
}
function getSegments(segments) {
var spreadsheetId = '14ahx-hgr92L3nCZlOexHEdxJX9uL8IoMqnnp0z-M-98';
var colNum = segments.span;
var url = ""
var sheetName = "";
var client = null;
for (var elementId in segments.elements)
{
sheetName = segments.elements[elementId];
if (sheetName in CachedSheets)
{
_processSegResponse("", elementId, colNum, sheetName);
}
else
{
url = BaseURL.sheets + spreadsheetId + '/values/' + sheetName + '?key=' + ApiKey;
client = new HttpClient(elementId, colNum, sheetName);
client.get(url, _processSegResponse);
}
}
}
function _processSegResponse(response, elementId, span, sheetName) {
var result = '<td colspan="' + span + '" class="msgTable segRow">\n<table class="msgTable segTable">\n';
var values = "";
if (response == "")
{
values = CachedSheets[sheetName];
}
else
{
values = JSON.parse(response).values;
CachedSheets[sheetName] = values;
}
var result = result + _setSegHeader(values);
var datatype = "";
var isComplexDatatype = false;
var types = new Object;
types.elements = new Object;
var reqFlag = "";
var cellStyle = "";
var value = "";
var typeElementId = "";
var colNum = values[1].length;
types.span = colNum
for (var i=2; i < values.length; i++)
{
reqFlag = (values[i][3] + "").toLowerCase();
if ((!_required(reqFlag)) && (reqFlag != 'varies')) {
continue;
}
datatype = values[i][2].replace(/[\ ]/g,'').toUpperCase();
isComplexDatatype = datatype in ComplexDatatypes;
result = result + '<tr>\n';
for (var j=0; j < colNum; j++)
{
value = values[i][j];
if (value == null)
{
value="";
}
cellStyle = '<td class="msgTable">';
if (j == 0)
{
cellStyle = '<td class="msgTable segSeq">';
//value = datatype + '_' + value;
if (isComplexDatatype)
{
typeElementId = elementId + '_' + datatype + '_' + i;
value = '<div id="Cell_' + typeElementId + '" class="expand2" onClick="segToggle(\'' + typeElementId + '\')">\u229e<\/div>' + value;
}
}
else if ( (j > 1) && (j < 6) )
{
cellStyle = '<td class="msgTable col' + j + '">';
}
else if (j == 6 )
{
value = value.replace(/(?:\r\n|\r|\n)/g, '<br />');
}
result = result + cellStyle + value + '<\/td>\n';
}
result = result + '<\/tr>\n';
if (isComplexDatatype) //build the dataype table
{
result = result + '<tr id="' + typeElementId + '" class="hide"><\/tr>\n';
storeDatatype(types, datatype, typeElementId);
}
}
result = result + '<\/table>\n<\/td>\n';
var row = document.getElementById(elementId);
row.innerHTML = result;
getDatatypes(types, 1);
}
function _setSegHeader(values) {
var content='<tr>\n';
for (var j=0; j < values[1].length; j++)
{
content = content + '<th class="msgTable segCol' + j + '">' + values[1][j] + '<\/th>\n';
}
content = content + '<\/tr>\n';
return content;
}
//Manage XDM
function getXDMDelayed(sheetName,factor) {
window.setTimeout(function() {
getSubmissionSet(sheetName);
}, factor * 750);
}
function getSubmissionSet(sheetName) {
//https://docs.google.com/spreadsheets/d/1aOhhmBgp5xrJteHUAzr687c_J-Iz0qDgFsuZz1NbqT4/edit?usp=sharing
var spreadsheetId = '1aOhhmBgp5xrJteHUAzr687c_J-Iz0qDgFsuZz1NbqT4';
var url = BaseURL.sheets + spreadsheetId + '/values/' + sheetName + '?key=' + ApiKey;
var client = new HttpClient(sheetName);
client.get(url, _processXDMSubmissionSet);
}
function _processXDMSubmissionSet(response, sheetName) {
var divId = 'div' + sheetName;
var values = JSON.parse(response).values;
var title = values[0][0];
var table = document.createElement('table');
table.setAttribute('class','msgTable');
var tableContent = _setXDMTableHeader(values);
var level = 0;
var exLevel = 0;
var exclude = false;
var testWord = "";
var reqFlag = "";
var value="";
var cellStyle=""
var colNum = values[1].length;
var isGroupRow = true;
var segments = new Object;
segments.elements = new Object;
segments.span = colNum;
var segmentId = "";
var elementId = "";
for (var i=2; i < values.length; i++)
{
level = (values[i][0].match(/\u21E8/g) || []).length; //number of leading arrows determines the nesting level
// testWord = _lastWord(values[i][1].toLowerCase());
// isGroupRow = (testWord == 'begin') || (testWord == 'end');
// if (exclude) //we are in an exclusion range, check for end of range
// {
// if ((level == exLevel) && (testWord == 'end'))
// {
// exclude = false;
// }
// continue;
// }
reqFlag = (values[i][3] + "").toLowerCase();
if (!_required2(reqFlag))
{
if (testWord == 'begin') //start exclusion range
{
exLevel = level;
exclude = true;
}
if (testWord != 'end') //catch closure of non-excluded group
{
continue;
}
}
tableContent = tableContent + '<tr>\n';
for (var j=0; j < colNum; j++)
{
value = values[i][j];
if (value == null)
{
value="";
}
cellStyle = '<td class="msgTable">';
if ( (j == 2) || j == 3)
{
cellStyle = '<td class="msgTable col' + j + '">';
}
if ( (j == 1) && isGroupRow)
{
cellStyle = '<td class="msgTable group">';
}
if ( (j == 0) && (!isGroupRow))
{
segmentId = value.substring(level).replace(/[\[\]\ {}]/g,'');
elementId = '360X_'+ sheetName + '_' + segmentId + '_' + i;
value = value + '<div id="Cell_' + elementId + '" class="expand" onClick="segToggle(\'' + elementId +
'\')">\u229e<\/div>';
}
if (j == 4 )
{
value = value.replace(/(?:\r\n|\r|\n)/g, '<br />');
}
tableContent = tableContent + cellStyle + value + '<\/td>\n';
}
tableContent = tableContent + '<\/tr>\n';
if (!isGroupRow) //build the segment table
{
tableContent = tableContent + '<tr id="' + elementId + '" class="hide"><\/tr>\n';
storeSegment(segments, segmentId, elementId);
}
}
//appendPre(tableContent);
table.innerHTML = tableContent;
var div = document.getElementById(divId);
div.appendChild(table);
//getSegments(segments);
}
function _setXDMTableHeader(values) {
var content='<tr>\n<td colspan="' + values[1].length + '" class="msgTable title">' + values[0][0] + '<\/td>\n<\/tr>
\n<tr>\n';
for (var j=0; j < values[1].length; j++)
{
content = content + '<th class="msgTable col' + j + '">' + values[1][j] + '<\/th>\n';
}
content = content + '<\/tr>\n';
return content;
}
function _required2(reqFlag) {
reqFlag = reqFlag.replace(/[\ ]/g,'');
//simple case of required
if ((reqFlag == 'r') || (reqFlag == 'r(*)'))
{
return true;
}
//not required and not conditional
if (reqFlag.charAt(0) != 'c')
{
return false;
}
//handle conditional
var matches = reqFlag.match(/\((.*?)\)/);
if (matches)
{
var conditions = matches[1].split('/');
for (var i = 0; i< conditions.length; i++)
{
if ((conditions[i] == 'r') || (conditions[i] == 're'))
{
return true;
}
}
}
//Conditional, but none of the conditions is required
return false;
}
//]]>
</script> |