www/biomaterials/wizards/create_child_bioplate.js

Code
Comments
Other
Rev Date Author Line
7604 25 Feb 19 nicklas 1 /* $Id $
7604 25 Feb 19 nicklas 2   ------------------------------------------------------------------
7604 25 Feb 19 nicklas 3   Copyright (C) 2014 Nicklas Nordborg
7604 25 Feb 19 nicklas 4
7604 25 Feb 19 nicklas 5   This file is part of BASE - BioArray Software Environment.
7604 25 Feb 19 nicklas 6   Available at http://base.thep.lu.se/
7604 25 Feb 19 nicklas 7
7604 25 Feb 19 nicklas 8   BASE is free software; you can redistribute it and/or
7604 25 Feb 19 nicklas 9   modify it under the terms of the GNU General Public License
7604 25 Feb 19 nicklas 10   as published by the Free Software Foundation; either version 3
7604 25 Feb 19 nicklas 11   of the License, or (at your option) any later version.
7604 25 Feb 19 nicklas 12
7604 25 Feb 19 nicklas 13   BASE is distributed in the hope that it will be useful,
7604 25 Feb 19 nicklas 14   but WITHOUT ANY WARRANTY; without even the implied warranty of
7604 25 Feb 19 nicklas 15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
7604 25 Feb 19 nicklas 16   GNU General Public License for more details.
7604 25 Feb 19 nicklas 17
7604 25 Feb 19 nicklas 18   You should have received a copy of the GNU General Public License
7604 25 Feb 19 nicklas 19   along with BASE. If not, see <http://www.gnu.org/licenses/>.
7604 25 Feb 19 nicklas 20   ------------------------------------------------------------------
7604 25 Feb 19 nicklas 21
7604 25 Feb 19 nicklas 22   @author Nicklas
7604 25 Feb 19 nicklas 23 */
7604 25 Feb 19 nicklas 24 'use strict';
7604 25 Feb 19 nicklas 25
7604 25 Feb 19 nicklas 26 var CreateChildBioPlate = function()
7604 25 Feb 19 nicklas 27 {
7604 25 Feb 19 nicklas 28   var child = {};
7604 25 Feb 19 nicklas 29   
7604 25 Feb 19 nicklas 30   // For drawing
7604 25 Feb 19 nicklas 31   var graphics;
7604 25 Feb 19 nicklas 32   var pen;
7604 25 Feb 19 nicklas 33   var selectedPen;
7604 25 Feb 19 nicklas 34   
7604 25 Feb 19 nicklas 35   // Source and destination plates
7604 25 Feb 19 nicklas 36   var sourcePlate;
7604 25 Feb 19 nicklas 37   var destPlates;
7604 25 Feb 19 nicklas 38   
7604 25 Feb 19 nicklas 39   // We can select one well on each plate
7604 25 Feb 19 nicklas 40   var selectedSourceWell;
7604 25 Feb 19 nicklas 41   var selectedDestWell;
7604 25 Feb 19 nicklas 42
7604 25 Feb 19 nicklas 43   // Plate and source well currently being edited
7604 25 Feb 19 nicklas 44   var editingPlate;
7604 25 Feb 19 nicklas 45   var editingWell;
7604 25 Feb 19 nicklas 46
7604 25 Feb 19 nicklas 47   /**
7604 25 Feb 19 nicklas 48     Initialize the page.
7604 25 Feb 19 nicklas 49   */
7604 25 Feb 19 nicklas 50   child.initPage = function()
7604 25 Feb 19 nicklas 51   {
7604 25 Feb 19 nicklas 52     var pageId = Doc.getPageId();
7604 25 Feb 19 nicklas 53     if (pageId == 'step-1')
7604 25 Feb 19 nicklas 54     {
7604 25 Feb 19 nicklas 55       // Save and close buttons
7604 25 Feb 19 nicklas 56       Buttons.addClickHandler('close', App.closeWindow);
7604 25 Feb 19 nicklas 57       Buttons.addClickHandler('btnNext', child.gotoStep2);
7604 25 Feb 19 nicklas 58       
7604 25 Feb 19 nicklas 59       // Hardware
7604 25 Feb 19 nicklas 60       Buttons.addClickHandler('hardware_id.select', child.selectHardware);
7604 25 Feb 19 nicklas 61       Events.addEventHandler('hardware_id', 'base-selected', Items.onItemSelected);
7604 25 Feb 19 nicklas 62
7604 25 Feb 19 nicklas 63       // Protocol
7604 25 Feb 19 nicklas 64       Buttons.addClickHandler('protocol_id.select', child.selectProtocol);
7604 25 Feb 19 nicklas 65       Events.addEventHandler('protocol_id', 'base-selected', Items.onItemSelected);
7604 25 Feb 19 nicklas 66
7604 25 Feb 19 nicklas 67       // Protocol
7604 25 Feb 19 nicklas 68       Buttons.addClickHandler('kit_id.select', child.selectKit);
7604 25 Feb 19 nicklas 69       Events.addEventHandler('kit_id', 'base-selected', Items.onItemSelected);
7604 25 Feb 19 nicklas 70
7604 25 Feb 19 nicklas 71       // Tag
7604 25 Feb 19 nicklas 72       Buttons.addClickHandler('tag_id.select', child.selectTag);
7604 25 Feb 19 nicklas 73       Events.addEventHandler('tag_id', 'base-selected', Items.onItemSelected);
7604 25 Feb 19 nicklas 74       
7604 25 Feb 19 nicklas 75       // Quantities
7604 25 Feb 19 nicklas 76       Events.addEventHandler('original_quantity', 'keypress', Events.numberOnly);
7604 25 Feb 19 nicklas 77       Events.addEventHandler('used_quantity', 'keypress', Events.numberOnly);
7604 25 Feb 19 nicklas 78       
7604 25 Feb 19 nicklas 79       // Child type
7604 25 Feb 19 nicklas 80       Events.addEventHandler('child_biomaterial_type', 'change', child.childTypeOnChange);
7604 25 Feb 19 nicklas 81
7604 25 Feb 19 nicklas 82       // Plate geometry
7604 25 Feb 19 nicklas 83       Buttons.addClickHandler('plategeometry_id.select', child.selectPlateGeometry);
7604 25 Feb 19 nicklas 84       Events.addEventHandler('plategeometry_id', 'base-selected', Items.onItemSelected);
7604 25 Feb 19 nicklas 85
7604 25 Feb 19 nicklas 86       // Bioplate type
7604 25 Feb 19 nicklas 87       Buttons.addClickHandler('bioplatetype_id.select', child.selectBioPlateType);
7604 25 Feb 19 nicklas 88       Events.addEventHandler('bioplatetype_id', 'base-selected', Items.onItemSelected);
7604 25 Feb 19 nicklas 89       
7604 25 Feb 19 nicklas 90       // Storage location
7604 25 Feb 19 nicklas 91       Buttons.addClickHandler('freezer_id.select', child.selectFreezer);
7604 25 Feb 19 nicklas 92       Events.addEventHandler('freezer_id', 'base-selected', Items.onItemSelected);
7604 25 Feb 19 nicklas 93       
7604 25 Feb 19 nicklas 94       // Plates
7604 25 Feb 19 nicklas 95       Events.addEventHandler('number_of_plates', 'keypress', Events.integerOnly);
7604 25 Feb 19 nicklas 96       Events.addEventHandler('size', 'keypress', Events.integerOnly);
7604 25 Feb 19 nicklas 97       
7604 25 Feb 19 nicklas 98       child.childTypeOnChange();
7604 25 Feb 19 nicklas 99     }
7604 25 Feb 19 nicklas 100     else if (pageId == 'step-2')
7604 25 Feb 19 nicklas 101     {
7604 25 Feb 19 nicklas 102       // Save and close buttons
7604 25 Feb 19 nicklas 103       Buttons.addClickHandler('close', App.closeWindow);
7604 25 Feb 19 nicklas 104       Buttons.addClickHandler('btnSave', child.createChildPlate);
7604 25 Feb 19 nicklas 105       
7604 25 Feb 19 nicklas 106       // Toolbar
7604 25 Feb 19 nicklas 107       Buttons.addClickHandler('btnPlaceByRow', child.placeByRow);
7604 25 Feb 19 nicklas 108       Buttons.addClickHandler('btnPlaceByColumn', child.placeByColumn);
7604 25 Feb 19 nicklas 109       Buttons.addClickHandler('btnClearMapping', child.clearMapping);
7604 25 Feb 19 nicklas 110       Buttons.addClickHandler('btnSelectPlateMapping', child.selectPlateMapping);
7604 25 Feb 19 nicklas 111       Events.addEventHandler('btnSelectPlateMapping', 'base-selected', child.setPlateMappingCallback);
7604 25 Feb 19 nicklas 112
7604 25 Feb 19 nicklas 113       // Options
7604 25 Feb 19 nicklas 114       Events.addEventHandler('showSourceCoordinates', 'click', child.showSourceCoordinatesOnClick);
7604 25 Feb 19 nicklas 115
7604 25 Feb 19 nicklas 116       // Handle layout changes
7604 25 Feb 19 nicklas 117       Events.addEventHandler(window, 'resize', child.onLayoutChange);
7604 25 Feb 19 nicklas 118       
7604 25 Feb 19 nicklas 119       // Initialize graphics
7604 25 Feb 19 nicklas 120       graphics = new jsGraphics(Doc.element('canvas'));
7604 25 Feb 19 nicklas 121       pen = new jsPen(new jsColor('#2288AA'), 1);
7604 25 Feb 19 nicklas 122       selectedPen = new jsPen(new jsColor('#2288AA'), 2);
7604 25 Feb 19 nicklas 123
7604 25 Feb 19 nicklas 124       child.initSourceBioPlate();
7604 25 Feb 19 nicklas 125       child.initDestinationPlates();
7604 25 Feb 19 nicklas 126     }
7604 25 Feb 19 nicklas 127
7604 25 Feb 19 nicklas 128   }
7604 25 Feb 19 nicklas 129   
7604 25 Feb 19 nicklas 130   child.gotoStep2 = function()
7604 25 Feb 19 nicklas 131   {
7604 25 Feb 19 nicklas 132     var frm = document.forms['main'];
7604 25 Feb 19 nicklas 133     var childType = frm.child_biomaterial_type.value;
7604 25 Feb 19 nicklas 134     if (Strings.trim(frm.event_name.value) == '')
7604 25 Feb 19 nicklas 135     {
7604 25 Feb 19 nicklas 136       Forms.showNotification(frm.event_name, 'You must enter a name for the new event');
7604 25 Feb 19 nicklas 137       return;
7604 25 Feb 19 nicklas 138     }
7604 25 Feb 19 nicklas 139     if (Strings.trim(frm.number_of_plates.value) == '')
7604 25 Feb 19 nicklas 140     {
7604 25 Feb 19 nicklas 141       Forms.showNotification(frm.number_of_plates, 'You must enter the number of plates that was created');
7604 25 Feb 19 nicklas 142       return;
7604 25 Feb 19 nicklas 143     }
7604 25 Feb 19 nicklas 144     if (Strings.trim(frm.plate_name_prefix.value) == '')
7604 25 Feb 19 nicklas 145     {
7604 25 Feb 19 nicklas 146       Forms.showNotification(frm.plate_name_prefix, 'You must enter a name prefix for the new plates');
7604 25 Feb 19 nicklas 147       return;
7604 25 Feb 19 nicklas 148     }
7604 25 Feb 19 nicklas 149     if (frm.plategeometry_id.length == 0 && childType != 'PHYSICALBIOASSAY')
7604 25 Feb 19 nicklas 150     {
7604 25 Feb 19 nicklas 151       Forms.showNotification('plategeometry_id.select', 'You must select a plate geometry');
7604 25 Feb 19 nicklas 152       return false;
7604 25 Feb 19 nicklas 153     }
7604 25 Feb 19 nicklas 154     if (frm.bioplatetype_id.length == 0 && childType != 'PHYSICALBIOASSAY')
7604 25 Feb 19 nicklas 155     {
7604 25 Feb 19 nicklas 156       Forms.showNotification('bioplatetype_id.select', 'You must select a plate type');
7604 25 Feb 19 nicklas 157       return false;
7604 25 Feb 19 nicklas 158     }
7604 25 Feb 19 nicklas 159     frm.submit();
7604 25 Feb 19 nicklas 160   }
7604 25 Feb 19 nicklas 161   
7604 25 Feb 19 nicklas 162   child.selectHardware = function()
7604 25 Feb 19 nicklas 163   {
7604 25 Feb 19 nicklas 164     var frm = document.forms['main'];
7604 25 Feb 19 nicklas 165     var url = '&resetTemporary=1';
7604 25 Feb 19 nicklas 166     if (frm.hardware_id.length > 1) 
7604 25 Feb 19 nicklas 167     {
7604 25 Feb 19 nicklas 168       var id = Math.abs(parseInt(frm.hardware_id[1].value));        
7604 25 Feb 19 nicklas 169       url += '&item_id='+id;
7604 25 Feb 19 nicklas 170     }
7604 25 Feb 19 nicklas 171     var childType = frm.child_biomaterial_type.value;
7604 25 Feb 19 nicklas 172     url += ItemSubtype.createRelatedFilter(childType+'_subtype_id', 'HARDWARE');
7604 25 Feb 19 nicklas 173     Dialogs.selectItem('HARDWARE', 'hardware_id', 0, url);
7604 25 Feb 19 nicklas 174   }
7604 25 Feb 19 nicklas 175
7604 25 Feb 19 nicklas 176   child.selectProtocol = function()
7604 25 Feb 19 nicklas 177   {
7604 25 Feb 19 nicklas 178     var frm = document.forms['main'];
7604 25 Feb 19 nicklas 179     var url = '&resetTemporary=1';
7604 25 Feb 19 nicklas 180     if (frm.protocol_id.length > 1) 
7604 25 Feb 19 nicklas 181     {
7604 25 Feb 19 nicklas 182       var id = Math.abs(parseInt(frm.protocol_id[1].value));        
7604 25 Feb 19 nicklas 183       url += '&item_id='+id;
7604 25 Feb 19 nicklas 184     }
7604 25 Feb 19 nicklas 185     var childType = frm.child_biomaterial_type[frm.child_biomaterial_type.selectedIndex].value;
7604 25 Feb 19 nicklas 186     url += ItemSubtype.createRelatedFilter(childType+'_subtype_id', 'PROTOCOL');
7604 25 Feb 19 nicklas 187     Dialogs.selectItem('PROTOCOL', 'protocol_id', 0, url);
7604 25 Feb 19 nicklas 188   }
7604 25 Feb 19 nicklas 189   
7604 25 Feb 19 nicklas 190   child.selectKit = function()
7604 25 Feb 19 nicklas 191   {
7604 25 Feb 19 nicklas 192     var frm = document.forms['main'];
7604 25 Feb 19 nicklas 193     var url = '&resetTemporary=1';
7604 25 Feb 19 nicklas 194     url += '&tmpfilter:BOOLEAN:inactive=0';
7604 25 Feb 19 nicklas 195     if (frm.kit_id.length > 1) 
7604 25 Feb 19 nicklas 196     {
7604 25 Feb 19 nicklas 197       var id = Math.abs(parseInt(frm.kit_id[1].value));        
7604 25 Feb 19 nicklas 198       url += '&item_id='+id;
7604 25 Feb 19 nicklas 199     }
7604 25 Feb 19 nicklas 200     var childType = frm.child_biomaterial_type[frm.child_biomaterial_type.selectedIndex].value;
7604 25 Feb 19 nicklas 201     url += ItemSubtype.createRelatedFilter(childType+'_subtype_id', 'KIT');
7604 25 Feb 19 nicklas 202     Dialogs.selectItem('KIT', 'kit_id', 0, url);
7604 25 Feb 19 nicklas 203   }
7604 25 Feb 19 nicklas 204
7604 25 Feb 19 nicklas 205   child.selectTag = function()
7604 25 Feb 19 nicklas 206   {
7604 25 Feb 19 nicklas 207     var frm = document.forms['main'];
7604 25 Feb 19 nicklas 208     var url = '&resetTemporary=1';
7604 25 Feb 19 nicklas 209     if (frm.protocol_id.length > 1) 
7604 25 Feb 19 nicklas 210     {
7604 25 Feb 19 nicklas 211       var id = Math.abs(parseInt(frm.protocol_id[1].value));        
7604 25 Feb 19 nicklas 212       url += '&item_id='+id;
7604 25 Feb 19 nicklas 213     }
7604 25 Feb 19 nicklas 214     var childType = frm.child_biomaterial_type.value;
7604 25 Feb 19 nicklas 215     url += ItemSubtype.createRelatedFilter(childType+'_subtype_id', 'TAG');
7604 25 Feb 19 nicklas 216     Dialogs.selectItem('TAG', 'tag_id', 0, url);
7604 25 Feb 19 nicklas 217   }
7604 25 Feb 19 nicklas 218
7604 25 Feb 19 nicklas 219   child.selectFreezer = function()
7604 25 Feb 19 nicklas 220   {
7604 25 Feb 19 nicklas 221     var frm = document.forms['main'];
7604 25 Feb 19 nicklas 222     var url = '&resetTemporary=1';
7604 25 Feb 19 nicklas 223     if (frm.freezer_id.length > 1) 
7604 25 Feb 19 nicklas 224     {
7604 25 Feb 19 nicklas 225       var id = Math.abs(parseInt(frm.freezer_id[1].value));        
7604 25 Feb 19 nicklas 226       url += '&item_id='+id;
7604 25 Feb 19 nicklas 227     }
7604 25 Feb 19 nicklas 228     url += '&tmpfilter:INT:itemSubtype='+Data.int('page-data', 'freezer-id');
7604 25 Feb 19 nicklas 229     Dialogs.selectItem('HARDWARE', 'freezer_id', 0, url);
7604 25 Feb 19 nicklas 230   }
7604 25 Feb 19 nicklas 231   
7604 25 Feb 19 nicklas 232   child.selectPlateGeometry = function()
7604 25 Feb 19 nicklas 233   {
7604 25 Feb 19 nicklas 234     var frm = document.forms['main'];
7604 25 Feb 19 nicklas 235     var url = '&resetTemporary=1';
7604 25 Feb 19 nicklas 236     if (frm.plategeometry_id.length > 0) url += '&item_id='+frm.plategeometry_id[0].value;
7604 25 Feb 19 nicklas 237     Dialogs.selectItem('PLATEGEOMETRY', 'plategeometry_id', 0, url);
7604 25 Feb 19 nicklas 238   }
7604 25 Feb 19 nicklas 239   
7604 25 Feb 19 nicklas 240   child.selectBioPlateType = function()
7604 25 Feb 19 nicklas 241   {
7604 25 Feb 19 nicklas 242     var frm = document.forms['main'];
7604 25 Feb 19 nicklas 243     var url = '&resetTemporary=1';
7604 25 Feb 19 nicklas 244     if (frm.bioplatetype_id.length > 0)
7604 25 Feb 19 nicklas 245     {
7604 25 Feb 19 nicklas 246       url += '&item_id='+frm.bioplatetype_id[0].value;
7604 25 Feb 19 nicklas 247     }
7604 25 Feb 19 nicklas 248     
7604 25 Feb 19 nicklas 249     var childType = frm.child_biomaterial_type.value; 
7604 25 Feb 19 nicklas 250     // Restrict to plates that can holds to target biomaterial
7604 25 Feb 19 nicklas 251     url += '&tmpfilter:INT:bioMaterialType='+encodeURIComponent('|'+Data.int('page-data', childType));
7604 25 Feb 19 nicklas 252     var subtypeId = ItemSubtype.getSubtypeId(childType+'_subtype_id');
7604 25 Feb 19 nicklas 253     // Restrict to plates with the given subtype
7604 25 Feb 19 nicklas 254     url += '&tmpfilter:INT:itemSubtype='+encodeURIComponent(subtypeId ? '|' + subtypeId : '=');
7604 25 Feb 19 nicklas 255   
7604 25 Feb 19 nicklas 256     Dialogs.selectItem('BIOPLATETYPE', 'bioplatetype_id', 0, url);
7604 25 Feb 19 nicklas 257   }
7604 25 Feb 19 nicklas 258   
7604 25 Feb 19 nicklas 259   child.childTypeOnChange = function()
7604 25 Feb 19 nicklas 260   {
7604 25 Feb 19 nicklas 261     var frm = document.forms['main'];
7604 25 Feb 19 nicklas 262     var childType = frm.child_biomaterial_type.value;
7604 25 Feb 19 nicklas 263     var isSample = childType == 'SAMPLE';
7604 25 Feb 19 nicklas 264     var isExtract = childType == 'EXTRACT';
7604 25 Feb 19 nicklas 265     var isBioAssay = childType == 'PHYSICALBIOASSAY';
7604 25 Feb 19 nicklas 266     Doc.showHide('sampleSubtypesDiv', isSample);
7604 25 Feb 19 nicklas 267     Doc.showHide('extractSubtypesDiv', isExtract);
7604 25 Feb 19 nicklas 268     Doc.showHide('bioAssaySubtypesDiv', isBioAssay);
7604 25 Feb 19 nicklas 269     Doc.showHide('tagDiv', isExtract);
7604 25 Feb 19 nicklas 270     Doc.showHide('originalQuantityDiv', !isBioAssay);
7604 25 Feb 19 nicklas 271     Doc.showHide('freezerDiv', !isBioAssay);
7604 25 Feb 19 nicklas 272     Doc.showHide('plateTypeDiv', !isBioAssay);
7604 25 Feb 19 nicklas 273     Doc.showHide('geometryDiv', !isBioAssay);
7604 25 Feb 19 nicklas 274     Doc.showHide('sizeDiv', isBioAssay);
7604 25 Feb 19 nicklas 275   }
7604 25 Feb 19 nicklas 276
7604 25 Feb 19 nicklas 277   
7604 25 Feb 19 nicklas 278   /**
7604 25 Feb 19 nicklas 279     Select the source well that is clicked on. The currently selected well
7604 25 Feb 19 nicklas 280     is de-selected. If the clicked well is the same as the currently 
7604 25 Feb 19 nicklas 281     selected well no new item is selected. If a destination well is already 
7604 25 Feb 19 nicklas 282     selected a link is made between the source and destination wells.
7604 25 Feb 19 nicklas 283   */
7604 25 Feb 19 nicklas 284   child.sourceWellOnClick = function(event)
7604 25 Feb 19 nicklas 285   {
7604 25 Feb 19 nicklas 286     var row = Data.int(event.currentTarget, 'row');
7604 25 Feb 19 nicklas 287     var column = Data.int(event.currentTarget, 'column');
7604 25 Feb 19 nicklas 288     
7604 25 Feb 19 nicklas 289     var well = sourcePlate.getWell(row, column);
7604 25 Feb 19 nicklas 290     if (!well) return;
7604 25 Feb 19 nicklas 291     child.storeAndHideChildInfo();
7604 25 Feb 19 nicklas 292   
7604 25 Feb 19 nicklas 293     // De-select the currently selected source well
7604 25 Feb 19 nicklas 294     if (selectedSourceWell) 
7604 25 Feb 19 nicklas 295     {
7604 25 Feb 19 nicklas 296       selectedSourceWell.setSelected(false);
7604 25 Feb 19 nicklas 297       if (well == selectedSourceWell)
7604 25 Feb 19 nicklas 298       {
7604 25 Feb 19 nicklas 299         // Re-draw link with regular pen (eg. same as onmouseover)
7604 25 Feb 19 nicklas 300         selectedSourceWell.drawLink(graphics, pen, true);
7604 25 Feb 19 nicklas 301         selectedSourceWell = null;
7604 25 Feb 19 nicklas 302         return;
7604 25 Feb 19 nicklas 303       }
7604 25 Feb 19 nicklas 304       else
7604 25 Feb 19 nicklas 305       {
7604 25 Feb 19 nicklas 306         selectedSourceWell.hideLink(graphics);
7604 25 Feb 19 nicklas 307       }
7604 25 Feb 19 nicklas 308     }
7604 25 Feb 19 nicklas 309     
7604 25 Feb 19 nicklas 310     // Select the new source well and draw link to destination well
7604 25 Feb 19 nicklas 311     selectedSourceWell = well;
7604 25 Feb 19 nicklas 312     selectedSourceWell.setSelected(true);
7604 25 Feb 19 nicklas 313     selectedSourceWell.drawLink(graphics, selectedPen, true);
7604 25 Feb 19 nicklas 314   
7604 25 Feb 19 nicklas 315     // Map the source and destination wells
7604 25 Feb 19 nicklas 316     if (selectedSourceWell && selectedDestWell)
7604 25 Feb 19 nicklas 317     {
7604 25 Feb 19 nicklas 318       child.mapSelectedWells();
7604 25 Feb 19 nicklas 319     }
7604 25 Feb 19 nicklas 320     child.showChildInfo();
7604 25 Feb 19 nicklas 321   }
7604 25 Feb 19 nicklas 322   
7604 25 Feb 19 nicklas 323   /**
7604 25 Feb 19 nicklas 324     Draw a link between the mapped source and destination wells.
7604 25 Feb 19 nicklas 325   */
7604 25 Feb 19 nicklas 326   child.sourceWellOnMouseOver = function(event)
7604 25 Feb 19 nicklas 327   {
7604 25 Feb 19 nicklas 328     var row = Data.int(event.currentTarget, 'row');
7604 25 Feb 19 nicklas 329     var column = Data.int(event.currentTarget, 'column');
7604 25 Feb 19 nicklas 330
7604 25 Feb 19 nicklas 331     var well = sourcePlate.getWell(row, column);
7604 25 Feb 19 nicklas 332     if (!well) return;
7604 25 Feb 19 nicklas 333     well.drawLink(graphics, pen, false);
7604 25 Feb 19 nicklas 334   }
7604 25 Feb 19 nicklas 335   
7604 25 Feb 19 nicklas 336   /**
7604 25 Feb 19 nicklas 337     Hide the link between the mapped source and destination 
7604 25 Feb 19 nicklas 338     wells, unless one of them is selected.
7604 25 Feb 19 nicklas 339   */
7604 25 Feb 19 nicklas 340   child.sourceWellOnMouseOut = function(event)
7604 25 Feb 19 nicklas 341   {
7604 25 Feb 19 nicklas 342     var row = Data.int(event.currentTarget, 'row');
7604 25 Feb 19 nicklas 343     var column = Data.int(event.currentTarget, 'column');
7604 25 Feb 19 nicklas 344
7604 25 Feb 19 nicklas 345     var well = sourcePlate.getWell(row, column);
7604 25 Feb 19 nicklas 346     if (!well) return;
7604 25 Feb 19 nicklas 347     if (!well.selected && !(well.mappedWell && well.mappedWell.selected)) 
7604 25 Feb 19 nicklas 348     {
7604 25 Feb 19 nicklas 349       well.hideLink(graphics);
7604 25 Feb 19 nicklas 350     }
7604 25 Feb 19 nicklas 351   }
7604 25 Feb 19 nicklas 352   
7604 25 Feb 19 nicklas 353   child.destWellOnClick = function(event)
7604 25 Feb 19 nicklas 354   {
7604 25 Feb 19 nicklas 355     var plateNo = Data.int(event.currentTarget, 'plate');
7604 25 Feb 19 nicklas 356     var row = Data.int(event.currentTarget, 'row');
7604 25 Feb 19 nicklas 357     var column = Data.int(event.currentTarget, 'column');
7604 25 Feb 19 nicklas 358     
7604 25 Feb 19 nicklas 359     var well = destPlates[plateNo].getWell(row, column);
7604 25 Feb 19 nicklas 360     child.storeAndHideChildInfo();
7604 25 Feb 19 nicklas 361   
7604 25 Feb 19 nicklas 362     // De-select the currently selected well
7604 25 Feb 19 nicklas 363     if (selectedDestWell) 
7604 25 Feb 19 nicklas 364     {
7604 25 Feb 19 nicklas 365       selectedDestWell.setSelected(false);
7604 25 Feb 19 nicklas 366       if (well == selectedDestWell)
7604 25 Feb 19 nicklas 367       {
7604 25 Feb 19 nicklas 368         // Re-draw link with regular pen (eg. same as onmouseover)
7604 25 Feb 19 nicklas 369         selectedDestWell.drawLink(graphics, pen, true);
7604 25 Feb 19 nicklas 370         selectedDestWell = null;
7604 25 Feb 19 nicklas 371         return;
7604 25 Feb 19 nicklas 372       }
7604 25 Feb 19 nicklas 373       else
7604 25 Feb 19 nicklas 374       {
7604 25 Feb 19 nicklas 375         selectedDestWell.hideLink(graphics);
7604 25 Feb 19 nicklas 376       }
7604 25 Feb 19 nicklas 377     }
7604 25 Feb 19 nicklas 378     
7604 25 Feb 19 nicklas 379     selectedDestWell = well;
7604 25 Feb 19 nicklas 380     selectedDestWell.setSelected(true);
7604 25 Feb 19 nicklas 381     selectedDestWell.drawLink(graphics, selectedPen, true);
7604 25 Feb 19 nicklas 382   
7604 25 Feb 19 nicklas 383     if (selectedSourceWell && selectedDestWell)
7604 25 Feb 19 nicklas 384     {
7604 25 Feb 19 nicklas 385       child.mapSelectedWells();
7604 25 Feb 19 nicklas 386     }
7604 25 Feb 19 nicklas 387     child.showChildInfo();
7604 25 Feb 19 nicklas 388   }
7604 25 Feb 19 nicklas 389   
7604 25 Feb 19 nicklas 390   child.destWellOnMouseOver = function(event)
7604 25 Feb 19 nicklas 391   {
7604 25 Feb 19 nicklas 392     var plateNo = Data.int(event.currentTarget, 'plate');
7604 25 Feb 19 nicklas 393     var row = Data.int(event.currentTarget, 'row');
7604 25 Feb 19 nicklas 394     var column = Data.int(event.currentTarget, 'column');
7604 25 Feb 19 nicklas 395     
7604 25 Feb 19 nicklas 396     var well = destPlates[plateNo].getWell(row, column);
7604 25 Feb 19 nicklas 397     if (!well) return;
7604 25 Feb 19 nicklas 398     well.drawLink(graphics, pen, false);
7604 25 Feb 19 nicklas 399   }
7604 25 Feb 19 nicklas 400   
7604 25 Feb 19 nicklas 401   child.destWellOnMouseOut = function(event)
7604 25 Feb 19 nicklas 402   {
7604 25 Feb 19 nicklas 403     var plateNo = Data.int(event.currentTarget, 'plate');
7604 25 Feb 19 nicklas 404     var row = Data.int(event.currentTarget, 'row');
7604 25 Feb 19 nicklas 405     var column = Data.int(event.currentTarget, 'column');
7604 25 Feb 19 nicklas 406     
7604 25 Feb 19 nicklas 407     var well = destPlates[plateNo].getWell(row, column);
7604 25 Feb 19 nicklas 408     if (!well) return;
7604 25 Feb 19 nicklas 409     if (!well.selected && !(well.mappedWell && well.mappedWell.selected)) 
7604 25 Feb 19 nicklas 410     {
7604 25 Feb 19 nicklas 411       well.hideLink(graphics);
7604 25 Feb 19 nicklas 412     }
7604 25 Feb 19 nicklas 413   }
7604 25 Feb 19 nicklas 414   
7604 25 Feb 19 nicklas 415   /**
7604 25 Feb 19 nicklas 416     Map the selected source and destination wells. Hide and
7604 25 Feb 19 nicklas 417     redraw links as needed.
7604 25 Feb 19 nicklas 418   */
7604 25 Feb 19 nicklas 419   child.mapSelectedWells = function()
7604 25 Feb 19 nicklas 420   {
7604 25 Feb 19 nicklas 421     // Hide any links that are currently displayed
7604 25 Feb 19 nicklas 422     selectedSourceWell.hideLink(graphics);
7604 25 Feb 19 nicklas 423     selectedDestWell.hideLink(graphics);
7604 25 Feb 19 nicklas 424     
7604 25 Feb 19 nicklas 425     // Map to the new well and draw link
7604 25 Feb 19 nicklas 426     if (selectedSourceWell.mappedWell != selectedDestWell)
7604 25 Feb 19 nicklas 427     {
7604 25 Feb 19 nicklas 428       selectedSourceWell.mapToWell(selectedDestWell);
7604 25 Feb 19 nicklas 429       selectedSourceWell.drawLink(graphics, pen, true);
7604 25 Feb 19 nicklas 430     }
7604 25 Feb 19 nicklas 431     else
7604 25 Feb 19 nicklas 432     {
7604 25 Feb 19 nicklas 433       selectedSourceWell.unmapWell();
7604 25 Feb 19 nicklas 434     }
7604 25 Feb 19 nicklas 435     
7604 25 Feb 19 nicklas 436     // De-select everything
7604 25 Feb 19 nicklas 437     selectedSourceWell.setSelected(false);
7604 25 Feb 19 nicklas 438     selectedDestWell.setSelected(false);
7604 25 Feb 19 nicklas 439     selectedSourceWell = null;
7604 25 Feb 19 nicklas 440     selectedDestWell = null;
7604 25 Feb 19 nicklas 441   }
7604 25 Feb 19 nicklas 442
7604 25 Feb 19 nicklas 443   /**
7604 25 Feb 19 nicklas 444     Remove all mappings that have been made so far.
7604 25 Feb 19 nicklas 445   */
7604 25 Feb 19 nicklas 446   child.clearMapping = function()
7604 25 Feb 19 nicklas 447   {
7604 25 Feb 19 nicklas 448     if (!destPlates) 
7604 25 Feb 19 nicklas 449     {
7604 25 Feb 19 nicklas 450       alert('No destination plates have been created');
7604 25 Feb 19 nicklas 451       return;
7604 25 Feb 19 nicklas 452     }
7604 25 Feb 19 nicklas 453     if (!confirm('This will remove all placed biomaterial. Continue?')) return;
7604 25 Feb 19 nicklas 454     sourcePlate.unmapAll(graphics);
7604 25 Feb 19 nicklas 455   }
7604 25 Feb 19 nicklas 456   
7604 25 Feb 19 nicklas 457   /**
7604 25 Feb 19 nicklas 458     Automatically move remaining biomaterial to the destination plate filling rows first.
7604 25 Feb 19 nicklas 459     Biomaterial and wells that have already been mapped are skipped.
7604 25 Feb 19 nicklas 460   */
7604 25 Feb 19 nicklas 461   child.placeByRow = function()
7604 25 Feb 19 nicklas 462   {
7604 25 Feb 19 nicklas 463     if (!destPlates) 
7604 25 Feb 19 nicklas 464     {
7604 25 Feb 19 nicklas 465       alert('No destination plates have been created');
7604 25 Feb 19 nicklas 466       return;
7604 25 Feb 19 nicklas 467     }
7604 25 Feb 19 nicklas 468     var srcRow = 0;
7604 25 Feb 19 nicklas 469     var srcCol = 0;
7604 25 Feb 19 nicklas 470     for (var plateNo = 0; plateNo < destPlates.length; plateNo++)
7604 25 Feb 19 nicklas 471     {
7604 25 Feb 19 nicklas 472       var destPlate = destPlates[plateNo];
7604 25 Feb 19 nicklas 473       for (var destRow = 0; destRow < destPlate.rows; destRow++)
7604 25 Feb 19 nicklas 474       {
7604 25 Feb 19 nicklas 475         for (var destCol = 0; destCol < destPlate.columns; destCol++)
7604 25 Feb 19 nicklas 476         {
7604 25 Feb 19 nicklas 477           var destWell = destPlate.getWell(destRow, destCol);
7604 25 Feb 19 nicklas 478           if (!destWell.mappedWell && !destWell.locked)
7604 25 Feb 19 nicklas 479           {
7604 25 Feb 19 nicklas 480             var mapped = false;
7604 25 Feb 19 nicklas 481             var srcWell = sourcePlate.getWell(srcRow, srcCol);
7604 25 Feb 19 nicklas 482             while (srcWell && !mapped)
7604 25 Feb 19 nicklas 483             {
7604 25 Feb 19 nicklas 484               if (srcWell.id && !srcWell.locked && !srcWell.mappedWell)
7604 25 Feb 19 nicklas 485               {
7604 25 Feb 19 nicklas 486                 srcWell.mapToWell(destWell);
7604 25 Feb 19 nicklas 487                 mapped = true;
7604 25 Feb 19 nicklas 488               }
7604 25 Feb 19 nicklas 489               else
7604 25 Feb 19 nicklas 490               {
7604 25 Feb 19 nicklas 491                 srcCol++;
7604 25 Feb 19 nicklas 492                 if (srcCol >= sourcePlate.columns)
7604 25 Feb 19 nicklas 493                 {
7604 25 Feb 19 nicklas 494                   srcCol = 0;
7604 25 Feb 19 nicklas 495                   srcRow++;
7604 25 Feb 19 nicklas 496                 }
7604 25 Feb 19 nicklas 497                 srcWell = sourcePlate.getWell(srcRow, srcCol);
7604 25 Feb 19 nicklas 498               }
7604 25 Feb 19 nicklas 499             }
7604 25 Feb 19 nicklas 500           }
7604 25 Feb 19 nicklas 501         }
7604 25 Feb 19 nicklas 502       }
7604 25 Feb 19 nicklas 503     }
7604 25 Feb 19 nicklas 504   }
7604 25 Feb 19 nicklas 505
7604 25 Feb 19 nicklas 506   /**
7604 25 Feb 19 nicklas 507     Automatically move remaining biomaterial to the destination plate filling columns first.
7604 25 Feb 19 nicklas 508     Biomaterial and wells that have already been mapped are skipped.
7604 25 Feb 19 nicklas 509   */
7604 25 Feb 19 nicklas 510   child.placeByColumn = function()
7604 25 Feb 19 nicklas 511   {
7604 25 Feb 19 nicklas 512     if (!destPlates) 
7604 25 Feb 19 nicklas 513     {
7604 25 Feb 19 nicklas 514       alert('No destination plates have been created');
7604 25 Feb 19 nicklas 515       return;
7604 25 Feb 19 nicklas 516     }
7604 25 Feb 19 nicklas 517     var srcRow = 0;
7604 25 Feb 19 nicklas 518     var srcCol = 0;
7604 25 Feb 19 nicklas 519     for (var plateNo = 0; plateNo < destPlates.length; plateNo++)
7604 25 Feb 19 nicklas 520     {
7604 25 Feb 19 nicklas 521       var destPlate = destPlates[plateNo];
7604 25 Feb 19 nicklas 522       for (var destCol = 0; destCol < destPlate.columns; destCol++)
7604 25 Feb 19 nicklas 523       {
7604 25 Feb 19 nicklas 524         for (var destRow = 0; destRow < destPlate.rows; destRow++)
7604 25 Feb 19 nicklas 525         {
7604 25 Feb 19 nicklas 526           var destWell = destPlate.getWell(destRow, destCol);
7604 25 Feb 19 nicklas 527           if (!destWell.mappedWell && !destWell.locked)
7604 25 Feb 19 nicklas 528           {
7604 25 Feb 19 nicklas 529             var mapped = false;
7604 25 Feb 19 nicklas 530             var srcWell = sourcePlate.getWell(srcRow, srcCol);
7604 25 Feb 19 nicklas 531             while (srcWell && !mapped)
7604 25 Feb 19 nicklas 532             {
7604 25 Feb 19 nicklas 533               if (srcWell.id && !srcWell.locked && !srcWell.mappedWell)
7604 25 Feb 19 nicklas 534               {
7604 25 Feb 19 nicklas 535                 srcWell.mapToWell(destWell);
7604 25 Feb 19 nicklas 536                 mapped = true;
7604 25 Feb 19 nicklas 537               }
7604 25 Feb 19 nicklas 538               else
7604 25 Feb 19 nicklas 539               {
7604 25 Feb 19 nicklas 540                 srcRow++;
7604 25 Feb 19 nicklas 541                 if (srcRow >= sourcePlate.rows)
7604 25 Feb 19 nicklas 542                 {
7604 25 Feb 19 nicklas 543                   srcCol++;
7604 25 Feb 19 nicklas 544                   srcRow = 0;
7604 25 Feb 19 nicklas 545                 }
7604 25 Feb 19 nicklas 546                 srcWell = sourcePlate.getWell(srcRow, srcCol);
7604 25 Feb 19 nicklas 547               }
7604 25 Feb 19 nicklas 548             }
7604 25 Feb 19 nicklas 549           }
7604 25 Feb 19 nicklas 550         }
7604 25 Feb 19 nicklas 551       }
7604 25 Feb 19 nicklas 552     }
7604 25 Feb 19 nicklas 553   }
7604 25 Feb 19 nicklas 554
7604 25 Feb 19 nicklas 555   child.selectPlateMapping = function()
7604 25 Feb 19 nicklas 556   {
7604 25 Feb 19 nicklas 557     if (!destPlates) 
7604 25 Feb 19 nicklas 558     {
7604 25 Feb 19 nicklas 559       alert('No destination plates have been created');
7604 25 Feb 19 nicklas 560       return;
7604 25 Feb 19 nicklas 561     }
7604 25 Feb 19 nicklas 562     var url = '&resetTemporary=1';
7604 25 Feb 19 nicklas 563     url += '&tmpfilter:INT:sourceGeometry.rows='+sourcePlate.rows;
7604 25 Feb 19 nicklas 564     url += '&tmpfilter:INT:sourceGeometry.columns='+sourcePlate.columns;
7604 25 Feb 19 nicklas 565     url += '&tmpfilter:INT:sourceCount=1';
7604 25 Feb 19 nicklas 566     url += '&tmpfilter:INT:destinationGeometry.rows='+destPlates[0].rows;
7604 25 Feb 19 nicklas 567     url += '&tmpfilter:INT:destinationGeometry.columns='+destPlates[0].columns;
7604 25 Feb 19 nicklas 568     url += '&tmpfilter:INT:destinationCount=' + destPlates.length;
7604 25 Feb 19 nicklas 569     Dialogs.selectItem('PLATEMAPPING', 'btnSelectPlateMapping', 0, url);
7604 25 Feb 19 nicklas 570   }
7604 25 Feb 19 nicklas 571   
7604 25 Feb 19 nicklas 572   child.setPlateMappingCallback = function(event)
7604 25 Feb 19 nicklas 573   {
7604 25 Feb 19 nicklas 574     var request = Ajax.getXmlHttpRequest();
7604 25 Feb 19 nicklas 575     var url = '../../lims/platemappings/ajax.jsp?ID='+App.getSessionId();
7604 25 Feb 19 nicklas 576     url += '&cmd=GetMappingDetails&item_id=' + event.detail.id;
7604 25 Feb 19 nicklas 577     request.open("GET", url, false); 
7604 25 Feb 19 nicklas 578     request.send(null);
7604 25 Feb 19 nicklas 579     var mappingInfo = JSON.parse(request.responseText);
7604 25 Feb 19 nicklas 580     if (mappingInfo.status != 'ok')
7604 25 Feb 19 nicklas 581     {
7604 25 Feb 19 nicklas 582       Forms.showNotification('btnSelectPlateMapping', plateInfo.message);
7604 25 Feb 19 nicklas 583       return false;
7604 25 Feb 19 nicklas 584     }
7604 25 Feb 19 nicklas 585     
7604 25 Feb 19 nicklas 586     var win = Dialogs.getDialog('SelectPLATEMAPPING') || window;
7604 25 Feb 19 nicklas 587     if (mappingInfo.sourcePlates != 1 || mappingInfo.sourceRows != sourcePlate.rows || mappingInfo.sourceColumns != sourcePlate.columns)
7604 25 Feb 19 nicklas 588     {
7604 25 Feb 19 nicklas 589       if (!win.confirm("The selected mapping doesn't match the geometry of the source plate.\nContinue mapping overlapping positions?")) return;
7604 25 Feb 19 nicklas 590     }
7604 25 Feb 19 nicklas 591     else if (mappingInfo.destinationPlates != destPlates.length || mappingInfo.destinationRows != destPlates[0].rows || mappingInfo.destinationColumns != destPlates[0].columns)
7604 25 Feb 19 nicklas 592     {
7604 25 Feb 19 nicklas 593       if (!win.confirm("The selected mapping doesn't match the geometry of the destination plate.\nContinue mapping overlapping positions?")) return;
7604 25 Feb 19 nicklas 594     }
7604 25 Feb 19 nicklas 595     
7604 25 Feb 19 nicklas 596     var numMapped = 0;
7604 25 Feb 19 nicklas 597     for (var i = 0; i < mappingInfo.details.length; i++)
7604 25 Feb 19 nicklas 598     {
7604 25 Feb 19 nicklas 599       var mapping = mappingInfo.details[i].split(',');
7604 25 Feb 19 nicklas 600       var srcWell = sourcePlate.getWell(parseInt(mapping[1]), parseInt(mapping[2]));
7604 25 Feb 19 nicklas 601       var plateNo = parseInt(mapping[3]);
7604 25 Feb 19 nicklas 602       if (plateNo >= 0 && plateNo < destPlates.length)
7604 25 Feb 19 nicklas 603       {
7604 25 Feb 19 nicklas 604         var destPlate = destPlates[plateNo];
7604 25 Feb 19 nicklas 605         var destWell = destPlate.getWell(parseInt(mapping[4]), parseInt(mapping[5]));
7604 25 Feb 19 nicklas 606         if (srcWell && destWell)
7604 25 Feb 19 nicklas 607         {
7604 25 Feb 19 nicklas 608           if (!destWell.mappedWell && !destWell.locked && srcWell.id && !srcWell.locked && !srcWell.mappedWell)
7604 25 Feb 19 nicklas 609           {
7604 25 Feb 19 nicklas 610             srcWell.mapToWell(destWell);
7604 25 Feb 19 nicklas 611             numMapped++;
7604 25 Feb 19 nicklas 612           }
7604 25 Feb 19 nicklas 613         }
7604 25 Feb 19 nicklas 614       }
7604 25 Feb 19 nicklas 615     }
7604 25 Feb 19 nicklas 616   }
7604 25 Feb 19 nicklas 617
7604 25 Feb 19 nicklas 618   child.initSourceBioPlate = function()
7604 25 Feb 19 nicklas 619   {
7604 25 Feb 19 nicklas 620     var frm = document.forms['main'];
7604 25 Feb 19 nicklas 621     var childBioMaterialType = frm.child_biomaterial_type.value;
7604 25 Feb 19 nicklas 622     var sourceBioMaterialType = frm.source_biomaterial_type.value;
7604 25 Feb 19 nicklas 623     var isBioAssayEvent = childBioMaterialType == 'PHYSICALBIOASSAY';
7604 25 Feb 19 nicklas 624     var childNameSuffix = '';
7604 25 Feb 19 nicklas 625     if (childBioMaterialType == 'SAMPLE')
7604 25 Feb 19 nicklas 626     {
7604 25 Feb 19 nicklas 627       childNameSuffix = 's';
7604 25 Feb 19 nicklas 628     }
7604 25 Feb 19 nicklas 629     else if (childBioMaterialType == 'EXTRACT')
7604 25 Feb 19 nicklas 630     {
7604 25 Feb 19 nicklas 631       childNameSuffix = 'e';
7604 25 Feb 19 nicklas 632     }
7604 25 Feb 19 nicklas 633
7604 25 Feb 19 nicklas 634     var request = Ajax.getXmlHttpRequest();
7604 25 Feb 19 nicklas 635     var url = '../bioplates/ajax.jsp?ID='+App.getSessionId();
7604 25 Feb 19 nicklas 636     url += '&cmd=GetFullPlateInfo&item_id=' + frm.sourceplate_id.value;
7604 25 Feb 19 nicklas 637     if (!isBioAssayEvent)
7604 25 Feb 19 nicklas 638     {
7604 25 Feb 19 nicklas 639       url += '&countChildren='+(sourceBioMaterialType == childBioMaterialType ? 'pooled' : '1');
7604 25 Feb 19 nicklas 640     }
7604 25 Feb 19 nicklas 641     request.open("GET", url, false); 
7604 25 Feb 19 nicklas 642     // NOTE! 'false' causes code to wait for the response. aka. 'Synchronous AJAX' or SJAX.
7604 25 Feb 19 nicklas 643     request.send(null);
7604 25 Feb 19 nicklas 644     var plateInfo = JSON.parse(request.responseText);
7604 25 Feb 19 nicklas 645     if (plateInfo.status != 'ok')
7604 25 Feb 19 nicklas 646     {
7604 25 Feb 19 nicklas 647       alert(plateInfo.message);
7604 25 Feb 19 nicklas 648       return false;
7604 25 Feb 19 nicklas 649     }
7604 25 Feb 19 nicklas 650
7604 25 Feb 19 nicklas 651     // Get plate and well information from the AJAX response
7604 25 Feb 19 nicklas 652     var rows = plateInfo.rows;
7604 25 Feb 19 nicklas 653     var columns = plateInfo.columns;
7604 25 Feb 19 nicklas 654     
7604 25 Feb 19 nicklas 655     var bigPlate = rows > 12 || columns > 18;
7604 25 Feb 19 nicklas 656     var plateClass = bigPlate ? 'plate bigplate' : 'plate';
7604 25 Feb 19 nicklas 657
7604 25 Feb 19 nicklas 658     // Create plate and wells
7604 25 Feb 19 nicklas 659     var prefix = 'source';
7604 25 Feb 19 nicklas 660     var plate = new Plate(prefix, plateInfo.id, plateInfo.name, rows, columns, true);
7604 25 Feb 19 nicklas 661     for (var i = 0; i < plateInfo.wells.length; i++)
7604 25 Feb 19 nicklas 662     {
7604 25 Feb 19 nicklas 663       var wellInfo = plateInfo.wells[i];
7604 25 Feb 19 nicklas 664       var bmInfo = wellInfo.bioMaterial;
7604 25 Feb 19 nicklas 665       var row = wellInfo.row;
7604 25 Feb 19 nicklas 666       var col = wellInfo.column;
7604 25 Feb 19 nicklas 667       var well = plate.getWell(row, col);
7604 25 Feb 19 nicklas 668       if (bmInfo)
7604 25 Feb 19 nicklas 669       {
7604 25 Feb 19 nicklas 670         well.id = bmInfo.id;
7604 25 Feb 19 nicklas 671         well.name = bmInfo.name;
7604 25 Feb 19 nicklas 672         if (!isBioAssayEvent)
7604 25 Feb 19 nicklas 673         {
7604 25 Feb 19 nicklas 674           well.childCount = bmInfo.childCount;
7604 25 Feb 19 nicklas 675           well.childName = well.name + '.' + childNameSuffix + (well.childCount + 1);
7604 25 Feb 19 nicklas 676         }
7604 25 Feb 19 nicklas 677       }
7604 25 Feb 19 nicklas 678     }
7604 25 Feb 19 nicklas 679     
7604 25 Feb 19 nicklas 680     // Create html table representing the bioplate
7604 25 Feb 19 nicklas 681     var html = '<table class="'+plateClass+'">';
7604 25 Feb 19 nicklas 682     html += '<tr><td></td>';
7604 25 Feb 19 nicklas 683     for (var c = 0; c < plate.columns; c++)
7604 25 Feb 19 nicklas 684     {
7604 25 Feb 19 nicklas 685       html += '<td class="columnheader">' + (c+1) + '</td>';
7604 25 Feb 19 nicklas 686     }
7604 25 Feb 19 nicklas 687     html += '</tr>';
7604 25 Feb 19 nicklas 688     for (var r = 0; r < plate.rows; r++)
7604 25 Feb 19 nicklas 689     {
7604 25 Feb 19 nicklas 690       html += '<tr><td class="rowheader">' + Plates.toAlphaCoordinate[r] + '</td>';
7604 25 Feb 19 nicklas 691       for (var c = 0; c < plate.columns; c++)
7604 25 Feb 19 nicklas 692       {
7604 25 Feb 19 nicklas 693         var well = plate.getWell(r, c);
7604 25 Feb 19 nicklas 694         var cls = 'well';
7604 25 Feb 19 nicklas 695         var onclick = '';
7604 25 Feb 19 nicklas 696         var onmouseover = '';
7604 25 Feb 19 nicklas 697         var onmouseout = '';
7604 25 Feb 19 nicklas 698         var title = well.name ? Strings.encodeTags(well.name) : '';
7604 25 Feb 19 nicklas 699
7604 25 Feb 19 nicklas 700         // We can only create a child biomaterial if the well is not empty
7604 25 Feb 19 nicklas 701         cls += well.id ? ' used editable' : ' empty';
7604 25 Feb 19 nicklas 702         html += '<td id="'+prefix+'.'+r+'.'+c+'" class="' + cls + '" data-row="'+r+'" data-column="'+c+'" title="'+title+'">';
7604 25 Feb 19 nicklas 703         html += '<div class="info" id="'+prefix+'.'+r+'.'+c+'.info"></div></td>';
7604 25 Feb 19 nicklas 704       }
7604 25 Feb 19 nicklas 705       html += '</tr>';
7604 25 Feb 19 nicklas 706     }
7604 25 Feb 19 nicklas 707     html += '</table>';
7604 25 Feb 19 nicklas 708     Doc.element('plate.src').innerHTML = html;
7604 25 Feb 19 nicklas 709     Doc.element('plate.src.name').innerHTML = Strings.encodeTags(plateInfo.name);
7604 25 Feb 19 nicklas 710     sourcePlate = plate;
7604 25 Feb 19 nicklas 711     
7604 25 Feb 19 nicklas 712     var wells = Doc.element('plate.src').getElementsByClassName('editable');
7604 25 Feb 19 nicklas 713     for (var i = 0; i < wells.length; i++)
7604 25 Feb 19 nicklas 714     {
7604 25 Feb 19 nicklas 715       var well = wells[i];
7604 25 Feb 19 nicklas 716       Events.addEventHandler(well, 'click', child.sourceWellOnClick);
7604 25 Feb 19 nicklas 717       Events.addEventHandler(well, 'mouseout', child.sourceWellOnMouseOut);
7604 25 Feb 19 nicklas 718       Events.addEventHandler(well, 'mouseover', child.sourceWellOnMouseOver);
7604 25 Feb 19 nicklas 719     }
7604 25 Feb 19 nicklas 720   }
7604 25 Feb 19 nicklas 721   
7604 25 Feb 19 nicklas 722   
7604 25 Feb 19 nicklas 723   child.initDestinationPlates = function()
7604 25 Feb 19 nicklas 724   {
7604 25 Feb 19 nicklas 725     var frm = document.forms['main'];
7604 25 Feb 19 nicklas 726     var numPlates = parseInt(frm.number_of_plates.value);
7604 25 Feb 19 nicklas 727     var childBioMaterialType = frm.child_biomaterial_type.value;
7604 25 Feb 19 nicklas 728     var rows = parseInt(frm.rows.value);
7604 25 Feb 19 nicklas 729     var columns = parseInt(frm.columns.value);
7604 25 Feb 19 nicklas 730     var namePrefix = frm.childplate_prefix.value;
7604 25 Feb 19 nicklas 731     
7604 25 Feb 19 nicklas 732     var bigPlate = rows > 12 || columns > 18;
7604 25 Feb 19 nicklas 733     var plateClass = bigPlate ? 'plate bigplate' : 'plate';
7604 25 Feb 19 nicklas 734
7604 25 Feb 19 nicklas 735     Doc.element('plate.dest.info').innerHTML = numPlates + ' - ' + rows + '×' + columns;
7604 25 Feb 19 nicklas 736     
7604 25 Feb 19 nicklas 737     // Create plate and wells
7604 25 Feb 19 nicklas 738     destPlates = new Array();
7604 25 Feb 19 nicklas 739     var html = '';
7604 25 Feb 19 nicklas 740     for (var plateNo = 0; plateNo < numPlates; plateNo++)
7604 25 Feb 19 nicklas 741     {
7604 25 Feb 19 nicklas 742       var prefix = 'dest.' + plateNo;
7604 25 Feb 19 nicklas 743       var plate = new Plate(prefix, plateNo, namePrefix + plateNo, rows, columns, false);
7604 25 Feb 19 nicklas 744       plate.barcode = '';
7604 25 Feb 19 nicklas 745       destPlates[plateNo] = plate;
7604 25 Feb 19 nicklas 746
7604 25 Feb 19 nicklas 747       // Create html table representing the bioplate
7604 25 Feb 19 nicklas 748       html += '<table class="'+plateClass+'" style="margin-bottom: 4px;">';
7604 25 Feb 19 nicklas 749       if (plateNo == 0)
7604 25 Feb 19 nicklas 750       {
7604 25 Feb 19 nicklas 751         html += '<tr><td></td>';
7604 25 Feb 19 nicklas 752         for (var c = 0; c < plate.columns; c++)
7604 25 Feb 19 nicklas 753         {
7604 25 Feb 19 nicklas 754           html += '<td class="columnheader">' + (c+1) + '</td>';
7604 25 Feb 19 nicklas 755         }
7604 25 Feb 19 nicklas 756         html += '</tr>';
7604 25 Feb 19 nicklas 757       }
7604 25 Feb 19 nicklas 758       for (var r = 0; r < plate.rows; r++)
7604 25 Feb 19 nicklas 759       {
7604 25 Feb 19 nicklas 760         html += '<tr><td class="rowheader">' + Plates.toAlphaCoordinate[r] + '</td>';
7604 25 Feb 19 nicklas 761         for (var c = 0; c < plate.columns; c++)
7604 25 Feb 19 nicklas 762         {
7604 25 Feb 19 nicklas 763           var cls = 'well empty editable';
7604 25 Feb 19 nicklas 764           html += '<td id="'+prefix+'.'+r+'.'+c+'" class="' + cls + '" data-plate="'+plateNo+'" data-row="'+r+'" data-column="'+c+'">';
7604 25 Feb 19 nicklas 765           html += '<div class="info" id="'+prefix+'.'+r+'.'+c+'.info"></div></td>';
7604 25 Feb 19 nicklas 766         }
7604 25 Feb 19 nicklas 767         html += '</tr>';
7604 25 Feb 19 nicklas 768       }
7604 25 Feb 19 nicklas 769       html += '</table>';
7604 25 Feb 19 nicklas 770     }
7604 25 Feb 19 nicklas 771     
7604 25 Feb 19 nicklas 772     Doc.element('plate.dest').innerHTML = html;
7604 25 Feb 19 nicklas 773
7604 25 Feb 19 nicklas 774     Doc.hide('destplatecreateoptions');
7604 25 Feb 19 nicklas 775     Doc.show('toolbar.mappings');
7604 25 Feb 19 nicklas 776     Doc.showHide('plate.dest.options', !bigPlate);
7604 25 Feb 19 nicklas 777     
7604 25 Feb 19 nicklas 778     var wells = Doc.element('plate.dest').getElementsByClassName('editable');
7604 25 Feb 19 nicklas 779     for (var i = 0; i < wells.length; i++)
7604 25 Feb 19 nicklas 780     {
7604 25 Feb 19 nicklas 781       var well = wells[i];
7604 25 Feb 19 nicklas 782       Events.addEventHandler(well, 'click', child.destWellOnClick);
7604 25 Feb 19 nicklas 783       Events.addEventHandler(well, 'mouseout', child.destWellOnMouseOut);
7604 25 Feb 19 nicklas 784       Events.addEventHandler(well, 'mouseover', child.destWellOnMouseOver);
7604 25 Feb 19 nicklas 785     }
7604 25 Feb 19 nicklas 786
7604 25 Feb 19 nicklas 787     child.showSourceCoordinatesOnClick();
7604 25 Feb 19 nicklas 788   }
7604 25 Feb 19 nicklas 789
7604 25 Feb 19 nicklas 790   /**
7604 25 Feb 19 nicklas 791     Redraw the link between selected wells when the layout changes
7604 25 Feb 19 nicklas 792   */
7604 25 Feb 19 nicklas 793   child.onLayoutChange = function(event)
7604 25 Feb 19 nicklas 794   {
7604 25 Feb 19 nicklas 795     if (selectedSourceWell)
7604 25 Feb 19 nicklas 796     {
7604 25 Feb 19 nicklas 797       selectedSourceWell.drawLink(graphics, selectedPen, true);
7604 25 Feb 19 nicklas 798     }
7604 25 Feb 19 nicklas 799     else if (selectedDestWell)
7604 25 Feb 19 nicklas 800     {
7604 25 Feb 19 nicklas 801       selectedDestWell.drawLink(graphics, selectedPen, true);
7604 25 Feb 19 nicklas 802     }
7604 25 Feb 19 nicklas 803   }
7604 25 Feb 19 nicklas 804
7604 25 Feb 19 nicklas 805   child.showSourceCoordinatesOnClick = function()
7604 25 Feb 19 nicklas 806   {
7604 25 Feb 19 nicklas 807     var frm = document.forms['main'];
7604 25 Feb 19 nicklas 808     Doc.addOrRemoveClass('plate.dest', 'noinfo', !frm.showSourceCoordinates.checked);
7604 25 Feb 19 nicklas 809   }
7604 25 Feb 19 nicklas 810
7604 25 Feb 19 nicklas 811   
7604 25 Feb 19 nicklas 812   child.showChildInfo = function()
7604 25 Feb 19 nicklas 813   {
7604 25 Feb 19 nicklas 814     if (selectedDestWell) 
7604 25 Feb 19 nicklas 815     {
7604 25 Feb 19 nicklas 816       editingPlate = selectedDestWell.plate;
7604 25 Feb 19 nicklas 817       editingWell = selectedDestWell.mappedWell;
7604 25 Feb 19 nicklas 818     }
7604 25 Feb 19 nicklas 819     else if (selectedSourceWell)
7604 25 Feb 19 nicklas 820     {
7604 25 Feb 19 nicklas 821       if (selectedSourceWell.mappedWell)
7604 25 Feb 19 nicklas 822       {
7604 25 Feb 19 nicklas 823         editingPlate = selectedSourceWell.mappedWell.plate;  
7604 25 Feb 19 nicklas 824       }
7604 25 Feb 19 nicklas 825       editingWell = selectedSourceWell;
7604 25 Feb 19 nicklas 826     }
7604 25 Feb 19 nicklas 827     var frm = document.forms['main'];
7604 25 Feb 19 nicklas 828     var isBioAssayEvent = frm.child_biomaterial_type.value == 'PHYSICALBIOASSAY';
7604 25 Feb 19 nicklas 829     if (editingPlate)
7604 25 Feb 19 nicklas 830     {
7604 25 Feb 19 nicklas 831       frm.plate_name.value = editingPlate.name;
7604 25 Feb 19 nicklas 832       if (!isBioAssayEvent)
7604 25 Feb 19 nicklas 833       {
7604 25 Feb 19 nicklas 834         frm.plate_barcode.value = editingPlate.barcode;
7604 25 Feb 19 nicklas 835       }
7604 25 Feb 19 nicklas 836       Doc.show('childplate.info', 'table');
7604 25 Feb 19 nicklas 837     }
7604 25 Feb 19 nicklas 838     if (editingWell && !isBioAssayEvent)
7604 25 Feb 19 nicklas 839     {
7604 25 Feb 19 nicklas 840       frm.biomaterial_name.value = editingWell.childName;
7604 25 Feb 19 nicklas 841       Doc.show('childbiomaterial.info', 'table');
7604 25 Feb 19 nicklas 842     }
7604 25 Feb 19 nicklas 843   }
7604 25 Feb 19 nicklas 844   
7604 25 Feb 19 nicklas 845   child.storeAndHideChildInfo = function()
7604 25 Feb 19 nicklas 846   {
7604 25 Feb 19 nicklas 847     var frm = document.forms['main'];
7604 25 Feb 19 nicklas 848     var isBioAssayEvent = frm.child_biomaterial_type.value == 'PHYSICALBIOASSAY';
7604 25 Feb 19 nicklas 849     if (editingWell && !isBioAssayEvent)
7604 25 Feb 19 nicklas 850     {
7604 25 Feb 19 nicklas 851       Doc.hide('childbiomaterial.info');
7604 25 Feb 19 nicklas 852       editingWell.childName = frm.biomaterial_name.value;
7604 25 Feb 19 nicklas 853       editingWell = null;
7604 25 Feb 19 nicklas 854     }
7604 25 Feb 19 nicklas 855     if (editingPlate)
7604 25 Feb 19 nicklas 856     {
7604 25 Feb 19 nicklas 857       Doc.hide('childplate.info');
7604 25 Feb 19 nicklas 858       editingPlate.name = frm.plate_name.value;
7604 25 Feb 19 nicklas 859       if (!isBioAssayEvent)
7604 25 Feb 19 nicklas 860       {
7604 25 Feb 19 nicklas 861         editingPlate.barcode = frm.plate_barcode.value;
7604 25 Feb 19 nicklas 862       }
7604 25 Feb 19 nicklas 863       editingPlate = null;
7604 25 Feb 19 nicklas 864     }
7604 25 Feb 19 nicklas 865     
7604 25 Feb 19 nicklas 866   }
7604 25 Feb 19 nicklas 867
7604 25 Feb 19 nicklas 868   child.createChildPlate = function()
7604 25 Feb 19 nicklas 869   {
7604 25 Feb 19 nicklas 870     var frm = document.forms['main'];
7604 25 Feb 19 nicklas 871     var numMapped = 0;
7604 25 Feb 19 nicklas 872     var isBioAssayEvent = frm.child_biomaterial_type.value == 'PHYSICALBIOASSAY';
7604 25 Feb 19 nicklas 873     for (var plateNo = 0; plateNo < destPlates.length; plateNo++)
7604 25 Feb 19 nicklas 874     {
7604 25 Feb 19 nicklas 875       var destPlate = destPlates[plateNo];
7604 25 Feb 19 nicklas 876       Forms.addHidden(frm, 'plate.' + plateNo + '.name', destPlate.name);
7604 25 Feb 19 nicklas 877       if (!isBioAssayEvent)
7604 25 Feb 19 nicklas 878       {
7604 25 Feb 19 nicklas 879         Forms.addHidden(frm, 'plate.' + plateNo + '.barcode', destPlate.barcode);
7604 25 Feb 19 nicklas 880       }
7604 25 Feb 19 nicklas 881       for (var row = 0; row < destPlate.rows; row++)
7604 25 Feb 19 nicklas 882       {
7604 25 Feb 19 nicklas 883         for (var column = 0; column < destPlate.columns; column++)
7604 25 Feb 19 nicklas 884         {
7604 25 Feb 19 nicklas 885           var well = destPlate.getWell(row, column);
7604 25 Feb 19 nicklas 886           if (well.mappedWell)
7604 25 Feb 19 nicklas 887           {
7604 25 Feb 19 nicklas 888             var prefix = 'well.' +plateNo + '.' + row + '.' + column;
7604 25 Feb 19 nicklas 889             Forms.addHidden(frm, prefix, well.mappedWell.id);
7604 25 Feb 19 nicklas 890             if (!isBioAssayEvent)
7604 25 Feb 19 nicklas 891             {
7604 25 Feb 19 nicklas 892               Forms.addHidden(frm, prefix + '.name', well.mappedWell.childName);
7604 25 Feb 19 nicklas 893             }
7604 25 Feb 19 nicklas 894             numMapped++;
7604 25 Feb 19 nicklas 895           }
7604 25 Feb 19 nicklas 896         }
7604 25 Feb 19 nicklas 897       }
7604 25 Feb 19 nicklas 898     }
7604 25 Feb 19 nicklas 899     
7604 25 Feb 19 nicklas 900     if (numMapped == 0)
7604 25 Feb 19 nicklas 901     {
7604 25 Feb 19 nicklas 902       Forms.showNotification('btnSave', 'No wells have been mapped.');
7604 25 Feb 19 nicklas 903       return;
7604 25 Feb 19 nicklas 904     }
7604 25 Feb 19 nicklas 905     
7604 25 Feb 19 nicklas 906     frm.submit();
7604 25 Feb 19 nicklas 907   }
7604 25 Feb 19 nicklas 908
7604 25 Feb 19 nicklas 909   
7604 25 Feb 19 nicklas 910   return child;
7604 25 Feb 19 nicklas 911 }();
7604 25 Feb 19 nicklas 912
7604 25 Feb 19 nicklas 913 Doc.onLoad(CreateChildBioPlate.initPage);