extensions/net.sf.basedb.meludi/trunk/resources/reports/case_summary_alt_rec.js

Code
Comments
Other
Rev Date Author Line
4788 02 May 18 olle 1 var CaseSummaryAltRec = function()
4788 02 May 18 olle 2 {
4788 02 May 18 olle 3   var cs = {};
4788 02 May 18 olle 4   var debug = 0;
4788 02 May 18 olle 5   var sampleItemPrefix = '';
4788 02 May 18 olle 6   var sampleItemNumDigits = 5;
5031 16 Oct 18 olle 7   var sampleItemNameLength = 9;
4788 02 May 18 olle 8   var TRUNCATE_SIZE = [-1, 30, 20, 15];
5031 16 Oct 18 olle 9   var defaultColClass = null;
5092 14 Nov 18 olle 10   var chainedItems = [];
4788 02 May 18 olle 11   var wizard_sub_name = ' (rec)'
4788 02 May 18 olle 12
4788 02 May 18 olle 13   cs.initPage = function()
4788 02 May 18 olle 14   {
4788 02 May 18 olle 15 //alert("case_summary_alt_rec::initPage(): Start");
4788 02 May 18 olle 16     Events.addEventHandler('showConfidential', 'change', cs.showConfidentialOnChange);
4788 02 May 18 olle 17     Events.doOnEnter('caseName_alt_rec', cs.caseSummary);
5395 02 May 19 olle 18     Buttons.addClickHandler('btnCaseSummary', cs.caseSummary);
4788 02 May 18 olle 19     Buttons.addClickHandler('printButton', cs.goPrint);
4788 02 May 18 olle 20     Buttons.addClickHandler('close', App.closeWindow);
4788 02 May 18 olle 21     
4788 02 May 18 olle 22     var caseName = Data.get('page-data', 'case-name');
4788 02 May 18 olle 23 //alert("case_summary_alt_rec::initPage(): caseName = " + caseName);
4788 02 May 18 olle 24     var isAdmin = Data.int('page-data', 'admin');
4788 02 May 18 olle 25     var isPatientCurator = Data.int('page-data', 'patient-curator');
4788 02 May 18 olle 26
4788 02 May 18 olle 27     var url = '../CaseSummary.servlet?ID='+App.getSessionId();
4788 02 May 18 olle 28     url += '&cmd=GetCaseInfo';
4788 02 May 18 olle 29     url += '&caseName='+encodeURIComponent(caseName);
4788 02 May 18 olle 30     Wizard.showLoadingAnimation('Loading information about case: ' + Strings.encodeTags(caseName));
4788 02 May 18 olle 31     Wizard.asyncJsonRequest(url, cs.caseInfoLoaded);
4788 02 May 18 olle 32   }
4788 02 May 18 olle 33   
4788 02 May 18 olle 34   cs.caseInfoLoaded = function(response)
4788 02 May 18 olle 35   {
4788 02 May 18 olle 36     Doc.show('all-info');
4788 02 May 18 olle 37     
5092 14 Nov 18 olle 38     var maxItemsInLeftCol = 1;
5092 14 Nov 18 olle 39     var maxItemsInRightCol = 1;
5092 14 Nov 18 olle 40
4788 02 May 18 olle 41     var caseName = Data.get('page-data', 'case-name');
4788 02 May 18 olle 42     var caseInfo = response.caseInfo;
4788 02 May 18 olle 43     var site = response.site;
4788 02 May 18 olle 44     var patient = response.patient;
4788 02 May 18 olle 45 //alert("case_summary_alt_rec::caseInfoLoaded(): caseName = " + caseName + " caseInfo = " + JSON.stringify(caseInfo) + " site = " + JSON.stringify(site) + " patient = " + JSON.stringify(patient));
4788 02 May 18 olle 46     cs.initSections(response.sections);
4788 02 May 18 olle 47     var consentOk = true;
4788 02 May 18 olle 48     sampleItemPrefix = response.sampleItemPrefix;
4788 02 May 18 olle 49     sampleItemNumDigits = response.sampleItemNumDigits;
5031 16 Oct 18 olle 50     sampleItemNameLength = sampleItemPrefix.length + sampleItemNumDigits + 2;
4830 04 Jun 18 olle 51     if (Doc.element('caseName') != null)
4830 04 Jun 18 olle 52     {
4830 04 Jun 18 olle 53       Doc.element('caseName').setAttribute('title', 'Please enter a case id ("' + sampleItemPrefix + '" + ' + sampleItemNumDigits + ' digits)');
4830 04 Jun 18 olle 54     }
4788 02 May 18 olle 55     var projInfo = response.projInfo;
4788 02 May 18 olle 56 //alert("case_summary_alt_rec::caseInfoLoaded(): projInfo = " + JSON.stringify(projInfo));
4788 02 May 18 olle 57
4788 02 May 18 olle 58     if (projInfo)
4788 02 May 18 olle 59     {
4788 02 May 18 olle 60       cs.addColumn('project.name', cs.asLink('PROJECT', projInfo));
4788 02 May 18 olle 61       cs.addColumn('project.description', Strings.encodeTags(projInfo.description));
4788 02 May 18 olle 62     }
4788 02 May 18 olle 63     else
4788 02 May 18 olle 64     {
4788 02 May 18 olle 65       cs.addColumn('project.name', cs.asNoInfo('No project information has been registered'));
4788 02 May 18 olle 66       Doc.hide('project-details');
4788 02 May 18 olle 67     }
4788 02 May 18 olle 68
4788 02 May 18 olle 69     if (caseInfo)
4788 02 May 18 olle 70     {
4788 02 May 18 olle 71       // Use returned case name, as it may have been found from personal number
4788 02 May 18 olle 72       if (!patient || patient.allCases.indexOf(caseName) == -1)
4788 02 May 18 olle 73       {
4788 02 May 18 olle 74         caseName = caseInfo.name;
4788 02 May 18 olle 75         Data.set('page-data', 'case-name', caseName);
4788 02 May 18 olle 76         // Update header text to use the potentially changed case name
4788 02 May 18 olle 77         if (Doc.element('path-case-summary'))
4788 02 May 18 olle 78         {
4788 02 May 18 olle 79           Doc.element('path-case-summary').innerHTML = 'Case summary' + wizard_sub_name + ' - ' + Strings.encodeTags(caseName);
4788 02 May 18 olle 80         }
4788 02 May 18 olle 81       }
4788 02 May 18 olle 82
5013 08 Oct 18 olle 83 //alert("case_summary_alt_rec.js::caseInfoLoaded(): caseInfo.diagnosisConfirmed = " + caseInfo.diagnosisConfirmed);
4788 02 May 18 olle 84       consentOk = !caseInfo.consent || caseInfo.consent == 'Yes';
4788 02 May 18 olle 85       cs.addColumn('case.name', cs.asLink('SAMPLE', caseInfo));
4788 02 May 18 olle 86       cs.addColumn('case.registrationDate', cs.asDate(caseInfo.registrationDate));
4788 02 May 18 olle 87       cs.addColumn('case.tubeContentType', Strings.encodeTags(caseInfo.tubeContentType));
4788 02 May 18 olle 88       cs.addColumn('case.mutationAnalysis', Strings.encodeTags(caseInfo.mutationAnalysis));
4788 02 May 18 olle 89       cs.addColumn('case.site', site ? site.name : null);
4788 02 May 18 olle 90       cs.addColumn('case.consent', cs.asConsent(caseInfo.consent, cs.asDate(caseInfo.consentDate)));
4879 27 Jun 18 olle 91       cs.addColumn('case.diagnosisConfirmed', caseInfo.diagnosisConfirmed);
4841 08 Jun 18 olle 92       cs.addColumn('case.referralId', Strings.encodeTags(caseInfo.referralId));
4788 02 May 18 olle 93       cs.addColumn('case.projectFocus', Strings.encodeTags(caseInfo.projectFocus));
4788 02 May 18 olle 94       cs.addColumn('case.metastasisSite', Strings.encodeTags(caseInfo.metastasisSite));
5259 22 Jan 19 olle 95       cs.addColumn('case.ffpeBlockOrderDate', cs.asDate(caseInfo.ffpeBlockOrderDate));
4788 02 May 18 olle 96       cs.addColumn('case.nofTubes', caseInfo.nofTubes);
4788 02 May 18 olle 97       cs.addColumn('case.otherPathNote', Strings.encodeTags(caseInfo.otherPathNote));
4788 02 May 18 olle 98       cs.addColumn('case.description', Strings.encodeTags(caseInfo.description));
4788 02 May 18 olle 99     }
4788 02 May 18 olle 100     else
4788 02 May 18 olle 101     {
4788 02 May 18 olle 102       cs.addColumn('case.name', cs.asNoInfo('No case information has been registered'));
4788 02 May 18 olle 103       Doc.hide('case-details');
4788 02 May 18 olle 104     }
4788 02 May 18 olle 105
4788 02 May 18 olle 106     if (patient)
4788 02 May 18 olle 107     {
4788 02 May 18 olle 108       if (consentOk)
4788 02 May 18 olle 109       {
4788 02 May 18 olle 110         try
4788 02 May 18 olle 111         {
4788 02 May 18 olle 112           cs.addColumn('patient.name', cs.asLink('BIOSOURCE', patient));
4788 02 May 18 olle 113           cs.addColumn('patient.registrationDate', cs.asDate(patient.registrationDate));
4788 02 May 18 olle 114           cs.addColumn('patient.personalNumber', cs.warnIfMissing(Strings.encodeTags(patient.personalNumber)));
4788 02 May 18 olle 115           cs.addColumn('patient.allFirstNames', cs.warnIfMissing(Strings.encodeTags(patient.allFirstNames)));
4788 02 May 18 olle 116           cs.addColumn('patient.familyName', cs.warnIfMissing(Strings.encodeTags(patient.familyName)));
4788 02 May 18 olle 117           cs.addColumn('patient.gender', Strings.encodeTags(patient.gender));
4788 02 May 18 olle 118           cs.addColumn('patient.allCases', cs.asCaseList(patient.allCases, caseName));
4788 02 May 18 olle 119         }
4788 02 May 18 olle 120         catch (e)
4788 02 May 18 olle 121         {
4788 02 May 18 olle 122           cs.logError('patient-info', e);
4788 02 May 18 olle 123         }
4788 02 May 18 olle 124       }
4788 02 May 18 olle 125       else
4788 02 May 18 olle 126       {
4788 02 May 18 olle 127         Doc.hide('patient-info');
4788 02 May 18 olle 128       }
4788 02 May 18 olle 129     }
4788 02 May 18 olle 130     else
4788 02 May 18 olle 131     {
4788 02 May 18 olle 132       cs.addColumn('patient.name', cs.asNoInfo('No patient information has been registered'));
4788 02 May 18 olle 133       Doc.hide('patient-details');
4788 02 May 18 olle 134     }
4788 02 May 18 olle 135
5044 19 Oct 18 olle 136     var yellowPrefixes = {};
4796 08 May 18 olle 137     var blood = consentOk ? response.blood : null;
4796 08 May 18 olle 138     if (blood && blood.length > 0)
4796 08 May 18 olle 139     {
4796 08 May 18 olle 140       for (var i = 0; i < blood.length; i++)
4796 08 May 18 olle 141       {
4796 08 May 18 olle 142         try
4796 08 May 18 olle 143         {
4796 08 May 18 olle 144           var b = blood[i];
4796 08 May 18 olle 145           cs.addColumn('blood.name', cs.asLink('SAMPLE', b));
4986 28 Sep 18 olle 146           cs.addColumn('blood.tubeLabel', Strings.encodeTags(b.tubeLabel));
4796 08 May 18 olle 147           cs.addColumn('blood.registrationDate', cs.asDate(b.registrationDate));
4796 08 May 18 olle 148           cs.addColumn('blood.consent', cs.asConsent(b.consent, cs.asDate(b.consentDate)));
4796 08 May 18 olle 149           cs.addColumn('blood.bloodSample', Strings.encodeTags(b.bloodSample));
4796 08 May 18 olle 150           cs.addColumn('blood.samplingDate', cs.warnIfMissing(cs.asDateTime(b.samplingDate)));
5027 15 Oct 18 olle 151           cs.addColumn('blood.arrivalDate', cs.warnIfMissing(cs.asDateTime(b.arrivalDate)));
5027 15 Oct 18 olle 152           //cs.addColumn('blood.freezerDate', cs.warnIfMissing(cs.asDateTime(b.freezerDate, b.samplingDate)));
5027 15 Oct 18 olle 153           cs.addColumn('blood.freezerDate', cs.asDateTime(b.freezerDate));
4831 05 Jun 18 olle 154           cs.addColumn('blood.storageBox', cs.asBioPlateLocation(b.bioWell));
4796 08 May 18 olle 155           cs.addColumn('blood.serum', Strings.encodeTags(b.serum));
5034 17 Oct 18 olle 156           cs.addColumn('blood.arrivalOperator', Strings.encodeTags(b.arrivalOperator));
4796 08 May 18 olle 157           cs.addColumn('blood.comment', Strings.encodeTags(b.comment));
4796 08 May 18 olle 158         }
4796 08 May 18 olle 159         catch (e)
4796 08 May 18 olle 160         {
4796 08 May 18 olle 161           cs.logError('blood-info', e);
4796 08 May 18 olle 162         }
4796 08 May 18 olle 163       }
4796 08 May 18 olle 164     }
4796 08 May 18 olle 165     else
4796 08 May 18 olle 166     {
4796 08 May 18 olle 167       if (consentOk)
4796 08 May 18 olle 168       {
4796 08 May 18 olle 169         cs.addColumn('blood.name', cs.asNoInfo('No blood information has been registered'));
4796 08 May 18 olle 170         Doc.hide('blood-details');
4796 08 May 18 olle 171       }
4796 08 May 18 olle 172       else
4796 08 May 18 olle 173       {
4796 08 May 18 olle 174         Doc.hide('blood-info');
4796 08 May 18 olle 175       }
4796 08 May 18 olle 176     }
4796 08 May 18 olle 177
4796 08 May 18 olle 178     // Blood DNA
4796 08 May 18 olle 179     var bdna = consentOk ? response.bdna : null;
4796 08 May 18 olle 180     if (bdna && bdna.length > 0)
4796 08 May 18 olle 181     {
4796 08 May 18 olle 182       var truncateAt = TRUNCATE_SIZE[Math.min(bdna.length-1, TRUNCATE_SIZE.length)];
4796 08 May 18 olle 183       for (var i = 0; i < bdna.length; i++)
4796 08 May 18 olle 184       {
4796 08 May 18 olle 185         try
4796 08 May 18 olle 186         {
4796 08 May 18 olle 187           var d = bdna[i];
4796 08 May 18 olle 188           cs.addColumn('bdna.name', cs.asLink('EXTRACT', d));
4796 08 May 18 olle 189           cs.addColumn('bdna.registrationDate', cs.asDate(d.registrationDate));
4796 08 May 18 olle 190           cs.addColumn('bdna.storageBox', cs.asBioPlateLocation(d.bioWell));
4796 08 May 18 olle 191           cs.addColumn('bdna.remainingQuantity', cs.asQuantity(d.remainingQuantity, ' Âµg'));
4796 08 May 18 olle 192           cs.addColumn('bdna.originalQuantity', cs.asQuantity(d.originalQuantity, ' Âµg'));
4796 08 May 18 olle 193           cs.addColumn('bdna.ndConc', cs.asQuantity(d.ndConc, ' ng/µl'));
4796 08 May 18 olle 194           cs.addColumn('bdna.comment', cs.truncate(d.comment, truncateAt));
4796 08 May 18 olle 195         }
4796 08 May 18 olle 196         catch (e)
4796 08 May 18 olle 197         {
4796 08 May 18 olle 198           cs.logError('bdna-info', e);
4796 08 May 18 olle 199         }
4796 08 May 18 olle 200       }
4796 08 May 18 olle 201     }
4796 08 May 18 olle 202     else
4796 08 May 18 olle 203     {
4796 08 May 18 olle 204       if (consentOk)
4796 08 May 18 olle 205       {
4796 08 May 18 olle 206         cs.addColumn('bdna.name', cs.asNoInfo('No Blood DNA information has been registered'));
4796 08 May 18 olle 207         Doc.hide('bdna-details');
4796 08 May 18 olle 208       }
4796 08 May 18 olle 209       else
4796 08 May 18 olle 210       {
4796 08 May 18 olle 211         Doc.hide('bdna-info');
4796 08 May 18 olle 212       }
4796 08 May 18 olle 213     }
4796 08 May 18 olle 214     
4912 13 Jul 18 olle 215     var ffpeblock = consentOk ? response.ffpeblock : null;
4912 13 Jul 18 olle 216     if (ffpeblock && ffpeblock.length > 0)
4912 13 Jul 18 olle 217     {
4912 13 Jul 18 olle 218       for (var i = 0; i < ffpeblock.length; i++)
4912 13 Jul 18 olle 219       {
4912 13 Jul 18 olle 220         try
4912 13 Jul 18 olle 221         {
4912 13 Jul 18 olle 222           var b = ffpeblock[i];
5031 16 Oct 18 olle 223           defaultColClass = b.YellowLabel != null ? 'yellow-specimen' : null;
5031 16 Oct 18 olle 224           yellowPrefixes[b.name] = defaultColClass;
5092 14 Nov 18 olle 225           //cs.addColumn('ffpeblock.name', cs.asLink('SAMPLE', b));
5092 14 Nov 18 olle 226           cs.addColumn('ffpeblock.name', cs.asLink('SAMPLE', b, 0, true));
4912 13 Jul 18 olle 227           cs.addColumn('ffpeblock.registrationDate', cs.asDate(b.registrationDate));
4912 13 Jul 18 olle 228           cs.addColumn('ffpeblock.consent', cs.asConsent(b.consent, cs.asDate(b.consentDate)));
4912 13 Jul 18 olle 229           cs.addColumn('ffpeblock.pad', cs.warnIfMissing(Strings.encodeTags(b.pad)));
5074 06 Nov 18 olle 230           cs.addColumn('ffpeblock.materialNumber', cs.warnIfMissing(Strings.encodeTags(b.materialNumber)));
5160 30 Nov 18 olle 231           cs.addColumn('ffpeblock.localisation', Strings.encodeTags(b.localisation));
5044 19 Oct 18 olle 232           //cs.addColumn('ffpeblock.samplingDate', cs.warnIfMissing(cs.asDateTime(b.samplingDate)));
5044 19 Oct 18 olle 233           cs.addColumn('ffpeblock.arrivalDate', cs.warnIfMissing(cs.asDateTime(b.arrivalDate)));
5135 22 Nov 18 olle 234           cs.addColumn('ffpeblock.returnedDate', cs.warnIfMissing(cs.asDateTime(b.returnedDate)));
5044 19 Oct 18 olle 235           cs.addColumn('ffpeblock.operatorDeliveryComment', Strings.encodeTags(b.operatorDeliveryComment));
5044 19 Oct 18 olle 236           //cs.addColumn('ffpeblock.otherPathNote', Strings.encodeTags(b.otherPathNote));
4912 13 Jul 18 olle 237         }
4912 13 Jul 18 olle 238         catch (e)
4912 13 Jul 18 olle 239         {
4912 13 Jul 18 olle 240           cs.logError('ffpeblock-info', e);
4912 13 Jul 18 olle 241         }
4912 13 Jul 18 olle 242       }
4912 13 Jul 18 olle 243     }
4912 13 Jul 18 olle 244     else
4912 13 Jul 18 olle 245     {
4912 13 Jul 18 olle 246       if (consentOk)
4912 13 Jul 18 olle 247       {
4912 13 Jul 18 olle 248         cs.addColumn('ffpeblock.name', cs.asNoInfo('No FFPE block information has been registered'));
4912 13 Jul 18 olle 249         Doc.hide('ffpeblock-details');
4912 13 Jul 18 olle 250       }
4912 13 Jul 18 olle 251       else
4912 13 Jul 18 olle 252       {
4912 13 Jul 18 olle 253         Doc.hide('ffpeblock-info');
4912 13 Jul 18 olle 254       }
4912 13 Jul 18 olle 255     }
4912 13 Jul 18 olle 256
4788 02 May 18 olle 257     var specimen = response.specimen;
4788 02 May 18 olle 258 //alert("case_summary_alt_rec::caseInfoLoaded(): specimen = " + JSON.stringify(specimen));
4788 02 May 18 olle 259     var numSpecimen = 0;
4788 02 May 18 olle 260     if (specimen && specimen.length > 0)
4788 02 May 18 olle 261     {
4788 02 May 18 olle 262       var truncateAt = TRUNCATE_SIZE[Math.min(specimen.length-1, TRUNCATE_SIZE.length)];
4788 02 May 18 olle 263       for (var i = 0; i < specimen.length; i++)
4788 02 May 18 olle 264       {
4788 02 May 18 olle 265         var s = specimen[i];
5031 16 Oct 18 olle 266         defaultColClass = s.YellowLabel != null ? 'yellow-specimen' : null;
5031 16 Oct 18 olle 267         yellowPrefixes[s.name] = defaultColClass;
5092 14 Nov 18 olle 268         //cs.addColumn('specimen.name', cs.asLink('SAMPLE', s));
5092 14 Nov 18 olle 269         cs.addColumn('specimen.name', cs.asLink('SAMPLE', s, 0, true));
4788 02 May 18 olle 270         cs.addColumn('specimen.registrationDate', cs.asDate(s.registrationDate));
4788 02 May 18 olle 271         cs.addColumn('specimen.specimenType', Strings.encodeTags(s.specimenType));
4788 02 May 18 olle 272         cs.addColumn('specimen.specimenInputType', Strings.encodeTags(s.specimenInputType));
4788 02 May 18 olle 273         cs.addColumn('specimen.storageBox', cs.asBioPlateLocation(s.bioWell));
4788 02 May 18 olle 274         cs.addColumn('specimen.samplingDate', cs.warnIfMissing(cs.asDateTime(s.samplingDate)));
4788 02 May 18 olle 275         cs.addColumn('specimen.viableTumourCellsPercent', s.viableTumourCellsPercent);
4788 02 May 18 olle 276         cs.addColumn('specimen.plNumber', cs.warnIfMissing(Strings.encodeTags(s.plNumber)));
4788 02 May 18 olle 277         cs.addColumn('specimen.pad', cs.warnIfMissing(Strings.encodeTags(s.pad)));
4788 02 May 18 olle 278 /*
4788 02 May 18 olle 279         cs.addColumn('specimen.remainingQuantity', cs.asQuantity(s.remainingQuantity, ' mg', 1000));
4788 02 May 18 olle 280         cs.addColumn('specimen.originalQuantity', cs.asQuantity(s.originalQuantity, ' mg', 1000));
4788 02 May 18 olle 281 */
4788 02 May 18 olle 282         cs.addColumn('specimen.nofSections', s.nofSections);
4788 02 May 18 olle 283         cs.addColumn('specimen.operatorDeliveryComment', cs.truncate(s.operatorDeliveryComment, truncateAt));
4788 02 May 18 olle 284         cs.addColumn('specimen.description', cs.truncate(s.description, truncateAt));
4788 02 May 18 olle 285 /*
4788 02 May 18 olle 286         cs.addColumn('specimen.startPlate', cs.asLink('BIOPLATE', s.startPlate));
4788 02 May 18 olle 287 */
4788 02 May 18 olle 288         cs.addColumn('specimen.startList', cs.asLink('ITEMLIST', s.startList));
4788 02 May 18 olle 289         numSpecimen++;
4788 02 May 18 olle 290       }
4788 02 May 18 olle 291     }
4788 02 May 18 olle 292     if (numSpecimen == 0)
4788 02 May 18 olle 293     {
4788 02 May 18 olle 294       cs.addColumn('specimen.name', cs.asNoInfo('No specimen information has been registered'));
4788 02 May 18 olle 295       Doc.hide('specimen-details');
4788 02 May 18 olle 296     }
4788 02 May 18 olle 297
5093 14 Nov 18 olle 298     var histology = response.histology;
5093 14 Nov 18 olle 299     if (histology && histology.length > 0)
5093 14 Nov 18 olle 300     {
5093 14 Nov 18 olle 301       var truncateAt = TRUNCATE_SIZE[Math.min(histology.length-1, TRUNCATE_SIZE.length)];
5093 14 Nov 18 olle 302       maxItemsInLeftCol = Math.max(maxItemsInLeftCol, histology.length);
5093 14 Nov 18 olle 303       for (var i = 0; i < histology.length; i++)
5093 14 Nov 18 olle 304       {
5093 14 Nov 18 olle 305         try
5093 14 Nov 18 olle 306         {
5093 14 Nov 18 olle 307           var h = histology[i];
5093 14 Nov 18 olle 308           defaultColClass = cs.getDefaultColClass(h, yellowPrefixes);
5093 14 Nov 18 olle 309           cs.addColumn('histology.name', cs.asLink('SAMPLE', h, 0, true));
5093 14 Nov 18 olle 310           //cs.addColumn('histology.donotuse', cs.asDoNotUse(h));
5093 14 Nov 18 olle 311           cs.addColumn('histology.registrationDate', cs.asDate(h.registrationDate));
5093 14 Nov 18 olle 312           cs.addColumn('histology.partitionDate', cs.asDate(h.partitionDate));
5093 14 Nov 18 olle 313           cs.addColumn('histology.usedQuantity', cs.asQuantity(h.originalQuantity, ' mg', 1000));
5093 14 Nov 18 olle 314   
5093 14 Nov 18 olle 315           var embedded = h.embedDate ? true : false;
5093 14 Nov 18 olle 316           cs.addColumn('histology.embedded', embedded ? cs.asDate(h.embedDate) : 'No');
5093 14 Nov 18 olle 317           cs.addColumn('histology.embedProtocol', embedded ? cs.asLink('PROTOCOL', h.embedProtocol, truncateAt) : null);
5093 14 Nov 18 olle 318           cs.addColumn('histology.paraffinBlock', embedded ? cs.asBioPlateLocation(h.bioWell) : null);
5093 14 Nov 18 olle 319           cs.addColumn('histology.storageBox', embedded ? null : cs.asBioPlateLocation(h.bioWell));
5115 20 Nov 18 olle 320
5115 20 Nov 18 olle 321           // SCAN-B-rec start  
5115 20 Nov 18 olle 322           var fStain = h.FStain;            
5115 20 Nov 18 olle 323           var eStain = h.EStain;            
5115 20 Nov 18 olle 324           cs.addColumn('histology.stained', h.numStains ? 'Yes' : 'No');
5115 20 Nov 18 olle 325           cs.addColumn('histology.nofSlides', h.numStains);
5115 20 Nov 18 olle 326           cs.addColumn('histology.heGlassF', fStain ? cs.asBioPlateLocation(fStain.bioWell) : null);
5115 20 Nov 18 olle 327           cs.addColumn('histology.heGlassFTumourCellsPct', fStain ? fStain.tumourCellsPct : null);
5115 20 Nov 18 olle 328           cs.addColumn('histology.heGlassE', eStain ? cs.asBioPlateLocation(eStain.bioWell) : null);
5115 20 Nov 18 olle 329           cs.addColumn('histology.heGlassETumourCellsPct', eStain ? eStain.tumourCellsPct : null);
5115 20 Nov 18 olle 330           // SCAN-B-rec end
5115 20 Nov 18 olle 331
5093 14 Nov 18 olle 332           var stained = h.stainDate ? true : false;
5093 14 Nov 18 olle 333           var bestStain = stained ? h.bestStain : null;
5093 14 Nov 18 olle 334           var scored = bestStain && bestStain.ScoreComplete != null ? true : false;
5115 20 Nov 18 olle 335
5115 20 Nov 18 olle 336           //cs.addColumn('histology.stained', stained ? cs.asDate(h.stainDate) : 'No');
5115 20 Nov 18 olle 337           //cs.addColumn('histology.nofSlides', stained ? h.numStains : null);
5093 14 Nov 18 olle 338           cs.addColumn('histology.heGlass', bestStain ? cs.asBioPlateLocation(bestStain.bioWell) : null);
5093 14 Nov 18 olle 339           cs.addColumn('histology.stainProtocol', stained ? cs.asLink('PROTOCOL', h.stainProtocol, truncateAt) : null);
5093 14 Nov 18 olle 340
5093 14 Nov 18 olle 341           cs.addColumn('histology.scored', (scored ? (bestStain.ScoreComplete ? 'Complete' : 'In progress') : 'No')+cs.asFileLink(bestStain ? bestStain.image : null, 'picture.png'));
5093 14 Nov 18 olle 342           cs.addColumn('histology.scoreInvasiveCancer', scored ? cs.asPercent(bestStain.ScoreInvasiveCancer) : null);
5093 14 Nov 18 olle 343           cs.addColumn('histology.scoreInsituCancer', scored ? cs.asPercent(bestStain.ScoreInsituCancer) : null);
5093 14 Nov 18 olle 344           cs.addColumn('histology.scoreLymphocytes', scored ? cs.asPercent(bestStain.ScoreLymphocytes) : null);
5093 14 Nov 18 olle 345           cs.addColumn('histology.scoreNormal', scored ? cs.asPercent(bestStain.ScoreNormal) : null);
5093 14 Nov 18 olle 346           cs.addColumn('histology.scoreStroma', scored ? cs.asPercent(bestStain.ScoreStroma) : null);
5093 14 Nov 18 olle 347           cs.addColumn('histology.scoreFat', scored ? cs.asPercent(bestStain.ScoreFat) : null);
5093 14 Nov 18 olle 348           cs.addColumn('histology.scoreComments', scored ? cs.truncate(bestStain.comments, truncateAt) : null);
5093 14 Nov 18 olle 349         }
5093 14 Nov 18 olle 350         catch (e)
5093 14 Nov 18 olle 351         {
5093 14 Nov 18 olle 352           cs.logError('histology-info', e);
5093 14 Nov 18 olle 353         }
5093 14 Nov 18 olle 354       }
5093 14 Nov 18 olle 355       defaultColClass = null;
5093 14 Nov 18 olle 356     }
5093 14 Nov 18 olle 357     else
5093 14 Nov 18 olle 358     {
5093 14 Nov 18 olle 359       cs.addColumn('histology.name', cs.asNoInfo('No histology information has been registered'));
5093 14 Nov 18 olle 360       Doc.hide('histology-details');
5093 14 Nov 18 olle 361     }
5093 14 Nov 18 olle 362
4788 02 May 18 olle 363     var rna = response.rna;
4788 02 May 18 olle 364     if (rna && rna.length > 0)
4788 02 May 18 olle 365     {
4788 02 May 18 olle 366       var truncateAt = TRUNCATE_SIZE[Math.min(rna.length-1, TRUNCATE_SIZE.length)];
4788 02 May 18 olle 367       for (var i = 0; i < rna.length; i++)
4788 02 May 18 olle 368       {
4788 02 May 18 olle 369         var r = rna[i];
5031 16 Oct 18 olle 370         defaultColClass = yellowPrefixes[r.name.substr(0,sampleItemNameLength)];
5092 14 Nov 18 olle 371         //cs.addColumn('rna.name', cs.asLink('EXTRACT', r));
5092 14 Nov 18 olle 372         cs.addColumn('rna.name', cs.asLink('EXTRACT', r, 0, true));
4788 02 May 18 olle 373         cs.addColumn('rna.flag', r.flag ? cs.asFlagInfo(r.flag, 'flag.png') : null);
4788 02 May 18 olle 374         cs.addColumn('rna.registrationDate', cs.asDate(r.registrationDate));
4788 02 May 18 olle 375         cs.addColumn('rna.specimenType', Strings.encodeTags(r.specimenType));
4788 02 May 18 olle 376         cs.addColumn('rna.samplingDate', cs.warnIfMissing(cs.asDateTime(r.samplingDate)));
4788 02 May 18 olle 377         cs.addColumn('rna.viableTumourCellsPercent', r.viableTumourCellsPercent);
4788 02 May 18 olle 378         cs.addColumn('rna.storageBox', cs.asBioPlateLocation(r.bioWell));
4788 02 May 18 olle 379         cs.addColumn('rna.usedQuantity', cs.asQuantity(r.usedQuantity, ' Âµg'));
4788 02 May 18 olle 380         cs.addColumn('rna.extractionDate', cs.asDate(r.extractionDate)+cs.asLabEnvLink('http://givare2.onk.lu.se/', r.extractionDate, 'RNA extraction: ' + r.name, 'thermometer.png'));
4788 02 May 18 olle 381         cs.addColumn('rna.extractionProtocol', cs.asLink('PROTOCOL', r.extractionProtocol, truncateAt));
4788 02 May 18 olle 382         cs.addColumn('rna.remainingQuantity', cs.asQuantity(r.remainingQuantity, ' Âµg'));
4788 02 May 18 olle 383         cs.addColumn('rna.originalQuantity', cs.asQuantity(r.originalQuantity, ' Âµg'));
4788 02 May 18 olle 384 /*
4788 02 May 18 olle 385         cs.addColumn('rna.ndConc', cs.asQuantity(r.ndConc, ' ng/µl'));
4788 02 May 18 olle 386 */
4788 02 May 18 olle 387         cs.addColumn('rna.operatorDeliveryComment', cs.truncate(r.operatorDeliveryComment, truncateAt));
4788 02 May 18 olle 388         cs.addColumn('rna.description', cs.truncate(r.description, truncateAt));
4788 02 May 18 olle 389 /*
4788 02 May 18 olle 390         cs.addColumn('rna.startPlate', cs.asLink('BIOPLATE', r.startPlate));
4788 02 May 18 olle 391 */
4788 02 May 18 olle 392         cs.addColumn('rna.startList', cs.asLink('ITEMLIST', r.startList));
4788 02 May 18 olle 393 /*
4788 02 May 18 olle 394         
4788 02 May 18 olle 395         var hasQc = r.nofQc ? true : false;
4788 02 May 18 olle 396         cs.addColumn('rna.qc', hasQc ? (r.qcDate ? cs.asDate(r.qcDate) : cs.asNoInfo('Waiting for Caliper...')) : 'No');
4788 02 May 18 olle 397         cs.addColumn('rna.nofQc', hasQc ? r.nofQc : null);
4788 02 May 18 olle 398         cs.addColumn('rna.qcProtocol', hasQc ? cs.asLink('PROTOCOL', r.qcProtocol, truncateAt) : null);
4788 02 May 18 olle 399         cs.addColumn('rna.qcPlate', hasQc ? cs.asBioPlateLocation(r.qcPlate)+cs.asFileLink(r.qcPdf, 'pdffile.png') : null);
4788 02 May 18 olle 400         cs.addColumn('rna.qcRqs', hasQc && r.qcRqs ? Meludi.formatNumber(r.qcRqs, null, 1) : null);
4788 02 May 18 olle 401         cs.addColumn('rna.qcRin', hasQc && r.qcRin ? Meludi.formatNumber(r.qcRin, null, 1) : null);
4788 02 May 18 olle 402         cs.addColumn('rna.qcDescription', hasQc ? cs.truncate(r.qcDescription, truncateAt) : null);
4788 02 May 18 olle 403 */
4788 02 May 18 olle 404       }
4788 02 May 18 olle 405     }
4788 02 May 18 olle 406     else
4788 02 May 18 olle 407     {
4788 02 May 18 olle 408       cs.addColumn('rna.name', cs.asNoInfo('No RNA information has been registered'));
4788 02 May 18 olle 409       Doc.hide('rna-details');
4788 02 May 18 olle 410     }
4788 02 May 18 olle 411
4788 02 May 18 olle 412     var dna = response.dna;
4788 02 May 18 olle 413     if (dna && dna.length > 0)
4788 02 May 18 olle 414     {
4788 02 May 18 olle 415       var truncateAt = TRUNCATE_SIZE[Math.min(dna.length-1, TRUNCATE_SIZE.length)];
4788 02 May 18 olle 416       for (var i = 0; i < dna.length; i++)
4788 02 May 18 olle 417       {
4788 02 May 18 olle 418         var d = dna[i];
5031 16 Oct 18 olle 419         defaultColClass = yellowPrefixes[d.name.substr(0,sampleItemNameLength)];
5092 14 Nov 18 olle 420         //cs.addColumn('dna.name', cs.asLink('EXTRACT', d));
5092 14 Nov 18 olle 421         cs.addColumn('dna.name', cs.asLink('EXTRACT', d, 0, true));
4788 02 May 18 olle 422         cs.addColumn('dna.registrationDate', cs.asDate(d.registrationDate));
4788 02 May 18 olle 423         cs.addColumn('dna.specimenType', Strings.encodeTags(d.specimenType));
4788 02 May 18 olle 424         cs.addColumn('dna.samplingDate', cs.warnIfMissing(cs.asDateTime(d.samplingDate)));
4788 02 May 18 olle 425         cs.addColumn('dna.viableTumourCellsPercent', d.viableTumourCellsPercent);
4788 02 May 18 olle 426         cs.addColumn('dna.storageBox', cs.asBioPlateLocation(d.bioWell));
4788 02 May 18 olle 427         cs.addColumn('dna.extractionDate', cs.asDate(d.extractionDate)+cs.asLabEnvLink('http://givare2.onk.lu.se/', d.extractionDate, 'DNA extraction: ' + d.name, 'thermometer.png'));
4788 02 May 18 olle 428         cs.addColumn('dna.extractionProtocol', cs.asLink('PROTOCOL', d.extractionProtocol, truncateAt));
4788 02 May 18 olle 429         cs.addColumn('dna.remainingQuantity', cs.asQuantity(d.remainingQuantity, ' Âµg'));
4788 02 May 18 olle 430         cs.addColumn('dna.originalQuantity', cs.asQuantity(d.originalQuantity, ' Âµg'));
4788 02 May 18 olle 431 /*
4788 02 May 18 olle 432         cs.addColumn('dna.ndConc', cs.asQuantity(d.ndConc, ' ng/µl'));
4788 02 May 18 olle 433 */
4788 02 May 18 olle 434         cs.addColumn('dna.operatorDeliveryComment', cs.truncate(d.operatorDeliveryComment, truncateAt));
4788 02 May 18 olle 435         cs.addColumn('dna.description', cs.truncate(d.description, truncateAt));
4788 02 May 18 olle 436 /*
4788 02 May 18 olle 437         cs.addColumn('dna.startPlate', cs.asLink('BIOPLATE', d.startPlate));
4788 02 May 18 olle 438 */
4788 02 May 18 olle 439         cs.addColumn('dna.startList', cs.asLink('ITEMLIST', d.startList));
4788 02 May 18 olle 440       }
4788 02 May 18 olle 441     }
4788 02 May 18 olle 442     else
4788 02 May 18 olle 443     {
4788 02 May 18 olle 444       cs.addColumn('dna.name', cs.asNoInfo('No DNA information has been registered'));
4788 02 May 18 olle 445       Doc.hide('dna-details');
4788 02 May 18 olle 446     }
4788 02 May 18 olle 447
4788 02 May 18 olle 448 /*
4788 02 May 18 olle 449     var mrna = response.mrna;
4788 02 May 18 olle 450     if (mrna && mrna.length > 0)
4788 02 May 18 olle 451     {
4788 02 May 18 olle 452       var truncateAt = TRUNCATE_SIZE[Math.min(mrna.length-1, TRUNCATE_SIZE.length)];
4788 02 May 18 olle 453       for (var i = 0; i < mrna.length; i++)
4788 02 May 18 olle 454       {
4788 02 May 18 olle 455         var r = mrna[i];
5031 16 Oct 18 olle 456         defaultColClass = yellowPrefixes[r.name.substr(0,sampleItemNameLength)];
5092 14 Nov 18 olle 457         //cs.addColumn('mrna.name', cs.asLink('EXTRACT', r));
5092 14 Nov 18 olle 458         cs.addColumn('mrna.name', cs.asLink('EXTRACT', r, 0, true));
4788 02 May 18 olle 459         cs.addColumn('mrna.registrationDate', cs.asDate(r.registrationDate));
4788 02 May 18 olle 460         cs.addColumn('mrna.storageBox', cs.asBioPlateLocation(r.bioWell)+cs.asFileLink(r.platePdf, 'pdffile.png'));
4788 02 May 18 olle 461         cs.addColumn('mrna.result', (r.result && r.result != 'Successful') ? cs.asFailInfo(r.result, 'error.png') : null);
4788 02 May 18 olle 462         cs.addColumn('mrna.cleanupDate', cs.asDate(r.cleanupDate)+cs.asLabEnvLink('http://givare2.onk.lu.se/', r.cleanupDate, 'mRNA cleanup: ' + r.name, 'thermometer.png'));
4788 02 May 18 olle 463         cs.addColumn('mrna.usedQuantity', cs.asQuantity(r.usedQuantity, ' Âµg'));
4788 02 May 18 olle 464         cs.addColumn('mrna.description', cs.truncate(r.description, truncateAt));
4788 02 May 18 olle 465       }
4788 02 May 18 olle 466     }
4788 02 May 18 olle 467     else
4788 02 May 18 olle 468     {
4788 02 May 18 olle 469       cs.addColumn('mrna.name', cs.asNoInfo('No mRNA information has been registered'));
4788 02 May 18 olle 470       Doc.hide('mrna-details');
4788 02 May 18 olle 471     }
4788 02 May 18 olle 472
4788 02 May 18 olle 473     var cdna = response.cdna;
4788 02 May 18 olle 474     if (cdna && cdna.length > 0)
4788 02 May 18 olle 475     {
4788 02 May 18 olle 476       var truncateAt = TRUNCATE_SIZE[Math.min(cdna.length-1, TRUNCATE_SIZE.length)];
4788 02 May 18 olle 477       for (var i = 0; i < cdna.length; i++)
4788 02 May 18 olle 478       {
4788 02 May 18 olle 479         var r = cdna[i];
5031 16 Oct 18 olle 480         defaultColClass = yellowPrefixes[r.name.substr(0,sampleItemNameLength)];
5092 14 Nov 18 olle 481         //cs.addColumn('cdna.name', cs.asLink('EXTRACT', r));
5092 14 Nov 18 olle 482         cs.addColumn('cdna.name', cs.asLink('EXTRACT', r, 0, true));
4788 02 May 18 olle 483         cs.addColumn('cdna.registrationDate', cs.asDate(r.registrationDate));
4788 02 May 18 olle 484         cs.addColumn('cdna.storageBox', cs.asBioPlateLocation(r.bioWell));
4788 02 May 18 olle 485         cs.addColumn('cdna.result', (r.result && r.result != 'Successful') ? cs.asFailInfo(r.result, 'error.png') : null);
4788 02 May 18 olle 486         cs.addColumn('cdna.synthesisDate', cs.asDate(r.synthesisDate)+cs.asLabEnvLink('http://givare2.onk.lu.se/', r.synthesisDate, 'cDNA synthesis: ' + r.name, 'thermometer.png'));
4788 02 May 18 olle 487         cs.addColumn('cdna.description', cs.truncate(r.description, truncateAt));
4788 02 May 18 olle 488       }
4788 02 May 18 olle 489     }
4788 02 May 18 olle 490     else
4788 02 May 18 olle 491     {
4788 02 May 18 olle 492       cs.addColumn('cdna.name', cs.asNoInfo('No cDNA information has been registered'));
4788 02 May 18 olle 493       Doc.hide('cdna-details');
4788 02 May 18 olle 494     }
4788 02 May 18 olle 495 */    
4788 02 May 18 olle 496     var lib = response.lib;
4788 02 May 18 olle 497     if (lib && lib.length > 0)
4788 02 May 18 olle 498     {
4788 02 May 18 olle 499       var truncateAt = TRUNCATE_SIZE[Math.min(lib.length-1, TRUNCATE_SIZE.length)];
4788 02 May 18 olle 500       for (var i = 0; i < lib.length; i++)
4788 02 May 18 olle 501       {
4788 02 May 18 olle 502         var d = lib[i];
4788 02 May 18 olle 503         var barcodeInfo = 'NA';
4788 02 May 18 olle 504         if (d.index1 != null && d.index2 != null)
4788 02 May 18 olle 505         {
4788 02 May 18 olle 506           barcodeInfo = cs.asLink('TAG', d.index2) + ',' + cs.asLink('TAG', d.index1);
4788 02 May 18 olle 507         }
5031 16 Oct 18 olle 508         defaultColClass = yellowPrefixes[d.name.substr(0,sampleItemNameLength)];
5092 14 Nov 18 olle 509         //cs.addColumn('lib.name', cs.asLink('EXTRACT', d));
5092 14 Nov 18 olle 510         cs.addColumn('lib.name', cs.asLink('EXTRACT', d, 0, true));
4788 02 May 18 olle 511         cs.addColumn('lib.registrationDate', cs.asDate(d.registrationDate));
4788 02 May 18 olle 512         cs.addColumn('lib.storageBox', cs.asBioPlateLocation(d.bioWell));
4788 02 May 18 olle 513         cs.addColumn('lib.result', (d.result && d.result != 'Successful') ? cs.asFailInfo(d.result, 'error.png') : null);
4788 02 May 18 olle 514         cs.addColumn('lib.cleanupDate', cs.asDate(d.cleanupDate)+cs.asLabEnvLink('http://givare2.onk.lu.se/', d.cleanupDate, 'Library cleanup: ' + d.name, 'thermometer.png'));
4788 02 May 18 olle 515         cs.addColumn('lib.libPrepProtocol', cs.asLink('PROTOCOL', d.libPrepProtocol, truncateAt));
4788 02 May 18 olle 516         cs.addColumn('lib.libPrepKit', cs.asLink('KIT', d.libPrepKit, truncateAt));
4788 02 May 18 olle 517         cs.addColumn('lib.remainingQuantity', cs.asQuantity(d.remainingQuantity, ' ng', 0.001));
4788 02 May 18 olle 518         cs.addColumn('lib.originalQuantity', cs.asQuantity(d.originalQuantity, ' ng', 0.001));
4788 02 May 18 olle 519         cs.addColumn('lib.barcode.name', barcodeInfo);
4788 02 May 18 olle 520         cs.addColumn('lib.ca_size', cs.asQuantity(d.ca_size, ''));
4788 02 May 18 olle 521         cs.addColumn('lib.molarity', cs.asQuantity(d.library_molarity_est, ' nM'));
4788 02 May 18 olle 522         cs.addColumn('lib.adapterFrac', cs.asPercent(d.library_frac_adpt));
4788 02 May 18 olle 523         cs.addColumn('lib.qubitconc', cs.asQuantity(d.qubitconc, ' ng/µl'));
4788 02 May 18 olle 524         cs.addColumn('lib.description', cs.truncate(d.description, truncateAt));
4788 02 May 18 olle 525       }
4788 02 May 18 olle 526     }
4788 02 May 18 olle 527     else
4788 02 May 18 olle 528     {
4788 02 May 18 olle 529       cs.addColumn('lib.name', cs.asNoInfo('No library information has been registered'));
4788 02 May 18 olle 530       Doc.hide('lib-details');
4788 02 May 18 olle 531     }
4788 02 May 18 olle 532 /*
4788 02 May 18 olle 533     var pooledLib = response.pooledlib;
4788 02 May 18 olle 534     if (pooledLib && pooledLib.length > 0)
4788 02 May 18 olle 535     {
4788 02 May 18 olle 536       var truncateAt = TRUNCATE_SIZE[Math.min(pooledLib.length-1, TRUNCATE_SIZE.length)];
4788 02 May 18 olle 537       for (var i = 0; i < pooledLib.length; i++)
4788 02 May 18 olle 538       {
4788 02 May 18 olle 539         var r = pooledLib[i];
4788 02 May 18 olle 540         cs.addColumn('pooledlib.name', cs.asLink('EXTRACT', r));
4788 02 May 18 olle 541         cs.addColumn('pooledlib.registrationDate', cs.asDate(r.registrationDate));
4788 02 May 18 olle 542         cs.addColumn('pooledlib.poolDate', cs.asDate(r.poolDate)+cs.asLabEnvLink('http://givare2.onk.lu.se/', r.poolDate, 'Pooled library pooling: ' + r.name, 'thermometer.png'));
4788 02 May 18 olle 543         cs.addColumn('pooledlib.remainingQuantity', cs.asQuantity(r.remainingQuantity, ' ng', 0.001));
4788 02 May 18 olle 544         cs.addColumn('pooledlib.originalQuantity', cs.asQuantity(r.originalQuantity, ' ng', 0.001));
4788 02 May 18 olle 545         cs.addColumn('pooledlib.poolMolarity', cs.asQuantity(r.poolMolarity, ' nM'));
4788 02 May 18 olle 546         cs.addColumn('pooledlib.poolConc', cs.asQuantity(r.poolConc, ' ng/µl'));
4788 02 May 18 olle 547         cs.addColumn('pooledlib.description', cs.truncate(r.description, truncateAt));
4788 02 May 18 olle 548       }
4788 02 May 18 olle 549     }
4788 02 May 18 olle 550     else
4788 02 May 18 olle 551     {
4788 02 May 18 olle 552       cs.addColumn('pooledlib.name', cs.asNoInfo('No pooled library information has been registered'));
4788 02 May 18 olle 553       Doc.hide('pooledlib-details');
4788 02 May 18 olle 554     }
4788 02 May 18 olle 555
4788 02 May 18 olle 556     var sequencingRuns = response.sequencingRun;
4788 02 May 18 olle 557     if (sequencingRuns && sequencingRuns.length > 0)
4788 02 May 18 olle 558     {
4788 02 May 18 olle 559       var truncateAt = TRUNCATE_SIZE[Math.min(sequencingRuns.length-1, TRUNCATE_SIZE.length)];
4788 02 May 18 olle 560       for (var i = 0; i < sequencingRuns.length; i++)
4788 02 May 18 olle 561       {
4788 02 May 18 olle 562         var sr = sequencingRuns[i];
4788 02 May 18 olle 563         var fc = sr.flowCell;
4788 02 May 18 olle 564         cs.addColumn('sequencingRun.name', cs.asLink('DERIVEDBIOASSAY', sr));
4788 02 May 18 olle 565         cs.addColumn('sequencingRun.flowCell', cs.asLink('PHYSICALBIOASSAY', fc));
4788 02 May 18 olle 566         cs.addColumn('sequencingRun.result', (sr.result && sr.result != 'Successful') ? cs.asFailInfo(sr.result, 'error.png') : null);
4788 02 May 18 olle 567         cs.addColumn('sequencingRun.clusterDate', cs.asDate(fc.clusterDate));
4788 02 May 18 olle 568         cs.addColumn('sequencingRun.startDate', cs.asDate(sr.startDate));
4788 02 May 18 olle 569         cs.addColumn('sequencingRun.endDate', cs.asDate(sr.endDate));
4788 02 May 18 olle 570         cs.addColumn('sequencingRun.description', cs.truncate(sr.description, truncateAt));
4788 02 May 18 olle 571       }
4788 02 May 18 olle 572     }
4788 02 May 18 olle 573     else
4788 02 May 18 olle 574     {
4788 02 May 18 olle 575       cs.addColumn('sequencingRun.name', cs.asNoInfo('No sequencing information has been registered'));
4788 02 May 18 olle 576       Doc.hide('sequencingRun-details');
4788 02 May 18 olle 577     }
4788 02 May 18 olle 578 */
4788 02 May 18 olle 579
4788 02 May 18 olle 580     var linkedItems = document.getElementsByClassName('linked-item');
4788 02 May 18 olle 581     for (var itemNo = 0; itemNo < linkedItems.length; itemNo++)
4788 02 May 18 olle 582     {
4788 02 May 18 olle 583       Events.addEventHandler(linkedItems[itemNo], 'click', Items.itemOnClick);
4788 02 May 18 olle 584     }
4788 02 May 18 olle 585     
4788 02 May 18 olle 586     var linkedFiles = document.getElementsByClassName('linked-file');
4788 02 May 18 olle 587     for (var fileNo = 0; fileNo < linkedFiles.length; fileNo++)
4788 02 May 18 olle 588     {
4788 02 May 18 olle 589       Events.addEventHandler(linkedFiles[fileNo], 'click', Files.viewFileOnClick);
4788 02 May 18 olle 590     }
4788 02 May 18 olle 591
4788 02 May 18 olle 592 /*    
4788 02 May 18 olle 593     var linkedLabEnvs = document.getElementsByClassName('linked-labenv');
4788 02 May 18 olle 594     for (var labEnvNo = 0; labEnvNo < linkedLabEnvs.length; labEnvNo++)
4788 02 May 18 olle 595     {
4788 02 May 18 olle 596       Events.addEventHandler(linkedLabEnvs[labEnvNo], 'click', LabEnvs.viewDataOnClick);
4788 02 May 18 olle 597     }
4788 02 May 18 olle 598 */
4788 02 May 18 olle 599     
4788 02 May 18 olle 600     var linkedCases = document.getElementsByClassName('linked-case');
4788 02 May 18 olle 601     for (var caseNo = 0; caseNo < linkedCases.length; caseNo++)
4788 02 May 18 olle 602     {
4788 02 May 18 olle 603       Events.addEventHandler(linkedCases[caseNo], 'click', cs.caseSummary);
4788 02 May 18 olle 604     }
5092 14 Nov 18 olle 605
5092 14 Nov 18 olle 606     chainedItems = document.getElementsByClassName('chained-item');
5092 14 Nov 18 olle 607     for (var itemNo = 0; itemNo < chainedItems.length; itemNo++)
5092 14 Nov 18 olle 608     {
5092 14 Nov 18 olle 609       Events.addEventHandler(chainedItems[itemNo], 'click', cs.chainedItemOnClick);
5092 14 Nov 18 olle 610     }
5092 14 Nov 18 olle 611     
5092 14 Nov 18 olle 612     var highlight = Data.get('page-data', 'highlight')+'.';
5092 14 Nov 18 olle 613     if (highlight)
5092 14 Nov 18 olle 614     {
5092 14 Nov 18 olle 615       var targetList = highlight.split(',');
5092 14 Nov 18 olle 616       var rootItem = cs.highlightChainedItems(targetList, targetList[0]);
5092 14 Nov 18 olle 617       if (rootItem)
5092 14 Nov 18 olle 618       {
5092 14 Nov 18 olle 619         Doc.addClass(rootItem.parentNode, 'rootitem');
5092 14 Nov 18 olle 620       }
5092 14 Nov 18 olle 621     }
5092 14 Nov 18 olle 622
4788 02 May 18 olle 623 //alert("case_summary_alt_rec::caseInfoLoaded(): End");
4788 02 May 18 olle 624   }
4788 02 May 18 olle 625   
5092 14 Nov 18 olle 626   cs.chainedItemOnClick = function(event)
5092 14 Nov 18 olle 627   {
5092 14 Nov 18 olle 628     // A possible list of 'chain-id' values that should be highlighted
5092 14 Nov 18 olle 629     var targetList = Data.get(event.currentTarget, 'chain-id').split(',');
5092 14 Nov 18 olle 630     cs.highlightChainedItems(targetList);
5092 14 Nov 18 olle 631     Doc.addClass(event.currentTarget.parentNode, 'rootitem');
5092 14 Nov 18 olle 632   }
5092 14 Nov 18 olle 633   
5092 14 Nov 18 olle 634   /**
5092 14 Nov 18 olle 635     Highlight all items that share part of the name with the target
5092 14 Nov 18 olle 636     that was clicked. Note that parent items have a shorter name and
5092 14 Nov 18 olle 637     child items have a longer name so we need two tests.
5092 14 Nov 18 olle 638   */
5092 14 Nov 18 olle 639   cs.highlightChainedItems = function(targetList, scrollTo)
5092 14 Nov 18 olle 640   {
5092 14 Nov 18 olle 641     // 'targetList' is a possible list of 'chain-id' values that should be highlighted
5092 14 Nov 18 olle 642     // 'autoScroll' is used as a marker so that that only the first <td> within the same <table> is scrolled into view
5092 14 Nov 18 olle 643     var autoScroll = new Date().getTime();
5092 14 Nov 18 olle 644     var rootItem = null;
5092 14 Nov 18 olle 645     for (var itemNo = 0; itemNo < chainedItems.length; itemNo++)
5092 14 Nov 18 olle 646     {
5092 14 Nov 18 olle 647       var item = chainedItems[itemNo];
5092 14 Nov 18 olle 648       var chainId = Data.get(item, 'chain-id').split(',');
5092 14 Nov 18 olle 649       var inChain = cs.hasCommonElement(targetList, chainId);
5092 14 Nov 18 olle 650       Doc.addOrRemoveClass(item.parentNode, 'chained', inChain);
5092 14 Nov 18 olle 651       Doc.removeClass(item.parentNode, 'rootitem');
5092 14 Nov 18 olle 652       
5092 14 Nov 18 olle 653       // This handles vertical scrolling to the root item
5092 14 Nov 18 olle 654       if (scrollTo && chainId.indexOf(scrollTo) >= 0) 
5092 14 Nov 18 olle 655       {
5092 14 Nov 18 olle 656         item.parentNode.scrollIntoView();
5092 14 Nov 18 olle 657         scrollTo = null;
5092 14 Nov 18 olle 658         rootItem = item;
5092 14 Nov 18 olle 659       }
5092 14 Nov 18 olle 660       
5092 14 Nov 18 olle 661       if (inChain)
5092 14 Nov 18 olle 662       {
5092 14 Nov 18 olle 663         // Try to scroll the highlighted item into view
5092 14 Nov 18 olle 664         // We need to get the <td> aligned left or right in the <div> that is the 
5092 14 Nov 18 olle 665         // parent to the <table>
5092 14 Nov 18 olle 666         var td = item.parentNode;
5092 14 Nov 18 olle 667         var tbl = td.parentNode.parentNode.parentNode; // Moving: td -> tr -> thead -> table
5092 14 Nov 18 olle 668         var div = tbl.parentNode;
5092 14 Nov 18 olle 669         if (div.autoScroll != autoScroll)
5092 14 Nov 18 olle 670         {
5092 14 Nov 18 olle 671           if (td.offsetLeft < div.scrollLeft) 
5092 14 Nov 18 olle 672           {
5092 14 Nov 18 olle 673             div.scrollLeft = td.offsetLeft;
5092 14 Nov 18 olle 674             div.autoScroll = autoScroll;
5092 14 Nov 18 olle 675           } 
5092 14 Nov 18 olle 676           else if (td.offsetLeft + td.offsetWidth > div.scrollLeft + div.offsetWidth)
5092 14 Nov 18 olle 677           {
5092 14 Nov 18 olle 678             div.scrollLeft = td.offsetLeft + td.offsetWidth - div.offsetWidth;
5092 14 Nov 18 olle 679             div.autoScroll = autoScroll;
5092 14 Nov 18 olle 680           }
5092 14 Nov 18 olle 681         }
5092 14 Nov 18 olle 682       }
5092 14 Nov 18 olle 683     }
5092 14 Nov 18 olle 684     return rootItem;
5092 14 Nov 18 olle 685   }
5092 14 Nov 18 olle 686   
5092 14 Nov 18 olle 687   /**
5092 14 Nov 18 olle 688     Check if the two lists have at least a pair of elements
5092 14 Nov 18 olle 689     were one is a substring of the other.
5092 14 Nov 18 olle 690   */
5092 14 Nov 18 olle 691   cs.hasCommonElement = function(list1, list2)
5092 14 Nov 18 olle 692   {
5092 14 Nov 18 olle 693     for (var i1 = 0; i1 < list1.length; i1++)
5092 14 Nov 18 olle 694     {
5092 14 Nov 18 olle 695       var e1 = list1[i1];
5092 14 Nov 18 olle 696       for (var i2 = 0; i2 < list2.length; i2++)
5092 14 Nov 18 olle 697       {
5092 14 Nov 18 olle 698         var e2 = list2[i2];
5092 14 Nov 18 olle 699         if (e2.indexOf(e1) == 0 || e1.indexOf(e2) == 0) return true;
5092 14 Nov 18 olle 700       }
5092 14 Nov 18 olle 701     }
5092 14 Nov 18 olle 702     return false;
5092 14 Nov 18 olle 703   }
5092 14 Nov 18 olle 704   
4788 02 May 18 olle 705   cs.initSections = function(sections)
4788 02 May 18 olle 706   {
4788 02 May 18 olle 707     for (var s = 0; s < sections.length; s++)
4788 02 May 18 olle 708     {
4788 02 May 18 olle 709       var section = sections[s];
4788 02 May 18 olle 710
4788 02 May 18 olle 711       var details = Doc.element(section.id+'-details');
4788 02 May 18 olle 712       // If the details section is 'forcibly' hidden (eg. no items of that type), ignore this call
4788 02 May 18 olle 713       if (details && details.style.display != 'none')
4788 02 May 18 olle 714       {
4788 02 May 18 olle 715         var headerDiv = Doc.element(section.id+'-header');
4788 02 May 18 olle 716         if (headerDiv)
4788 02 May 18 olle 717         {
4788 02 May 18 olle 718           Doc.addClass(headerDiv, 'link');
4788 02 May 18 olle 719           headerDiv.title = 'Hide/show details';
4788 02 May 18 olle 720           headerDiv.sectionId = section.id;
4788 02 May 18 olle 721           Events.addEventHandler(headerDiv, 'click', cs.toggleDetails);
4788 02 May 18 olle 722         }
4788 02 May 18 olle 723         
4788 02 May 18 olle 724         var sectionDiv = Doc.element(section.id+'-info');
4788 02 May 18 olle 725         Doc.addOrRemoveClass(sectionDiv, 'hide-details', section.hiddenDetails);
4788 02 May 18 olle 726       }
4788 02 May 18 olle 727     }
4788 02 May 18 olle 728   }
4788 02 May 18 olle 729
4788 02 May 18 olle 730   cs.toggleDetails = function(event)
4788 02 May 18 olle 731   {
4788 02 May 18 olle 732     var sectionId = event.currentTarget.sectionId;
4788 02 May 18 olle 733     var details = Doc.element(sectionId+'-details');
4788 02 May 18 olle 734     // If the details section is 'forcibly' hidden (eg. no items of that type), ignore this call
4788 02 May 18 olle 735     if (details.style.display == 'none') return;
4788 02 May 18 olle 736     
4788 02 May 18 olle 737     // Add 'hide-details' class to main <div section-info> if it is visible
4788 02 May 18 olle 738     var section = Doc.element(sectionId+'-info');
4788 02 May 18 olle 739     var isVisible = section.className.indexOf('hide-details') == -1;
4788 02 May 18 olle 740     Doc.addOrRemoveClass(section, 'hide-details', isVisible);
4788 02 May 18 olle 741
4788 02 May 18 olle 742     // Save to BASE setting
4788 02 May 18 olle 743     var url = '../CaseSummary.servlet?ID='+App.getSessionId();
4788 02 May 18 olle 744     url += '&cmd=SetSectionVisibility';
4788 02 May 18 olle 745     url += '&section='+sectionId+'&hidden='+(isVisible ? 1 : 0);
4788 02 May 18 olle 746     Wizard.asyncJsonRequest(url, null, 'POST');
4788 02 May 18 olle 747   }
4788 02 May 18 olle 748
5092 14 Nov 18 olle 749   cs.getDefaultColClass = function(item, yellowPrefixes)
5092 14 Nov 18 olle 750   {
5092 14 Nov 18 olle 751     var defaultColClass = yellowPrefixes[item.name.substr(0,sampleItemNameLength)];
5092 14 Nov 18 olle 752 /*
5092 14 Nov 18 olle 753     if (item.DO_NOT_USE)
5092 14 Nov 18 olle 754     {
5092 14 Nov 18 olle 755       defaultColClass = 'donotuse ' + (defaultColClass || '');
5092 14 Nov 18 olle 756     }
5092 14 Nov 18 olle 757 */
5092 14 Nov 18 olle 758     return defaultColClass;
5092 14 Nov 18 olle 759   }
5092 14 Nov 18 olle 760   
5031 16 Oct 18 olle 761   cs.addColumn = function(id, value, className)
4788 02 May 18 olle 762   {
4788 02 May 18 olle 763 //alert("case_summary_alt_rec::addColumn(): Start");
4788 02 May 18 olle 764     var tr = Doc.element(id);
4788 02 May 18 olle 765     var td = document.createElement('td');
5031 16 Oct 18 olle 766     if (!className) className = defaultColClass;
5031 16 Oct 18 olle 767     if (className) td.className = className;
4788 02 May 18 olle 768     if (tr.hasAddedColumns)
4788 02 May 18 olle 769     {
4788 02 May 18 olle 770       td.className = 'extra-column';
4788 02 May 18 olle 771       tr.childNodes[tr.childNodes.length-1].className += ' fixed-column';
4788 02 May 18 olle 772     }
4788 02 May 18 olle 773     tr.hasAddedColumns = true;
4788 02 May 18 olle 774     if (value != null)
4788 02 May 18 olle 775     {
4788 02 May 18 olle 776       td.innerHTML = value == '' ? '&nbsp;' : value;
4788 02 May 18 olle 777       if (tr.className.indexOf('dynamic-column') >= 0)
4788 02 May 18 olle 778       {
4788 02 May 18 olle 779         tr.style.display = 'table-row';
4788 02 May 18 olle 780       }
4788 02 May 18 olle 781     }
4788 02 May 18 olle 782     else
4788 02 May 18 olle 783     {
4788 02 May 18 olle 784       td.innerHTML = '&nbsp;';
4788 02 May 18 olle 785     }
4788 02 May 18 olle 786     tr.appendChild(td);
4788 02 May 18 olle 787   }
4788 02 May 18 olle 788
5092 14 Nov 18 olle 789   cs.asLink = function(itemType, item, maxLength, chainable)
4788 02 May 18 olle 790   {
4788 02 May 18 olle 791     var link = '';
4788 02 May 18 olle 792     if (item)
4788 02 May 18 olle 793     {
4788 02 May 18 olle 794       var name = cs.truncate(item.name, maxLength);
4788 02 May 18 olle 795       if (item.id)
4788 02 May 18 olle 796       {
4788 02 May 18 olle 797         link = '<span class="link linked-item" data-item-type="'+itemType+'" data-item-id="'+item.id+'" data-no-edit="'+(item.editable ? 0 : 1)+'">';
4788 02 May 18 olle 798         link += name + '</span>';
4788 02 May 18 olle 799       }
4788 02 May 18 olle 800       else
4788 02 May 18 olle 801       {
4788 02 May 18 olle 802         link = name;
4788 02 May 18 olle 803       }
5092 14 Nov 18 olle 804       if (chainable) 
5092 14 Nov 18 olle 805       {
5092 14 Nov 18 olle 806         var chainId = item.name;
5092 14 Nov 18 olle 807         if (chainable.length) chainId = chainable.join('.,');
5092 14 Nov 18 olle 808         // NOTE! 'chain-id' is name of item + '.' to ensure correct matching of substrings ('foo.m2' is NOT in the same chain when starting at 'foo.m')
5092 14 Nov 18 olle 809         //link += '<img class="chained-item" data-chain-id="'+Strings.encodeTags(chainId)+'." title="Highlight all parent/child items" src="'+home+'/images/parent-child.png">';
5092 14 Nov 18 olle 810         link += '<img class="chained-item" data-chain-id="'+Strings.encodeTags(chainId)+'." title="Highlight all parent/child items" src="../images/parent-child.png">';
5092 14 Nov 18 olle 811       }
4788 02 May 18 olle 812     }
4788 02 May 18 olle 813     return link;
4788 02 May 18 olle 814   }
4788 02 May 18 olle 815   
4788 02 May 18 olle 816   cs.asFileLink = function(file, icon)
4788 02 May 18 olle 817   {
4788 02 May 18 olle 818     var link = '';
4788 02 May 18 olle 819     if (file)
4788 02 May 18 olle 820     {
4788 02 May 18 olle 821       link = '<span class="link linked-file" data-file-id="'+file.id+'"><img src="../images/'+icon+'"></span>';
4788 02 May 18 olle 822     }
4788 02 May 18 olle 823     return link;
4788 02 May 18 olle 824   }
4788 02 May 18 olle 825
4788 02 May 18 olle 826   cs.asLabEnvLink = function(sensor, date, title, icon)
4788 02 May 18 olle 827   {
4788 02 May 18 olle 828     var link = '';
4788 02 May 18 olle 829     // Check if BASE extension LabEnv is installed
4788 02 May 18 olle 830     var homeLabEnv = Data.get('page-data', 'home-labenv');
4788 02 May 18 olle 831     if (homeLabEnv)
4788 02 May 18 olle 832     {
4788 02 May 18 olle 833       if (date)
4788 02 May 18 olle 834       {
4788 02 May 18 olle 835         if (sensor)
4788 02 May 18 olle 836         {
4788 02 May 18 olle 837           // Link to pop-up window with lab environment data for the chosen sensor and date
4788 02 May 18 olle 838           link = '<span class="link linked-labenv" data-sensor="'+sensor+'" data-date="'+date+'" data-title="'+title+'"><img src="../images/'+icon+'"></span>';
4788 02 May 18 olle 839         }
4788 02 May 18 olle 840       }
4788 02 May 18 olle 841     }
4788 02 May 18 olle 842     return link;
4788 02 May 18 olle 843   }
4788 02 May 18 olle 844
4788 02 May 18 olle 845   cs.asCaseList = function(allCases, mainCase)
4788 02 May 18 olle 846   {
4788 02 May 18 olle 847     var html = '';
4788 02 May 18 olle 848     for (var i = 0; i < allCases.length; i++)
4788 02 May 18 olle 849     {
4788 02 May 18 olle 850       var cse = allCases[i];
4788 02 May 18 olle 851       var cse2 = Strings.encodeTags(cse);
4788 02 May 18 olle 852       if (html != '') html += ', ';
4788 02 May 18 olle 853       if (cse != mainCase)
4788 02 May 18 olle 854       {
4788 02 May 18 olle 855         html += '<span class="link linked-case" data-case-name="'+cse2+'" title="Show summary of case #'+cse2+'">'+cse2+'</span>';
4788 02 May 18 olle 856       }
4788 02 May 18 olle 857       else
4788 02 May 18 olle 858       {
4788 02 May 18 olle 859         html += '<b>' + cse2 + '</b>';
4788 02 May 18 olle 860       }
4788 02 May 18 olle 861     }
4788 02 May 18 olle 862     return allCases.length > 1 ? html : null;
4788 02 May 18 olle 863   }
4788 02 May 18 olle 864
4788 02 May 18 olle 865   
4788 02 May 18 olle 866   // Format value as a date
4788 02 May 18 olle 867   cs.asDate = function(value)
4788 02 May 18 olle 868   {
4788 02 May 18 olle 869     if (!value) return '';
4788 02 May 18 olle 870     if (value.length == 8)
4788 02 May 18 olle 871     {
4788 02 May 18 olle 872       value = value.substr(0, 4) + '-' + value.substr(4, 2) + '-' + value.substr(6, 2);
4788 02 May 18 olle 873     }
4788 02 May 18 olle 874     return value;
4788 02 May 18 olle 875   }
4788 02 May 18 olle 876
4788 02 May 18 olle 877   // Format as date+time value
4788 02 May 18 olle 878   cs.asDateTime = function(value, compareToDate)
4788 02 May 18 olle 879   {
4788 02 May 18 olle 880     if (!value) return '';
4788 02 May 18 olle 881     if (value.length == 8)
4788 02 May 18 olle 882     {
4788 02 May 18 olle 883       value = cs.asDate(value);
4788 02 May 18 olle 884     }
4788 02 May 18 olle 885     else if (value.length == 13)
4788 02 May 18 olle 886     {
4788 02 May 18 olle 887       // If the compareToDate is the same day as the 'value' date, skip the date and replace with white-space
4788 02 May 18 olle 888       if (compareToDate && value.substr(0, 8) == compareToDate.substr(0, 8))
4788 02 May 18 olle 889       {
4788 02 May 18 olle 890         value = '<span class="invisible">'+cs.asDate(value.substr(0, 8)) + '</span> ' + value.substr(9, 2) + ':'+value.substr(11, 2)
4788 02 May 18 olle 891       }
4788 02 May 18 olle 892       else
4788 02 May 18 olle 893       {
4788 02 May 18 olle 894         value = cs.asDate(value.substr(0, 8)) + ' ' + value.substr(9, 2) + ':'+value.substr(11, 2);
4788 02 May 18 olle 895       }
4788 02 May 18 olle 896     }
4788 02 May 18 olle 897     return value;
4788 02 May 18 olle 898   }
4788 02 May 18 olle 899
4788 02 May 18 olle 900   // Style the value as a quantity with (optional) unit
4788 02 May 18 olle 901   cs.asQuantity = function(value, unit, scale)
4788 02 May 18 olle 902   {
4788 02 May 18 olle 903     var result = '';
4788 02 May 18 olle 904     if (value != null)
4788 02 May 18 olle 905     {
4788 02 May 18 olle 906       if (scale) value = value / scale;
4788 02 May 18 olle 907       result = Meludi.formatNumber(value, unit, 2);
4788 02 May 18 olle 908     }
4788 02 May 18 olle 909     return result;
4788 02 May 18 olle 910   }
4788 02 May 18 olle 911   
4788 02 May 18 olle 912   // Style the value as a percentage value
4788 02 May 18 olle 913   cs.asPercent = function(value)
4788 02 May 18 olle 914   {
4788 02 May 18 olle 915     var result = '';
4788 02 May 18 olle 916     if (value != null)
4788 02 May 18 olle 917     {
4788 02 May 18 olle 918       result = value + '%';
4788 02 May 18 olle 919     }
4788 02 May 18 olle 920     return result;
4788 02 May 18 olle 921   }
4788 02 May 18 olle 922
4788 02 May 18 olle 923
4788 02 May 18 olle 924   // Style the message as a warning message
4788 02 May 18 olle 925   cs.asWarning = function(message)
4788 02 May 18 olle 926   {
4788 02 May 18 olle 927     message = '<span class="warning">' + message + '</span>';
4788 02 May 18 olle 928     return message;
4788 02 May 18 olle 929   }
4788 02 May 18 olle 930
4788 02 May 18 olle 931   // Generate a 'Missing' warning if the value is missing
4788 02 May 18 olle 932   cs.warnIfMissing = function(value)
4788 02 May 18 olle 933   {
4788 02 May 18 olle 934     var message = value ? value : cs.asWarning('Missing');
4788 02 May 18 olle 935     return message;
4788 02 May 18 olle 936   }
4788 02 May 18 olle 937   
4788 02 May 18 olle 938   // Style the message as a 'no information' message
4788 02 May 18 olle 939   cs.asNoInfo = function(message)
4788 02 May 18 olle 940   {
4788 02 May 18 olle 941     message = '<span class="no-info">' + message + '</span>';
4788 02 May 18 olle 942     return message;
4788 02 May 18 olle 943   }
4788 02 May 18 olle 944   
4788 02 May 18 olle 945   // Style the message as a 'flag information' message
4788 02 May 18 olle 946   cs.asFlagInfo = function(message, icon)
4788 02 May 18 olle 947   {
4788 02 May 18 olle 948     message = '<span class="flag-info">' + message + '&nbsp;' + '<img src="../images/'+icon+'"></span>';
4788 02 May 18 olle 949     return message;
4788 02 May 18 olle 950   }
4788 02 May 18 olle 951
4788 02 May 18 olle 952   // Style the message as a 'fail information' message
4788 02 May 18 olle 953   cs.asFailInfo = function(message, icon)
4788 02 May 18 olle 954   {
4788 02 May 18 olle 955     message = '<span class="fail-info">' + message + '&nbsp;' + '<img src="../images/'+icon+'"></span>';
4788 02 May 18 olle 956     return message;
4788 02 May 18 olle 957   }
4788 02 May 18 olle 958
4788 02 May 18 olle 959   cs.asConsent = function(consent, consentDate)
4788 02 May 18 olle 960   {
4788 02 May 18 olle 961     var warn = !consent || !consentDate;
4788 02 May 18 olle 962     var message;
4788 02 May 18 olle 963     if (!consent)
4788 02 May 18 olle 964     {
4788 02 May 18 olle 965       message = 'Missing' + (consentDate ? ', ' + consentDate : '');
4788 02 May 18 olle 966     }
4788 02 May 18 olle 967     else
4788 02 May 18 olle 968     {
4788 02 May 18 olle 969       message = consent + ', ' + (consentDate ? consentDate : 'Missing date');
4788 02 May 18 olle 970       
4788 02 May 18 olle 971     }
4788 02 May 18 olle 972     return warn ? cs.asWarning(message) : message;
4788 02 May 18 olle 973   }
4788 02 May 18 olle 974   
4788 02 May 18 olle 975   // A biowell as the location
4788 02 May 18 olle 976   cs.asBioPlateLocation = function(well)
4788 02 May 18 olle 977   {
4788 02 May 18 olle 978     if (!well) return '';
4788 02 May 18 olle 979     var plate = well.bioPlate;
4788 02 May 18 olle 980     var text = cs.asLink('BIOPLATE', plate)  + ' ' + well.location;
4788 02 May 18 olle 981     if (plate.storage)
4788 02 May 18 olle 982     {
4788 02 May 18 olle 983       var storage = plate.storage;
4788 02 May 18 olle 984       var tmp = [];
4788 02 May 18 olle 985       if (storage.name) tmp[tmp.length] = Strings.encodeTags(storage.name);
4788 02 May 18 olle 986       if (storage.section) tmp[tmp.length] = 'section: ' +storage.section;
4788 02 May 18 olle 987       if (storage.tray) tmp[tmp.length] = 'tray: ' +storage.tray;
4788 02 May 18 olle 988       if (storage.position) tmp[tmp.length] = 'position: ' +storage.position;
4788 02 May 18 olle 989
4788 02 May 18 olle 990       text = '<span class="more-info" title="' + tmp.join('; ')+'">' + text + ' </span>';
4788 02 May 18 olle 991     }
4788 02 May 18 olle 992     return text;
4788 02 May 18 olle 993   }
4788 02 May 18 olle 994
4788 02 May 18 olle 995   cs.truncate = function(value, maxLength)
4788 02 May 18 olle 996   {
4788 02 May 18 olle 997     if (!value) return value;
4788 02 May 18 olle 998     if (maxLength > 2 && value.length > maxLength) 
4788 02 May 18 olle 999     {
4788 02 May 18 olle 1000       var tmp = '<span class="truncated" title="'+value+'">'+Strings.encodeTags(value.substring(0, maxLength-2)) + '...</span>';
4788 02 May 18 olle 1001       value = tmp;
4788 02 May 18 olle 1002     }
4788 02 May 18 olle 1003     else
4788 02 May 18 olle 1004     {
4788 02 May 18 olle 1005       value = Strings.encodeTags(value);
4788 02 May 18 olle 1006     }
4788 02 May 18 olle 1007     return value;
4788 02 May 18 olle 1008   }
4788 02 May 18 olle 1009
4788 02 May 18 olle 1010   cs.showConfidentialOnChange = function()
4788 02 May 18 olle 1011   {
4788 02 May 18 olle 1012     var frm = document.forms['meludi'];
4788 02 May 18 olle 1013     Doc.addOrRemoveClass('all-info', 'hide-confidential', !frm.showConfidential.checked);
4788 02 May 18 olle 1014   }
4788 02 May 18 olle 1015
4788 02 May 18 olle 1016   cs.caseSummary = function(event)
4788 02 May 18 olle 1017   {
5395 02 May 19 olle 1018 //alert("case_summary_alt_rec::caseSummary(): Start");
4788 02 May 18 olle 1019     var frm = document.forms['meludi'];
4788 02 May 18 olle 1020     var caseName = Data.get(event.currentTarget, 'case-name');
5395 02 May 19 olle 1021 //alert("case_summary_alt_rec::caseSummary(): caseName from event = " + caseName);
4788 02 May 18 olle 1022     if (!caseName)
4788 02 May 18 olle 1023     {
4788 02 May 18 olle 1024       caseName = frm.caseName_alt_rec.value;
5395 02 May 19 olle 1025 //alert("case_summary_alt_rec::caseSummary(): caseName from input field caseName_alt_rec = " + caseName);
4788 02 May 18 olle 1026       if (!caseName)
4788 02 May 18 olle 1027       {
4788 02 May 18 olle 1028         Forms.showNotification('caseName', 'Please enter a case id (&quot;' + sampleItemPrefix + '&quot; + ' + sampleItemNumDigits + ' digits)', null, null, 'left');
4788 02 May 18 olle 1029         return;
4788 02 May 18 olle 1030       }
4788 02 May 18 olle 1031     }
4788 02 May 18 olle 1032     //var url = 'case_summary.jsp?ID='+App.getSessionId();
4788 02 May 18 olle 1033     var url = 'case_summary_alt_rec.jsp?ID='+App.getSessionId();
4788 02 May 18 olle 1034     url += '&caseName='+encodeURIComponent(caseName);
4788 02 May 18 olle 1035     url += '&pageType='+Data.get('page-data', 'page-type');
5395 02 May 19 olle 1036 //alert("case_summary_alt_rec::caseSummary(): url = " + url);
4788 02 May 18 olle 1037     location.href = url;
4788 02 May 18 olle 1038   }
4788 02 May 18 olle 1039
4788 02 May 18 olle 1040   cs.goPrint = function()
4788 02 May 18 olle 1041   {
4788 02 May 18 olle 1042     var caseName = Data.get('page-data', 'case-name');
4788 02 May 18 olle 1043     var printNote = '<b>Note!</b> For better printing set page orientation to <i>portrait</i>.<br>';
4788 02 May 18 olle 1044     printNote += ' You may have to <i>scale down</i> to fit everything on the width of the page.';
4788 02 May 18 olle 1045     Meludi.openPrintWindow('all-content', 'Case summary - ' + Strings.encodeTags(caseName), 'portrait', printNote, '../', 'case_summary.css');
4788 02 May 18 olle 1046   }
4788 02 May 18 olle 1047
4788 02 May 18 olle 1048   cs.logError = function(section, err)
4788 02 May 18 olle 1049   {
4788 02 May 18 olle 1050     console.error(err);
4788 02 May 18 olle 1051     section = Doc.element(section);
4788 02 May 18 olle 1052     var div = document.createElement('div');
4788 02 May 18 olle 1053     div.className = 'messagecontainer error';
4788 02 May 18 olle 1054     div.innerHTML = err;
4788 02 May 18 olle 1055     section.parentNode.insertBefore(div, section.nextSibling);
4788 02 May 18 olle 1056   }
4788 02 May 18 olle 1057   
4788 02 May 18 olle 1058   return cs;
4788 02 May 18 olle 1059 }();
4788 02 May 18 olle 1060
4788 02 May 18 olle 1061 var LabEnvs = function()
4788 02 May 18 olle 1062 {
4788 02 May 18 olle 1063   var labenvs = {};
4788 02 May 18 olle 1064
4788 02 May 18 olle 1065   /**
4788 02 May 18 olle 1066     Event handler that calls 'labenv.jar/reports/labenvironmentdatabaseeventpopup.jsp'
4788 02 May 18 olle 1067     when clicking on the attached target. The sensor id should be stored
4788 02 May 18 olle 1068     in attribute 'data-sensor', the date in 'data-date',
4788 02 May 18 olle 1069     and the title in 'data-title'.
4788 02 May 18 olle 1070   */
4788 02 May 18 olle 1071   labenvs.viewDataOnClick = function(event)
4788 02 May 18 olle 1072   {
4788 02 May 18 olle 1073     var homeLabEnv = Data.get('page-data', 'home-labenv');
4788 02 May 18 olle 1074     var title = Data.get(event.currentTarget, 'title');
4788 02 May 18 olle 1075     var sensor = Data.get(event.currentTarget, 'sensor');
4788 02 May 18 olle 1076     var date = Data.get(event.currentTarget, 'date');
4788 02 May 18 olle 1077     var url = homeLabEnv;
4788 02 May 18 olle 1078     url += '/reports/labenvironmentdatabaseeventpopup.jsp';
4788 02 May 18 olle 1079     url += '?ID='+App.getSessionId();
4788 02 May 18 olle 1080     url += '&pageTitle='+encodeURIComponent(title);
4788 02 May 18 olle 1081     url += '&labSensorUrl='+encodeURIComponent(sensor);
4788 02 May 18 olle 1082     url += '&originDate='+encodeURIComponent(date);
4788 02 May 18 olle 1083     Dialogs.openPopup(url, title, 820, 768);
4788 02 May 18 olle 1084   }
4788 02 May 18 olle 1085   
4788 02 May 18 olle 1086   return labenvs;
4788 02 May 18 olle 1087 }();
4788 02 May 18 olle 1088
4788 02 May 18 olle 1089 Doc.onLoad(CaseSummaryAltRec.initPage);