extensions/net.sf.basedb.meludi/trunk/resources/sampleproc/extramaterial.js

Code
Comments
Other
Rev Date Author Line
3412 22 Jun 15 olle 1 var ExtraMaterialReg = function()
3412 22 Jun 15 olle 2 {
3412 22 Jun 15 olle 3   var emreg = {};
3412 22 Jun 15 olle 4   var debug = 0;
3412 22 Jun 15 olle 5   
3412 22 Jun 15 olle 6   var emInfo;
4207 07 Nov 16 olle 7
4207 07 Nov 16 olle 8   var sampleItemPrefix = '';  
3412 22 Jun 15 olle 9   var nofExtraMaterialIsValid = false;
3435 02 Jul 15 olle 10   var extraMaterialIsValid = false;
3412 22 Jun 15 olle 11   var jsonOldNameArr = [];
3412 22 Jun 15 olle 12   
3412 22 Jun 15 olle 13   var restartTimer;
3412 22 Jun 15 olle 14   var restartAt;
3412 22 Jun 15 olle 15   
3412 22 Jun 15 olle 16   // Page initialization
3412 22 Jun 15 olle 17   emreg.initPage = function()
3412 22 Jun 15 olle 18   {
3412 22 Jun 15 olle 19     var frm = document.forms['meludi'];  
3412 22 Jun 15 olle 20
3412 22 Jun 15 olle 21     // Step 1
3412 22 Jun 15 olle 22     Events.addEventHandler('step-1', 'wizard-validate', emreg.validateStep1);
3412 22 Jun 15 olle 23     Events.addEventHandler('nofExtraMaterial', 'keypress', Events.integerOnly);
3412 22 Jun 15 olle 24     Events.addEventHandler('nofExtraMaterial', 'blur', emreg.nofExtraMaterialOnChange);
3412 22 Jun 15 olle 25     Events.addEventHandler('nofExtraMaterial', 'keypress', Wizard.goNextOnTabOrEnter);
3412 22 Jun 15 olle 26     Events.addEventHandler('arrivalDateDefault', 'blur', emreg.arrivalDateOnChange, { 'index': -1 });
3412 22 Jun 15 olle 27
3412 22 Jun 15 olle 28     // Set default value for default arrival date
3412 22 Jun 15 olle 29     frm.arrivalDateDefault.value = Dates.formatDate(new Date(), 'yyyyMMdd');
3412 22 Jun 15 olle 30     
3412 22 Jun 15 olle 31     // Step 2
3412 22 Jun 15 olle 32     Events.addEventHandler('step-2', 'wizard-initialize', emreg.initializeStep2);
3412 22 Jun 15 olle 33     Events.addEventHandler('step-2', 'wizard-validate', emreg.validateStep2);
3412 22 Jun 15 olle 34
3412 22 Jun 15 olle 35     // Navigation
3412 22 Jun 15 olle 36     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
3412 22 Jun 15 olle 37     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
3412 22 Jun 15 olle 38     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
3412 22 Jun 15 olle 39     Buttons.addClickHandler('goregister', Wizard.goRegister);
3412 22 Jun 15 olle 40     Buttons.addClickHandler('gostop', emreg.stopAutoRestart);
3412 22 Jun 15 olle 41     
3412 22 Jun 15 olle 42     // Final registration
3412 22 Jun 15 olle 43     Events.addEventHandler('wizard', 'wizard-submit', emreg.submit);
3412 22 Jun 15 olle 44
4207 07 Nov 16 olle 45     // Call LabelGenerationServlet to get sample item prefix
4207 07 Nov 16 olle 46     var url = '../LabelGeneration.servlet?ID='+App.getSessionId();
4207 07 Nov 16 olle 47     url += '&cmd=CountCases';
4207 07 Nov 16 olle 48     
4207 07 Nov 16 olle 49     Wizard.showLoadingAnimation('Loading information about project...');
4207 07 Nov 16 olle 50     Wizard.asyncJsonRequest(url, emreg.projectInfoLoaded);
4207 07 Nov 16 olle 51   }
4207 07 Nov 16 olle 52
4207 07 Nov 16 olle 53   emreg.projectInfoLoaded = function(response)
4207 07 Nov 16 olle 54   {
4207 07 Nov 16 olle 55     var frm = document.forms['meludi'];
4207 07 Nov 16 olle 56
4207 07 Nov 16 olle 57     sampleItemPrefix = response.sampleItemPrefix;
4207 07 Nov 16 olle 58
4207 07 Nov 16 olle 59     Doc.element('instructSamplePrefix').innerHTML = '4. The name must not start with "' + sampleItemPrefix + '", since that is reserved for MeLuDI items.<br>';
4207 07 Nov 16 olle 60
3412 22 Jun 15 olle 61     Doc.show('step-1');
3412 22 Jun 15 olle 62     Doc.show('gonext');
3412 22 Jun 15 olle 63   }
3412 22 Jun 15 olle 64
3412 22 Jun 15 olle 65   emreg.validateStep1 = function(event)
3412 22 Jun 15 olle 66   {
3412 22 Jun 15 olle 67     emreg.nofExtraMaterialOnChange();
3412 22 Jun 15 olle 68     // If not valid, we prevent the wizard from moving to the next step
3412 22 Jun 15 olle 69     if (!nofExtraMaterialIsValid) event.preventDefault();
3412 22 Jun 15 olle 70   }
3412 22 Jun 15 olle 71   
3412 22 Jun 15 olle 72   emreg.initializeStep2 = function()
3412 22 Jun 15 olle 73   {
3412 22 Jun 15 olle 74     var frm = document.forms['meludi'];
3412 22 Jun 15 olle 75     var nofExtraMaterial = frm.nofExtraMaterial.value;
3412 22 Jun 15 olle 76
3412 22 Jun 15 olle 77     var html = '<table id="extra-material" class="step-form">';
3412 22 Jun 15 olle 78     // First header row
3412 22 Jun 15 olle 79     html += '<thead>';
3412 22 Jun 15 olle 80     html += '<tr>';
3412 22 Jun 15 olle 81     html += '<th class="dottedleft" style="width: 18em;">Name</th>';
3412 22 Jun 15 olle 82     html += '<th colspan="3" style="width: 9em;">Type</th>';
3412 22 Jun 15 olle 83     html += '<th style="width: 18em;">Item name</th>';
3412 22 Jun 15 olle 84     html += '<th style="width: 8em;">Arrival date</th>';
3637 01 Dec 15 olle 85     html += '<th colspan="2" style="width: 11em;">Control reference std.</th>';
3412 22 Jun 15 olle 86     html += '<th style="width: 300px;">Operator delivery comment</th>';
3412 22 Jun 15 olle 87     html += '<th></th>';
3412 22 Jun 15 olle 88     html += '<th>Input message</th>';
3412 22 Jun 15 olle 89     html += '</tr>';
3412 22 Jun 15 olle 90     // Second header row
3412 22 Jun 15 olle 91     html += '<tr>';
3412 22 Jun 15 olle 92     html += '<th></th>';
3412 22 Jun 15 olle 93     html += '<td style="width: 3em;">DNA</td><td style="width: 3em;">RNA</td><td style="width: 3em;">Spec.</td>';
3412 22 Jun 15 olle 94     html += '<th class="dottedleft"></th>';
3412 22 Jun 15 olle 95     html += '<th style="width: 8em;"></th>';
3637 01 Dec 15 olle 96     html += '<td style="width: 3em;"></td>';
3637 01 Dec 15 olle 97     html += '<td style="width: 8em;">Lot no.</td>';
3412 22 Jun 15 olle 98     html += '<td style="width: 300px;"></td>';
3412 22 Jun 15 olle 99     html += '<td class="dottedleft"></td>';
3412 22 Jun 15 olle 100     html += '<td class="dottedleft"></td>';
3412 22 Jun 15 olle 101     html += '</tr>';
3412 22 Jun 15 olle 102     html += '</thead>';
3412 22 Jun 15 olle 103     html += '<tbody>';
3412 22 Jun 15 olle 104
3412 22 Jun 15 olle 105     for (var i=0; i < nofExtraMaterial; i++)
3412 22 Jun 15 olle 106     {
3412 22 Jun 15 olle 107       // Get id for next tab field, going down each column, starting with the one at left
3412 22 Jun 15 olle 108       var nameNextId = 'name.'+(i+1);
3412 22 Jun 15 olle 109       // Check if reached last row
3412 22 Jun 15 olle 110       if (i == nofExtraMaterial-1)
3412 22 Jun 15 olle 111       {
3412 22 Jun 15 olle 112         nameNextId = 'comment.0';
3412 22 Jun 15 olle 113       }
3412 22 Jun 15 olle 114       var arrivalDateNextId = 'arrivaldate.'+(i+1);
3412 22 Jun 15 olle 115       // Check if reached last row
3412 22 Jun 15 olle 116       if (i == nofExtraMaterial-1)
3412 22 Jun 15 olle 117       {
3412 22 Jun 15 olle 118         arrivalDateNextId = 'comment.0';
3412 22 Jun 15 olle 119       }
3412 22 Jun 15 olle 120       // Check if reached last row
3412 22 Jun 15 olle 121       var commentNextId = 'comment.'+(i+1);
3412 22 Jun 15 olle 122       if (i == nofExtraMaterial-1)
3412 22 Jun 15 olle 123       {
3412 22 Jun 15 olle 124         commentNextId = 'goregister';
3412 22 Jun 15 olle 125       }
3412 22 Jun 15 olle 126       html += '<tr>';
3637 01 Dec 15 olle 127       html += '<td><input type="text" id="name.'+i+'" style="width: 16em;" data-next-focus="'+nameNextId+'"></input></td>';
3412 22 Jun 15 olle 128       html += '<td style="width: 3em;"><input type="radio" name="type.'+i+'" id="isDna.'+i+'" value="DNA" checked></td>';
3412 22 Jun 15 olle 129       html += '<td style="width: 3em;"><input type="radio" name="type.'+i+'" id="isRna.'+i+'" value="RNA" ></td>';
3412 22 Jun 15 olle 130       html += '<td style="width: 3em;"><input type="radio" name="type.'+i+'" id="isSpecimen.'+i+'" value="Specimen" ></td>';
3412 22 Jun 15 olle 131       html += '<td id="itemname.'+i+'" style="width: 18em;"></td>';
3412 22 Jun 15 olle 132       // Arrival date
3412 22 Jun 15 olle 133       html += '<td class="input" style="width: 8em;">';
3412 22 Jun 15 olle 134       html += '<input type="text" id="arrivaldate.'+i+'"'
3412 22 Jun 15 olle 135       html += '    class="auto-init" data-auto-init="focus-on-enter" data-next-focus="'+arrivalDateNextId+'"'
3412 22 Jun 15 olle 136       html += '    data-disallow-future-date="1"'
3412 22 Jun 15 olle 137       html += '    style="width: 6em;" maxlength="10">'
3412 22 Jun 15 olle 138       html += '</td>';
3637 01 Dec 15 olle 139       // Control check box
3637 01 Dec 15 olle 140       html += '<td style="width: 3em;"><input type="checkbox" name="isControl.'+i+'" id="isControl.'+i+'"></td>';
3637 01 Dec 15 olle 141       // Control lot no.
3637 01 Dec 15 olle 142       html += '<td><input type="text" id="controlLotNo.'+i+'" style="width: 8em;" data-next-focus=""></input></td>';
3412 22 Jun 15 olle 143       // Operator delivery comment
3412 22 Jun 15 olle 144       html += '<td class="input"  style="width: 300px;"><textarea rows="1" name="comment.'+i+'" id="comment.'+i+'" style="width: 300px; height: 20px;" data-next-focus="'+commentNextId+'"></textarea></td>';
3412 22 Jun 15 olle 145       // Status and message columns
3412 22 Jun 15 olle 146       html += '<td class="status" id="extramaterial.'+i+'.status"></td>';
3412 22 Jun 15 olle 147       html += '<td class="help"><span id="extramaterial.'+i+'.message" class="message"></span></td>';    
3412 22 Jun 15 olle 148       html += '</tr>';
3412 22 Jun 15 olle 149     }
3412 22 Jun 15 olle 150     Doc.element('extra-material').innerHTML = html;
3412 22 Jun 15 olle 151
3412 22 Jun 15 olle 152     for (var i=0; i < nofExtraMaterial; i++)
3412 22 Jun 15 olle 153     {
3412 22 Jun 15 olle 154       // Add event handlers
3412 22 Jun 15 olle 155       Events.addEventHandler('name.'+i, 'change', emreg.nameOnChange, { 'index': i });
3412 22 Jun 15 olle 156       Events.addEventHandler('isDna.'+i, 'change', emreg.typeOnChange, { 'type': 'DNA', 'index': i });
3412 22 Jun 15 olle 157       Events.addEventHandler('isRna.'+i, 'change', emreg.typeOnChange, { 'type': 'RNA', 'index': i });
3412 22 Jun 15 olle 158       Events.addEventHandler('isSpecimen.'+i, 'change', emreg.typeOnChange, { 'type': 'Specimen', 'index': i });
3412 22 Jun 15 olle 159       Events.addEventHandler('arrivaldate.'+i, 'blur', emreg.arrivalDateOnChange, { 'index': i });
3637 01 Dec 15 olle 160       Events.addEventHandler('isControl.'+i, 'change', emreg.controlOnChange, { 'index': i });
3412 22 Jun 15 olle 161
3412 22 Jun 15 olle 162       // Set default values for dates
3412 22 Jun 15 olle 163       var defaultArrivalDate = frm.arrivalDateDefault.value;
3412 22 Jun 15 olle 164       frm['arrivaldate.'+i].value = defaultArrivalDate;
3435 02 Jul 15 olle 165
3435 02 Jul 15 olle 166       // Set default values for input status
3435 02 Jul 15 olle 167       Wizard.setInputStatus('extramaterial.'+i, 'invalid', 'Missing name');
3637 01 Dec 15 olle 168       
3637 01 Dec 15 olle 169       // Disable control lot number field initially
3637 01 Dec 15 olle 170       Doc.addClass('controlLotNo.'+i, 'disabled');
3412 22 Jun 15 olle 171     }
3412 22 Jun 15 olle 172
3412 22 Jun 15 olle 173     Wizard.setCurrentStep(2);
3412 22 Jun 15 olle 174     Doc.show('goregister');
3412 22 Jun 15 olle 175     Doc.show('gocancel');
3412 22 Jun 15 olle 176     frm['name.0'].focus();
3412 22 Jun 15 olle 177   }
3412 22 Jun 15 olle 178
3412 22 Jun 15 olle 179   emreg.nofExtraMaterialOnChange = function()
3412 22 Jun 15 olle 180   {
3412 22 Jun 15 olle 181     nofExtraMaterialIsValid = false;
3412 22 Jun 15 olle 182
3412 22 Jun 15 olle 183     var frm = document.forms['meludi'];
3412 22 Jun 15 olle 184     var nofExtraMaterial = frm.nofExtraMaterial.value;
3412 22 Jun 15 olle 185     
3412 22 Jun 15 olle 186     if (nofExtraMaterial == '')
3412 22 Jun 15 olle 187     {
3412 22 Jun 15 olle 188       Wizard.setInputStatus('nofExtraMaterial', 'invalid', 'Missing');
3412 22 Jun 15 olle 189       return;
3412 22 Jun 15 olle 190     }
3412 22 Jun 15 olle 191     if (parseInt(nofExtraMaterial) < 1)
3412 22 Jun 15 olle 192     {
3412 22 Jun 15 olle 193       Wizard.setInputStatus('nofExtraMaterial', 'invalid', 'Must be at least 1');
3412 22 Jun 15 olle 194       return;
3412 22 Jun 15 olle 195     }
3412 22 Jun 15 olle 196     Wizard.setInputStatus('nofExtraMaterial', 'valid');
3412 22 Jun 15 olle 197     nofExtraMaterialIsValid = true; 
3412 22 Jun 15 olle 198   }
3412 22 Jun 15 olle 199
3412 22 Jun 15 olle 200   emreg.nameOnChange = function(event)
3412 22 Jun 15 olle 201   {
3412 22 Jun 15 olle 202     var frm = document.forms['meludi'];
3412 22 Jun 15 olle 203     var target = event.currentTarget;
3412 22 Jun 15 olle 204
3412 22 Jun 15 olle 205     var index = Data.int(target, 'index');
3412 22 Jun 15 olle 206
3639 02 Dec 15 olle 207     // Extra material names may contain letters, figures, underscores "_", and hyphens "-".
3639 02 Dec 15 olle 208     // The name must contain at least one letter.
3639 02 Dec 15 olle 209     // The name must not start with underscore "_" or hyphen "-".
3639 02 Dec 15 olle 210     // The name must not start with "ML", since that is reserved for MeLuDI items.
3639 02 Dec 15 olle 211
3435 02 Jul 15 olle 212     extraMaterialIsValid = true;
3435 02 Jul 15 olle 213
3412 22 Jun 15 olle 214     var namePrefix = 'name.';
3412 22 Jun 15 olle 215     var name = frm[namePrefix+index].value;
3412 22 Jun 15 olle 216
3639 02 Dec 15 olle 217     // Check that name is not empty string
3412 22 Jun 15 olle 218     if (name == '')
3412 22 Jun 15 olle 219     {
3412 22 Jun 15 olle 220       Wizard.setInputStatus('extramaterial.'+index, 'invalid', 'Missing name');
3435 02 Jul 15 olle 221       extraMaterialIsValid = false;
3412 22 Jun 15 olle 222       return;
3412 22 Jun 15 olle 223     }
4207 07 Nov 16 olle 224     // Check that name does not start with sample item prefix
4207 07 Nov 16 olle 225     if (name.indexOf(sampleItemPrefix) == 0)
3412 22 Jun 15 olle 226     {
4207 07 Nov 16 olle 227       Wizard.setInputStatus('extramaterial.'+index, 'invalid', 'Name of extra material must not start with "' + sampleItemPrefix + '"');
3435 02 Jul 15 olle 228       extraMaterialIsValid = false;
3412 22 Jun 15 olle 229       return;
3412 22 Jun 15 olle 230     }
3639 02 Dec 15 olle 231     // Check that name does not start with underscore "_"
3639 02 Dec 15 olle 232     if (name.indexOf('_') == 0)
3639 02 Dec 15 olle 233     {
3639 02 Dec 15 olle 234       Wizard.setInputStatus('extramaterial.'+index, 'invalid', 'Name of extra material must not start with "_"');
3639 02 Dec 15 olle 235       extraMaterialIsValid = false;
3639 02 Dec 15 olle 236       return;
3639 02 Dec 15 olle 237     }
3639 02 Dec 15 olle 238     // Check that name does not start with hyphen "-"
3639 02 Dec 15 olle 239     if (name.indexOf('-') == 0)
3639 02 Dec 15 olle 240     {
3639 02 Dec 15 olle 241       Wizard.setInputStatus('extramaterial.'+index, 'invalid', 'Name of extra material must not start with "-"');
3639 02 Dec 15 olle 242       extraMaterialIsValid = false;
3639 02 Dec 15 olle 243       return;
3639 02 Dec 15 olle 244     }
3639 02 Dec 15 olle 245     // Check that name only contains letters, figures, underscores, and hyphens
3639 02 Dec 15 olle 246     var pattern = /^[A-Za-z0-9_-]*$/
3639 02 Dec 15 olle 247     if (!pattern.test(name))
3639 02 Dec 15 olle 248     {
3639 02 Dec 15 olle 249       Wizard.setInputStatus('extramaterial.'+index, 'invalid', 'Name must contain only letters, figures, underscores, and hyphens');
3639 02 Dec 15 olle 250       extraMaterialIsValid = false;
3639 02 Dec 15 olle 251       return;
3639 02 Dec 15 olle 252     }
3639 02 Dec 15 olle 253     // Check that name contains at least one letter
3639 02 Dec 15 olle 254     pattern = /^[0-9_-]*[A-Za-z]+[A-Za-z0-9_-]*$/
3639 02 Dec 15 olle 255     if (!pattern.test(name))
3639 02 Dec 15 olle 256     {
3639 02 Dec 15 olle 257       Wizard.setInputStatus('extramaterial.'+index, 'invalid', 'Name must contain at least one letter');
3639 02 Dec 15 olle 258       extraMaterialIsValid = false;
3639 02 Dec 15 olle 259       return;
3639 02 Dec 15 olle 260     }
3412 22 Jun 15 olle 261     Wizard.setInputStatus('extramaterial.'+index, 'valid');
3412 22 Jun 15 olle 262
3412 22 Jun 15 olle 263     var type = frm['type.'+index].value;
3412 22 Jun 15 olle 264
3412 22 Jun 15 olle 265     // Check if an old name exists
3412 22 Jun 15 olle 266     var oldName = jsonOldNameArr[index];
3412 22 Jun 15 olle 267
3412 22 Jun 15 olle 268     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
3412 22 Jun 15 olle 269     url += '&cmd=GetExtraMaterialInfo';
3412 22 Jun 15 olle 270     url += '&index=' + encodeURIComponent(index);
3412 22 Jun 15 olle 271     url += '&name=' + encodeURIComponent(name);
3412 22 Jun 15 olle 272     url += '&type=' + encodeURIComponent(type);
3412 22 Jun 15 olle 273     url += '&oldName=' + encodeURIComponent(oldName);
3412 22 Jun 15 olle 274     
3412 22 Jun 15 olle 275     Wizard.showLoadingAnimation('Loading information about extra material...');
3412 22 Jun 15 olle 276     Wizard.asyncJsonRequest(url, emreg.extraMaterialInfoLoaded);
3412 22 Jun 15 olle 277   }
3412 22 Jun 15 olle 278
3412 22 Jun 15 olle 279   emreg.extraMaterialInfoLoaded = function(response)
3412 22 Jun 15 olle 280   {
3412 22 Jun 15 olle 281     var frm = document.forms['meludi'];  
3435 02 Jul 15 olle 282     var nofExtraMaterial = frm.nofExtraMaterial.value;
3412 22 Jun 15 olle 283     emInfo = response.emInfo;
3412 22 Jun 15 olle 284
3412 22 Jun 15 olle 285     var index = emInfo.index;
3412 22 Jun 15 olle 286     var name = emInfo.name;
3412 22 Jun 15 olle 287     var type = emInfo.type;
3435 02 Jul 15 olle 288     var namePrefix = 'name.';
3435 02 Jul 15 olle 289     var typePrefix = 'type.';
3435 02 Jul 15 olle 290     var itemnamePrefix = 'itemname.';
3412 22 Jun 15 olle 291     var nofSpecimen = emInfo.nofSpecimen;
3412 22 Jun 15 olle 292     var nofDna = emInfo.nofDna;
3412 22 Jun 15 olle 293     var nofRna = emInfo.nofRna;
3412 22 Jun 15 olle 294     var highestSpecimenNumber = emInfo.highestSpecimenNumber;
3435 02 Jul 15 olle 295     var oldNameHighestSpecimenNumber = emInfo.oldNameHighestSpecimenNumber;    
3435 02 Jul 15 olle 296     var jsonResult = [];
3412 22 Jun 15 olle 297     var itemnamePrefix = 'itemname.';
3435 02 Jul 15 olle 298     var jsonExtractSuffix = {};
3435 02 Jul 15 olle 299     jsonExtractSuffix['DNA'] = '.d';
3435 02 Jul 15 olle 300     jsonExtractSuffix['RNA'] = '.r';
3412 22 Jun 15 olle 301
3412 22 Jun 15 olle 302     if (type == 'DNA' && nofDna > 0)
3412 22 Jun 15 olle 303     {
3412 22 Jun 15 olle 304       Wizard.setInputStatus('extramaterial.'+index, 'invalid', 'DNA extract with that name already exists');
3435 02 Jul 15 olle 305       extraMaterialIsValid = false;
3412 22 Jun 15 olle 306       return;
3412 22 Jun 15 olle 307     }
3412 22 Jun 15 olle 308
3412 22 Jun 15 olle 309     if (type == 'RNA' && nofRna > 0)
3412 22 Jun 15 olle 310     {
3412 22 Jun 15 olle 311       Wizard.setInputStatus('extramaterial.'+index, 'invalid', 'RNA extract with that name already exists');
3435 02 Jul 15 olle 312       extraMaterialIsValid = false;
3412 22 Jun 15 olle 313       return;
3412 22 Jun 15 olle 314     }
3412 22 Jun 15 olle 315
3412 22 Jun 15 olle 316     var itemname = name;
3435 02 Jul 15 olle 317     //
3435 02 Jul 15 olle 318     jsonResult = emreg.checkExtractItemNames();
3435 02 Jul 15 olle 319     for (var i=0; i < nofExtraMaterial; i++)
3412 22 Jun 15 olle 320     {
3435 02 Jul 15 olle 321       var tmpType = frm[typePrefix+i].value;
3435 02 Jul 15 olle 322       var tmpName = frm[namePrefix+i].value;
3435 02 Jul 15 olle 323       if (tmpType == 'DNA' || tmpType == 'RNA')
3435 02 Jul 15 olle 324       {
3435 02 Jul 15 olle 325         if (tmpName == '')
3435 02 Jul 15 olle 326         {
3435 02 Jul 15 olle 327           Doc.element(itemnamePrefix+i).innerHTML = '';
3435 02 Jul 15 olle 328           Wizard.setInputStatus('extramaterial.'+i, 'invalid', 'Missing name');
3435 02 Jul 15 olle 329           extraMaterialIsValid = false;
3435 02 Jul 15 olle 330         }
3435 02 Jul 15 olle 331         else
3435 02 Jul 15 olle 332         {
3435 02 Jul 15 olle 333           if (jsonResult[i])
3435 02 Jul 15 olle 334           {
3435 02 Jul 15 olle 335             itemname = tmpName + jsonExtractSuffix[tmpType];
3435 02 Jul 15 olle 336             // Update itemname
3435 02 Jul 15 olle 337             Doc.element(itemnamePrefix+i).innerHTML = itemname;
3435 02 Jul 15 olle 338             Wizard.setInputStatus('extramaterial.'+i, 'valid', '');
3435 02 Jul 15 olle 339           }
3435 02 Jul 15 olle 340           else
3435 02 Jul 15 olle 341           {
3435 02 Jul 15 olle 342             Wizard.setInputStatus('extramaterial.'+i, 'invalid', tmpType + ' extract name duplicate');
3435 02 Jul 15 olle 343             extraMaterialIsValid = false;
3435 02 Jul 15 olle 344           }
3435 02 Jul 15 olle 345         }
3435 02 Jul 15 olle 346       }
3412 22 Jun 15 olle 347     }
3435 02 Jul 15 olle 348     if (type == 'Specimen')
3412 22 Jun 15 olle 349     {
3412 22 Jun 15 olle 350       // Update all specimens with same base name to get unique number suffices
3412 22 Jun 15 olle 351       emreg.updateSpecimenItemNames(name, highestSpecimenNumber);
3412 22 Jun 15 olle 352     }
3412 22 Jun 15 olle 353
3412 22 Jun 15 olle 354     // Check if an old name exists
3412 22 Jun 15 olle 355     var oldName = jsonOldNameArr[index];
3412 22 Jun 15 olle 356     if (oldName)
3412 22 Jun 15 olle 357     {
3412 22 Jun 15 olle 358       // Update all specimens with same old base name to get unique number suffices
3412 22 Jun 15 olle 359       emreg.updateSpecimenItemNames(oldName, oldNameHighestSpecimenNumber);
3412 22 Jun 15 olle 360     }
3412 22 Jun 15 olle 361     // Update JSONArr of names
3412 22 Jun 15 olle 362     jsonOldNameArr[index] = name;
3412 22 Jun 15 olle 363   }
3412 22 Jun 15 olle 364
3435 02 Jul 15 olle 365   /**
3435 02 Jul 15 olle 366    *  Check for duplicate names of extracs in list.
3435 02 Jul 15 olle 367    *  The first occurrence is considered OK, while
3435 02 Jul 15 olle 368    *  following are considered duplicates. JSONArray
3435 02 Jul 15 olle 369    *  jsonResults has value `false` for duplicates,
3435 02 Jul 15 olle 370    *  else `true`.
3435 02 Jul 15 olle 371    */
3435 02 Jul 15 olle 372   emreg.checkExtractItemNames = function()
3435 02 Jul 15 olle 373   {
3435 02 Jul 15 olle 374     // Check if more than one extract item with same name
3435 02 Jul 15 olle 375     // and type exists in the table
3435 02 Jul 15 olle 376
3435 02 Jul 15 olle 377     var frm = document.forms['meludi'];
3435 02 Jul 15 olle 378     var namePrefix = 'name.';
3435 02 Jul 15 olle 379     var typePrefix = 'type.';
3435 02 Jul 15 olle 380     var itemnamePrefix = 'itemname.';
3435 02 Jul 15 olle 381     var nofExtractsWithName = 0;
3435 02 Jul 15 olle 382     var jsonResult = [];
3435 02 Jul 15 olle 383     jsonResult[0] = true;
3435 02 Jul 15 olle 384     var nofExtraMaterial = frm.nofExtraMaterial.value;
3435 02 Jul 15 olle 385     for (var i=0; i < nofExtraMaterial; i++)
3435 02 Jul 15 olle 386     {
3435 02 Jul 15 olle 387       jsonResult[i] = true;
3435 02 Jul 15 olle 388     }
3435 02 Jul 15 olle 389     for (var i=0; i < nofExtraMaterial; i++)
3435 02 Jul 15 olle 390     {
3435 02 Jul 15 olle 391       var currentType = frm[typePrefix+i].value;
3435 02 Jul 15 olle 392       var currentName = frm[namePrefix+i].value;
3435 02 Jul 15 olle 393       for (var j=(i+1); j < nofExtraMaterial; j++)
3435 02 Jul 15 olle 394       {
3435 02 Jul 15 olle 395         var type = frm[typePrefix+j].value;
3435 02 Jul 15 olle 396         if (type == currentType)
3435 02 Jul 15 olle 397         {
3435 02 Jul 15 olle 398           var name = frm[namePrefix+j].value;
3435 02 Jul 15 olle 399           if (name == currentName)
3435 02 Jul 15 olle 400           {
3435 02 Jul 15 olle 401             jsonResult[j] = false;
3435 02 Jul 15 olle 402           }
3435 02 Jul 15 olle 403         }
3435 02 Jul 15 olle 404       }
3435 02 Jul 15 olle 405     }
3435 02 Jul 15 olle 406     return jsonResult;
3435 02 Jul 15 olle 407   }
3435 02 Jul 15 olle 408
3412 22 Jun 15 olle 409   emreg.updateSpecimenItemNames = function(currentName, highestSpecimenNumber)
3412 22 Jun 15 olle 410   {
3412 22 Jun 15 olle 411     // Update all item names for specimens with given name
3412 22 Jun 15 olle 412     // by adding numbers above those already used for specimens
3412 22 Jun 15 olle 413     // in the database 
3412 22 Jun 15 olle 414
3412 22 Jun 15 olle 415     var frm = document.forms['meludi'];
3412 22 Jun 15 olle 416     var nofExtraMaterial = frm.nofExtraMaterial.value;
3412 22 Jun 15 olle 417     var highestTempSpecimenNumber = highestSpecimenNumber;
3412 22 Jun 15 olle 418     for (var i=0; i < nofExtraMaterial; i++)
3412 22 Jun 15 olle 419     {
3412 22 Jun 15 olle 420       var namePrefix = 'name.';
3412 22 Jun 15 olle 421       var typePrefix = 'type.';
3412 22 Jun 15 olle 422       var itemnamePrefix = 'itemname.';
3412 22 Jun 15 olle 423       var type = frm[typePrefix+i].value;
3412 22 Jun 15 olle 424       if (type == 'Specimen')
3412 22 Jun 15 olle 425       {
3412 22 Jun 15 olle 426         var name = frm[namePrefix+i].value;
3412 22 Jun 15 olle 427         if (name == currentName)
3412 22 Jun 15 olle 428         {
3412 22 Jun 15 olle 429           // Increment highest temporary specimen number
3412 22 Jun 15 olle 430           highestTempSpecimenNumber++;
3412 22 Jun 15 olle 431           var itemname = name + '.' + highestTempSpecimenNumber;
3412 22 Jun 15 olle 432
3412 22 Jun 15 olle 433           // Update itemname
3412 22 Jun 15 olle 434           Doc.element(itemnamePrefix+i).innerHTML = itemname;
3412 22 Jun 15 olle 435         }
3412 22 Jun 15 olle 436       }
3412 22 Jun 15 olle 437     }
3412 22 Jun 15 olle 438   }
3412 22 Jun 15 olle 439
3412 22 Jun 15 olle 440   emreg.typeOnChange = function(event)
3412 22 Jun 15 olle 441   {
3637 01 Dec 15 olle 442     var frm = document.forms['meludi'];
3637 01 Dec 15 olle 443     var target = event.currentTarget;
3637 01 Dec 15 olle 444
3637 01 Dec 15 olle 445     var index = Data.int(target, 'index');
3637 01 Dec 15 olle 446
3637 01 Dec 15 olle 447     var type = frm['type.'+index].value;
3637 01 Dec 15 olle 448
3637 01 Dec 15 olle 449     if (type == 'DNA')
3637 01 Dec 15 olle 450     {
3637 01 Dec 15 olle 451       // Enable control check box
3637 01 Dec 15 olle 452       Doc.removeClass('isControl.'+index, 'disabled');
3637 01 Dec 15 olle 453     }
3637 01 Dec 15 olle 454     else
3637 01 Dec 15 olle 455     {
3637 01 Dec 15 olle 456       // Uncheck and disable control check box
3637 01 Dec 15 olle 457       frm['isControl.'+index].checked = false;
3637 01 Dec 15 olle 458       Doc.addClass('isControl.'+index, 'disabled');
3637 01 Dec 15 olle 459       // Clear and disable control lot number field
3637 01 Dec 15 olle 460       frm['controlLotNo.'+index].value = '';
3637 01 Dec 15 olle 461       Doc.addClass('controlLotNo.'+index, 'disabled');
3637 01 Dec 15 olle 462     }
3412 22 Jun 15 olle 463     emreg.nameOnChange(event);
3412 22 Jun 15 olle 464   }
3412 22 Jun 15 olle 465
3412 22 Jun 15 olle 466   emreg.arrivalDateOnChange = function(event)
3412 22 Jun 15 olle 467   {
3412 22 Jun 15 olle 468     var frm = document.forms['meludi'];
3412 22 Jun 15 olle 469     var target = event.currentTarget;
3412 22 Jun 15 olle 470
3412 22 Jun 15 olle 471     var index = Data.int(target, 'index');
3412 22 Jun 15 olle 472
3412 22 Jun 15 olle 473     var arrivalDateKey = 'arrivalDateDefault';
3412 22 Jun 15 olle 474     var messageFieldKey = 'arrivalDateDefault';
3412 22 Jun 15 olle 475     if (index >= 0)
3412 22 Jun 15 olle 476     {
3412 22 Jun 15 olle 477       var arrivalDatePrefix = 'arrivaldate.';
3412 22 Jun 15 olle 478       var messageFieldPrefix = 'extramaterial.';
3412 22 Jun 15 olle 479       arrivalDateKey = arrivalDatePrefix+index;
3412 22 Jun 15 olle 480       messageFieldKey = messageFieldPrefix+index;
3412 22 Jun 15 olle 481     }
3412 22 Jun 15 olle 482     var arrivalDate = frm[arrivalDateKey].value;
3412 22 Jun 15 olle 483
3412 22 Jun 15 olle 484     if (arrivalDate != '')
3412 22 Jun 15 olle 485     {
3412 22 Jun 15 olle 486       // Auto-fill the date if it's only given with 4(MMdd) or 6(yyMMdd) digits.
3412 22 Jun 15 olle 487       arrivalDate = Meludi.autoFillDate(arrivalDate);
3412 22 Jun 15 olle 488       frm[arrivalDateKey].value = arrivalDate;
3412 22 Jun 15 olle 489     
3412 22 Jun 15 olle 490       var d = Dates.parseString(arrivalDate, 'yyyyMMdd');
3412 22 Jun 15 olle 491       if (d == null)
3412 22 Jun 15 olle 492       {
3412 22 Jun 15 olle 493         Wizard.setInputStatus(messageFieldKey, 'invalid', 'Not a valid date');
3412 22 Jun 15 olle 494         return;
3412 22 Jun 15 olle 495       }
3412 22 Jun 15 olle 496       
3412 22 Jun 15 olle 497       var today = new Date();
3412 22 Jun 15 olle 498       if (d.getTime() > today.getTime())
3412 22 Jun 15 olle 499       {
3412 22 Jun 15 olle 500         Wizard.setInputStatus(messageFieldKey, 'invalid', 'Future date is not valid');
3412 22 Jun 15 olle 501         return;
3412 22 Jun 15 olle 502       }
3412 22 Jun 15 olle 503
3412 22 Jun 15 olle 504       Wizard.setInputStatus(messageFieldKey, 'valid');
3412 22 Jun 15 olle 505       emreg.nameOnChange(event);
3412 22 Jun 15 olle 506     }
3412 22 Jun 15 olle 507   }
3412 22 Jun 15 olle 508   
3637 01 Dec 15 olle 509   emreg.controlOnChange = function(event)
3637 01 Dec 15 olle 510   {
3637 01 Dec 15 olle 511     var frm = document.forms['meludi'];
3637 01 Dec 15 olle 512     var target = event.currentTarget;
3637 01 Dec 15 olle 513
3637 01 Dec 15 olle 514     var index = Data.int(target, 'index');
3637 01 Dec 15 olle 515     // Enable/Disable control lot number field
3637 01 Dec 15 olle 516     if (frm['isControl.'+index].checked)
3637 01 Dec 15 olle 517     {
3637 01 Dec 15 olle 518       // Enable control lot number field
3637 01 Dec 15 olle 519       Doc.removeClass('controlLotNo.'+index, 'disabled');
3637 01 Dec 15 olle 520     }
3637 01 Dec 15 olle 521     else
3637 01 Dec 15 olle 522     {
3637 01 Dec 15 olle 523       // Disable control lot number field
3637 01 Dec 15 olle 524       Doc.addClass('controlLotNo.'+index, 'disabled');
3637 01 Dec 15 olle 525       // Clear control lot number field
3637 01 Dec 15 olle 526       frm['controlLotNo.'+index].value = '';
3637 01 Dec 15 olle 527     }
3637 01 Dec 15 olle 528   }
3637 01 Dec 15 olle 529
3412 22 Jun 15 olle 530   emreg.validateStep2 = function(event)
3412 22 Jun 15 olle 531   {
3412 22 Jun 15 olle 532     var valid = true;
3412 22 Jun 15 olle 533     var frm = document.forms['meludi'];  
3412 22 Jun 15 olle 534
3412 22 Jun 15 olle 535     valid &= nofExtraMaterialIsValid;
3435 02 Jul 15 olle 536     valid &= extraMaterialIsValid;
3412 22 Jun 15 olle 537     
3412 22 Jun 15 olle 538     if (!valid) event.preventDefault();
3412 22 Jun 15 olle 539   }
3412 22 Jun 15 olle 540
3412 22 Jun 15 olle 541   emreg.submit = function()
3412 22 Jun 15 olle 542   {
3412 22 Jun 15 olle 543     var frm = document.forms['meludi'];
3412 22 Jun 15 olle 544
3412 22 Jun 15 olle 545     var nofExtraMaterial = parseInt(frm.nofExtraMaterial.value);
3412 22 Jun 15 olle 546     emInfo.specimen = [];
3412 22 Jun 15 olle 547     for (var i = 0; i < nofExtraMaterial; i++)
3412 22 Jun 15 olle 548     {
3412 22 Jun 15 olle 549       var specimenTube = {};
3412 22 Jun 15 olle 550       specimenTube.name = Doc.element('itemname.'+i).innerHTML;
3412 22 Jun 15 olle 551       specimenTube.type = frm['type.'+i].value;
3412 22 Jun 15 olle 552       specimenTube.arrivaldate = frm['arrivaldate.'+i].value;
3637 01 Dec 15 olle 553       specimenTube.controllotno = frm['controlLotNo.'+i].value;
3412 22 Jun 15 olle 554       specimenTube.comment = frm['comment.'+i].value;
3412 22 Jun 15 olle 555       emInfo.specimen[i] = specimenTube;
3412 22 Jun 15 olle 556     }
3412 22 Jun 15 olle 557
3412 22 Jun 15 olle 558     var submitInfo = {};
3412 22 Jun 15 olle 559     submitInfo.emInfo = emInfo;
3412 22 Jun 15 olle 560
3412 22 Jun 15 olle 561     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
3412 22 Jun 15 olle 562     url += '&cmd=CreateExtraMaterial';
3412 22 Jun 15 olle 563     Wizard.showLoadingAnimation('Performing registration...');
3412 22 Jun 15 olle 564     Wizard.asyncJsonRequest(url, emreg.submissionResults, 'POST', JSON.stringify(submitInfo));
3412 22 Jun 15 olle 565   }
3435 02 Jul 15 olle 566
3412 22 Jun 15 olle 567   emreg.submissionResults = function(response)
3412 22 Jun 15 olle 568   {
3412 22 Jun 15 olle 569     Wizard.showFinalMessage(response.messages);
3412 22 Jun 15 olle 570     Doc.show('gorestart');
3412 22 Jun 15 olle 571     Doc.show('gonext-message');
3412 22 Jun 15 olle 572   }
3412 22 Jun 15 olle 573
3412 22 Jun 15 olle 574   emreg.countDownToRestart = function()
3412 22 Jun 15 olle 575   {
3412 22 Jun 15 olle 576     var time = restartAt - (new Date()).getTime();
3412 22 Jun 15 olle 577     if (time < 0)
3412 22 Jun 15 olle 578     {
3412 22 Jun 15 olle 579       Wizard.restartWizard();
3412 22 Jun 15 olle 580     }
3412 22 Jun 15 olle 581     else
3412 22 Jun 15 olle 582     {
3412 22 Jun 15 olle 583       Doc.element('gonext-message').innerHTML = '<i>Wizard will restart automatically in ' + Math.ceil(time/1000) + ' seconds...</i>';
3412 22 Jun 15 olle 584     }
3412 22 Jun 15 olle 585   }
3412 22 Jun 15 olle 586   
3412 22 Jun 15 olle 587   emreg.stopAutoRestart = function()
3412 22 Jun 15 olle 588   {
3412 22 Jun 15 olle 589     clearTimeout(restartTimer);
3412 22 Jun 15 olle 590     Doc.hide('gonext-message');
3412 22 Jun 15 olle 591     Doc.hide('gostop');
3412 22 Jun 15 olle 592   }
3412 22 Jun 15 olle 593
3412 22 Jun 15 olle 594   return emreg;
3412 22 Jun 15 olle 595 }();
3412 22 Jun 15 olle 596
3412 22 Jun 15 olle 597 Doc.onLoad(ExtraMaterialReg.initPage);
3412 22 Jun 15 olle 598