var dwv = dwv || {};
dwv.test = dwv.test || {};
/**
* Get a message paragraph.
*
* @param {string} text The text message.
* @param {string} type The message type used as css class.
* @returns {object} The paragraph element.
*/
dwv.test.getMessagePara = function (text, type) {
var p = document.createElement('p');
p.className = 'message ' + type;
p.appendChild(document.createTextNode(text));
return p;
};
/**
* Launch a QIDO search on series.
*/
dwv.test.qidoSearch = function () {
// clear page
var div = document.getElementById('result');
div.innerHTML = '';
// qido get list
var qidoReq = new XMLHttpRequest();
var message;
qidoReq.addEventListener('load', function (event) {
var status = event.currentTarget.status;
// bad status
if (status !== 200 && status !== 204) {
message = 'Bad status in QIDO-RS request: ' +
status + ' (' + event.currentTarget.statusText + ').';
div.appendChild(dwv.test.getMessagePara(message, 'error'));
return;
}
// no content
if (status === 204 ||
!event.target.response ||
typeof event.target.response === 'undefined') {
message = 'No content.';
div.appendChild(dwv.test.getMessagePara(message));
return;
}
// parse json
var json = JSON.parse(event.target.response);
if (json.length === 0) {
message = 'Empty result.';
div.appendChild(dwv.test.getMessagePara(message));
return;
}
// fill table
qidoResponseToTable(json);
});
qidoReq.addEventListener('error', function (error) {
message = 'Error in QIDO-RS request';
console.error(message, error);
message += ', see console for details.';
div.appendChild(dwv.test.getMessagePara(message, 'error'));
});
var rootUrl = document.getElementById('rooturl').value;
var qidoArgs = document.getElementById('qidoArgs').value;
qidoReq.open('GET', rootUrl + qidoArgs);
qidoReq.setRequestHeader('Accept', 'application/dicom+json');
qidoReq.send();
};
/**
* Launch a STOW request.
*/
dwv.test.stow = function () {
var div = document.getElementById('result');
var stowReq = new XMLHttpRequest();
var message;
stowReq.addEventListener('load', function (event) {
var status = event.currentTarget.status;
// bad status
if (status !== 200 && status !== 204) {
message = 'Bad status in STOW-RS request: ' +
status + ' (' + event.currentTarget.statusText + ').';
div.appendChild(dwv.test.getMessagePara(message, 'error'));
return;
}
// no content
if (status === 204 ||
!event.target.response ||
typeof event.target.response === 'undefined') {
message = 'No content.';
div.appendChild(dwv.test.getMessagePara(message));
return;
}
// parse json
message = 'STOW-RS successful!!';
div.appendChild(dwv.test.getMessagePara(message, 'success'));
});
stowReq.addEventListener('error', function (error) {
message = 'Error in STOW-RS request';
console.error(message, error);
message += ', see console for details.';
div.appendChild(dwv.test.getMessagePara(message, 'error'));
});
// local files to request
var urls = [
'../data/bbmri-53323131.dcm',
'../data/bbmri-53323275.dcm',
'../data/bbmri-53323419.dcm'
];
// files' data
var data = [];
// load handler: store data and, when all data is received, launch STOW
var onload = function (event) {
// store
if (data.length < urls.length) {
data.push(event.target.response);
}
// if all, launch STOW
if (data.length === urls.length) {
// bundle data in multipart
var parts = [];
for (var j = 0; j < data.length; ++j) {
parts.push({
'Content-Type': 'application/dicom',
data: new Uint8Array(data[j])
});
}
var boundary = '----dwttestboundary';
var content = dwv.utils.buildMultipart(parts, boundary);
// STOW request
var rootUrl = document.getElementById('rooturl').value;
stowReq.open('POST', rootUrl + 'studies');
stowReq.setRequestHeader('Accept', 'application/dicom+json');
stowReq.setRequestHeader('Content-Type',
'multipart/related; type="application/dicom"; boundary=' + boundary);
stowReq.send(content);
}
};
// launch data requests
for (var i = 0; i < urls.length; ++i) {
var req = new XMLHttpRequest();
req.open('GET', urls[i]);
req.responseType = 'arraybuffer';
req.addEventListener('load', onload);
req.send();
}
};
/**
* Show the QIDO response as a table.
*
* @param {object} json The qido response as json object.
*/
function qidoResponseToTable(json) {
var viewerUrl = './viewer.html?input=';
var hasSeries = typeof json[0]['0020000E'] !== 'undefined';
var table = document.createElement('table');
table.id = 'series-table';
// table header
var header = table.createTHead();
var trow = header.insertRow(0);
var insertTCell = function (text, width) {
var th = document.createElement('th');
if (typeof width !== 'undefined') {
th.width = width;
}
th.innerHTML = text;
trow.appendChild(th);
};
insertTCell('#', '40px');
insertTCell('Study');
if (hasSeries) {
insertTCell('Series');
insertTCell('Modality', '70px');
insertTCell('Action');
}
// table body
var body = table.createTBody();
var cell;
for (var i = 0; i < json.length; ++i) {
var row = body.insertRow();
// number
cell = row.insertCell();
cell.appendChild(document.createTextNode(i));
// study
cell = row.insertCell();
var studyUid = json[i]['0020000D'].Value;
cell.title = studyUid;
cell.appendChild(document.createTextNode(studyUid));
if (hasSeries) {
// series
cell = row.insertCell();
var seriesUid = json[i]['0020000E'].Value;
cell.title = seriesUid;
cell.appendChild(document.createTextNode(seriesUid));
// modality
cell = row.insertCell();
cell.appendChild(document.createTextNode(json[i]['00080060'].Value));
// action
cell = row.insertCell();
var a = document.createElement('a');
a.href = viewerUrl + json[i]['00081190'].Value;
a.target = '_blank';
a.appendChild(document.createTextNode('view'));
cell.appendChild(a);
}
}
var div = document.getElementById('result');
div.appendChild(table);
}