extensions/net.sf.basedb.reggie/trunk/resources/delivery/list.js

Code
Comments
Other
Rev Date Author Line
4000 17 Jun 16 nicklas 1 var Delivery = function()
4000 17 Jun 16 nicklas 2 {
4000 17 Jun 16 nicklas 3   var delivery = {};
4000 17 Jun 16 nicklas 4   var debug = 0;
4000 17 Jun 16 nicklas 5   
4009 23 Jun 16 nicklas 6   // Information about the currently logged in user
4007 21 Jun 16 nicklas 7   var currentUser = null;
4009 23 Jun 16 nicklas 8   // The last URL used for loading specimen 
4009 23 Jun 16 nicklas 9   // We need it to be able to re-load the list after a download
4006 21 Jun 16 nicklas 10   var loadUrl = null;
4009 23 Jun 16 nicklas 11   // If the URL is loading the default (last 30 days) or has other search parameters
4006 21 Jun 16 nicklas 12   var hasSearchParameters = false;
4000 17 Jun 16 nicklas 13   
4009 23 Jun 16 nicklas 14   // Months in the "select month" list
4008 22 Jun 16 nicklas 15   var FIRST_YEAR = debug ? 2010 : 2016;
4008 22 Jun 16 nicklas 16   var MONTHS = [
4008 22 Jun 16 nicklas 17     'Januari', 'Februari', 'Mars', 'April', 'Maj', 'Juni',
4008 22 Jun 16 nicklas 18     'Juli', 'Augusti', 'September', 'Oktober', 'November', 'December'
4008 22 Jun 16 nicklas 19     ];
4008 22 Jun 16 nicklas 20
4009 23 Jun 16 nicklas 21   // Number of minutes before session timeout to display a warning
4009 23 Jun 16 nicklas 22   var WARN_BEFORE_TIMEOUT = 5;
4008 22 Jun 16 nicklas 23   
4000 17 Jun 16 nicklas 24   // Page initialization
4000 17 Jun 16 nicklas 25   delivery.initPage = function()
4000 17 Jun 16 nicklas 26   {
4009 23 Jun 16 nicklas 27     // The month selection list
4009 23 Jun 16 nicklas 28     delivery.createMonthSelectionList();
4009 23 Jun 16 nicklas 29     Events.addEventHandler('search-by-month', 'click', delivery.showMonthList);
4009 23 Jun 16 nicklas 30     Events.addEventHandler(document.body, 'click', delivery.hideMonthList);
4009 23 Jun 16 nicklas 31     Events.addEventHandler('month-list', 'click', delivery.searchByMonth);
4008 22 Jun 16 nicklas 32     
4009 23 Jun 16 nicklas 33     // The default search (last 30 days)
4009 23 Jun 16 nicklas 34     Events.addEventHandler('search-last-30', 'click', delivery.searchLast30Days);
4009 23 Jun 16 nicklas 35     
4009 23 Jun 16 nicklas 36     // The manual search box
4009 23 Jun 16 nicklas 37     Events.doOnEnter('search', delivery.searchReports);
4009 23 Jun 16 nicklas 38     Events.addEventHandler('btnSearch', 'click', delivery.searchReports);
4009 23 Jun 16 nicklas 39     
4009 23 Jun 16 nicklas 40     // Logout button    
4009 23 Jun 16 nicklas 41     Buttons.addClickHandler('btnLogout', delivery.logout);
4009 23 Jun 16 nicklas 42     
4009 23 Jun 16 nicklas 43     // Start timout check timer
4009 23 Jun 16 nicklas 44     delivery.updateTimeout();
4009 23 Jun 16 nicklas 45
4009 23 Jun 16 nicklas 46     // Perform the default search
4009 23 Jun 16 nicklas 47     delivery.searchLast30Days();
4009 23 Jun 16 nicklas 48   }
4009 23 Jun 16 nicklas 49   
4009 23 Jun 16 nicklas 50   /**
4009 23 Jun 16 nicklas 51     Initialize the month selection list. 
4009 23 Jun 16 nicklas 52   */
4009 23 Jun 16 nicklas 53   delivery.createMonthSelectionList = function()
4009 23 Jun 16 nicklas 54   {
4008 22 Jun 16 nicklas 55     var now = new Date();
4008 22 Jun 16 nicklas 56     var year = now.getFullYear();
4008 22 Jun 16 nicklas 57     var month = now.getMonth();
4008 22 Jun 16 nicklas 58
4008 22 Jun 16 nicklas 59     var html = '';
4008 22 Jun 16 nicklas 60     var numMonths = 0;
4008 22 Jun 16 nicklas 61     while (year > FIRST_YEAR || year == FIRST_YEAR && month >= 0)
4008 22 Jun 16 nicklas 62     {
4008 22 Jun 16 nicklas 63       var monthClass = 'month';
4008 22 Jun 16 nicklas 64       if (month < 0)
4008 22 Jun 16 nicklas 65       {
4008 22 Jun 16 nicklas 66         month = 11;
4008 22 Jun 16 nicklas 67         year--;
4008 22 Jun 16 nicklas 68         monthClass += ' new-year full-year';
4008 22 Jun 16 nicklas 69       }
4008 22 Jun 16 nicklas 70       if (numMonths == 0) monthClass += ' full-year';
4008 22 Jun 16 nicklas 71       html += '<div class="'+monthClass+'" data-year="'+year+'" data-month="'+month+'">';
4008 22 Jun 16 nicklas 72       if (month == 11 || numMonths == 0)
4008 22 Jun 16 nicklas 73       {
4008 22 Jun 16 nicklas 74         html += year + ' ';
4008 22 Jun 16 nicklas 75       }
4008 22 Jun 16 nicklas 76       html += MONTHS[month] + '</div>';
4008 22 Jun 16 nicklas 77       month--;
4008 22 Jun 16 nicklas 78       numMonths++;
4008 22 Jun 16 nicklas 79     }
4008 22 Jun 16 nicklas 80     
4009 23 Jun 16 nicklas 81     Doc.element('month-list').innerHTML = html;
4006 21 Jun 16 nicklas 82   }
4006 21 Jun 16 nicklas 83   
4009 23 Jun 16 nicklas 84   /**
4009 23 Jun 16 nicklas 85     Display the month selection list. It is
4009 23 Jun 16 nicklas 86     placed in relation to the current moust 
4009 23 Jun 16 nicklas 87     position.
4009 23 Jun 16 nicklas 88   */
4009 23 Jun 16 nicklas 89   delivery.showMonthList = function(event)
4008 22 Jun 16 nicklas 90   {
4009 23 Jun 16 nicklas 91     var monthList = Doc.element('month-list');
4008 22 Jun 16 nicklas 92     var x = event.clientX;
4008 22 Jun 16 nicklas 93     var y = event.clientY+2;
4008 22 Jun 16 nicklas 94
4009 23 Jun 16 nicklas 95     monthList.style.left = (x)+'px';
4009 23 Jun 16 nicklas 96     monthList.style.top = (y)+'px';
4008 22 Jun 16 nicklas 97     event.stopPropagation();
4008 22 Jun 16 nicklas 98     
4009 23 Jun 16 nicklas 99     Doc.show(monthList);
4008 22 Jun 16 nicklas 100   }
4008 22 Jun 16 nicklas 101   
4009 23 Jun 16 nicklas 102   /**
4009 23 Jun 16 nicklas 103     Hide the month selection list.
4009 23 Jun 16 nicklas 104   */
4009 23 Jun 16 nicklas 105   delivery.hideMonthList = function()
4008 22 Jun 16 nicklas 106   {
4009 23 Jun 16 nicklas 107     Doc.hide('month-list');
4008 22 Jun 16 nicklas 108   }
4008 22 Jun 16 nicklas 109   
4009 23 Jun 16 nicklas 110   /**
4009 23 Jun 16 nicklas 111     Search for samples from the given month that
4009 23 Jun 16 nicklas 112     was clicked.
4009 23 Jun 16 nicklas 113    */
4009 23 Jun 16 nicklas 114   delivery.searchByMonth = function(event)
4008 22 Jun 16 nicklas 115   {
4008 22 Jun 16 nicklas 116     var target = event.target;
4008 22 Jun 16 nicklas 117
4008 22 Jun 16 nicklas 118     var month = Data.int(target, 'month');
4008 22 Jun 16 nicklas 119     var year = Data.int(target, 'year');
4008 22 Jun 16 nicklas 120     
4008 22 Jun 16 nicklas 121     var title = 'Prov med ankomstdatum ' + MONTHS[month] + ' ' + year;
4008 22 Jun 16 nicklas 122     var parameters = '&year='+year+'&month='+month;
4008 22 Jun 16 nicklas 123     delivery.prepareForNewSearch(title, parameters);
4008 22 Jun 16 nicklas 124   }
4008 22 Jun 16 nicklas 125   
4009 23 Jun 16 nicklas 126   /**
4009 23 Jun 16 nicklas 127     Search for samples from the last 30 days (default search).
4009 23 Jun 16 nicklas 128   */
4009 23 Jun 16 nicklas 129   delivery.searchLast30Days = function()
4007 21 Jun 16 nicklas 130   {
4009 23 Jun 16 nicklas 131     var title = 'Prov med ankomstdatum de senaste 30 dagarna';
4009 23 Jun 16 nicklas 132     delivery.prepareForNewSearch(title, null);
4009 23 Jun 16 nicklas 133   }
4009 23 Jun 16 nicklas 134
4009 23 Jun 16 nicklas 135   /**
4009 23 Jun 16 nicklas 136     Manual query for personal number, SCANB-ID, etc.
4009 23 Jun 16 nicklas 137    */
4009 23 Jun 16 nicklas 138   delivery.searchReports = function()
4009 23 Jun 16 nicklas 139   {
4009 23 Jun 16 nicklas 140     var query = Doc.element('search').value;
4009 23 Jun 16 nicklas 141     if (!query) 
4007 21 Jun 16 nicklas 142     {
4009 23 Jun 16 nicklas 143       Doc.element('search').focus();
4009 23 Jun 16 nicklas 144       return;
4007 21 Jun 16 nicklas 145     }
4007 21 Jun 16 nicklas 146     
4009 23 Jun 16 nicklas 147     var title = 'Prov som matchar \'' + Strings.encodeTags(query) + '\'';
4009 23 Jun 16 nicklas 148     var parameters = '&query='+encodeURIComponent(query);
4009 23 Jun 16 nicklas 149     delivery.prepareForNewSearch(title, parameters);
4007 21 Jun 16 nicklas 150   }
4009 23 Jun 16 nicklas 151
4009 23 Jun 16 nicklas 152   /**
4009 23 Jun 16 nicklas 153     Prepare for a search by updating the title elements on
4009 23 Jun 16 nicklas 154     the web page and generating the query url.
4009 23 Jun 16 nicklas 155   */
4006 21 Jun 16 nicklas 156   delivery.prepareForNewSearch = function(title, urlParameters)
4006 21 Jun 16 nicklas 157   {
4009 23 Jun 16 nicklas 158     // Update titles and clear the search box
4009 23 Jun 16 nicklas 159     if (title) delivery.setDocumentTitle(title);
4006 21 Jun 16 nicklas 160     Doc.element('search').value = '';
4006 21 Jun 16 nicklas 161
4009 23 Jun 16 nicklas 162     // Hide existing results...
4006 21 Jun 16 nicklas 163     Doc.hide('new-reports-section');
4006 21 Jun 16 nicklas 164     Doc.hide('work-in-progress-section');
4006 21 Jun 16 nicklas 165     Doc.hide('archive-section');
4009 23 Jun 16 nicklas 166
4009 23 Jun 16 nicklas 167     // Show a message for the user
4009 23 Jun 16 nicklas 168     delivery.showMessage('Ett ögonblick, informationen hämtas...');
4006 21 Jun 16 nicklas 169     
4006 21 Jun 16 nicklas 170     loadUrl = '../Delivery.servlet?ID='+App.getSessionId();
4006 21 Jun 16 nicklas 171     loadUrl += '&cmd=LoadYellowSpecimen';
4008 22 Jun 16 nicklas 172     if (debug) loadUrl += '&debug=1';
4006 21 Jun 16 nicklas 173     if (urlParameters)
4006 21 Jun 16 nicklas 174     {
4006 21 Jun 16 nicklas 175       loadUrl += urlParameters;
4006 21 Jun 16 nicklas 176       hasSearchParameters = true;
4006 21 Jun 16 nicklas 177     }
4006 21 Jun 16 nicklas 178     else
4006 21 Jun 16 nicklas 179     {
4006 21 Jun 16 nicklas 180       hasSearchParameters = false;
4006 21 Jun 16 nicklas 181     }
4005 21 Jun 16 nicklas 182     delivery.loadSpecimenInformation();
4005 21 Jun 16 nicklas 183   }
4009 23 Jun 16 nicklas 184
4009 23 Jun 16 nicklas 185   /**
4009 23 Jun 16 nicklas 186     Update titles on the web page. Typically used
4009 23 Jun 16 nicklas 187     to reflect the current search.
4009 23 Jun 16 nicklas 188   */
4009 23 Jun 16 nicklas 189   delivery.setDocumentTitle = function(title)
4006 21 Jun 16 nicklas 190   {
4009 23 Jun 16 nicklas 191     Doc.element('page-title').innerHTML = title;
4009 23 Jun 16 nicklas 192     document.title = title;
4006 21 Jun 16 nicklas 193   }
4005 21 Jun 16 nicklas 194   
4009 23 Jun 16 nicklas 195   /**
4009 23 Jun 16 nicklas 196     Display a message for the user.
4009 23 Jun 16 nicklas 197   */
4009 23 Jun 16 nicklas 198   delivery.showMessage = function(msg)
4006 21 Jun 16 nicklas 199   {
4009 23 Jun 16 nicklas 200     Doc.element('message-text').innerHTML = msg;
4009 23 Jun 16 nicklas 201     Doc.show('message-section');
4006 21 Jun 16 nicklas 202   }
4009 23 Jun 16 nicklas 203
4009 23 Jun 16 nicklas 204   /**
4009 23 Jun 16 nicklas 205     Set information about the current user.
4009 23 Jun 16 nicklas 206   */
4009 23 Jun 16 nicklas 207   delivery.setUserInformation = function(userInfo)
4006 21 Jun 16 nicklas 208   {
4009 23 Jun 16 nicklas 209     currentUser = userInfo;
4009 23 Jun 16 nicklas 210     Doc.element('current-username').innerHTML = Strings.encodeTags(currentUser.username);
4009 23 Jun 16 nicklas 211     Doc.show('user-section');
4006 21 Jun 16 nicklas 212   }
4006 21 Jun 16 nicklas 213   
4009 23 Jun 16 nicklas 214   /**
4009 23 Jun 16 nicklas 215     Load specimen and report information.
4009 23 Jun 16 nicklas 216   */
4005 21 Jun 16 nicklas 217   delivery.loadSpecimenInformation = function()
4005 21 Jun 16 nicklas 218   {
4006 21 Jun 16 nicklas 219     if (loadUrl == null)
4006 21 Jun 16 nicklas 220     {
4006 21 Jun 16 nicklas 221       loadUrl = '../Delivery.servlet?ID='+App.getSessionId();
4006 21 Jun 16 nicklas 222       loadUrl += '&cmd=LoadYellowSpecimen';
4006 21 Jun 16 nicklas 223     }
4009 23 Jun 16 nicklas 224     Wizard.asyncJsonRequest(loadUrl, delivery.onSpecimenLoaded, 'GET', null, delivery.errorHandler);
4000 17 Jun 16 nicklas 225   }
4009 23 Jun 16 nicklas 226
4009 23 Jun 16 nicklas 227   /**
4009 23 Jun 16 nicklas 228     Callback when specimen information has been successfully loaded.
4009 23 Jun 16 nicklas 229   */
4000 17 Jun 16 nicklas 230   delivery.onSpecimenLoaded = function(response)
4000 17 Jun 16 nicklas 231   {
4009 23 Jun 16 nicklas 232     Doc.hide('message-section');
4009 23 Jun 16 nicklas 233     
4009 23 Jun 16 nicklas 234     // Update information about current user
4009 23 Jun 16 nicklas 235     if (response.user) delivery.setUserInformation(response.user);
4009 23 Jun 16 nicklas 236     
4000 17 Jun 16 nicklas 237     // For debugging!
4000 17 Jun 16 nicklas 238     //response.newReports = [];
4000 17 Jun 16 nicklas 239     //response.workInProgress = [];
4000 17 Jun 16 nicklas 240     //response.archived = [];
4000 17 Jun 16 nicklas 241     
4009 23 Jun 16 nicklas 242     // Generate a table with 3 sections: new reports, work in progres and archive.
4000 17 Jun 16 nicklas 243     var html;
4000 17 Jun 16 nicklas 244     var numReports = 0;
4000 17 Jun 16 nicklas 245     numReports += response.newReports.length;
4005 21 Jun 16 nicklas 246     html = delivery.createTBodySection(response.newReports, 'new-report', 'Nya rapporter', 'Det finns inga nya rapporter.');
4000 17 Jun 16 nicklas 247     Doc.element('new-reports-section').innerHTML = html;
4006 21 Jun 16 nicklas 248     Doc.showHide('new-reports-section', response.newReports.length > 0 || !hasSearchParameters);
4005 21 Jun 16 nicklas 249     
4000 17 Jun 16 nicklas 250     numReports += response.workInProgress.length;
4000 17 Jun 16 nicklas 251     html = delivery.createTBodySection(response.workInProgress, 'work-in-progress', 'Arbete pågår');
4000 17 Jun 16 nicklas 252     Doc.element('work-in-progress-section').innerHTML = html;
4000 17 Jun 16 nicklas 253     Doc.showHide('work-in-progress-section', response.workInProgress.length > 0);
4000 17 Jun 16 nicklas 254     
4000 17 Jun 16 nicklas 255     numReports += response.archived.length;
4000 17 Jun 16 nicklas 256     html = delivery.createTBodySection(response.archived, 'archived-report');
4000 17 Jun 16 nicklas 257     Doc.element('archive-section').innerHTML = html;
4000 17 Jun 16 nicklas 258     Doc.showHide('archive-section', response.archived.length > 0);
4000 17 Jun 16 nicklas 259     
4009 23 Jun 16 nicklas 260     if (numReports == 0) 
4009 23 Jun 16 nicklas 261     {
4009 23 Jun 16 nicklas 262       delivery.showMessage('Det finns inga rapporter.');
4009 23 Jun 16 nicklas 263       Doc.hide('new-reports-section');
4009 23 Jun 16 nicklas 264     }
4004 20 Jun 16 nicklas 265     
4009 23 Jun 16 nicklas 266     // Handle links to PDF documents
4004 20 Jun 16 nicklas 267     var pdfLinks = document.getElementsByClassName('download-pdf');
4004 20 Jun 16 nicklas 268     for (var pdfNo = 0; pdfNo < pdfLinks.length; pdfNo++)
4004 20 Jun 16 nicklas 269     {
4004 20 Jun 16 nicklas 270       Events.addEventHandler(pdfLinks[pdfNo], 'click', delivery.downloadPdf);
4004 20 Jun 16 nicklas 271     }
4000 17 Jun 16 nicklas 272   }
4000 17 Jun 16 nicklas 273
4004 20 Jun 16 nicklas 274   
4009 23 Jun 16 nicklas 275   /**
4009 23 Jun 16 nicklas 276     Generate HTML for a section in the table.
4009 23 Jun 16 nicklas 277     specimen = List of specimen information
4009 23 Jun 16 nicklas 278     rowClass = Class attribute of each new <tr> tag
4009 23 Jun 16 nicklas 279     header = Header text for the section (rotated; may be null)
4009 23 Jun 16 nicklas 280     msgIfNoSpecimen = Message to display if the specimen list is emtpy
4009 23 Jun 16 nicklas 281   */
4005 21 Jun 16 nicklas 282   delivery.createTBodySection = function(specimen, rowClass, header, msgIfNoSpecimen)
4000 17 Jun 16 nicklas 283   {
4000 17 Jun 16 nicklas 284     var html = '';
4005 21 Jun 16 nicklas 285     if (specimen.length == 0 && msgIfNoSpecimen)
4005 21 Jun 16 nicklas 286     {
4005 21 Jun 16 nicklas 287       html += '<tr class="'+rowClass+'">';
4005 21 Jun 16 nicklas 288       if (header)
4005 21 Jun 16 nicklas 289       {
4005 21 Jun 16 nicklas 290         html += '<td class="section-header small"></td>';
4005 21 Jun 16 nicklas 291       }
4005 21 Jun 16 nicklas 292       else
4005 21 Jun 16 nicklas 293       {
4005 21 Jun 16 nicklas 294         html += '<td></td>';
4005 21 Jun 16 nicklas 295       }
4005 21 Jun 16 nicklas 296       html += '<td colspan="8">' + msgIfNoSpecimen + '</td>';
4005 21 Jun 16 nicklas 297       html += '</tr>';
4005 21 Jun 16 nicklas 298     }
4005 21 Jun 16 nicklas 299     
4000 17 Jun 16 nicklas 300     for (var spNo = 0; spNo < specimen.length; spNo++)
4000 17 Jun 16 nicklas 301     {
4000 17 Jun 16 nicklas 302       var sp = specimen[spNo];
4000 17 Jun 16 nicklas 303       var pat = sp.patient;
4000 17 Jun 16 nicklas 304       var report = sp.pilotReport;
4000 17 Jun 16 nicklas 305       
4000 17 Jun 16 nicklas 306       html += '<tr class="'+rowClass+'">';
4000 17 Jun 16 nicklas 307       if (header)
4000 17 Jun 16 nicklas 308       {
4000 17 Jun 16 nicklas 309         if (spNo == 0)
4000 17 Jun 16 nicklas 310         {
4000 17 Jun 16 nicklas 311           html += '<td rowspan="'+specimen.length+'" class="section-header">';
4000 17 Jun 16 nicklas 312           html += '<div class="rotate">'+header+'</div>';
4000 17 Jun 16 nicklas 313           html += '</td>';
4000 17 Jun 16 nicklas 314         }
4000 17 Jun 16 nicklas 315       }
4000 17 Jun 16 nicklas 316       else
4000 17 Jun 16 nicklas 317       {
4000 17 Jun 16 nicklas 318         html += '<td></td>';
4000 17 Jun 16 nicklas 319       }
4000 17 Jun 16 nicklas 320       
4000 17 Jun 16 nicklas 321       html += '<td>'+Strings.encodeTags(pat.PersonalNo)+'</td>';
4000 17 Jun 16 nicklas 322       html += '<td>'+Strings.encodeTags(pat.AllFirstNames + ' ' + pat.FamilyName)+'</td>';
4037 29 Jul 16 nicklas 323       html += '<td>'+Strings.encodeTags(sp.PAD)+'</td>';
4000 17 Jun 16 nicklas 324       html += '<td>'+Strings.encodeTags(sp.name)+'</td>';
4000 17 Jun 16 nicklas 325       html += '<td>'+Reggie.reformatDate(sp.ArrivalDate)+'</td>';
4000 17 Jun 16 nicklas 326       
4000 17 Jun 16 nicklas 327       if (report)
4000 17 Jun 16 nicklas 328       {
4000 17 Jun 16 nicklas 329         html += '<td>'+Reggie.reformatDate(report.lastUpdatedDate)+'</td>';
4000 17 Jun 16 nicklas 330         if (report.downloadCount)
4000 17 Jun 16 nicklas 331         {
4000 17 Jun 16 nicklas 332           html += '<td>'+Reggie.reformatDate(report.downloadedDate)+' ('+report.downloadCount+')</td>';
4000 17 Jun 16 nicklas 333         }
4000 17 Jun 16 nicklas 334         else
4000 17 Jun 16 nicklas 335         {
4000 17 Jun 16 nicklas 336           html += '<td>Nej</td>';
4000 17 Jun 16 nicklas 337         }
4004 20 Jun 16 nicklas 338         html += '<td><img src="images/pdf-26.png" class="link download-pdf"';
4009 23 Jun 16 nicklas 339         html += ' title="Ladda ner den här rapporten"';
4004 20 Jun 16 nicklas 340         html += ' data-file-id="'+report.id+'" data-specimen-id="'+sp.id+'"></td>';
4000 17 Jun 16 nicklas 341       }
4040 29 Jul 16 nicklas 342       else if (sp.CompletedDate)
4040 29 Jul 16 nicklas 343       {
4040 29 Jul 16 nicklas 344         html += '<td class="completed-without-report" colspan="3">';
4182 27 Oct 16 nicklas 345         html += 'Rapport saknas. Kontakta SCAN-B lab för information.</td>';
4040 29 Jul 16 nicklas 346       }
4000 17 Jun 16 nicklas 347       else
4000 17 Jun 16 nicklas 348       {
4000 17 Jun 16 nicklas 349         html += '<td colspan="3"></td>';
4000 17 Jun 16 nicklas 350       }
4000 17 Jun 16 nicklas 351       
4000 17 Jun 16 nicklas 352       html += '</tr>';
4000 17 Jun 16 nicklas 353     }
4000 17 Jun 16 nicklas 354     
4000 17 Jun 16 nicklas 355     return html;
4000 17 Jun 16 nicklas 356   }
4009 23 Jun 16 nicklas 357
4009 23 Jun 16 nicklas 358   /**
4009 23 Jun 16 nicklas 359     Download a PDF document.
4009 23 Jun 16 nicklas 360   */
4009 23 Jun 16 nicklas 361   delivery.downloadPdf = function(event)
4009 23 Jun 16 nicklas 362   {
4009 23 Jun 16 nicklas 363     var target = event.currentTarget;
4009 23 Jun 16 nicklas 364     
4009 23 Jun 16 nicklas 365     var url = '../Delivery.servlet?ID='+App.getSessionId();
4009 23 Jun 16 nicklas 366     url += '&cmd=DownloadReport';
4009 23 Jun 16 nicklas 367     url += '&fileId='+Data.int(target, 'file-id');
4009 23 Jun 16 nicklas 368     url += '&specimenId='+Data.int(target, 'specimen-id');
4009 23 Jun 16 nicklas 369     
4009 23 Jun 16 nicklas 370     // The timeout will update the list with specimen
4009 23 Jun 16 nicklas 371     // (since the report may move between sections)
4009 23 Jun 16 nicklas 372     setTimeout(delivery.loadSpecimenInformation, 1500);
4009 23 Jun 16 nicklas 373     
4009 23 Jun 16 nicklas 374     window.open(url, 'DownloadPdf', 'width=600,height=400');
4009 23 Jun 16 nicklas 375   }
4009 23 Jun 16 nicklas 376
4009 23 Jun 16 nicklas 377   /**
4009 23 Jun 16 nicklas 378     Logout.
4009 23 Jun 16 nicklas 379   */
4009 23 Jun 16 nicklas 380   delivery.logout = function()
4009 23 Jun 16 nicklas 381   {
4009 23 Jun 16 nicklas 382     Doc.element('auto-logout').innerHTML = 'Loggar ut...';
4009 23 Jun 16 nicklas 383     var url = '../Delivery.servlet?ID='+App.getSessionId();
4009 23 Jun 16 nicklas 384     url += '&cmd=Logout';
4009 23 Jun 16 nicklas 385     // Request for logging out, all responses will trigger the redirect
4009 23 Jun 16 nicklas 386     Wizard.asyncJsonRequest(url, delivery.onLoggedOut, 'GET', null, delivery.onLoggedOut);
4009 23 Jun 16 nicklas 387   }
4000 17 Jun 16 nicklas 388   
4009 23 Jun 16 nicklas 389   /**
4009 23 Jun 16 nicklas 390     Redirect to the login page without history.
4009 23 Jun 16 nicklas 391   */
4009 23 Jun 16 nicklas 392   delivery.onLoggedOut = function()
4009 23 Jun 16 nicklas 393   {
4009 23 Jun 16 nicklas 394     location.replace('index.jsp');
4009 23 Jun 16 nicklas 395   }
4005 21 Jun 16 nicklas 396   
4009 23 Jun 16 nicklas 397   /**
4009 23 Jun 16 nicklas 398     Update timeout information for the current session. If the
4009 23 Jun 16 nicklas 399     timeout has been passed and automatick logout request is
4009 23 Jun 16 nicklas 400     sent.
4009 23 Jun 16 nicklas 401   */
4009 23 Jun 16 nicklas 402   delivery.updateTimeout = function()
4009 23 Jun 16 nicklas 403   {
4009 23 Jun 16 nicklas 404     if (currentUser) 
4009 23 Jun 16 nicklas 405     {
4009 23 Jun 16 nicklas 406       var timeout = currentUser.timeout;
4009 23 Jun 16 nicklas 407       var now = new Date().getTime();
4009 23 Jun 16 nicklas 408       
4009 23 Jun 16 nicklas 409       if (timeout < now)
4009 23 Jun 16 nicklas 410       {
4009 23 Jun 16 nicklas 411         // Auto logout should happen now
4009 23 Jun 16 nicklas 412         delivery.logout();
4009 23 Jun 16 nicklas 413         return;
4009 23 Jun 16 nicklas 414       }
4009 23 Jun 16 nicklas 415       
4009 23 Jun 16 nicklas 416       // Minutes to timeout rounded up
4009 23 Jun 16 nicklas 417       var minutesToTimeout = Math.ceil((timeout - now) / 60000);
4009 23 Jun 16 nicklas 418       // Seconds to timeout rounded up to nearest 15 seconds
4009 23 Jun 16 nicklas 419       var secondsToTimeout = 15 * Math.ceil((timeout - now) / 15000);
4009 23 Jun 16 nicklas 420
4009 23 Jun 16 nicklas 421       var autoLogout = '';
4009 23 Jun 16 nicklas 422       if (minutesToTimeout > 1)
4009 23 Jun 16 nicklas 423       {
4009 23 Jun 16 nicklas 424         // There is still more than one minute 
4009 23 Jun 16 nicklas 425         // Display a warning if it is less than the warning limit
4009 23 Jun 16 nicklas 426         if (minutesToTimeout <= WARN_BEFORE_TIMEOUT)
4009 23 Jun 16 nicklas 427         {
4009 23 Jun 16 nicklas 428           autoLogout = 'Automatisk utloggning om <b>'+minutesToTimeout+' minuter</b>';
4009 23 Jun 16 nicklas 429         }
4009 23 Jun 16 nicklas 430       }
4009 23 Jun 16 nicklas 431       else
4009 23 Jun 16 nicklas 432       {
4009 23 Jun 16 nicklas 433         autoLogout = 'Automatisk utloggning om <b>'+secondsToTimeout+' sekunder</b>';
4009 23 Jun 16 nicklas 434       }
4009 23 Jun 16 nicklas 435       Doc.element('auto-logout').innerHTML = autoLogout;
4009 23 Jun 16 nicklas 436     }
4009 23 Jun 16 nicklas 437     
4009 23 Jun 16 nicklas 438     // Repeat every 5 seconds
4009 23 Jun 16 nicklas 439     setTimeout(delivery.updateTimeout, 5000);
4009 23 Jun 16 nicklas 440   }
4009 23 Jun 16 nicklas 441   
4009 23 Jun 16 nicklas 442   /**
4009 23 Jun 16 nicklas 443     Error handler for AJAX requests
4009 23 Jun 16 nicklas 444   */
4009 23 Jun 16 nicklas 445   delivery.errorHandler = function(response, error)
4009 23 Jun 16 nicklas 446   {
4009 23 Jun 16 nicklas 447     if (debug) 
4009 23 Jun 16 nicklas 448     {
4009 23 Jun 16 nicklas 449       App.debug(response);
4009 23 Jun 16 nicklas 450       App.debug(error);
4009 23 Jun 16 nicklas 451     }
4009 23 Jun 16 nicklas 452     
4009 23 Jun 16 nicklas 453     // Try to translate the error to Swedish
4009 23 Jun 16 nicklas 454     var err = delivery.translateError(response ? response.message : error.toString());
4009 23 Jun 16 nicklas 455   
4009 23 Jun 16 nicklas 456     var msg = 'Det gick inte att hämta information om proven!';
4009 23 Jun 16 nicklas 457     msg += '<div class="error-text" title="'+Strings.encodeTags(err.originalMessage)+'">';
4009 23 Jun 16 nicklas 458     msg += Strings.encodeTags(err.message);
4009 23 Jun 16 nicklas 459     msg += '</div>';
4009 23 Jun 16 nicklas 460
4009 23 Jun 16 nicklas 461     delivery.showMessage(msg);
4009 23 Jun 16 nicklas 462   }
4009 23 Jun 16 nicklas 463
4009 23 Jun 16 nicklas 464   /**
4009 23 Jun 16 nicklas 465     Translate some common error messages to Swedish. Returns an object with
4009 23 Jun 16 nicklas 466     * originalMessage: The original error message
4009 23 Jun 16 nicklas 467     * message: The translated error message (or the original if no translation was found)
4009 23 Jun 16 nicklas 468     
4009 23 Jun 16 nicklas 469     If the error message indicates that the session is no longer active the
4009 23 Jun 16 nicklas 470     browser will be redirected to the login page.
4009 23 Jun 16 nicklas 471   */
4009 23 Jun 16 nicklas 472   delivery.translateError = function(message)
4009 23 Jun 16 nicklas 473   {
4009 23 Jun 16 nicklas 474     var err = {};
4009 23 Jun 16 nicklas 475     err.originalMessage = message;
4009 23 Jun 16 nicklas 476     err.message = message;
4009 23 Jun 16 nicklas 477
4009 23 Jun 16 nicklas 478     // The user has logged out!
4009 23 Jun 16 nicklas 479     if (message.indexOf('Not logged in') >= 0 ||
4009 23 Jun 16 nicklas 480       (message.indexOf('Item not found') >= 0 && message.indexOf('SessionControl') >= 0))
4009 23 Jun 16 nicklas 481     {
4009 23 Jun 16 nicklas 482       delivery.onLoggedOut();
4009 23 Jun 16 nicklas 483     }
4009 23 Jun 16 nicklas 484     
4009 23 Jun 16 nicklas 485     if (message.indexOf('Permission denied') >= 0 || 
4009 23 Jun 16 nicklas 486       (message.indexOf('Item not found') >= 0 && message.indexOf('AnnotationType') >= 0))
4009 23 Jun 16 nicklas 487     {
4009 23 Jun 16 nicklas 488       err.message = 'Behörighet saknas';
4009 23 Jun 16 nicklas 489       
4009 23 Jun 16 nicklas 490       if (message.indexOf('Biosource') >= 0)
4009 23 Jun 16 nicklas 491       {
4009 23 Jun 16 nicklas 492         err.message += ' för åtkomst till patient-information';
4009 23 Jun 16 nicklas 493       }
4009 23 Jun 16 nicklas 494       else if (message.indexOf('Sample') >= 0)
4009 23 Jun 16 nicklas 495       {
4009 23 Jun 16 nicklas 496         err.message += ' för åtkomst till prov-information';
4009 23 Jun 16 nicklas 497       }
4009 23 Jun 16 nicklas 498       else if (message.indexOf('Annotation') >= 0)
4009 23 Jun 16 nicklas 499       {
4009 23 Jun 16 nicklas 500         if (message.indexOf('PersonalNumber') >= 0 || 
4009 23 Jun 16 nicklas 501           message.indexOf('AllFirstNames') >= 0 || 
4009 23 Jun 16 nicklas 502           message.indexOf('FamilyName') >= 0)
4009 23 Jun 16 nicklas 503         {
4009 23 Jun 16 nicklas 504           err.message += ' för åtkomst till patient-information';
4009 23 Jun 16 nicklas 505         }
4009 23 Jun 16 nicklas 506         else
4009 23 Jun 16 nicklas 507         {
4009 23 Jun 16 nicklas 508           err.message += ' för åtkomst till prov-information';
4009 23 Jun 16 nicklas 509         }
4009 23 Jun 16 nicklas 510       }
4009 23 Jun 16 nicklas 511     }
4009 23 Jun 16 nicklas 512
4009 23 Jun 16 nicklas 513     return err;
4009 23 Jun 16 nicklas 514   }
4009 23 Jun 16 nicklas 515
4000 17 Jun 16 nicklas 516   return delivery;
4000 17 Jun 16 nicklas 517 }();
4000 17 Jun 16 nicklas 518
4000 17 Jun 16 nicklas 519 Doc.onLoad(Delivery.initPage);
4000 17 Jun 16 nicklas 520
4000 17 Jun 16 nicklas 521
4000 17 Jun 16 nicklas 522