kc-sdk
Version:
Knowledge Components SDK
290 lines (262 loc) • 8.82 kB
JavaScript
// enums
var listeningWindows = Object.freeze({
KC: 'kc',
ENCODER: 'encoder',
ALL: 'all'
});
var encoderTabs = Object.freeze({
LOGIC: 'LOGIC',
INDEX: 'INDEX',
TABULAR: 'TABULAR'
});
var sessionTypes = Object.freeze({
DX: {
state: ['I9'],
name: 'DX'
},
CMPX: {
state: ['I9'],
name: 'PX'
},
I10CM: {
state: ['I10'],
name: 'I10CM'
},
ICD10PCS: {
state: ['I10'],
name: 'ICD10PCS'
},
HCPCS: {
state: ['I9', 'I10'],
name: 'HCPCS'
}
});
var codeTypes = Object.freeze({
ADMITDX: {
state: ['I9'],
name: 'AdmitDx'
},
DX: {
state: ['I9'],
name: 'DX'
},
CMPX: {
state: ['I9'],
name: 'PX'
},
ADMIT10DX: {
state: ['I9'],
name: 'Admit10Dx'
},
I10CM: {
state: ['I10'],
name: 'I10CM'
},
I10PCS: {
state: ['I10'],
name: 'ICD10PCS'
},
HCPCS: {
state: ['I9', 'I10'],
name: 'HCPCS'
},
CPT: {
state: ['I9', 'I10'],
name: 'CPT'
}
});
var i9I10States = Object.freeze({
I9: { value: 'I9' },
I10: { value: 'I10' }
});
var listenerResponse = Object.freeze({
LOADPATIENTRECORD: 'loadPatientRecord Complete',
SETAUTHTOKEN: 'setAuthToken Complete',
SETI9I10STATE: 'setI9I10State Complete',
SETDEMOGRAPHICS: 'setDemographics Complete',
LOADPHRASEINLOGIC: 'logicRequest Received',
LOADPHRASEININDEX: 'indexRequest Received',
LOADCODEINTABULAR: 'tabularRequest Received',
ENCODEREXCEPTION: 'encoder listener exception: ',
KCEXCEPTION: 'kc listener exception: ',
OPENENCODER: 'encoderListening',
OPENKC: 'kcListening',
ENCODERSTARTUPCOMPLETE: 'Encoder Startup Complete'
});
var callbacks = Object.freeze({
SDKEXCEPTION: 'sdkRequestException',
SDKRESPONSE: 'sdkServiceResponse',
SAVEPATIENTRECORD: 'savePatientRecord',
CODESADDED: 'codesAdded',
KCLISTENINGCHANGED: 'kcListeningChanged',
ENCODERLISTENINGCHANGED: 'encoderListeningChanged',
WORKFLOWCOMPLETE: 'workflowComplete',
UNAUTHORIZED: 'unAuthorized'
});
var patientType = Object.freeze({
INPATIENT: {
payer_number: '01',
payer_name: 'Acute Inpatient',
displayValue: '01 Acute Inpatient'
},
OUTPATIENT: {
payer_number: '02',
payer_name: 'Outpatient',
displayValue: '02 Outpatient'
},
IRF: {
payer_number: '03',
payer_name: 'Inpatient Rehabilitation',
displayValue: '03 Inpatient Rehabilitation'
},
CAH: {
payer_number: '05',
payer_name: 'CAH Method II',
displayValue: '05 CAH Method II'
},
SNF: {
payer_number: '06',
payer_name: 'Skilled Nursing Facility',
displayValue: '06 Skilled Nursing Facility'
}
});
var messagingProvider = {
initialized: false,
currentHandler: null,
init: function () {
this.initialized = true;
var eventMethod = window.addEventListener ? 'addEventListener' : 'attachEvent';
var eventer = window[eventMethod];
var messageEvent = eventMethod === 'attachEvent' ? 'onmessage' : 'message';
eventer(
messageEvent,
function (e) {
var callback = this.currentHandler;
if (callback != null) {
var key = e.message ? 'message' : 'data';
var data = e[key];
callback(data);
}
},
false
);
},
post: function (target, message) {
if (target) {
target.postMessage(message, '*');
}
}
};
var kcMreService = {
launchMre: function (code, codeType, accessToken) {
code = adjustCodeForDecimal.adjust(code, codeType);
var codeTypeUrlHandler = {};
codeTypeUrlHandler.CPT = 'cptHandler.do?_k=101*';
codeTypeUrlHandler.HCPCS = 'hcpcsHandler.do?_k=102*';
codeTypeUrlHandler.DX = 'i9v1Handler.do?_k=103*';
codeTypeUrlHandler.PX = 'i9v3Handler.do?_k=104*';
codeTypeUrlHandler.I10CM = 'i10cmHandler.do?_k=201*';
codeTypeUrlHandler.ICD10PCS = 'i10pcsHandler.do?_k=202*';
var relayUrl = '';
var encodedUrl = '';
if (code !== null && codeType !== null) {
var codeBaseParam = codeType === codeTypes.HCPCS.name ? (isHcpcsCode(code) ? codeTypes.HCPCS.name : codeTypes.CPT.name) : codeType;
relayUrl = generateRelayUrl(code, codeBaseParam);
} else {
relayUrl = generateRelayUrl('', '');
}
encodedUrl = encodeURIComponent(relayUrl);
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState === 4 && this.status === 200) {
var response = JSON.parse(xhttp.responseText);
if (response.token) {
var xhttpOpenToken = new XMLHttpRequest();
xhttpOpenToken.onreadystatechange = function () {
if (this.readyState === 4 && this.status === 200) {
hasMREBrowserWindowOpened = true;
var openToken = xhttpOpenToken.responseText;
var mreForm = document.createElement('form');
mreForm.target = 'MRE';
mreForm.method = 'POST';
mreForm.action = relayUrl;
var mreInput = document.createElement('input');
mreInput.type = 'hidden';
mreInput.name = 'opentoken';
mreInput.value = openToken;
mreForm.appendChild(mreInput);
window.open('', 'MRE');
document.body.appendChild(mreForm);
mreForm.submit();
document.body.removeChild(mreForm);
}
};
xhttpOpenToken.open('GET', kcSdkConfig.tokenServer + 'getMreOpenToken?relayUrl=' + encodedUrl, true);
xhttpOpenToken.setRequestHeader('Authorization', 'Bearer ' + response.token);
xhttpOpenToken.send();
}
}
};
xhttp.open('GET', kcSdkConfig.tokenServer + 'ssoLogin/' + kcSdkConfig.appName, true);
xhttp.setRequestHeader('X-SSO-AuthToken', accessToken);
xhttp.send();
function generateRelayUrl(code, codeType) {
var baseURL = kcSdkConfig.mreBaseUrl + 'ssoHandler.do?_a=home';
if (code) {
baseURL = kcSdkConfig.mreBaseUrl + (codeTypeUrlHandler[codeType] ? codeTypeUrlHandler[codeType] : '');
baseURL = baseURL + code + '&_a=viewDetail';
}
return baseURL;
}
function isHcpcsCode(code) {
var modifiedCode = filterCode(code);
var regExHcpcsCode = /^[A-EG-HJ-MP-V][0-9]{4}$/;
return regExHcpcsCode.test(modifiedCode);
}
function filterCode(code, stripDecimals) {
var filteredCode = code;
/* istanbul ignore else */
if (filteredCode) {
filteredCode = filteredCode.trim();
if (stripDecimals) {
filteredCode = filteredCode.replace('.', '');
}
}
return filteredCode;
}
}
};
var jwt = {
getJwtData: function (accessToken) {
var jwtParts = accessToken.split('.');
if (jwtParts.length === 3) {
var payload = decodeURI(jwtParts[1]);
var jwtStringData = atob(payload.replace(/_/g, '/').replace(/-/g, '+'));
return JSON.parse(jwtStringData);
}
}
};
var adjustCodeForDecimal = {
adjust: function (code, codeType) {
if (code != null) {
switch (codeType) {
case codeTypes.I10CM.name:
case codeTypes.ADMIT10DX.name:
return addDecimal(code, 3);
case codeTypes.DX.name:
case codeTypes.ADMITDX.name:
return addDecimal(code, code.substring(0, 1) === 'E' ? 4 : 3);
case codeTypes.CMPX.name:
return addDecimal(code, 2);
}
}
function addDecimal(code, length) {
code = code.replace('.', '');
if (code.length > length) {
code = code.substring(0, length) + '.' + code.substring(length);
}
return code;
}
return code;
}
};