extensions/net.sf.basedb.reggie/trunk/resources/sampleproc/paused-specimen.js

Code
Comments
Other
Rev Date Author Line
5341 02 Apr 19 nicklas 1 var PausedSpecimen = function()
5341 02 Apr 19 nicklas 2 {
5341 02 Apr 19 nicklas 3   var paused = {};
5341 02 Apr 19 nicklas 4   var debug = 0;
5341 02 Apr 19 nicklas 5   
5341 02 Apr 19 nicklas 6   var specimen;
5341 02 Apr 19 nicklas 7   var sites;
5341 02 Apr 19 nicklas 8   
5341 02 Apr 19 nicklas 9   // Page initialization
5341 02 Apr 19 nicklas 10   paused.initPage = function()
5341 02 Apr 19 nicklas 11   {
5341 02 Apr 19 nicklas 12     // Step 1
5341 02 Apr 19 nicklas 13     Events.addEventHandler('nameFilter', 'change', paused.filterOnChange);
5341 02 Apr 19 nicklas 14     Events.addEventHandler('statusFilter', 'change', paused.filterOnChange);
5341 02 Apr 19 nicklas 15     Events.addEventHandler('siteFilter', 'change', paused.filterOnChange);
5341 02 Apr 19 nicklas 16     Events.addEventHandler('samplingDateFilter', 'change', paused.filterOnChange);
5341 02 Apr 19 nicklas 17     Events.addEventHandler('arrivalDateFilter', 'change', paused.filterOnChange);
5341 02 Apr 19 nicklas 18     Events.addEventHandler('storageBoxFilter', 'change', paused.filterOnChange);
5341 02 Apr 19 nicklas 19     Buttons.addClickHandler('btnExtractSpecimen', paused.extractSpecimen);
5341 02 Apr 19 nicklas 20     Buttons.addClickHandler('btnPauseSpecimen', paused.pauseSpecimen);
5344 02 Apr 19 nicklas 21     Buttons.addClickHandler('btnPauseSettings', paused.openSettings);
5341 02 Apr 19 nicklas 22     Buttons.addClickHandler('check_uncheck', paused.selectAll);
5341 02 Apr 19 nicklas 23     
5341 02 Apr 19 nicklas 24     // Navigation
5341 02 Apr 19 nicklas 25     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
5341 02 Apr 19 nicklas 26     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
5341 02 Apr 19 nicklas 27     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
5341 02 Apr 19 nicklas 28     Buttons.addClickHandler('goregister', Wizard.goRegister);
5341 02 Apr 19 nicklas 29     
5341 02 Apr 19 nicklas 30     
5341 02 Apr 19 nicklas 31     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
5341 02 Apr 19 nicklas 32     url += '&cmd=GetPausedSpecimenTubes';
5341 02 Apr 19 nicklas 33     Wizard.showLoadingAnimation('Loading paused specimen...');
5341 02 Apr 19 nicklas 34     Wizard.asyncJsonRequest(url, paused.onSpecimenLoaded);
5341 02 Apr 19 nicklas 35   }
5341 02 Apr 19 nicklas 36   
5341 02 Apr 19 nicklas 37   paused.onSpecimenLoaded = function(response)
5341 02 Apr 19 nicklas 38   {
5341 02 Apr 19 nicklas 39     specimen = response.specimenTubes;
5341 02 Apr 19 nicklas 40     sites = response.sites;
5341 02 Apr 19 nicklas 41
5341 02 Apr 19 nicklas 42     var frm = document.forms['reggie'];
5341 02 Apr 19 nicklas 43     var siteCount = [];
5344 02 Apr 19 nicklas 44     var pausedSites = [];
5341 02 Apr 19 nicklas 45     for (var siteNo = 0; siteNo < sites.length; siteNo++)
5341 02 Apr 19 nicklas 46     {
5341 02 Apr 19 nicklas 47       var site = sites[siteNo];
5344 02 Apr 19 nicklas 48       if (site.paused) pausedSites[pausedSites.length] = site.name;
5341 02 Apr 19 nicklas 49       siteCount[site.prefix] = 0;
5341 02 Apr 19 nicklas 50     }
5344 02 Apr 19 nicklas 51     Doc.element('pausedInfo').innerHTML = pausedSites.length > 0 ? 
5344 02 Apr 19 nicklas 52       '<b>Paused sites</b>: ' + pausedSites.join(', ') : '<b>No sites are paused</b>';
5341 02 Apr 19 nicklas 53     
5341 02 Apr 19 nicklas 54     var html = '';
5341 02 Apr 19 nicklas 55     for (var spNo = 0; spNo < specimen.length; spNo++)
5341 02 Apr 19 nicklas 56     {
5341 02 Apr 19 nicklas 57       var sp = specimen[spNo];
5341 02 Apr 19 nicklas 58       sp.include = true;
5341 02 Apr 19 nicklas 59       siteCount[sp.site.prefix]++;
5341 02 Apr 19 nicklas 60       var rowClass = 'highlight';
5341 02 Apr 19 nicklas 61       rowClass += spNo % 2 == 0 ? ' oddrow' : ' evenrow';
5341 02 Apr 19 nicklas 62       if (sp.YellowLabel != null) rowClass += ' yellow-specimen';
5341 02 Apr 19 nicklas 63       
5341 02 Apr 19 nicklas 64       html += '<tr class="' + rowClass + '" id="specimen.'+sp.id + '">';
5341 02 Apr 19 nicklas 65       html += '<td><span id="index.'+sp.id+'">'+(spNo+1)+'</span> <input type="checkbox" name="sp.'+sp.id+'"></td>';
5341 02 Apr 19 nicklas 66       html += '<td class="dottedleft if-yellow"><span class="link linked-item" data-item-type="SAMPLE" data-item-id="'+sp.id+'">'+Strings.encodeTags(sp.name)+'</span>';
5341 02 Apr 19 nicklas 67       html += '<img class="link case-summary" data-name="'+Strings.encodeTags(sp.name)+'" src="../images/case_summary.png"></td>';
5341 02 Apr 19 nicklas 68       html += '<td>'+(sp.AutoProcessing == 'Disable' ? 'Paused' : 'Scheduled') + '</td>';
5341 02 Apr 19 nicklas 69       html += '<td>'+Strings.encodeTags(sp.site.name) + '</td>';
5341 02 Apr 19 nicklas 70       html += '<td>'+Reggie.reformatDate(sp.SamplingDate)+'</td>';
5341 02 Apr 19 nicklas 71       html += '<td>'+Reggie.reformatDate(sp.ArrivalDate)+'</td>';
5341 02 Apr 19 nicklas 72       html += '<td>'+Strings.encodeTags(sp.bioWell.bioPlate.name + ' ' + sp.bioWell.location)+'</td>';
5341 02 Apr 19 nicklas 73       html += '<td style="width: auto;"></td>';
5341 02 Apr 19 nicklas 74       html += '</tr>';
5341 02 Apr 19 nicklas 75     }
5341 02 Apr 19 nicklas 76     
5341 02 Apr 19 nicklas 77     Doc.element('specimen-list').innerHTML = html;
5341 02 Apr 19 nicklas 78   
5341 02 Apr 19 nicklas 79     frm.siteFilter.length = 0;
5341 02 Apr 19 nicklas 80     frm.siteFilter[0] = new Option(' ', '');
5341 02 Apr 19 nicklas 81     for (var siteNo = 0; siteNo < sites.length; siteNo++)
5341 02 Apr 19 nicklas 82     {
5341 02 Apr 19 nicklas 83       var site = sites[siteNo];
5341 02 Apr 19 nicklas 84       frm.siteFilter[frm.siteFilter.length] = new Option(site.name + ' ('+siteCount[site.prefix]+')', site.prefix);
5341 02 Apr 19 nicklas 85     }
5341 02 Apr 19 nicklas 86     
5341 02 Apr 19 nicklas 87     paused.filterOnChange();
5341 02 Apr 19 nicklas 88     
5341 02 Apr 19 nicklas 89     if (submitMessages)
5341 02 Apr 19 nicklas 90     {
5341 02 Apr 19 nicklas 91       Wizard.showFinalMessage(submitMessages);
5341 02 Apr 19 nicklas 92       submitMessages = null;
5341 02 Apr 19 nicklas 93       setTimeout(Wizard.showFinalMessage, 10000, []); // Hide after 10 seconds
5341 02 Apr 19 nicklas 94     }
5341 02 Apr 19 nicklas 95     
5341 02 Apr 19 nicklas 96     Doc.show('step-1');
5341 02 Apr 19 nicklas 97
5341 02 Apr 19 nicklas 98     var cs = document.getElementsByClassName('case-summary');
5341 02 Apr 19 nicklas 99     for (var i = 0; i < cs.length; i++)
5341 02 Apr 19 nicklas 100     {
5341 02 Apr 19 nicklas 101       Events.addEventHandler(cs[i], 'click', Reggie.openCaseSummaryPopupOnEvent);
5341 02 Apr 19 nicklas 102     }
5341 02 Apr 19 nicklas 103     
5341 02 Apr 19 nicklas 104     var linkedItems = document.getElementsByClassName('linked-item');
5341 02 Apr 19 nicklas 105     for (var itemNo = 0; itemNo < linkedItems.length; itemNo++)
5341 02 Apr 19 nicklas 106     {
5341 02 Apr 19 nicklas 107       Events.addEventHandler(linkedItems[itemNo], 'click', Items.itemOnClick);
5341 02 Apr 19 nicklas 108     }
5341 02 Apr 19 nicklas 109   }
5341 02 Apr 19 nicklas 110
5341 02 Apr 19 nicklas 111   paused.selectAll = function()
5341 02 Apr 19 nicklas 112   {
5341 02 Apr 19 nicklas 113     var frm = document.forms['reggie'];
5341 02 Apr 19 nicklas 114     var firstChecked = null;
5341 02 Apr 19 nicklas 115     for (var spNo = 0; spNo < specimen.length; spNo++)
5341 02 Apr 19 nicklas 116     {
5341 02 Apr 19 nicklas 117       var sp = specimen[spNo];
5341 02 Apr 19 nicklas 118       if (sp.include)
5341 02 Apr 19 nicklas 119       {
5341 02 Apr 19 nicklas 120         if (firstChecked == null)
5341 02 Apr 19 nicklas 121         {
5341 02 Apr 19 nicklas 122           firstChecked = frm['sp.'+sp.id].checked;
5341 02 Apr 19 nicklas 123         }
5341 02 Apr 19 nicklas 124         frm['sp.'+sp.id].checked = !firstChecked;
5341 02 Apr 19 nicklas 125       }
5341 02 Apr 19 nicklas 126     }
5341 02 Apr 19 nicklas 127   }
5341 02 Apr 19 nicklas 128   
5341 02 Apr 19 nicklas 129   paused.filterOnChange = function()
5341 02 Apr 19 nicklas 130   {
5341 02 Apr 19 nicklas 131     var frm = document.forms['reggie'];
5341 02 Apr 19 nicklas 132
5341 02 Apr 19 nicklas 133     var filter = new Filter();
5341 02 Apr 19 nicklas 134     filter.addContainsCriteria(ItemProperty.Name, frm.nameFilter.value);
5341 02 Apr 19 nicklas 135     filter.addTextCriteria(ItemProperty.AutoProcessing, frm.statusFilter.value);
5341 02 Apr 19 nicklas 136     filter.addTextCriteria(ItemProperty.Site, frm.siteFilter.value);
5341 02 Apr 19 nicklas 137     filter.addDateCriteria(ItemProperty.SamplingDate, frm.samplingDateFilter.value);
5341 02 Apr 19 nicklas 138     filter.addDateCriteria(ItemProperty.ArrivalDate, frm.arrivalDateFilter.value);
5341 02 Apr 19 nicklas 139     filter.addContainsCriteria(ItemProperty.StorageBox, frm.storageBoxFilter.value);
5341 02 Apr 19 nicklas 140
5341 02 Apr 19 nicklas 141     var index = 0;
5341 02 Apr 19 nicklas 142     var numPaused = 0;
5341 02 Apr 19 nicklas 143     for (var spNo = 0; spNo < specimen.length; spNo++)
5341 02 Apr 19 nicklas 144     {
5341 02 Apr 19 nicklas 145       var sp = specimen[spNo];
5341 02 Apr 19 nicklas 146       sp.include = filter.check(sp);
5341 02 Apr 19 nicklas 147       var tr = Doc.element('specimen.'+sp.id);
5341 02 Apr 19 nicklas 148       if (sp.include)
5341 02 Apr 19 nicklas 149       {
5341 02 Apr 19 nicklas 150         index++;
5341 02 Apr 19 nicklas 151         var evenRow = index % 2 == 0;
5341 02 Apr 19 nicklas 152         Doc.addOrRemoveClass(tr, 'oddrow', !evenRow);
5341 02 Apr 19 nicklas 153         Doc.addOrRemoveClass(tr, 'evenrow', evenRow);
5341 02 Apr 19 nicklas 154         Doc.element('index.'+sp.id).innerHTML = index;
5341 02 Apr 19 nicklas 155         Doc.show(tr);
5341 02 Apr 19 nicklas 156         if (sp.AutoProcessing == 'Disable') numPaused++;
5341 02 Apr 19 nicklas 157       }
5341 02 Apr 19 nicklas 158       else
5341 02 Apr 19 nicklas 159       {
5341 02 Apr 19 nicklas 160         Doc.hide(tr);
5341 02 Apr 19 nicklas 161       }
5341 02 Apr 19 nicklas 162     }
5341 02 Apr 19 nicklas 163     
5341 02 Apr 19 nicklas 164     Doc.showHide('specimen-list', index != 0);
5341 02 Apr 19 nicklas 165     Doc.showHide('no-match', index==0);
5341 02 Apr 19 nicklas 166     Doc.addOrRemoveClass('btnExtractSpecimen', 'disabled', numPaused==0);
5341 02 Apr 19 nicklas 167     Doc.addOrRemoveClass('btnPauseSpecimen', 'disabled', index==numPaused);
5341 02 Apr 19 nicklas 168     
5341 02 Apr 19 nicklas 169     Doc.element('num-matching').innerHTML = index;
5341 02 Apr 19 nicklas 170   }
5341 02 Apr 19 nicklas 171   
5341 02 Apr 19 nicklas 172   paused.checkSelected = function(noNotification)
5341 02 Apr 19 nicklas 173   {
5341 02 Apr 19 nicklas 174     var frm = document.forms['reggie'];
5341 02 Apr 19 nicklas 175     var selected = [];
5341 02 Apr 19 nicklas 176     
5341 02 Apr 19 nicklas 177     for (var spNo = 0; spNo < specimen.length; spNo++)
5341 02 Apr 19 nicklas 178     {
5341 02 Apr 19 nicklas 179       var sp = specimen[spNo];
5341 02 Apr 19 nicklas 180       if (sp.include && frm['sp.'+sp.id].checked)
5341 02 Apr 19 nicklas 181       {
5341 02 Apr 19 nicklas 182         selected[selected.length] = sp.id;
5341 02 Apr 19 nicklas 183       }
5341 02 Apr 19 nicklas 184     }
5341 02 Apr 19 nicklas 185     
5341 02 Apr 19 nicklas 186     if (selected.length == 0 && !noNotification)
5341 02 Apr 19 nicklas 187     {
5341 02 Apr 19 nicklas 188       Forms.showNotification('check_uncheck', 'Please select at least one specimen from the list', null, 'pointer-below');
5341 02 Apr 19 nicklas 189     }
5341 02 Apr 19 nicklas 190     
5341 02 Apr 19 nicklas 191     return selected;
5341 02 Apr 19 nicklas 192   }
5341 02 Apr 19 nicklas 193
5341 02 Apr 19 nicklas 194   paused.extractSpecimen = function()
5341 02 Apr 19 nicklas 195   {
5341 02 Apr 19 nicklas 196     var selected = paused.checkSelected();
5341 02 Apr 19 nicklas 197     if (selected.length == 0) return;
5341 02 Apr 19 nicklas 198
5341 02 Apr 19 nicklas 199     var submitInfo = {};
5341 02 Apr 19 nicklas 200     submitInfo.specimen = selected;
5341 02 Apr 19 nicklas 201     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
5341 02 Apr 19 nicklas 202     url += '&cmd=SchedulePausedSpecimenForExtraction';
5341 02 Apr 19 nicklas 203     Wizard.showLoadingAnimation('Registering selected specimen for extraction...');
5341 02 Apr 19 nicklas 204     Wizard.asyncJsonRequest(url, paused.submissionResults, 'POST', JSON.stringify(submitInfo));
5341 02 Apr 19 nicklas 205   }
5341 02 Apr 19 nicklas 206   
5341 02 Apr 19 nicklas 207   paused.pauseSpecimen = function()
5341 02 Apr 19 nicklas 208   {
5341 02 Apr 19 nicklas 209     var selected = paused.checkSelected();
5341 02 Apr 19 nicklas 210     if (selected.length == 0) return;
5341 02 Apr 19 nicklas 211
5341 02 Apr 19 nicklas 212     var submitInfo = {};
5341 02 Apr 19 nicklas 213     submitInfo.specimen = selected;
5341 02 Apr 19 nicklas 214     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
5341 02 Apr 19 nicklas 215     url += '&cmd=RegisterPausedSpecimen';
5341 02 Apr 19 nicklas 216     Wizard.showLoadingAnimation('Registering selected specimen as paused...');
5341 02 Apr 19 nicklas 217     Wizard.asyncJsonRequest(url, paused.submissionResults, 'POST', JSON.stringify(submitInfo));
5341 02 Apr 19 nicklas 218   }
5341 02 Apr 19 nicklas 219
5344 02 Apr 19 nicklas 220   paused.openSettings = function()
5344 02 Apr 19 nicklas 221   {
5344 02 Apr 19 nicklas 222     var url = 'pause-settings.jsp?ID='+App.getSessionId();
5344 02 Apr 19 nicklas 223     Dialogs.openPopup(url, 'PauseSettings', 500, 350);
5344 02 Apr 19 nicklas 224   }
5344 02 Apr 19 nicklas 225   
5341 02 Apr 19 nicklas 226   var submitMessages;
5341 02 Apr 19 nicklas 227   // Re-load the updated information
5341 02 Apr 19 nicklas 228   paused.submissionResults = function(response)
5341 02 Apr 19 nicklas 229   {
5341 02 Apr 19 nicklas 230     submitMessages = response.messages;
5341 02 Apr 19 nicklas 231     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
5341 02 Apr 19 nicklas 232     url += '&cmd=GetPausedSpecimenTubes';
5341 02 Apr 19 nicklas 233     Wizard.showLoadingAnimation('Loading paused specimen...');
5341 02 Apr 19 nicklas 234     Wizard.asyncJsonRequest(url, paused.onSpecimenLoaded);
5341 02 Apr 19 nicklas 235   }
5341 02 Apr 19 nicklas 236   
5341 02 Apr 19 nicklas 237   return paused;
5341 02 Apr 19 nicklas 238 }();
5341 02 Apr 19 nicklas 239
5341 02 Apr 19 nicklas 240 Doc.onLoad(PausedSpecimen.initPage);
5341 02 Apr 19 nicklas 241
5341 02 Apr 19 nicklas 242
5341 02 Apr 19 nicklas 243 /**
5341 02 Apr 19 nicklas 244   Holds one or more filter criterias. Use the 'add*' methods
5341 02 Apr 19 nicklas 245   to add criterias to the filter, and the 'check(specimen)' method
5341 02 Apr 19 nicklas 246   to evaluate all criterias against a single specimen item.
5341 02 Apr 19 nicklas 247 */
5341 02 Apr 19 nicklas 248 var Filter = function()
5341 02 Apr 19 nicklas 249 {
5341 02 Apr 19 nicklas 250   this.criterias = [];
5341 02 Apr 19 nicklas 251 }
5341 02 Apr 19 nicklas 252
5341 02 Apr 19 nicklas 253 /**
5341 02 Apr 19 nicklas 254   Adds a text criteria comparing the given property to
5341 02 Apr 19 nicklas 255   a static value (f2).
5341 02 Apr 19 nicklas 256 */
5341 02 Apr 19 nicklas 257 Filter.prototype.addTextCriteria = function(itemProp, f2)
5341 02 Apr 19 nicklas 258 {
5341 02 Apr 19 nicklas 259   if (f2 != '') 
5341 02 Apr 19 nicklas 260   {
5341 02 Apr 19 nicklas 261     var cmp;
5341 02 Apr 19 nicklas 262     if (f2 == '=')
5341 02 Apr 19 nicklas 263     {
5341 02 Apr 19 nicklas 264       cmp = Comparator.eq;
5341 02 Apr 19 nicklas 265       f2 = null;
5341 02 Apr 19 nicklas 266     }
5341 02 Apr 19 nicklas 267     else if (f2 == '<>')
5341 02 Apr 19 nicklas 268     {
5341 02 Apr 19 nicklas 269       cmp = Comparator.neq;
5341 02 Apr 19 nicklas 270       f2 = null;
5341 02 Apr 19 nicklas 271     }
5341 02 Apr 19 nicklas 272     else
5341 02 Apr 19 nicklas 273     {
5341 02 Apr 19 nicklas 274       cmp = Comparator.eq;
5341 02 Apr 19 nicklas 275     }
5341 02 Apr 19 nicklas 276     this.criterias[this.criterias.length] = function(item) { return cmp(itemProp(item), f2) };
5341 02 Apr 19 nicklas 277   }
5341 02 Apr 19 nicklas 278 }
5341 02 Apr 19 nicklas 279
5341 02 Apr 19 nicklas 280 /**
5341 02 Apr 19 nicklas 281   Adds a text criteria checking if the given item property to
5341 02 Apr 19 nicklas 282   contains a static value (f2).
5341 02 Apr 19 nicklas 283 */
5341 02 Apr 19 nicklas 284 Filter.prototype.addContainsCriteria = function(itemProp, f2)
5341 02 Apr 19 nicklas 285 {
5341 02 Apr 19 nicklas 286   if (f2 != '') 
5341 02 Apr 19 nicklas 287   {
5341 02 Apr 19 nicklas 288     var cmp;
5341 02 Apr 19 nicklas 289     if (f2 == '=')
5341 02 Apr 19 nicklas 290     {
5341 02 Apr 19 nicklas 291       cmp = Comparator.eq;
5341 02 Apr 19 nicklas 292       f2 = null;
5341 02 Apr 19 nicklas 293     }
5341 02 Apr 19 nicklas 294     else if (f2 == '<>')
5341 02 Apr 19 nicklas 295     {
5341 02 Apr 19 nicklas 296       cmp = Comparator.neq;
5341 02 Apr 19 nicklas 297       f2 = null;
5341 02 Apr 19 nicklas 298     }
5341 02 Apr 19 nicklas 299     else
5341 02 Apr 19 nicklas 300     {
5341 02 Apr 19 nicklas 301       cmp = Comparator.contains;
5341 02 Apr 19 nicklas 302     }
5341 02 Apr 19 nicklas 303     this.criterias[this.criterias.length] = function(item) { return cmp(itemProp(item), f2) };
5341 02 Apr 19 nicklas 304   }
5341 02 Apr 19 nicklas 305 }
5341 02 Apr 19 nicklas 306
5341 02 Apr 19 nicklas 307 /**
5341 02 Apr 19 nicklas 308   Adds a temporal criteria for comparing dates. The 'f2' value
5341 02 Apr 19 nicklas 309   may start with either '<' or '>' to compare with earlier/later
5341 02 Apr 19 nicklas 310   than operators. In all cases, the 'f2' value is stripped from '-'
5341 02 Apr 19 nicklas 311   characters.
5341 02 Apr 19 nicklas 312 */
5341 02 Apr 19 nicklas 313 Filter.prototype.addDateCriteria = function(itemProp, f2)
5341 02 Apr 19 nicklas 314 {
5341 02 Apr 19 nicklas 315   if (f2 != '')
5341 02 Apr 19 nicklas 316   {
5341 02 Apr 19 nicklas 317     var cmp;
5341 02 Apr 19 nicklas 318     if (f2 == '=')
5341 02 Apr 19 nicklas 319     {
5341 02 Apr 19 nicklas 320       cmp = Comparator.eq;
5341 02 Apr 19 nicklas 321       f2 = null;
5341 02 Apr 19 nicklas 322     }
5341 02 Apr 19 nicklas 323     else if (f2 == '<>')
5341 02 Apr 19 nicklas 324     {
5341 02 Apr 19 nicklas 325       cmp = Comparator.neq;
5341 02 Apr 19 nicklas 326       f2 = null;
5341 02 Apr 19 nicklas 327     }
5341 02 Apr 19 nicklas 328     else
5341 02 Apr 19 nicklas 329     {
5341 02 Apr 19 nicklas 330       var firstChar = f2.charAt(0);
5341 02 Apr 19 nicklas 331       if (firstChar == '<' || firstChar == '>') f2 = f2.substring(1);
5341 02 Apr 19 nicklas 332       f2 = f2.replace(/\-/g, '');
5341 02 Apr 19 nicklas 333       cmp = Comparator.get(firstChar, Comparator.startsWith);
5341 02 Apr 19 nicklas 334     }
5341 02 Apr 19 nicklas 335     this.criterias[this.criterias.length] = function(item) { return cmp(itemProp(item), f2) };
5341 02 Apr 19 nicklas 336   }
5341 02 Apr 19 nicklas 337 }
5341 02 Apr 19 nicklas 338
5341 02 Apr 19 nicklas 339
5341 02 Apr 19 nicklas 340 /**
5341 02 Apr 19 nicklas 341   Evaluate all criterias. Return true if all pass, false otherwise.
5341 02 Apr 19 nicklas 342 */
5341 02 Apr 19 nicklas 343 Filter.prototype.check = function(sp)
5341 02 Apr 19 nicklas 344 {
5341 02 Apr 19 nicklas 345   for (var i = 0; i < this.criterias.length; i++)
5341 02 Apr 19 nicklas 346   {
5341 02 Apr 19 nicklas 347     if (!this.criterias[i](sp)) return false;
5341 02 Apr 19 nicklas 348   }
5341 02 Apr 19 nicklas 349   return true;
5341 02 Apr 19 nicklas 350 }
5341 02 Apr 19 nicklas 351
5341 02 Apr 19 nicklas 352 /**
5341 02 Apr 19 nicklas 353   Functions for extracting various properties from
5341 02 Apr 19 nicklas 354   specimen items. Each method accepts a single specimen as a parameter
5341 02 Apr 19 nicklas 355   and return a value from the specimen item. The methods
5341 02 Apr 19 nicklas 356   are used as parameters to Filter.add*Criteria() methods.
5341 02 Apr 19 nicklas 357 */
5341 02 Apr 19 nicklas 358 var ItemProperty = function()
5341 02 Apr 19 nicklas 359 {
5341 02 Apr 19 nicklas 360   var p = {};
5341 02 Apr 19 nicklas 361   
5341 02 Apr 19 nicklas 362   p.Name = function(item)
5341 02 Apr 19 nicklas 363   {
5341 02 Apr 19 nicklas 364     return item.name;
5341 02 Apr 19 nicklas 365   }
5341 02 Apr 19 nicklas 366   
5341 02 Apr 19 nicklas 367   p.AutoProcessing = function(item)
5341 02 Apr 19 nicklas 368   {
5341 02 Apr 19 nicklas 369     return item.AutoProcessing;
5341 02 Apr 19 nicklas 370   }
5341 02 Apr 19 nicklas 371   
5341 02 Apr 19 nicklas 372   // Get the item.site.prefix value
5341 02 Apr 19 nicklas 373   p.Site = function(item)
5341 02 Apr 19 nicklas 374   {
5341 02 Apr 19 nicklas 375     return item.site.prefix;
5341 02 Apr 19 nicklas 376   }
5341 02 Apr 19 nicklas 377   
5341 02 Apr 19 nicklas 378   p.ArrivalDate = function(item)
5341 02 Apr 19 nicklas 379   {
5341 02 Apr 19 nicklas 380     return item.ArrivalDate;
5341 02 Apr 19 nicklas 381   }
5341 02 Apr 19 nicklas 382
5341 02 Apr 19 nicklas 383   p.SamplingDate = function(item)
5341 02 Apr 19 nicklas 384   {
5341 02 Apr 19 nicklas 385     return item.SamplingDate;
5341 02 Apr 19 nicklas 386   }
5341 02 Apr 19 nicklas 387
5341 02 Apr 19 nicklas 388   p.StorageBox = function(item)
5341 02 Apr 19 nicklas 389   {
5341 02 Apr 19 nicklas 390     return item.bioWell.bioPlate.name + ' ' + item.bioWell.location;
5341 02 Apr 19 nicklas 391   }
5341 02 Apr 19 nicklas 392   
5341 02 Apr 19 nicklas 393   return p;
5341 02 Apr 19 nicklas 394 }();
5341 02 Apr 19 nicklas 395
5341 02 Apr 19 nicklas 396 /**
5341 02 Apr 19 nicklas 397   Comparator functions for comparing two values.
5341 02 Apr 19 nicklas 398 */
5341 02 Apr 19 nicklas 399 var Comparator = function()
5341 02 Apr 19 nicklas 400 {
5341 02 Apr 19 nicklas 401   var cmp = {};
5341 02 Apr 19 nicklas 402   
5341 02 Apr 19 nicklas 403   /**
5341 02 Apr 19 nicklas 404     Return a comparator based on the symbol
5341 02 Apr 19 nicklas 405     which can be either '>' or '<' to return
5341 02 Apr 19 nicklas 406     Comparator.gt or Comparator.lt. Otherwise
5341 02 Apr 19 nicklas 407     the given default or Comparator.eq is returned.
5341 02 Apr 19 nicklas 408   */
5341 02 Apr 19 nicklas 409   cmp.get = function(symbol, defaultCmp)
5341 02 Apr 19 nicklas 410   {
5341 02 Apr 19 nicklas 411     var c;
5341 02 Apr 19 nicklas 412     if (symbol == '<')
5341 02 Apr 19 nicklas 413     {
5341 02 Apr 19 nicklas 414       c = cmp.lt;
5341 02 Apr 19 nicklas 415     }
5341 02 Apr 19 nicklas 416     else if (symbol == '>')
5341 02 Apr 19 nicklas 417     {
5341 02 Apr 19 nicklas 418       c = cmp.gt;
5341 02 Apr 19 nicklas 419     }
5341 02 Apr 19 nicklas 420     else
5341 02 Apr 19 nicklas 421     {
5341 02 Apr 19 nicklas 422       c = defaultCmp || cmp.eq;
5341 02 Apr 19 nicklas 423     }
5341 02 Apr 19 nicklas 424     return c;
5341 02 Apr 19 nicklas 425   }
5341 02 Apr 19 nicklas 426   
5341 02 Apr 19 nicklas 427   // Compare if two values are equal
5341 02 Apr 19 nicklas 428   cmp.eq = function(v1, v2)
5341 02 Apr 19 nicklas 429   {
5341 02 Apr 19 nicklas 430     return v1 == v2;
5341 02 Apr 19 nicklas 431   }
5341 02 Apr 19 nicklas 432   
5341 02 Apr 19 nicklas 433   // Compare if two values are different
5341 02 Apr 19 nicklas 434   cmp.neq = function(v1, v2)
5341 02 Apr 19 nicklas 435   {
5341 02 Apr 19 nicklas 436     return v1 != v2;
5341 02 Apr 19 nicklas 437   }
5341 02 Apr 19 nicklas 438   
5341 02 Apr 19 nicklas 439   // Check if v2 is contained in v1
5341 02 Apr 19 nicklas 440   cmp.contains = function(v1, v2)
5341 02 Apr 19 nicklas 441   {
5341 02 Apr 19 nicklas 442     return v1 != null && v2 != null && v1.indexOf(v2) >= 0;
5341 02 Apr 19 nicklas 443   }
5341 02 Apr 19 nicklas 444   
5341 02 Apr 19 nicklas 445   // Compare if v1 starts with the same string as v2
5341 02 Apr 19 nicklas 446   cmp.startsWith = function(v1, v2)
5341 02 Apr 19 nicklas 447   {
5341 02 Apr 19 nicklas 448     return v1 != null && v1.indexOf(v2) == 0;
5341 02 Apr 19 nicklas 449   }
5341 02 Apr 19 nicklas 450
5341 02 Apr 19 nicklas 451   // Compare if two values are appoximately equals (difference is not more than 0.05)
5341 02 Apr 19 nicklas 452   cmp.approx = function(v1, v2)
5341 02 Apr 19 nicklas 453   {
5341 02 Apr 19 nicklas 454     return Math.abs(v2 - v1) < 0.05;
5341 02 Apr 19 nicklas 455   }
5341 02 Apr 19 nicklas 456   
5341 02 Apr 19 nicklas 457   // Compare if v1 is greater than or equal to v2
5341 02 Apr 19 nicklas 458   cmp.gt = function(v1, v2)
5341 02 Apr 19 nicklas 459   {
5341 02 Apr 19 nicklas 460     return v1 >= v2;
5341 02 Apr 19 nicklas 461   }
5341 02 Apr 19 nicklas 462   
5341 02 Apr 19 nicklas 463   // Compare if v1 is less than or equal to v2
5341 02 Apr 19 nicklas 464   cmp.lt = function(v1, v2)
5341 02 Apr 19 nicklas 465   {
5341 02 Apr 19 nicklas 466     return v1 <= v2;
5341 02 Apr 19 nicklas 467   }
5341 02 Apr 19 nicklas 468   
5341 02 Apr 19 nicklas 469   return cmp;
5341 02 Apr 19 nicklas 470 }();
5341 02 Apr 19 nicklas 471