extensions/net.sf.basedb.reggie/trunk/resources/personal/retractionform.js

Code
Comments
Other
Rev Date Author Line
2839 20 Oct 14 olle 1 var RetractionForm = function()
2839 20 Oct 14 olle 2 {
2839 20 Oct 14 olle 3   var rf = {};
2839 20 Oct 14 olle 4   var patientInfo;
2839 20 Oct 14 olle 5   var numItemsToBeDestroyed = 0;
2853 23 Oct 14 nicklas 6   var debug = 0;
2839 20 Oct 14 olle 7   var TRUNCATE_SIZE = [-1, 30, 20, 15];
2839 20 Oct 14 olle 8   
2839 20 Oct 14 olle 9   rf.initPage = function()
2839 20 Oct 14 olle 10   {
2839 20 Oct 14 olle 11     previewTitle = Doc.element('previewTitle');
2839 20 Oct 14 olle 12     previewList = Doc.element('previewList');
2839 20 Oct 14 olle 13     
2839 20 Oct 14 olle 14     // Step 1
2839 20 Oct 14 olle 15     Events.addEventHandler('step-1', 'wizard-validate', rf.validateStep1);
2839 20 Oct 14 olle 16     Events.addEventHandler('caseName', 'keypress', Wizard.goNextOnTabOrEnter);
2839 20 Oct 14 olle 17     
2839 20 Oct 14 olle 18     // Step 2
2839 20 Oct 14 olle 19     Events.addEventHandler('step-2', 'wizard-initialize', rf.initializeStep2);
2839 20 Oct 14 olle 20     Events.addEventHandler('step-2', 'wizard-validate', rf.validateStep2);
2839 20 Oct 14 olle 21
2839 20 Oct 14 olle 22     // Navigation
2839 20 Oct 14 olle 23     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
2839 20 Oct 14 olle 24     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
2839 20 Oct 14 olle 25     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
2839 20 Oct 14 olle 26     Buttons.addClickHandler('goregister', Wizard.goRegister);    
2839 20 Oct 14 olle 27     Buttons.addClickHandler('gocreate', rf.createProtocol);
2839 20 Oct 14 olle 28
2839 20 Oct 14 olle 29     // Final registration
2839 20 Oct 14 olle 30     Events.addEventHandler('wizard', 'wizard-submit', rf.submit);
2839 20 Oct 14 olle 31     
2839 20 Oct 14 olle 32     Doc.show('step-1');
2839 20 Oct 14 olle 33     Doc.show('gonext');
2839 20 Oct 14 olle 34   }
2839 20 Oct 14 olle 35   
2839 20 Oct 14 olle 36   /**
2839 20 Oct 14 olle 37     Check that the case number is valid.
2839 20 Oct 14 olle 38   */
2839 20 Oct 14 olle 39   rf.validateStep1 = function(event)
2839 20 Oct 14 olle 40   {
2839 20 Oct 14 olle 41     var frm = document.forms['reggie'];
2839 20 Oct 14 olle 42     
2839 20 Oct 14 olle 43     var caseName = frm.caseName.value;
2839 20 Oct 14 olle 44     var caseIsValid = false;
2839 20 Oct 14 olle 45     Wizard.setInputStatus('caseName');
2839 20 Oct 14 olle 46     if (caseName == '')
2839 20 Oct 14 olle 47     {
2839 20 Oct 14 olle 48       Wizard.setInputStatus('caseName', 'invalid', 'Missing');
2839 20 Oct 14 olle 49       frm.caseName.focus();
2839 20 Oct 14 olle 50     }
2839 20 Oct 14 olle 51     else if (!Reggie.isValidCaseName(caseName, false)) // 'C' suffix is not used
2839 20 Oct 14 olle 52     {
2839 20 Oct 14 olle 53       rf.validatePersonalNumber(caseName);
2839 20 Oct 14 olle 54       if (pnrIsValid)
2839 20 Oct 14 olle 55       {
2839 20 Oct 14 olle 56         caseIsValid = true;
2839 20 Oct 14 olle 57       }
2839 20 Oct 14 olle 58       else
2839 20 Oct 14 olle 59       {
2839 20 Oct 14 olle 60         // Entered number is neither a valid case name or personal number
2839 20 Oct 14 olle 61         // Try to give as appropriate error message as possible
2839 20 Oct 14 olle 62         if (caseName.length < 7 || pnrErrorMsg == null || pnrErrorMsg == '')
2839 20 Oct 14 olle 63         {
2839 20 Oct 14 olle 64           // The entered number is probably a faulty case name
2839 20 Oct 14 olle 65           Wizard.setInputStatus('caseName', 'invalid', 'Only 7-digits name is allowed .');
2839 20 Oct 14 olle 66         }
2839 20 Oct 14 olle 67         else
2839 20 Oct 14 olle 68         {
2839 20 Oct 14 olle 69           Wizard.setInputStatus('caseName', 'invalid', pnrErrorMsg);
2839 20 Oct 14 olle 70         }
2839 20 Oct 14 olle 71         frm.caseName.focus();
2839 20 Oct 14 olle 72       }
2839 20 Oct 14 olle 73     }
2839 20 Oct 14 olle 74     else
2839 20 Oct 14 olle 75     {
2839 20 Oct 14 olle 76       Wizard.setInputStatus('caseName', 'valid');
2839 20 Oct 14 olle 77       caseIsValid = true;
2839 20 Oct 14 olle 78     }
2839 20 Oct 14 olle 79     
2839 20 Oct 14 olle 80     // If not valid, we prevent the wizard from moving to the next step
2839 20 Oct 14 olle 81     if (!caseIsValid) event.preventDefault();
2839 20 Oct 14 olle 82   }
2839 20 Oct 14 olle 83   
2839 20 Oct 14 olle 84   rf.validatePersonalNumber = function(pnr)
2839 20 Oct 14 olle 85   {
2839 20 Oct 14 olle 86     //var frm = document.forms['reggie'];
2839 20 Oct 14 olle 87     //var pnr = frm.personalNumber.value;
2839 20 Oct 14 olle 88     pnrIsValid = false;
2839 20 Oct 14 olle 89     pnrIsAcceptable = true;
2839 20 Oct 14 olle 90     pnrErrorMsg = null;
2839 20 Oct 14 olle 91     
2839 20 Oct 14 olle 92     var pnrLen = pnr.length;
2839 20 Oct 14 olle 93     if (pnrLen != 12 && pnrLen != 10)
2839 20 Oct 14 olle 94     {
2839 20 Oct 14 olle 95       Wizard.setInputStatus('caseName', 'warning', pnrLen < 12 ? 'Personal number too short' : 'Personal number too long');
2839 20 Oct 14 olle 96       if (pnrLen < 12)
2839 20 Oct 14 olle 97       {
2839 20 Oct 14 olle 98         pnrErrorMsg = 'Personal number too short';
2839 20 Oct 14 olle 99       }
2839 20 Oct 14 olle 100       else
2839 20 Oct 14 olle 101       {
2839 20 Oct 14 olle 102         pnrErrorMsg = 'Personal number too long';
2839 20 Oct 14 olle 103       }
2839 20 Oct 14 olle 104       return;
2839 20 Oct 14 olle 105     }
2839 20 Oct 14 olle 106
2839 20 Oct 14 olle 107     if (!pnr.match(/^\d+$/))
2839 20 Oct 14 olle 108     {
2839 20 Oct 14 olle 109       if (!pnr.match(/^\d+[A-Za-z]$/))
2839 20 Oct 14 olle 110       {
2839 20 Oct 14 olle 111         return;
2839 20 Oct 14 olle 112       }
2839 20 Oct 14 olle 113     }
2839 20 Oct 14 olle 114     
2839 20 Oct 14 olle 115     var datePart = pnr.substring(0, pnrLen - 4); // Remove last four digits
2839 20 Oct 14 olle 116     var dateFormat = pnrLen == 10 ? 'yyMMdd' : 'yyyyMMdd';
2839 20 Oct 14 olle 117     var isValidDate = Dates.isDate(datePart, dateFormat);
2839 20 Oct 14 olle 118     if (!isValidDate)
2839 20 Oct 14 olle 119     {
2839 20 Oct 14 olle 120       var dayInMonth = parseInt(datePart.substring(-2), 10); // Last two characters
2839 20 Oct 14 olle 121       if (dayInMonth > 60)
2839 20 Oct 14 olle 122       {
2839 20 Oct 14 olle 123         // 'Samordningsnummer' has day-in-month + 60; check this
2839 20 Oct 14 olle 124         dayInMonth -= 60;
2839 20 Oct 14 olle 125         var tmpPnr = pnr.substring(0, pnrLen - 6); // First 4 or 6 digits is year+month
2839 20 Oct 14 olle 126         if (dayInMonth < 10) tmpPnr += '0';
2839 20 Oct 14 olle 127         tmpPnr += dayInMonth;
2839 20 Oct 14 olle 128         isValidDate = Dates.isDate(tmpPnr, dateFormat);
2839 20 Oct 14 olle 129       }
2839 20 Oct 14 olle 130     }
2839 20 Oct 14 olle 131     if (!isValidDate)
2839 20 Oct 14 olle 132     {
2839 20 Oct 14 olle 133       Wizard.setInputStatus('caseName', 'warning', 'Personal number: Not a valid date');
2839 20 Oct 14 olle 134       pnrErrorMsg = 'Personal number: Not a valid date';
2839 20 Oct 14 olle 135       return;
2839 20 Oct 14 olle 136     }
2839 20 Oct 14 olle 137     
2839 20 Oct 14 olle 138     if (!pnr.match(/^\d+[A-Za-z]$/))
2839 20 Oct 14 olle 139     {
2839 20 Oct 14 olle 140       if (!Reggie.personalNumberControlDigitCheck(pnr.substr(pnrLen == 10 ? 0 : 2)))
2839 20 Oct 14 olle 141       {
2839 20 Oct 14 olle 142         Wizard.setInputStatus('caseName', 'warning', 'Personal number: Invalid control digit');
2839 20 Oct 14 olle 143         pnrErrorMsg = 'Personal number: Invalid control digit';
2839 20 Oct 14 olle 144         return;
2839 20 Oct 14 olle 145       }
2839 20 Oct 14 olle 146     }
2839 20 Oct 14 olle 147
2839 20 Oct 14 olle 148     Wizard.setInputStatus('caseName', 'valid');
2839 20 Oct 14 olle 149     pnrIsValid = true;
2839 20 Oct 14 olle 150   }
2839 20 Oct 14 olle 151
2839 20 Oct 14 olle 152   rf.validateStep2 = function(event)
4496 10 May 17 nicklas 153   {}
2839 20 Oct 14 olle 154   
2839 20 Oct 14 olle 155   /**
2839 20 Oct 14 olle 156     Load information about the given case.
2839 20 Oct 14 olle 157   */
6824 30 Aug 22 nicklas 158   rf.initializeStep2 = function()
2839 20 Oct 14 olle 159   {
2839 20 Oct 14 olle 160     var frm = document.forms['reggie'];
2839 20 Oct 14 olle 161     var caseName = frm.caseName.value;
2839 20 Oct 14 olle 162
3323 11 May 15 nicklas 163     var url = '../Retraction.servlet?ID='+App.getSessionId();
2839 20 Oct 14 olle 164     url += '&cmd=GetCaseInfo&caseName=' + encodeURIComponent(caseName);
2839 20 Oct 14 olle 165     
2839 20 Oct 14 olle 166     Wizard.showLoadingAnimation('Loading case information...');
2839 20 Oct 14 olle 167     Wizard.asyncJsonRequest(url, rf.caseInfoLoaded);
2839 20 Oct 14 olle 168   }
2839 20 Oct 14 olle 169   
2839 20 Oct 14 olle 170   /**
2839 20 Oct 14 olle 171     Initalize the second step based on the information we have about the case.
2839 20 Oct 14 olle 172   */
2839 20 Oct 14 olle 173   rf.caseInfoLoaded = function(response)
2839 20 Oct 14 olle 174   {
2839 20 Oct 14 olle 175     var frm = document.forms['reggie'];
2839 20 Oct 14 olle 176     var caseName = frm.caseName.value;
4312 18 Jan 17 nicklas 177     if (!response.patient && !response.caseInfo)
4103 15 Sep 16 nicklas 178     {
4312 18 Jan 17 nicklas 179       Wizard.setFatalError('Could not find any patient or case information for ' + caseName);
4103 15 Sep 16 nicklas 180       return;
4103 15 Sep 16 nicklas 181     }
2839 20 Oct 14 olle 182     patientInfo = response.patient;
2839 20 Oct 14 olle 183     var caseInfo = response.caseInfo;
4312 18 Jan 17 nicklas 184     var caseNames = response.allCaseNames;
2839 20 Oct 14 olle 185
2839 20 Oct 14 olle 186     var html = '<table id="retractionItemsTable">';
2839 20 Oct 14 olle 187
2839 20 Oct 14 olle 188     // Patient Header row
3026 11 Dec 14 nicklas 189     html += '<thead class="bg-filled-100">';
2839 20 Oct 14 olle 190     html += '<tr>';
2839 20 Oct 14 olle 191     html += '<th colspan="2">Patient</th>';
2839 20 Oct 14 olle 192     html += '<th class="dottedleft" colspan="2">Date</th>';
2839 20 Oct 14 olle 193     html += '<th class="dottedleft">Gender</th>';
2839 20 Oct 14 olle 194     html += '<th class="dottedleft">All cases</th>';
2839 20 Oct 14 olle 195     html += '<th class="dottedleft" colspan="3">Person data</th>';
2839 20 Oct 14 olle 196     html += '<th class="dottedleft" colspan="2"></th>';
2839 20 Oct 14 olle 197     html += '<th class="dottedleft" colspan="2"></th>';
2839 20 Oct 14 olle 198     html += '</tr>';
2839 20 Oct 14 olle 199     html += '<tr>';
2839 20 Oct 14 olle 200     html += '<th>type</th>';
2839 20 Oct 14 olle 201     html += '<th>name</th>';
2839 20 Oct 14 olle 202     html += '<th class="dottedleft">type</th>';
2839 20 Oct 14 olle 203     html += '<th>value</th>';
2839 20 Oct 14 olle 204     html += '<th class="dottedleft"></th>';
2839 20 Oct 14 olle 205     html += '<th class="dottedleft"></th>';
2839 20 Oct 14 olle 206     html += '<th class="dottedleft">Personal number</th>';
2839 20 Oct 14 olle 207     html += '<th>All first names</th>';
2839 20 Oct 14 olle 208     html += '<th>Family name</th>';
2839 20 Oct 14 olle 209     html += '<th class="dottedleft"></th>';
2839 20 Oct 14 olle 210     html += '<th></th>';
2839 20 Oct 14 olle 211     html += '<th class="dottedleft"></th>';
2839 20 Oct 14 olle 212     html += '<th></th>';
2839 20 Oct 14 olle 213     html += '</tr>';
2839 20 Oct 14 olle 214     html += '</thead>';
2839 20 Oct 14 olle 215
4116 20 Sep 16 nicklas 216     // Patient
2839 20 Oct 14 olle 217     html += '<tbody>';
4116 20 Sep 16 nicklas 218     html += '<tr>';
4312 18 Jan 17 nicklas 219     if (!patientInfo)
4312 18 Jan 17 nicklas 220     {
4312 18 Jan 17 nicklas 221       html += '<td colspan="5"><span class="warning">No patient data is registered for this case</span></td>';
4312 18 Jan 17 nicklas 222       html += '<td class="dottedleft">' + rf.asCaseList(caseNames, caseName) + '</td>';
4312 18 Jan 17 nicklas 223       html += '<td class="dottedleft" colspan="5"></td>';
4312 18 Jan 17 nicklas 224     }
4312 18 Jan 17 nicklas 225     else
4312 18 Jan 17 nicklas 226     {
4312 18 Jan 17 nicklas 227       html += '<td>' + rf.warnIfMissing(patientInfo.subtype) + '</td>';
4312 18 Jan 17 nicklas 228       html += '<td>' + rf.warnIfMissing(patientInfo.name) + '</td>';
4312 18 Jan 17 nicklas 229       html += '<td class="dottedleft">Registration</td>';
4312 18 Jan 17 nicklas 230       html += '<td>' + rf.warnIfMissing(rf.asDateTime(patientInfo.registrationDate)) + '</td>';
4312 18 Jan 17 nicklas 231       html += '<td class="dottedleft">' + rf.warnIfMissing(patientInfo.gender) + '</td>';
4312 18 Jan 17 nicklas 232       html += '<td class="dottedleft">' + rf.asCaseList(caseNames, caseName) + '</td>';
4312 18 Jan 17 nicklas 233       html += '<td class="dottedleft">' + rf.warnIfMissing(patientInfo.personalNumber) + '</td>';
4312 18 Jan 17 nicklas 234       html += '<td>' + rf.warnIfMissing(patientInfo.allFirstNames) + '</td>';
4312 18 Jan 17 nicklas 235       html += '<td>' + rf.warnIfMissing(patientInfo.familyName) + '</td>';
4312 18 Jan 17 nicklas 236       html += '<td class="dottedleft"></td>';
4312 18 Jan 17 nicklas 237       html += '<td></td>';
4312 18 Jan 17 nicklas 238       html += '<td class="dottedleft"></td>';
4312 18 Jan 17 nicklas 239       html += '<td></td>';
4312 18 Jan 17 nicklas 240     }
4116 20 Sep 16 nicklas 241     html += '</tr>';
2839 20 Oct 14 olle 242     html += '</tbody>';
2839 20 Oct 14 olle 243
2839 20 Oct 14 olle 244     // Case
2839 20 Oct 14 olle 245     var caseInfo = response.caseInfo;
2839 20 Oct 14 olle 246     if (caseInfo && caseInfo.length > 0)
2839 20 Oct 14 olle 247     {
2839 20 Oct 14 olle 248       // Case Header row
3026 11 Dec 14 nicklas 249       html += '<thead class="bg-filled-100">';
2839 20 Oct 14 olle 250       html += '<tr>';
2839 20 Oct 14 olle 251       html += '<th colspan="2">Cases</th>';
2839 20 Oct 14 olle 252       html += '<th class="dottedleft" colspan="2">Date</th>';
2839 20 Oct 14 olle 253       html += '<th class="dottedleft" colspan="2">Consent</th>';
2839 20 Oct 14 olle 254       html += '<th class="dottedleft" colspan="3">Other data</th>';
2839 20 Oct 14 olle 255       html += '<th class="dottedleft" colspan="2">Flag</th>';
2839 20 Oct 14 olle 256       html += '<th class="dottedleft" colspan="2"></th>';
2839 20 Oct 14 olle 257       html += '</tr>';
2839 20 Oct 14 olle 258       html += '<tr>';
2839 20 Oct 14 olle 259       html += '<th>type</th>';
2839 20 Oct 14 olle 260       html += '<th>name</th>';
2839 20 Oct 14 olle 261       html += '<th class="dottedleft">type</th>';
2839 20 Oct 14 olle 262       html += '<th>value</th>';
2839 20 Oct 14 olle 263       html += '<th class="dottedleft">value</th>';
2839 20 Oct 14 olle 264       html += '<th>date</th>';
2839 20 Oct 14 olle 265       html += '<th class="dottedleft">Site</th>';
2839 20 Oct 14 olle 266       html += '<th>Laterality</th>';
2839 20 Oct 14 olle 267       html += '<th>Comment</th>';
2839 20 Oct 14 olle 268       html += '<th class="dottedleft">value</th>';
2839 20 Oct 14 olle 269       html += '<th>to set</th>';
2839 20 Oct 14 olle 270       html += '<th class="dottedleft"></th>';
2839 20 Oct 14 olle 271       html += '<th></th>';
2839 20 Oct 14 olle 272       html += '</tr>';
2839 20 Oct 14 olle 273       html += '</thead>';
2839 20 Oct 14 olle 274
2839 20 Oct 14 olle 275       html += '<tbody>';
2839 20 Oct 14 olle 276
2839 20 Oct 14 olle 277       var truncateAt = TRUNCATE_SIZE[Math.min(caseInfo.length-1, TRUNCATE_SIZE.length)];
2839 20 Oct 14 olle 278       for (var i = 0; i < caseInfo.length; i++)
2839 20 Oct 14 olle 279       {
2839 20 Oct 14 olle 280         var c = caseInfo[i];
2839 20 Oct 14 olle 281         var flag = c.flag ? c.flag : '-';
4102 15 Sep 16 nicklas 282         var site = c.site;
2839 20 Oct 14 olle 283         var comment = c.comment ? c.comment : '-';
2839 20 Oct 14 olle 284         //var autoProcessing = s.autoProcessing ? s.autoProcessing : '-';
2839 20 Oct 14 olle 285         html += '<tr>';
2839 20 Oct 14 olle 286         html += '<td>Case</td>';
2839 20 Oct 14 olle 287         html += '<td>' + c.name + '</td>';
2839 20 Oct 14 olle 288         html += '<td class="dottedleft">Registration</td>';
2839 20 Oct 14 olle 289         html += '<td>' + rf.warnIfMissing(rf.asDateTime(c.registrationDate)) + '</td>';
2839 20 Oct 14 olle 290         html += '<td class="dottedleft">' + rf.asConsentAnyDate(c.consent) + '</td>';
2839 20 Oct 14 olle 291         html += '<td>' + rf.warnIfMissing(rf.asDateTime(c.consentDate)) + '</td>';
2839 20 Oct 14 olle 292         html += '<td class="dottedleft">' + site.name + '</td>';
2839 20 Oct 14 olle 293         html += '<td>' + rf.warnIfMissing(c.laterality) + '</td>';
2839 20 Oct 14 olle 294         html += '<td>' + comment + '</td>';
2839 20 Oct 14 olle 295         html += '<td class="dottedleft">' + flag + '</td>';
2839 20 Oct 14 olle 296         html += '<td>-</td>';
2839 20 Oct 14 olle 297         html += '<td class="dottedleft"></td>';
2839 20 Oct 14 olle 298         html += '<td></td>';
2839 20 Oct 14 olle 299         html += '</tr>';
2839 20 Oct 14 olle 300       }
2839 20 Oct 14 olle 301       html += '</tbody>';
2839 20 Oct 14 olle 302     }
2839 20 Oct 14 olle 303     else
2839 20 Oct 14 olle 304     {
3026 11 Dec 14 nicklas 305       html += '<thead class="bg-filled-100">';
2839 20 Oct 14 olle 306       html += '<tr id="case.name2">';
4116 20 Sep 16 nicklas 307       html += '<th id="case-header2" colspan="2">Cases</th>';
4116 20 Sep 16 nicklas 308       html += '<td colspan="11" style="text-align: left;">' + rf.asNoInfo('No case information has been registered') + '</td>';
2839 20 Oct 14 olle 309       html += '</tr>';
2839 20 Oct 14 olle 310       html += '</thead>';
2839 20 Oct 14 olle 311     }
2839 20 Oct 14 olle 312
2839 20 Oct 14 olle 313     // Blood
2839 20 Oct 14 olle 314     var blood = response.blood;
2839 20 Oct 14 olle 315     if (blood && blood.length > 0)
2839 20 Oct 14 olle 316     {
2839 20 Oct 14 olle 317       // Blood Sample Header row
3026 11 Dec 14 nicklas 318       html += '<thead class="bg-filled-100">';
2839 20 Oct 14 olle 319       html += '<tr>';
2839 20 Oct 14 olle 320       html += '<th colspan="2">Blood samples</th>';
2839 20 Oct 14 olle 321       html += '<th class="dottedleft" colspan="2">Date</th>';
2839 20 Oct 14 olle 322       html += '<th class="dottedleft" colspan="2">Consent</th>';
2839 20 Oct 14 olle 323       html += '<th class="dottedleft" colspan="3">Other data</th>';
2839 20 Oct 14 olle 324       html += '<th class="dottedleft" colspan="2">Flag</th>';
2839 20 Oct 14 olle 325       html += '<th class="dottedleft" colspan="2"></th>';
2839 20 Oct 14 olle 326       html += '</tr>';
2839 20 Oct 14 olle 327       html += '<tr>';
2839 20 Oct 14 olle 328       html += '<th>type</th>';
2839 20 Oct 14 olle 329       html += '<th>name</th>';
2839 20 Oct 14 olle 330       html += '<th class="dottedleft">type</th>';
2839 20 Oct 14 olle 331       html += '<th>value</th>';
2839 20 Oct 14 olle 332       html += '<th class="dottedleft">value</th>';
2839 20 Oct 14 olle 333       html += '<th>date</th>';
2839 20 Oct 14 olle 334       html += '<th class="dottedleft">Sample type</th>';
2839 20 Oct 14 olle 335       html += '<th>RCC-ID</th>';
2839 20 Oct 14 olle 336       html += '<th>Serum</th>';
2839 20 Oct 14 olle 337       html += '<th class="dottedleft">value</th>';
2839 20 Oct 14 olle 338       html += '<th>to set</th>';
2839 20 Oct 14 olle 339       html += '<th class="dottedleft"></th>';
2839 20 Oct 14 olle 340       html += '<th></th>';
2839 20 Oct 14 olle 341       html += '</tr>';
2839 20 Oct 14 olle 342       html += '</thead>';
2839 20 Oct 14 olle 343
2839 20 Oct 14 olle 344       html += '<tbody>';
2839 20 Oct 14 olle 345     
2839 20 Oct 14 olle 346       var truncateAt = TRUNCATE_SIZE[Math.min(blood.length-1, TRUNCATE_SIZE.length)];
2839 20 Oct 14 olle 347       for (var i = 0; i < blood.length; i++)
2839 20 Oct 14 olle 348       {
2839 20 Oct 14 olle 349         var b = blood[i];
2839 20 Oct 14 olle 350         var flag = b.flag ? b.flag : '-';
2839 20 Oct 14 olle 351         var bloodSample = b.bloodSample ? b.bloodSample : '-';
2839 20 Oct 14 olle 352         var bloodRccidNumber = b.bloodRccidNumber ? b.bloodRccidNumber : '-';
2839 20 Oct 14 olle 353         var bloodSerum = b.serum ? b.serum : '-';
2839 20 Oct 14 olle 354         html += '<tr>';
2839 20 Oct 14 olle 355         html += '<td>Blood</td>';
2839 20 Oct 14 olle 356         html += '<td>' + b.name + '</td>';
2839 20 Oct 14 olle 357         html += '<td class="dottedleft">Sampling</td>';
2839 20 Oct 14 olle 358         html += '<td>' + rf.warnIfMissing(rf.asDateTime(b.samplingDate)) + '</td>';
2839 20 Oct 14 olle 359         html += '<td class="dottedleft">' + rf.asConsentAnyDate(b.consent) + '</td>';
2839 20 Oct 14 olle 360         html += '<td>' + rf.warnIfMissing(rf.asDateTime(b.consentDate)) + '</td>';
2839 20 Oct 14 olle 361         html += '<td class="dottedleft">' + bloodSample + '</td>';
2839 20 Oct 14 olle 362         html += '<td>' + bloodRccidNumber + '</td>';
2839 20 Oct 14 olle 363         html += '<td>' + bloodSerum + '</td>';
2839 20 Oct 14 olle 364         html += '<td class="dottedleft">' + flag + '</td>';
2839 20 Oct 14 olle 365         html += '<td>-</td>';
2839 20 Oct 14 olle 366         html += '<td class="dottedleft"></td>';
2839 20 Oct 14 olle 367         html += '<td></td>';
2839 20 Oct 14 olle 368         html += '</tr>';
2839 20 Oct 14 olle 369       }
2839 20 Oct 14 olle 370       html += '</tbody>';
2839 20 Oct 14 olle 371     }
2839 20 Oct 14 olle 372     else
2839 20 Oct 14 olle 373     {
2839 20 Oct 14 olle 374       // Blood Sample Header row
3026 11 Dec 14 nicklas 375       html += '<thead class="bg-filled-100">';
2839 20 Oct 14 olle 376       html += '<tr id="blood.name2">';
4116 20 Sep 16 nicklas 377       html += '<th id="blood-header2" colspan="2">Blood samples</th>';
4116 20 Sep 16 nicklas 378       html += '<td colspan="11" style="text-align: left;">' + rf.asNoInfo('No blood information has been registered') + '</td>';
2839 20 Oct 14 olle 379       html += '</tr>';
2839 20 Oct 14 olle 380       html += '</thead>';
2839 20 Oct 14 olle 381     }
2839 20 Oct 14 olle 382
2839 20 Oct 14 olle 383     // Other sample items
2839 20 Oct 14 olle 384
2839 20 Oct 14 olle 385     var specimen = response.specimen;
2839 20 Oct 14 olle 386     var noSpecimen = response.noSpecimen;
2839 20 Oct 14 olle 387     var histology = response.histology;
4109 15 Sep 16 nicklas 388     var stained = response.stained;
2839 20 Oct 14 olle 389     var lysate = response.lysate;
2839 20 Oct 14 olle 390     var rna = response.rna;
4107 15 Sep 16 nicklas 391     var rnaQc = response.rnaQc;
2839 20 Oct 14 olle 392     var dna = response.dna;
2839 20 Oct 14 olle 393     var ft = response.flowThrough;
2839 20 Oct 14 olle 394     var mrna = response.mrna;
2839 20 Oct 14 olle 395     var cdna = response.cdna;
2839 20 Oct 14 olle 396     var lib = response.lib;
2839 20 Oct 14 olle 397     var pooledLib = response.pooledlib;
3360 29 May 15 olle 398     var bloodDna = response.bloodDna;
2839 20 Oct 14 olle 399
2839 20 Oct 14 olle 400     // Count number of items to be included in lab protocol for destruction
2839 20 Oct 14 olle 401     numItemsToBeDestroyed = 0;
2839 20 Oct 14 olle 402     if (specimen && specimen.length > 0)
2839 20 Oct 14 olle 403     {
2839 20 Oct 14 olle 404       numItemsToBeDestroyed += specimen.length;
2839 20 Oct 14 olle 405     }
2839 20 Oct 14 olle 406     if (lysate && lysate.length > 0)
2839 20 Oct 14 olle 407     {
2839 20 Oct 14 olle 408       numItemsToBeDestroyed += lysate.length;
2839 20 Oct 14 olle 409     }
2839 20 Oct 14 olle 410     if (rna && rna.length > 0)
2839 20 Oct 14 olle 411     {
2839 20 Oct 14 olle 412       numItemsToBeDestroyed += rna.length;
2839 20 Oct 14 olle 413     }
2839 20 Oct 14 olle 414     if (dna && dna.length > 0)
2839 20 Oct 14 olle 415     {
2839 20 Oct 14 olle 416       numItemsToBeDestroyed += dna.length;
2839 20 Oct 14 olle 417     }
2839 20 Oct 14 olle 418     if (ft && ft.length > 0)
2839 20 Oct 14 olle 419     {
2839 20 Oct 14 olle 420       numItemsToBeDestroyed += ft.length;
2839 20 Oct 14 olle 421     }
3360 29 May 15 olle 422     if (bloodDna && bloodDna.length > 0)
3360 29 May 15 olle 423     {
3360 29 May 15 olle 424       numItemsToBeDestroyed += bloodDna.length;
3360 29 May 15 olle 425     }
2839 20 Oct 14 olle 426
2839 20 Oct 14 olle 427     // Check if any items exist
2839 20 Oct 14 olle 428     var itemExists = false;
2839 20 Oct 14 olle 429     if (specimen && specimen.length > 0)
2839 20 Oct 14 olle 430     {
2839 20 Oct 14 olle 431       itemExists = true;
2839 20 Oct 14 olle 432     }
2839 20 Oct 14 olle 433     if (noSpecimen && noSpecimen.length > 0)
2839 20 Oct 14 olle 434     {
2839 20 Oct 14 olle 435       itemExists = true;
2839 20 Oct 14 olle 436     }
2839 20 Oct 14 olle 437     if (histology && histology.length > 0)
2839 20 Oct 14 olle 438     {
2839 20 Oct 14 olle 439       itemExists = true;
2839 20 Oct 14 olle 440     }
2839 20 Oct 14 olle 441     if (lysate && lysate.length > 0)
2839 20 Oct 14 olle 442     {
2839 20 Oct 14 olle 443       itemExists = true;
2839 20 Oct 14 olle 444     }
2839 20 Oct 14 olle 445     if (rna && rna.length > 0)
2839 20 Oct 14 olle 446     {
2839 20 Oct 14 olle 447       itemExists = true;
2839 20 Oct 14 olle 448     }
2839 20 Oct 14 olle 449     if (dna && dna.length > 0)
2839 20 Oct 14 olle 450     {
2839 20 Oct 14 olle 451       itemExists = true;
2839 20 Oct 14 olle 452     }
2839 20 Oct 14 olle 453     if (ft && ft.length > 0)
2839 20 Oct 14 olle 454     {
2839 20 Oct 14 olle 455       itemExists = true;
2839 20 Oct 14 olle 456     }
2839 20 Oct 14 olle 457     if (mrna && mrna.length > 0)
2839 20 Oct 14 olle 458     {
2839 20 Oct 14 olle 459       itemExists = true;
2839 20 Oct 14 olle 460     }
2839 20 Oct 14 olle 461     if (cdna && cdna.length > 0)
2839 20 Oct 14 olle 462     {
2839 20 Oct 14 olle 463       itemExists = true;
2839 20 Oct 14 olle 464     }
2839 20 Oct 14 olle 465     if (lib && lib.length > 0)
2839 20 Oct 14 olle 466     {
2839 20 Oct 14 olle 467       itemExists = true;
2839 20 Oct 14 olle 468     }
2839 20 Oct 14 olle 469     if (pooledLib && specimen.length > 0)
2839 20 Oct 14 olle 470     {
2839 20 Oct 14 olle 471       itemExists = true;
2839 20 Oct 14 olle 472     }
3360 29 May 15 olle 473     if (bloodDna && bloodDna.length > 0)
3360 29 May 15 olle 474     {
3360 29 May 15 olle 475       itemExists = true;
3360 29 May 15 olle 476     }
2839 20 Oct 14 olle 477
2839 20 Oct 14 olle 478     if (itemExists)
2839 20 Oct 14 olle 479     {
2839 20 Oct 14 olle 480       // Sample Items Header row
3026 11 Dec 14 nicklas 481       html += '<thead class="bg-filled-100">';
2839 20 Oct 14 olle 482       html += '<tr>';
2839 20 Oct 14 olle 483       html += '<th colspan="2">Other items</th>';
2839 20 Oct 14 olle 484       html += '<th class="dottedleft" colspan="2">Date</th>';
2839 20 Oct 14 olle 485       html += '<th class="dottedleft" colspan="2">Other data</th>';
2839 20 Oct 14 olle 486       html += '<th class="dottedleft" colspan="3">Storage</th>';
2839 20 Oct 14 olle 487       html += '<th class="dottedleft" colspan="2">Flag</th>';
2839 20 Oct 14 olle 488       html += '<th class="dottedleft" colspan="2">AutoProcessing</th>';
2839 20 Oct 14 olle 489       html += '</tr>';
2839 20 Oct 14 olle 490       html += '<tr>';
2839 20 Oct 14 olle 491       html += '<th>type</th>';
2839 20 Oct 14 olle 492       html += '<th>name</th>';
2839 20 Oct 14 olle 493       html += '<th class="dottedleft">type</th>';
2839 20 Oct 14 olle 494       html += '<th>value</th>';
2839 20 Oct 14 olle 495       html += '<th class="dottedleft">name</th>';
2839 20 Oct 14 olle 496       html += '<th>value</th>';
4116 20 Sep 16 nicklas 497       html += '<th class="dottedleft" colspan="2">box/plate</th>';
4116 20 Sep 16 nicklas 498       html += '<th>location</th>';
2839 20 Oct 14 olle 499       html += '<th class="dottedleft">value</th>';
2839 20 Oct 14 olle 500       html += '<th>to set</th>';
2839 20 Oct 14 olle 501       html += '<th class="dottedleft">value</th>';
2839 20 Oct 14 olle 502       html += '<th>to set</th>';
2839 20 Oct 14 olle 503       html += '</tr>';
2839 20 Oct 14 olle 504       html += '</thead>';
4116 20 Sep 16 nicklas 505
4116 20 Sep 16 nicklas 506       html += '<tbody>';
4116 20 Sep 16 nicklas 507       // Other sample item rows
4116 20 Sep 16 nicklas 508       html += htmlTableRowsForItems(specimen, 'Specimen', 'specimen', 'Sampling', 'PAD', 'Storage box', false, false);
4116 20 Sep 16 nicklas 509       html += htmlTableRowsForItems(noSpecimen, 'NoSpecimen', 'nospecimen', 'Sampling', 'PAD', 'NA', false, false);
4116 20 Sep 16 nicklas 510       html += htmlTableRowsForItems(histology, 'Histology', 'histology', 'Partition', null, 'Paraffin block', true, true);
4116 20 Sep 16 nicklas 511       html += htmlTableRowsForItems(stained, 'Stained', 'stained', null, null, 'Slide', false, false);
4116 20 Sep 16 nicklas 512       html += htmlTableRowsForItems(lysate, 'Lysate', 'lysate', 'Lysis', null, 'Storage box', false, false);
4116 20 Sep 16 nicklas 513       html += htmlTableRowsForItems(rna, 'RNA', 'rna', null, null, 'Storage box', true, true);
4116 20 Sep 16 nicklas 514       html += htmlTableRowsForItems(rnaQc, 'RNA-QC', 'rnaqc', null, null, 'Plate', false, false);
4116 20 Sep 16 nicklas 515       html += htmlTableRowsForItems(dna, 'DNA', 'dna', null, null, 'Storage box', false, false);
4116 20 Sep 16 nicklas 516       html += htmlTableRowsForItems(ft, 'FlowThrough', 'flowthrough', null, null, 'Storage box', false, false);
4116 20 Sep 16 nicklas 517       html += htmlTableRowsForItems(mrna, 'mRNA', 'mrna', null, null, 'Work plate', false, false);
4116 20 Sep 16 nicklas 518       html += htmlTableRowsForItems(cdna, 'cDNA', 'cdna', null, null, 'Work plate', false, false);
4116 20 Sep 16 nicklas 519       html += htmlTableRowsForItems(lib, 'Library', 'library', null, null, 'Library plate', false, false);
4116 20 Sep 16 nicklas 520       html += htmlTableRowsForItems(pooledLib, 'Pooled Library', 'pooledlibrary', null, null, null, false, false);
4116 20 Sep 16 nicklas 521       html += htmlTableRowsForItems(bloodDna, 'BloodDNA', 'bloodDna', null, null, 'Storage box', false, false);
4116 20 Sep 16 nicklas 522       html += '</tbody>';
2839 20 Oct 14 olle 523     }
2839 20 Oct 14 olle 524     else
2839 20 Oct 14 olle 525     {
2839 20 Oct 14 olle 526       // Other Items Header row
3026 11 Dec 14 nicklas 527       html += '<thead class="bg-filled-100">';
2839 20 Oct 14 olle 528       html += '<tr id="other.name2">';
4116 20 Sep 16 nicklas 529       html += '<th id="other-header2" colspan="2">Other items</th>';
4116 20 Sep 16 nicklas 530       html += '<td colspan="11" style="text-align:left;">' + rf.asNoInfo('No other sample item information has been registered') + '</td>';
2839 20 Oct 14 olle 531       html += '</tr>';
2839 20 Oct 14 olle 532       html += '</thead>';
2839 20 Oct 14 olle 533     }
2839 20 Oct 14 olle 534
2839 20 Oct 14 olle 535     // Sequencing runs
2839 20 Oct 14 olle 536     var sr = response.sequencingRun;
2839 20 Oct 14 olle 537     if (sr && sr.length > 0)
2839 20 Oct 14 olle 538     {
2839 20 Oct 14 olle 539       // Sequencing runs Header row
3026 11 Dec 14 nicklas 540       html += '<thead class="bg-filled-100">';
2839 20 Oct 14 olle 541       html += '<tr>';
2839 20 Oct 14 olle 542       html += '<th colspan="2">Sequencing runs</th>';
2839 20 Oct 14 olle 543       html += '<th class="dottedleft" colspan="2">Date</th>';
2839 20 Oct 14 olle 544       html += '<th class="dottedleft" colspan="2">Flow cell</th>';
2839 20 Oct 14 olle 545       html += '<th class="dottedleft" colspan="3">Other data</th>';
2839 20 Oct 14 olle 546       html += '<th class="dottedleft" colspan="2">Flag NA</th>';
2839 20 Oct 14 olle 547       html += '<th class="dottedleft" colspan="2">AutoProcessing</th>';
2839 20 Oct 14 olle 548       html += '</tr>';
2839 20 Oct 14 olle 549       html += '<tr>';
4112 19 Sep 16 nicklas 550       html += '<th colspan="2">name</th>';
2839 20 Oct 14 olle 551       html += '<th class="dottedleft">start</th>';
2839 20 Oct 14 olle 552       html += '<th>end</th>';
2839 20 Oct 14 olle 553       html += '<th class="dottedleft">name</th>';
2839 20 Oct 14 olle 554       html += '<th>cluster date</th>';
2839 20 Oct 14 olle 555       html += '<th class="dottedleft">Case</th>';
2839 20 Oct 14 olle 556       html += '<th>Result</th>';
2839 20 Oct 14 olle 557       html += '<th>Comment</th>';
2839 20 Oct 14 olle 558       html += '<th class="dottedleft"></th>';
2839 20 Oct 14 olle 559       html += '<th></th>';
2839 20 Oct 14 olle 560       html += '<th class="dottedleft">value</th>';
2839 20 Oct 14 olle 561       html += '<th>to set</th>';
2839 20 Oct 14 olle 562       html += '</tr>';
2839 20 Oct 14 olle 563       html += '</thead>';
2839 20 Oct 14 olle 564
4112 19 Sep 16 nicklas 565       html += '<tbody class="bottomborder">';
2839 20 Oct 14 olle 566     
2839 20 Oct 14 olle 567       var truncateAt = TRUNCATE_SIZE[Math.min(sr.length-1, TRUNCATE_SIZE.length)];
2839 20 Oct 14 olle 568       for (var i = 0; i < sr.length; i++)
2839 20 Oct 14 olle 569       {
2839 20 Oct 14 olle 570         var seqrun = sr[i];
2839 20 Oct 14 olle 571         var autoProcessing = seqrun.autoProcessing ? seqrun.autoProcessing : '-';
2839 20 Oct 14 olle 572         var flowCell = seqrun.flowCell;
2839 20 Oct 14 olle 573         var seqrunCase = seqrun.caseName;
2839 20 Oct 14 olle 574         var seqrunResult = seqrun.result;
2839 20 Oct 14 olle 575         html += '<tr>';
4112 19 Sep 16 nicklas 576         html += '<td colspan="2">' + seqrun.name + '</td>';
2839 20 Oct 14 olle 577         html += '<td class="dottedleft">' + rf.warnIfMissing(rf.asDateTime(seqrun.startDate)) + '</td>';
2839 20 Oct 14 olle 578         html += '<td>' + rf.warnIfMissing(rf.asDateTime(seqrun.endDate)) + '</td>';
2839 20 Oct 14 olle 579         html += '<td class="dottedleft">' + flowCell.name + '</td>';
2839 20 Oct 14 olle 580         html += '<td>' + rf.warnIfMissing(rf.asDateTime(flowCell.clusterDate)) + '</td>';
2839 20 Oct 14 olle 581         html += '<td class="dottedleft">' + seqrun.caseName + '</td>';
2839 20 Oct 14 olle 582         html += '<td>' + seqrun.result + '</td>';
2839 20 Oct 14 olle 583         html += '<td>' + seqrun.comment + '</td>';
2839 20 Oct 14 olle 584         html += '<td class="dottedleft">-</td>';
2839 20 Oct 14 olle 585         html += '<td>-</td>';
2839 20 Oct 14 olle 586         html += '<td class="dottedleft">' + autoProcessing + '</td>';
2839 20 Oct 14 olle 587         html += '<td>-</td>';
2839 20 Oct 14 olle 588         html += '</tr>';
2839 20 Oct 14 olle 589       }
2839 20 Oct 14 olle 590       html += '</tbody>';
2839 20 Oct 14 olle 591     }
2839 20 Oct 14 olle 592     else
2839 20 Oct 14 olle 593     {
2839 20 Oct 14 olle 594       // Sequencing Runs Header row
3026 11 Dec 14 nicklas 595       html += '<thead class="bg-filled-100">';
2839 20 Oct 14 olle 596       html += '<tr id="seqruns.name2">';
4116 20 Sep 16 nicklas 597       html += '<th id="seqruns-header2" colspan="2">Sequencing runs</th>';
4116 20 Sep 16 nicklas 598       html += '<td colspan="11" style="text-align: left;">' + rf.asNoInfo('No sequencing run information has been registered') + '</td>';
2839 20 Oct 14 olle 599       html += '</tr>';
2839 20 Oct 14 olle 600       html += '</thead>';
2839 20 Oct 14 olle 601     }
2839 20 Oct 14 olle 602
2839 20 Oct 14 olle 603     html += '</table>';
2839 20 Oct 14 olle 604     Doc.element('retractTable').innerHTML = html;
2839 20 Oct 14 olle 605
2839 20 Oct 14 olle 606     // Initialize biosource type radio buttons
4312 18 Jan 17 nicklas 607     
4312 18 Jan 17 nicklas 608     var useRetract = !patientInfo || patientInfo.name.indexOf('RetroNo') == -1;
2839 20 Oct 14 olle 609     if (useRetract)
2839 20 Oct 14 olle 610     {
2839 20 Oct 14 olle 611       // Use "Retract" for "PAT*" and "Retract*" biosources
2839 20 Oct 14 olle 612       rf.enableNewBiosourceTypeOption('newbiosourcetype.retract', true);
2839 20 Oct 14 olle 613       rf.enableNewBiosourceTypeOption('newbiosourcetype.retrono', false);
2839 20 Oct 14 olle 614     }
2839 20 Oct 14 olle 615     else
2839 20 Oct 14 olle 616     {
2839 20 Oct 14 olle 617       // Use "RetroNo" for "No*" and "Not asked*" biosources
2839 20 Oct 14 olle 618       rf.enableNewBiosourceTypeOption('newbiosourcetype.retract', false);
2839 20 Oct 14 olle 619       rf.enableNewBiosourceTypeOption('newbiosourcetype.retrono', true);
2839 20 Oct 14 olle 620     }
2839 20 Oct 14 olle 621
2839 20 Oct 14 olle 622     Wizard.setCurrentStep(2);
2839 20 Oct 14 olle 623
2839 20 Oct 14 olle 624     Doc.show('step-1');
2839 20 Oct 14 olle 625     Doc.show('gocancel');
2839 20 Oct 14 olle 626     Doc.show('goregister');
2839 20 Oct 14 olle 627     Doc.show('gocreate');
2839 20 Oct 14 olle 628   }
2839 20 Oct 14 olle 629
2839 20 Oct 14 olle 630
2839 20 Oct 14 olle 631   function htmlTableRowsForItems(
2839 20 Oct 14 olle 632     itemJsonArr,
2839 20 Oct 14 olle 633     itemType,
2839 20 Oct 14 olle 634     itemTypeVarName,
2839 20 Oct 14 olle 635     dateType,
2839 20 Oct 14 olle 636     otherDataType,
2839 20 Oct 14 olle 637     storageType,
2839 20 Oct 14 olle 638     setRetracted,
2839 20 Oct 14 olle 639     setAutoProcessingDisabled)
2839 20 Oct 14 olle 640   {
2839 20 Oct 14 olle 641     // Table item row
2839 20 Oct 14 olle 642     var html = '';
2839 20 Oct 14 olle 643     if (itemJsonArr && itemJsonArr.length > 0)
2839 20 Oct 14 olle 644     {
2839 20 Oct 14 olle 645       var truncateAt = TRUNCATE_SIZE[Math.min(itemJsonArr.length-1, TRUNCATE_SIZE.length)];
2839 20 Oct 14 olle 646       for (var i = 0; i < itemJsonArr.length; i++)
2839 20 Oct 14 olle 647       {
2839 20 Oct 14 olle 648         var item = itemJsonArr[i];
2839 20 Oct 14 olle 649         var flag = item.flag ? item.flag : '-';
2839 20 Oct 14 olle 650         var autoProcessing = item.autoProcessing ? item.autoProcessing : '-';
2839 20 Oct 14 olle 651         var itemDate = '-';
2839 20 Oct 14 olle 652         if (dateType)
2839 20 Oct 14 olle 653         {
2839 20 Oct 14 olle 654           if (dateType == 'Sampling')
2839 20 Oct 14 olle 655           {
2839 20 Oct 14 olle 656             itemDate = rf.warnIfMissing(rf.asDateTime(item.samplingDate));
2839 20 Oct 14 olle 657           }
2839 20 Oct 14 olle 658           else if (dateType == 'Partition')
2839 20 Oct 14 olle 659           {
2839 20 Oct 14 olle 660             itemDate = rf.warnIfMissing(rf.asDateTime(item.partitionDate));
2839 20 Oct 14 olle 661           }
2839 20 Oct 14 olle 662           else if (dateType == 'Lysis')
2839 20 Oct 14 olle 663           {
2839 20 Oct 14 olle 664             itemDate = rf.warnIfMissing(rf.asDateTime(item.lysisDate));
2839 20 Oct 14 olle 665           }
2839 20 Oct 14 olle 666         }
2839 20 Oct 14 olle 667         else
2839 20 Oct 14 olle 668         {
2839 20 Oct 14 olle 669           dateType = '-';
2839 20 Oct 14 olle 670         }
2839 20 Oct 14 olle 671         var otherDateName = '-';
2839 20 Oct 14 olle 672         var otherDateValue = '-';
2839 20 Oct 14 olle 673         var otherDataName = '-';
2839 20 Oct 14 olle 674         var otherDataValue = '-';
2839 20 Oct 14 olle 675         if (otherDataType)
2839 20 Oct 14 olle 676         {
2839 20 Oct 14 olle 677           if (otherDataType == 'PAD')
2839 20 Oct 14 olle 678           {
2839 20 Oct 14 olle 679             otherDataName = 'PAD';
2839 20 Oct 14 olle 680             otherDataValue = rf.warnIfMissing(item.pad);
2839 20 Oct 14 olle 681           }
2839 20 Oct 14 olle 682         }
2839 20 Oct 14 olle 683         var storageName = '-';
2839 20 Oct 14 olle 684         var storageId = '-';
2839 20 Oct 14 olle 685         var storagePosition = '-';
4116 20 Sep 16 nicklas 686         var storageCoordinate = '-';
2839 20 Oct 14 olle 687         if (storageType)
2839 20 Oct 14 olle 688         {
2839 20 Oct 14 olle 689           if (storageType == 'NA')
2839 20 Oct 14 olle 690           {
2839 20 Oct 14 olle 691             storageName = 'NA';
2839 20 Oct 14 olle 692             storageId = 'NA';
2839 20 Oct 14 olle 693             storagePosition = 'NA';
2839 20 Oct 14 olle 694           }
4110 15 Sep 16 nicklas 695           else if (item.bioWell)
2839 20 Oct 14 olle 696           {
2839 20 Oct 14 olle 697             storageName = storageType;
2839 20 Oct 14 olle 698             storageId = rf.asBioPlateName(item.bioWell);
4116 20 Sep 16 nicklas 699             storageCoordinate = item.bioWell ? item.bioWell.location : '-';
2839 20 Oct 14 olle 700             storagePosition = rf.asPureBioPlateLocation(item.bioWell);
2839 20 Oct 14 olle 701           }
2839 20 Oct 14 olle 702         }
2839 20 Oct 14 olle 703         html += '<tr>';
2839 20 Oct 14 olle 704         html += '<td>' + itemType + '</td>';
2839 20 Oct 14 olle 705         html += '<td>' + item.name + '</td>';
2839 20 Oct 14 olle 706         html += '<td class="dottedleft">' + dateType + '</td>';
2839 20 Oct 14 olle 707         html += '<td>' + itemDate + '</td>';
2839 20 Oct 14 olle 708         html += '<td class="dottedleft">' + otherDataName + '</td>';
2839 20 Oct 14 olle 709         html += '<td>' + otherDataValue + '</td>';
4116 20 Sep 16 nicklas 710         html += '<td class="dottedleft">' + storageId + '</td>';
4116 20 Sep 16 nicklas 711         html += '<td>' + storageCoordinate + '</td>';
2839 20 Oct 14 olle 712         html += '<td>' + storagePosition + '</td>';
2839 20 Oct 14 olle 713         html += '<td class="dottedleft">' + flag + '</td>';
2839 20 Oct 14 olle 714         if (setRetracted)
2839 20 Oct 14 olle 715         {
2839 20 Oct 14 olle 716           var checkboxName = itemTypeVarName + '.retracted.' + item.id;
2839 20 Oct 14 olle 717           //html += '<td><input type="checkbox" name="' + checkboxName + '" checked>Retracted ' + checkboxName + '</td>';
2839 20 Oct 14 olle 718           html += '<td><input type="checkbox" name="' + checkboxName + '" checked>Retracted</td>';
2839 20 Oct 14 olle 719         }
2839 20 Oct 14 olle 720         else
2839 20 Oct 14 olle 721         {
2839 20 Oct 14 olle 722           var checkboxName = itemTypeVarName + '.retracted.' + item.id;
2839 20 Oct 14 olle 723           //html += '<td>- ' + checkboxName + '</td>';
2839 20 Oct 14 olle 724           html += '<td>-</td>';
2839 20 Oct 14 olle 725         }
2839 20 Oct 14 olle 726         html += '<td class="dottedleft">' + autoProcessing + '</td>';
2839 20 Oct 14 olle 727         if (setAutoProcessingDisabled)
2839 20 Oct 14 olle 728         {
2839 20 Oct 14 olle 729           var checkboxName = itemTypeVarName + '.autoProcessingDisable.' + item.id;
2839 20 Oct 14 olle 730           //html += '<td><input type="checkbox" name="' + checkboxName + '" checked>Disable ' + checkboxName + '</td>';
2839 20 Oct 14 olle 731           html += '<td><input type="checkbox" name="' + checkboxName + '" checked>Disable</td>';
2839 20 Oct 14 olle 732         }
2839 20 Oct 14 olle 733         else
2839 20 Oct 14 olle 734         {
2839 20 Oct 14 olle 735           var checkboxName = itemTypeVarName + '.autoProcessingDisable.' + item.id;
2839 20 Oct 14 olle 736           //html += '<td>- ' + checkboxName + '</td>';
2839 20 Oct 14 olle 737           html += '<td>-</td>';
2839 20 Oct 14 olle 738         }
2839 20 Oct 14 olle 739         html += '</tr>';
2839 20 Oct 14 olle 740       }
2839 20 Oct 14 olle 741     }
2839 20 Oct 14 olle 742     return html;
2839 20 Oct 14 olle 743   }
2839 20 Oct 14 olle 744
2839 20 Oct 14 olle 745
2839 20 Oct 14 olle 746
2839 20 Oct 14 olle 747
2839 20 Oct 14 olle 748   function checkBoxValues(selectedSamples)
2839 20 Oct 14 olle 749   {
2839 20 Oct 14 olle 750     var inputs = document.getElementsByTagName("input");
2839 20 Oct 14 olle 751     var checkboxes = [];
2839 20 Oct 14 olle 752     for (var i = 0; i < inputs.length; i++)
2839 20 Oct 14 olle 753     {
2839 20 Oct 14 olle 754       if (inputs[i].type == "checkbox")
2839 20 Oct 14 olle 755       {
2839 20 Oct 14 olle 756         // Require that checkbox name contains a dot '.' to be included in list
2839 20 Oct 14 olle 757         if (inputs[i].name.indexOf(".") > -1)
2839 20 Oct 14 olle 758         {
2839 20 Oct 14 olle 759           checkboxes.push(inputs[i]);
2839 20 Oct 14 olle 760           if (inputs[i].checked)
2839 20 Oct 14 olle 761           {
2839 20 Oct 14 olle 762             selectedSamples.push(inputs[i].name);
2839 20 Oct 14 olle 763           }
2839 20 Oct 14 olle 764           else
2839 20 Oct 14 olle 765           {
2839 20 Oct 14 olle 766             selectedSamples.push(inputs[i].name + '_unchecked');
2839 20 Oct 14 olle 767           }
2839 20 Oct 14 olle 768         }
2839 20 Oct 14 olle 769       }
2839 20 Oct 14 olle 770     }
2839 20 Oct 14 olle 771     return selectedSamples;
2839 20 Oct 14 olle 772   }
2839 20 Oct 14 olle 773
2839 20 Oct 14 olle 774   rf.asCaseList = function(allCases, mainCase)
2839 20 Oct 14 olle 775   {
2839 20 Oct 14 olle 776     var html = '';
2839 20 Oct 14 olle 777     for (var i = 0; i < allCases.length; i++)
2839 20 Oct 14 olle 778     {
2839 20 Oct 14 olle 779       var cse = allCases[i];
2839 20 Oct 14 olle 780       if (html != '') html += ', ';
2839 20 Oct 14 olle 781       if (cse != mainCase)
2839 20 Oct 14 olle 782       {
2839 20 Oct 14 olle 783         //html += '<span class="link linked-case" data-case-name="'+cse+'" title="Show summary of case #'+cse+'">'+cse+'</span>';
2839 20 Oct 14 olle 784         html += cse;
2839 20 Oct 14 olle 785       }
2839 20 Oct 14 olle 786       else
2839 20 Oct 14 olle 787       {
2839 20 Oct 14 olle 788         html += '<b>' + cse + '</b>';
2839 20 Oct 14 olle 789       }
2839 20 Oct 14 olle 790     }
2839 20 Oct 14 olle 791     return allCases.length > 0 ? html : null;
2839 20 Oct 14 olle 792   }
2839 20 Oct 14 olle 793
2839 20 Oct 14 olle 794   
2839 20 Oct 14 olle 795   // Format value as a date
2839 20 Oct 14 olle 796   rf.asDate = function(value)
2839 20 Oct 14 olle 797   {
2839 20 Oct 14 olle 798     if (!value) return '';
2839 20 Oct 14 olle 799     if (value.length == 8)
2839 20 Oct 14 olle 800     {
2839 20 Oct 14 olle 801       value = value.substr(0, 4) + '-' + value.substr(4, 2) + '-' + value.substr(6, 2);
2839 20 Oct 14 olle 802     }
2839 20 Oct 14 olle 803     return value;
2839 20 Oct 14 olle 804   }
2839 20 Oct 14 olle 805
2839 20 Oct 14 olle 806   // Format as date+time value
2839 20 Oct 14 olle 807   rf.asDateTime = function(value, compareToDate)
2839 20 Oct 14 olle 808   {
2839 20 Oct 14 olle 809     if (!value) return '';
2839 20 Oct 14 olle 810     if (value.length == 8)
2839 20 Oct 14 olle 811     {
2839 20 Oct 14 olle 812       value = rf.asDate(value);
2839 20 Oct 14 olle 813     }
2839 20 Oct 14 olle 814     else if (value.length == 13)
2839 20 Oct 14 olle 815     {
2839 20 Oct 14 olle 816       // If the compareToDate is the same day as the 'value' date, skip the date and replace with white-space
2839 20 Oct 14 olle 817       if (compareToDate && value.substr(0, 8) == compareToDate.substr(0, 8))
2839 20 Oct 14 olle 818       {
2839 20 Oct 14 olle 819         value = '<span class="invisible">'+rf.asDate(value.substr(0, 8)) + '</span> ' + value.substr(9, 2) + ':'+value.substr(11, 2)
2839 20 Oct 14 olle 820       }
2839 20 Oct 14 olle 821       else
2839 20 Oct 14 olle 822       {
2839 20 Oct 14 olle 823         value = rf.asDate(value.substr(0, 8)) + ' ' + value.substr(9, 2) + ':'+value.substr(11, 2);
2839 20 Oct 14 olle 824       }
2839 20 Oct 14 olle 825     }
2839 20 Oct 14 olle 826     return value;
2839 20 Oct 14 olle 827   }
2839 20 Oct 14 olle 828
2839 20 Oct 14 olle 829   // Style the message as a warning message
2839 20 Oct 14 olle 830   rf.asWarning = function(message)
2839 20 Oct 14 olle 831   {
2839 20 Oct 14 olle 832     message = '<span class="warning">' + message + '</span>';
2839 20 Oct 14 olle 833     return message;
2839 20 Oct 14 olle 834   }
2839 20 Oct 14 olle 835
2839 20 Oct 14 olle 836   // Generate a 'Missing' warning if the value is missing
2839 20 Oct 14 olle 837   rf.warnIfMissing = function(value)
2839 20 Oct 14 olle 838   {
2839 20 Oct 14 olle 839     var message = value ? value : rf.asWarning('Missing');
2839 20 Oct 14 olle 840     return message;
2839 20 Oct 14 olle 841   }
2839 20 Oct 14 olle 842   
2839 20 Oct 14 olle 843   // Style the message as a 'no information' message
2839 20 Oct 14 olle 844   rf.asNoInfo = function(message)
2839 20 Oct 14 olle 845   {
2839 20 Oct 14 olle 846     message = '<span class="no-info">' + message + '</span>';
2839 20 Oct 14 olle 847     return message;
2839 20 Oct 14 olle 848   }
2839 20 Oct 14 olle 849   
2839 20 Oct 14 olle 850   rf.asConsentAnyDate = function(consent)
2839 20 Oct 14 olle 851   {
2839 20 Oct 14 olle 852     var warn = !consent;
2839 20 Oct 14 olle 853     var message;
2839 20 Oct 14 olle 854     if (!consent)
2839 20 Oct 14 olle 855     {
2839 20 Oct 14 olle 856       message = 'Missing';
2839 20 Oct 14 olle 857     }
2839 20 Oct 14 olle 858     else
2839 20 Oct 14 olle 859     {
2839 20 Oct 14 olle 860       message = consent;
2839 20 Oct 14 olle 861       
2839 20 Oct 14 olle 862     }
2839 20 Oct 14 olle 863     return warn ? rf.asWarning(message) : message;
2839 20 Oct 14 olle 864   }
2839 20 Oct 14 olle 865   
2839 20 Oct 14 olle 866   // A biowell as plate name
2839 20 Oct 14 olle 867   rf.asBioPlateName = function(well)
2839 20 Oct 14 olle 868   {
2839 20 Oct 14 olle 869     if (!well) return '';
2839 20 Oct 14 olle 870     var plate = well.bioPlate;
2839 20 Oct 14 olle 871     if (!plate) return '';
2839 20 Oct 14 olle 872     var text = plate.name;
2839 20 Oct 14 olle 873     return text;
2839 20 Oct 14 olle 874   }
2839 20 Oct 14 olle 875
2839 20 Oct 14 olle 876   // A biowell as the location
2839 20 Oct 14 olle 877   rf.asPureBioPlateLocation = function(well)
2839 20 Oct 14 olle 878   {
2839 20 Oct 14 olle 879     if (!well) return '';
2839 20 Oct 14 olle 880     var plate = well.bioPlate;
4116 20 Sep 16 nicklas 881     var text = '';
2839 20 Oct 14 olle 882     if (plate.storage)
2839 20 Oct 14 olle 883     {
2839 20 Oct 14 olle 884       var storage = plate.storage;
2839 20 Oct 14 olle 885       var tmp = [];
2839 20 Oct 14 olle 886       if (storage.name) tmp[tmp.length] = storage.name;
2839 20 Oct 14 olle 887       if (storage.section) tmp[tmp.length] = 'section: ' +storage.section;
2839 20 Oct 14 olle 888       if (storage.tray) tmp[tmp.length] = 'tray: ' +storage.tray;
2839 20 Oct 14 olle 889       if (storage.position) tmp[tmp.length] = 'position: ' +storage.position;
2839 20 Oct 14 olle 890
2839 20 Oct 14 olle 891       //text = '<span class="more-info" title="' + tmp.join('; ')+'">' + text + ' </span>';
2839 20 Oct 14 olle 892       text = text + ' ' + tmp.join('; ');
2839 20 Oct 14 olle 893     }
2839 20 Oct 14 olle 894     return text;
2839 20 Oct 14 olle 895   }
2839 20 Oct 14 olle 896
2839 20 Oct 14 olle 897   rf.truncate = function(value, maxLength)
2839 20 Oct 14 olle 898   {
2839 20 Oct 14 olle 899     if (!value) return value;
2839 20 Oct 14 olle 900     if (maxLength > 2 && value.length > maxLength) 
2839 20 Oct 14 olle 901     {
2839 20 Oct 14 olle 902       var tmp = '<span class="truncated" title="'+value+'">'+value.substring(0, maxLength-2) + '...</span>';
2839 20 Oct 14 olle 903       value = tmp;
2839 20 Oct 14 olle 904     }
2839 20 Oct 14 olle 905     return value;
2839 20 Oct 14 olle 906   }
2839 20 Oct 14 olle 907
2839 20 Oct 14 olle 908   rf.goPrint = function()
2839 20 Oct 14 olle 909   {
2839 20 Oct 14 olle 910     var caseName = Data.get('page-data', 'case-name');
2839 20 Oct 14 olle 911     var printNote = '<b>Note!</b> For better printing set page orientation to <i>portrait</i>.<br>';
2839 20 Oct 14 olle 912     printNote += ' You may have to <i>scale down</i> to fit everything on the width of the page.';
2839 20 Oct 14 olle 913     Reggie.openPrintWindow('all-content', 'Case summary - ' + Strings.encodeTags(caseName), 'portrait', printNote, '../', 'case_summary.css');
2839 20 Oct 14 olle 914   }
2839 20 Oct 14 olle 915
2839 20 Oct 14 olle 916   rf.submit = function()
2839 20 Oct 14 olle 917   {
2839 20 Oct 14 olle 918     var frm = document.forms['reggie'];
2839 20 Oct 14 olle 919
2839 20 Oct 14 olle 920     var retractionInfo = {};
2839 20 Oct 14 olle 921     retractionInfo.caseName = frm.caseName.value;
2839 20 Oct 14 olle 922     var selectedSamples = [];
2839 20 Oct 14 olle 923     // Other sample items
2839 20 Oct 14 olle 924     selectedSamples = checkBoxValues(selectedSamples);
2839 20 Oct 14 olle 925     retractionInfo.selectedSamples = selectedSamples;
2839 20 Oct 14 olle 926
2839 20 Oct 14 olle 927     // Force reset when unchecked flag
2839 20 Oct 14 olle 928     var forceResetWhenUnchecked = false;
2839 20 Oct 14 olle 929     var forceResetWhenUncheckedCB = document.getElementById("forceResetWhenUnchecked");
2839 20 Oct 14 olle 930     if (forceResetWhenUncheckedCB.checked)
2839 20 Oct 14 olle 931     {
2839 20 Oct 14 olle 932       forceResetWhenUnchecked = true;
2839 20 Oct 14 olle 933     }
2839 20 Oct 14 olle 934     retractionInfo.forceResetWhenUnchecked = forceResetWhenUnchecked;
2839 20 Oct 14 olle 935
2839 20 Oct 14 olle 936     retractionInfo.bioSourceType = Forms.getCheckedRadio(frm.newbiosourcetype).value;
2839 20 Oct 14 olle 937
2839 20 Oct 14 olle 938     var submitInfo = {};
2839 20 Oct 14 olle 939     submitInfo.retractionInfo = retractionInfo;
2839 20 Oct 14 olle 940     
3323 11 May 15 nicklas 941     var url = '../Retraction.servlet?ID=' + App.getSessionId();
2839 20 Oct 14 olle 942     url += '&cmd=RegisterRetraction';
2839 20 Oct 14 olle 943
2839 20 Oct 14 olle 944     Wizard.showLoadingAnimation('Performing registration...');
2839 20 Oct 14 olle 945     Wizard.asyncJsonRequest(url, rf.submissionResults, 'POST', JSON.stringify(submitInfo));
2839 20 Oct 14 olle 946   }
2839 20 Oct 14 olle 947
2839 20 Oct 14 olle 948   
2839 20 Oct 14 olle 949   rf.submissionResults = function(response)
2839 20 Oct 14 olle 950   {
2839 20 Oct 14 olle 951     Wizard.showFinalMessage(response.messages);
2839 20 Oct 14 olle 952     Doc.show('gorestart');
2839 20 Oct 14 olle 953   }
2839 20 Oct 14 olle 954
2839 20 Oct 14 olle 955
2839 20 Oct 14 olle 956   rf.createProtocol = function()
2839 20 Oct 14 olle 957   {
2839 20 Oct 14 olle 958     var frm = document.forms['reggie'];
5638 03 Oct 19 nicklas 959     
5638 03 Oct 19 nicklas 960     var url = 'retraction_protocol2.jsp?ID='+App.getSessionId();
5641 04 Oct 19 nicklas 961     url += '&caseName='+encodeURIComponent(frm.caseName.value);
5638 03 Oct 19 nicklas 962
5638 03 Oct 19 nicklas 963     window.open(url);
2839 20 Oct 14 olle 964   }
2839 20 Oct 14 olle 965
2839 20 Oct 14 olle 966
2839 20 Oct 14 olle 967   rf.enableNewBiosourceTypeOption = function(option, checkIt)
2839 20 Oct 14 olle 968   {
2839 20 Oct 14 olle 969     option = Doc.element(option); // The radio button
2839 20 Oct 14 olle 970     option.disabled = false;
2839 20 Oct 14 olle 971     if (checkIt) option.checked = true;
2839 20 Oct 14 olle 972     
2839 20 Oct 14 olle 973     var label = Doc.element(option.id + '.label'); // The label
2839 20 Oct 14 olle 974     Doc.removeClass(label, 'disabled');
2839 20 Oct 14 olle 975   }
2839 20 Oct 14 olle 976
2839 20 Oct 14 olle 977
2839 20 Oct 14 olle 978   return rf;
2839 20 Oct 14 olle 979 }();
2839 20 Oct 14 olle 980
2839 20 Oct 14 olle 981 Doc.onLoad(RetractionForm.initPage);
2839 20 Oct 14 olle 982