www/biomaterials/wizards/move_biomaterial.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 MoveBioMaterial = function()
7604 25 Feb 19 nicklas 27 {
7604 25 Feb 19 nicklas 28   var move = {};
7604 25 Feb 19 nicklas 29   
7604 25 Feb 19 nicklas 30   var graphics;
7604 25 Feb 19 nicklas 31   var pen;
7604 25 Feb 19 nicklas 32   var selectedPen;
7604 25 Feb 19 nicklas 33   
7604 25 Feb 19 nicklas 34   // Source and destination plates
7604 25 Feb 19 nicklas 35   var sourcePlate;
7604 25 Feb 19 nicklas 36   var destPlate;
7604 25 Feb 19 nicklas 37   
7604 25 Feb 19 nicklas 38   // We can select one well on each plate
7604 25 Feb 19 nicklas 39   var selectedSourceWell;
7604 25 Feb 19 nicklas 40   var selectedDestWell;
7604 25 Feb 19 nicklas 41
7604 25 Feb 19 nicklas 42   /**
7604 25 Feb 19 nicklas 43     Initialize the page.
7604 25 Feb 19 nicklas 44   */
7604 25 Feb 19 nicklas 45   move.initPage = function()
7604 25 Feb 19 nicklas 46   {
7604 25 Feb 19 nicklas 47     // Save and close buttons
7604 25 Feb 19 nicklas 48     Buttons.addClickHandler('close', App.closeWindow);
7604 25 Feb 19 nicklas 49     Buttons.addClickHandler('btnSave', move.moveBioMaterial);
7604 25 Feb 19 nicklas 50     
7604 25 Feb 19 nicklas 51     // Protocol
7604 25 Feb 19 nicklas 52     Buttons.addClickHandler('protocol_id.select', Wizards.selectProtocol);
7604 25 Feb 19 nicklas 53     Events.addEventHandler('protocol_id', 'base-selected', Wizards.setProtocolCallback);
7604 25 Feb 19 nicklas 54
7604 25 Feb 19 nicklas 55     // Kit
7604 25 Feb 19 nicklas 56     Buttons.addClickHandler('kit_id.select', Wizards.selectKit);
7604 25 Feb 19 nicklas 57     Events.addEventHandler('kit_id', 'base-selected', Wizards.setKitCallback);
7604 25 Feb 19 nicklas 58
7604 25 Feb 19 nicklas 59     // Hardware
7604 25 Feb 19 nicklas 60     Buttons.addClickHandler('hardware_id.select', Wizards.selectHardware);
7604 25 Feb 19 nicklas 61     Events.addEventHandler('hardware_id', 'base-selected', Wizards.setHardwareCallback);
7604 25 Feb 19 nicklas 62     
7604 25 Feb 19 nicklas 63     // Toolbar
7604 25 Feb 19 nicklas 64     Buttons.addClickHandler('btnSelectPlate', move.selectBioPlate);
7604 25 Feb 19 nicklas 65     Events.addEventHandler('btnSelectPlate', 'base-selected', move.setBioPlateCallback);
7604 25 Feb 19 nicklas 66     Buttons.addClickHandler('btnPlaceByRow', move.placeByRow);
7604 25 Feb 19 nicklas 67     Buttons.addClickHandler('btnPlaceByColumn', move.placeByColumn);
7604 25 Feb 19 nicklas 68     Buttons.addClickHandler('btnClearMapping', move.clearMapping);
7604 25 Feb 19 nicklas 69     Buttons.addClickHandler('btnSelectPlateMapping', move.selectPlateMapping);
7604 25 Feb 19 nicklas 70     Events.addEventHandler('btnSelectPlateMapping', 'base-selected', move.setPlateMappingCallback);
7604 25 Feb 19 nicklas 71     
7604 25 Feb 19 nicklas 72     // Options
7604 25 Feb 19 nicklas 73     Events.addEventHandler('showSourceCoordinates', 'click', move.showSourceCoordinatesOnClick);
7604 25 Feb 19 nicklas 74     
7604 25 Feb 19 nicklas 75     // Handle layout changes
7604 25 Feb 19 nicklas 76     Events.addEventHandler(window, 'resize', move.onLayoutChange);
7604 25 Feb 19 nicklas 77
7604 25 Feb 19 nicklas 78     // Initialize graphics
7604 25 Feb 19 nicklas 79     graphics = new jsGraphics(Doc.element('canvas'));
7604 25 Feb 19 nicklas 80     pen = new jsPen(new jsColor('#2288AA'), 1);
7604 25 Feb 19 nicklas 81     selectedPen = new jsPen(new jsColor('#2288AA'), 2);
7604 25 Feb 19 nicklas 82     
7604 25 Feb 19 nicklas 83     move.displayBioPlate(Data.int('page-data', 'source-plate'), true);
7604 25 Feb 19 nicklas 84   }
7604 25 Feb 19 nicklas 85   
7604 25 Feb 19 nicklas 86   move.selectBioPlate = function()
7604 25 Feb 19 nicklas 87   {
7604 25 Feb 19 nicklas 88     if (destPlate && !confirm('This will reset all moved biomaterial. Continue?')) return;
7604 25 Feb 19 nicklas 89     
7604 25 Feb 19 nicklas 90     var url = '&resetTemporary=1';
7604 25 Feb 19 nicklas 91     var bioMaterialType = Data.int('page-data', 'biomaterial-type');
7604 25 Feb 19 nicklas 92     if (bioMaterialType)
7604 25 Feb 19 nicklas 93     {
7604 25 Feb 19 nicklas 94       url += '&tmpfilter:INT:bioPlateType.bioMaterialType='+encodeURIComponent('|'+bioMaterialType);
7604 25 Feb 19 nicklas 95     }
7604 25 Feb 19 nicklas 96     var commonSubtype = Data.int('page-data', 'common-subtype');
7604 25 Feb 19 nicklas 97     if (commonSubtype)
7604 25 Feb 19 nicklas 98     {
7604 25 Feb 19 nicklas 99       url += '&tmpfilter:INT:bioPlateType.itemSubtype='+encodeURIComponent('|'+commonSubtype);
7604 25 Feb 19 nicklas 100     }
7604 25 Feb 19 nicklas 101
7604 25 Feb 19 nicklas 102     Dialogs.selectItem('BIOPLATE', 'btnSelectPlate', 0, url);
7604 25 Feb 19 nicklas 103   }
7604 25 Feb 19 nicklas 104
7604 25 Feb 19 nicklas 105   move.setBioPlateCallback =  function(event)
7604 25 Feb 19 nicklas 106   {
7604 25 Feb 19 nicklas 107     move.displayBioPlate(event.detail.id, false);
7604 25 Feb 19 nicklas 108   }
7604 25 Feb 19 nicklas 109   
7604 25 Feb 19 nicklas 110   move.displayBioPlate = function(bioPlateId, isSourcePlate)
7604 25 Feb 19 nicklas 111   {
7604 25 Feb 19 nicklas 112     if (!isSourcePlate && bioPlateId == sourcePlate.id)
7604 25 Feb 19 nicklas 113     {    
7604 25 Feb 19 nicklas 114       Forms.showNotification('plate.dest.name', 'It is not possible to use the same plate as both source and destination plate.');
7604 25 Feb 19 nicklas 115       return false;
7604 25 Feb 19 nicklas 116     }
7604 25 Feb 19 nicklas 117     
7604 25 Feb 19 nicklas 118     var request = Ajax.getXmlHttpRequest();
7604 25 Feb 19 nicklas 119     var url = '../bioplates/ajax.jsp?ID='+App.getSessionId()+'&cmd=GetFullPlateInfo&item_id=' + bioPlateId;
7604 25 Feb 19 nicklas 120     request.open("GET", url, false); 
7604 25 Feb 19 nicklas 121     // NOTE! 'false' causes code to wait for the response. aka. 'Synchronous AJAX' or SJAX.
7604 25 Feb 19 nicklas 122     request.send(null);
7604 25 Feb 19 nicklas 123     var plateInfo = JSON.parse(request.responseText);
7604 25 Feb 19 nicklas 124     if (plateInfo.status != 'ok')
7604 25 Feb 19 nicklas 125     {
7604 25 Feb 19 nicklas 126       Forms.showNotification('plate.dest.name', plateInfo.message);
7604 25 Feb 19 nicklas 127       return;
7604 25 Feb 19 nicklas 128     }
7604 25 Feb 19 nicklas 129
7604 25 Feb 19 nicklas 130     // Get plate and well information from the AJAX response
7604 25 Feb 19 nicklas 131     var rows = plateInfo.rows
7604 25 Feb 19 nicklas 132     var columns = plateInfo.columns;
7604 25 Feb 19 nicklas 133     
7604 25 Feb 19 nicklas 134     var bigPlate = rows > 12 || columns > 18;
7604 25 Feb 19 nicklas 135     var plateClass = bigPlate ? 'plate bigplate' : 'plate';
7604 25 Feb 19 nicklas 136
7604 25 Feb 19 nicklas 137     // Remove existing mapping
7604 25 Feb 19 nicklas 138     if (sourcePlate) sourcePlate.unmapAll(graphics);
7604 25 Feb 19 nicklas 139     selectedDestWell = null;
7604 25 Feb 19 nicklas 140
7604 25 Feb 19 nicklas 141     // Create plate and wells
7604 25 Feb 19 nicklas 142     var prefix = isSourcePlate ? 'source' : 'dest';
7604 25 Feb 19 nicklas 143     var plate = new Plate(prefix, plateInfo.id, plateInfo.name, rows, columns, isSourcePlate);
7604 25 Feb 19 nicklas 144     for (var i = 0; i < plateInfo.wells.length; i++)
7604 25 Feb 19 nicklas 145     {
7604 25 Feb 19 nicklas 146       var wellInfo = plateInfo.wells[i];
7604 25 Feb 19 nicklas 147       var bmInfo = wellInfo.bioMaterial;
7604 25 Feb 19 nicklas 148       var row = wellInfo.row;
7604 25 Feb 19 nicklas 149       var col = wellInfo.column;
7604 25 Feb 19 nicklas 150       var well = plate.getWell(row, col);
7604 25 Feb 19 nicklas 151       if (bmInfo)
7604 25 Feb 19 nicklas 152       {
7604 25 Feb 19 nicklas 153         well.id = bmInfo.id;
7604 25 Feb 19 nicklas 154         well.name = bmInfo.name;
7604 25 Feb 19 nicklas 155       }
7604 25 Feb 19 nicklas 156       well.locked = isSourcePlate ? !wellInfo.canClear : !wellInfo.canAdd || well.id;
7604 25 Feb 19 nicklas 157     }
7604 25 Feb 19 nicklas 158     
7604 25 Feb 19 nicklas 159     // Create html table representing the bioplate
7604 25 Feb 19 nicklas 160     var html = '<table class="'+plateClass+'">';
7604 25 Feb 19 nicklas 161     html += '<tr><td class="bg-filled-100"></td>';
7604 25 Feb 19 nicklas 162     for (var c = 0; c < plate.columns; c++)
7604 25 Feb 19 nicklas 163     {
7604 25 Feb 19 nicklas 164       html += '<td class="columnheader bg-filled-100">' + (c+1) + '</td>';
7604 25 Feb 19 nicklas 165     }
7604 25 Feb 19 nicklas 166     html += '</tr>';
7604 25 Feb 19 nicklas 167     for (var r = 0; r < plate.rows; r++)
7604 25 Feb 19 nicklas 168     {
7604 25 Feb 19 nicklas 169       html += '<tr><td class="rowheader bg-filled-100">' + Plates.toAlphaCoordinate[r] + '</td>';
7604 25 Feb 19 nicklas 170       for (var c = 0; c < plate.columns; c++)
7604 25 Feb 19 nicklas 171       {
7604 25 Feb 19 nicklas 172         var well = plate.getWell(r, c);
7604 25 Feb 19 nicklas 173         var cls = 'well';
7604 25 Feb 19 nicklas 174         var title = well.name ? Strings.encodeTags(well.name) : '';
7604 25 Feb 19 nicklas 175         if (isSourcePlate)
7604 25 Feb 19 nicklas 176         {
7604 25 Feb 19 nicklas 177           // We can only move a biomaterial if the well is not empty or locked
7604 25 Feb 19 nicklas 178           if (well.id)
7604 25 Feb 19 nicklas 179           {
7604 25 Feb 19 nicklas 180             cls += well.locked ? ' used locked' : ' used editable';
7604 25 Feb 19 nicklas 181           }
7604 25 Feb 19 nicklas 182           else
7604 25 Feb 19 nicklas 183           {
7604 25 Feb 19 nicklas 184             cls += ' empty';
7604 25 Feb 19 nicklas 185           }
7604 25 Feb 19 nicklas 186         }
7604 25 Feb 19 nicklas 187         else
7604 25 Feb 19 nicklas 188         {
7604 25 Feb 19 nicklas 189           // We only add biomaterial to destination well if it is not locked
7604 25 Feb 19 nicklas 190           if (well.locked)
7604 25 Feb 19 nicklas 191           {
7604 25 Feb 19 nicklas 192             cls += ' unmappable';
7604 25 Feb 19 nicklas 193           }
7604 25 Feb 19 nicklas 194           else
7604 25 Feb 19 nicklas 195           {
7604 25 Feb 19 nicklas 196             cls += ' empty editable';
7604 25 Feb 19 nicklas 197           }
7604 25 Feb 19 nicklas 198         }
7604 25 Feb 19 nicklas 199         html += '<td id="'+prefix+'.'+r+'.'+c+'" class="' + cls + '" data-row="'+r+'" data-column="'+c+'" title="'+title+'">';
7604 25 Feb 19 nicklas 200         html += '<div class="info" id="'+prefix+'.'+r+'.'+c+'.info"></div></td>';
7604 25 Feb 19 nicklas 201       }
7604 25 Feb 19 nicklas 202       html += '</tr>';
7604 25 Feb 19 nicklas 203     }
7604 25 Feb 19 nicklas 204     html += '</table>';
7604 25 Feb 19 nicklas 205     
7604 25 Feb 19 nicklas 206     if (isSourcePlate)
7604 25 Feb 19 nicklas 207     {
7604 25 Feb 19 nicklas 208       Doc.element('plate.src').innerHTML = html;
7604 25 Feb 19 nicklas 209       Doc.element('plate.src.name').innerHTML = Strings.encodeTags(plateInfo.name);
7604 25 Feb 19 nicklas 210       sourcePlate = plate;
7604 25 Feb 19 nicklas 211       
7604 25 Feb 19 nicklas 212       var wells = Doc.element('plate.src').getElementsByClassName('editable');
7604 25 Feb 19 nicklas 213       for (var i = 0; i < wells.length; i++)
7604 25 Feb 19 nicklas 214       {
7604 25 Feb 19 nicklas 215         var well = wells[i];
7604 25 Feb 19 nicklas 216         Events.addEventHandler(well, 'click', move.sourceWellOnClick);
7604 25 Feb 19 nicklas 217         Events.addEventHandler(well, 'mouseout', move.sourceWellOnMouseOut);
7604 25 Feb 19 nicklas 218         Events.addEventHandler(well, 'mouseover', move.sourceWellOnMouseOver);
7604 25 Feb 19 nicklas 219       }
7604 25 Feb 19 nicklas 220     }
7604 25 Feb 19 nicklas 221     else
7604 25 Feb 19 nicklas 222     {
7604 25 Feb 19 nicklas 223       Doc.element('plate.dest').innerHTML = html;
7604 25 Feb 19 nicklas 224       Doc.element('plate.dest.name').innerHTML = Strings.encodeTags(plateInfo.name);
7604 25 Feb 19 nicklas 225       destPlate = plate;
7604 25 Feb 19 nicklas 226       Doc.showHide('plate.dest.options', !bigPlate);
7604 25 Feb 19 nicklas 227       
7604 25 Feb 19 nicklas 228       var wells = Doc.element('plate.dest').getElementsByClassName('editable');
7604 25 Feb 19 nicklas 229       for (var i = 0; i < wells.length; i++)
7604 25 Feb 19 nicklas 230       {
7604 25 Feb 19 nicklas 231         var well = wells[i];
7604 25 Feb 19 nicklas 232         Events.addEventHandler(well, 'click', move.destWellOnClick);
7604 25 Feb 19 nicklas 233         Events.addEventHandler(well, 'mouseout', move.destWellOnMouseOut);
7604 25 Feb 19 nicklas 234         Events.addEventHandler(well, 'mouseover', move.destWellOnMouseOver);
7604 25 Feb 19 nicklas 235       }
7604 25 Feb 19 nicklas 236       
7604 25 Feb 19 nicklas 237       move.showSourceCoordinatesOnClick();
7604 25 Feb 19 nicklas 238     }
7604 25 Feb 19 nicklas 239   }
7604 25 Feb 19 nicklas 240
7604 25 Feb 19 nicklas 241   move.moveBioMaterial = function()
7604 25 Feb 19 nicklas 242   {
7604 25 Feb 19 nicklas 243     if (!destPlate)
7604 25 Feb 19 nicklas 244     {
7604 25 Feb 19 nicklas 245       Forms.showNotification('btnSelectPlate', 'No destination plate has been selected');
7604 25 Feb 19 nicklas 246       return;
7604 25 Feb 19 nicklas 247     }
7604 25 Feb 19 nicklas 248     var frm = document.forms['main'];
7604 25 Feb 19 nicklas 249     if (Strings.trim(frm.name.value) == '')
7604 25 Feb 19 nicklas 250     {
7604 25 Feb 19 nicklas 251       Forms.showNotification(frm.name, 'You must enter a name for the event');
7604 25 Feb 19 nicklas 252       return;
7604 25 Feb 19 nicklas 253     }
7604 25 Feb 19 nicklas 254     
7604 25 Feb 19 nicklas 255     frm.destplate_id.value = destPlate.id;
7604 25 Feb 19 nicklas 256     frm.rows.value = destPlate.rows;
7604 25 Feb 19 nicklas 257     frm.columns.value = destPlate.columns;
7604 25 Feb 19 nicklas 258     
7604 25 Feb 19 nicklas 259     var numMapped = 0;
7604 25 Feb 19 nicklas 260     for (var row = 0; row < destPlate.rows; row++)
7604 25 Feb 19 nicklas 261     {
7604 25 Feb 19 nicklas 262       for (var column = 0; column < destPlate.columns; column++)
7604 25 Feb 19 nicklas 263       {
7604 25 Feb 19 nicklas 264         var well = destPlate.getWell(row, column);
7604 25 Feb 19 nicklas 265         
7604 25 Feb 19 nicklas 266         if (well.mappedWell)
7604 25 Feb 19 nicklas 267         {
7604 25 Feb 19 nicklas 268           Forms.addHidden(frm, 'well.' + row + '.' + column, well.mappedWell.id);
7604 25 Feb 19 nicklas 269           numMapped++;
7604 25 Feb 19 nicklas 270         }
7604 25 Feb 19 nicklas 271       }
7604 25 Feb 19 nicklas 272     }
7604 25 Feb 19 nicklas 273     
7604 25 Feb 19 nicklas 274     if (numMapped == 0)
7604 25 Feb 19 nicklas 275     {
7604 25 Feb 19 nicklas 276       Forms.showNotification('btnSave', 'No wells have been mapped.');
7604 25 Feb 19 nicklas 277       return;
7604 25 Feb 19 nicklas 278     }
7604 25 Feb 19 nicklas 279
7604 25 Feb 19 nicklas 280     frm.submit();
7604 25 Feb 19 nicklas 281   }
7604 25 Feb 19 nicklas 282   
7604 25 Feb 19 nicklas 283   /**
7604 25 Feb 19 nicklas 284     Select the source well that is clicked on. The currently selected well
7604 25 Feb 19 nicklas 285     is de-selected. If the clicked well is the same as the currently 
7604 25 Feb 19 nicklas 286     selected well no new item is selected. If a destination well is already 
7604 25 Feb 19 nicklas 287     selected a link is made between the source and destination wells.
7604 25 Feb 19 nicklas 288   */
7604 25 Feb 19 nicklas 289   move.sourceWellOnClick = function(event)
7604 25 Feb 19 nicklas 290   {
7604 25 Feb 19 nicklas 291     var row = Data.int(event.currentTarget, 'row');
7604 25 Feb 19 nicklas 292     var column = Data.int(event.currentTarget, 'column');
7604 25 Feb 19 nicklas 293     App.debug(row+':'+column);
7604 25 Feb 19 nicklas 294     var well = sourcePlate.getWell(row, column);
7604 25 Feb 19 nicklas 295     if (!well) return;
7604 25 Feb 19 nicklas 296   
7604 25 Feb 19 nicklas 297     // De-select the currently selected source well
7604 25 Feb 19 nicklas 298     if (selectedSourceWell) 
7604 25 Feb 19 nicklas 299     {
7604 25 Feb 19 nicklas 300       selectedSourceWell.setSelected(false);
7604 25 Feb 19 nicklas 301       if (well == selectedSourceWell)
7604 25 Feb 19 nicklas 302       {
7604 25 Feb 19 nicklas 303         // Re-draw link with regular pen (eg. same as onmouseover)
7604 25 Feb 19 nicklas 304         selectedSourceWell.drawLink(graphics, pen, true);
7604 25 Feb 19 nicklas 305         selectedSourceWell = null;
7604 25 Feb 19 nicklas 306         return;
7604 25 Feb 19 nicklas 307       }
7604 25 Feb 19 nicklas 308       else
7604 25 Feb 19 nicklas 309       {
7604 25 Feb 19 nicklas 310         selectedSourceWell.hideLink(graphics);
7604 25 Feb 19 nicklas 311       }
7604 25 Feb 19 nicklas 312     }
7604 25 Feb 19 nicklas 313     
7604 25 Feb 19 nicklas 314     // Select the new source well and draw link to destination well
7604 25 Feb 19 nicklas 315     selectedSourceWell = well;
7604 25 Feb 19 nicklas 316     selectedSourceWell.setSelected(true);
7604 25 Feb 19 nicklas 317     selectedSourceWell.drawLink(graphics, selectedPen, true);
7604 25 Feb 19 nicklas 318   
7604 25 Feb 19 nicklas 319     // Map the source and destination wells
7604 25 Feb 19 nicklas 320     if (selectedSourceWell && selectedDestWell)
7604 25 Feb 19 nicklas 321     {
7604 25 Feb 19 nicklas 322       move.mapSelectedWells();
7604 25 Feb 19 nicklas 323     }
7604 25 Feb 19 nicklas 324   }
7604 25 Feb 19 nicklas 325   
7604 25 Feb 19 nicklas 326   /**
7604 25 Feb 19 nicklas 327     Draw a link between the mapped source and destination wells.
7604 25 Feb 19 nicklas 328   */
7604 25 Feb 19 nicklas 329   move.sourceWellOnMouseOver = function(event)
7604 25 Feb 19 nicklas 330   {
7604 25 Feb 19 nicklas 331     var row = Data.int(event.currentTarget, 'row');
7604 25 Feb 19 nicklas 332     var column = Data.int(event.currentTarget, 'column');
7604 25 Feb 19 nicklas 333
7604 25 Feb 19 nicklas 334     var well = sourcePlate.getWell(row, column);
7604 25 Feb 19 nicklas 335     if (!well) return;
7604 25 Feb 19 nicklas 336     well.drawLink(graphics, pen, false);
7604 25 Feb 19 nicklas 337   }
7604 25 Feb 19 nicklas 338   
7604 25 Feb 19 nicklas 339   /**
7604 25 Feb 19 nicklas 340     Hide the link between the mapped source and destination 
7604 25 Feb 19 nicklas 341     wells, unless one of them is selected.
7604 25 Feb 19 nicklas 342   */
7604 25 Feb 19 nicklas 343   move.sourceWellOnMouseOut = function(event)
7604 25 Feb 19 nicklas 344   {
7604 25 Feb 19 nicklas 345     var row = Data.int(event.currentTarget, 'row');
7604 25 Feb 19 nicklas 346     var column = Data.int(event.currentTarget, 'column');
7604 25 Feb 19 nicklas 347
7604 25 Feb 19 nicklas 348     var well = sourcePlate.getWell(row, column);
7604 25 Feb 19 nicklas 349     if (!well) return;
7604 25 Feb 19 nicklas 350     if (!well.selected && !(well.mappedWell && well.mappedWell.selected)) 
7604 25 Feb 19 nicklas 351     {
7604 25 Feb 19 nicklas 352       well.hideLink(graphics);
7604 25 Feb 19 nicklas 353     }
7604 25 Feb 19 nicklas 354   }
7604 25 Feb 19 nicklas 355
7604 25 Feb 19 nicklas 356   move.destWellOnClick = function(event)
7604 25 Feb 19 nicklas 357   {
7604 25 Feb 19 nicklas 358     var row = Data.int(event.currentTarget, 'row');
7604 25 Feb 19 nicklas 359     var column = Data.int(event.currentTarget, 'column');
7604 25 Feb 19 nicklas 360
7604 25 Feb 19 nicklas 361     var well = destPlate.getWell(row, column);
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       move.mapSelectedWells();
7604 25 Feb 19 nicklas 386     }
7604 25 Feb 19 nicklas 387   }
7604 25 Feb 19 nicklas 388   
7604 25 Feb 19 nicklas 389   move.destWellOnMouseOver = function(event)
7604 25 Feb 19 nicklas 390   {
7604 25 Feb 19 nicklas 391     var row = Data.int(event.currentTarget, 'row');
7604 25 Feb 19 nicklas 392     var column = Data.int(event.currentTarget, 'column');
7604 25 Feb 19 nicklas 393
7604 25 Feb 19 nicklas 394     var well = destPlate.getWell(row, column);
7604 25 Feb 19 nicklas 395     if (!well) return;
7604 25 Feb 19 nicklas 396     well.drawLink(graphics, pen, false);
7604 25 Feb 19 nicklas 397   }
7604 25 Feb 19 nicklas 398   
7604 25 Feb 19 nicklas 399   move.destWellOnMouseOut = function(event)
7604 25 Feb 19 nicklas 400   {
7604 25 Feb 19 nicklas 401     var row = Data.int(event.currentTarget, 'row');
7604 25 Feb 19 nicklas 402     var column = Data.int(event.currentTarget, 'column');
7604 25 Feb 19 nicklas 403
7604 25 Feb 19 nicklas 404     var well = destPlate.getWell(row, column);
7604 25 Feb 19 nicklas 405     if (!well) return;
7604 25 Feb 19 nicklas 406     if (!well.selected && !(well.mappedWell && well.mappedWell.selected)) 
7604 25 Feb 19 nicklas 407     {
7604 25 Feb 19 nicklas 408       well.hideLink(graphics);
7604 25 Feb 19 nicklas 409     }
7604 25 Feb 19 nicklas 410   }
7604 25 Feb 19 nicklas 411   
7604 25 Feb 19 nicklas 412   /**
7604 25 Feb 19 nicklas 413     Map the selected source and destination wells. Hide and
7604 25 Feb 19 nicklas 414     redraw links as needed.
7604 25 Feb 19 nicklas 415   */
7604 25 Feb 19 nicklas 416   move.mapSelectedWells = function()
7604 25 Feb 19 nicklas 417   {
7604 25 Feb 19 nicklas 418     // Hide any links that are currently displayed
7604 25 Feb 19 nicklas 419     selectedSourceWell.hideLink(graphics);
7604 25 Feb 19 nicklas 420     selectedDestWell.hideLink(graphics);
7604 25 Feb 19 nicklas 421     
7604 25 Feb 19 nicklas 422     // Map to the new well and draw link
7604 25 Feb 19 nicklas 423     if (selectedSourceWell.mappedWell != selectedDestWell)
7604 25 Feb 19 nicklas 424     {
7604 25 Feb 19 nicklas 425       selectedSourceWell.mapToWell(selectedDestWell);
7604 25 Feb 19 nicklas 426       selectedSourceWell.drawLink(graphics, pen, true);
7604 25 Feb 19 nicklas 427     }
7604 25 Feb 19 nicklas 428     else
7604 25 Feb 19 nicklas 429     {
7604 25 Feb 19 nicklas 430       selectedSourceWell.unmapWell();
7604 25 Feb 19 nicklas 431     }
7604 25 Feb 19 nicklas 432     
7604 25 Feb 19 nicklas 433     // De-select everything
7604 25 Feb 19 nicklas 434     selectedSourceWell.setSelected(false);
7604 25 Feb 19 nicklas 435     selectedDestWell.setSelected(false);
7604 25 Feb 19 nicklas 436     selectedSourceWell = null;
7604 25 Feb 19 nicklas 437     selectedDestWell = null;
7604 25 Feb 19 nicklas 438   }
7604 25 Feb 19 nicklas 439
7604 25 Feb 19 nicklas 440   /**
7604 25 Feb 19 nicklas 441     Remove all mappings that have been made so far.
7604 25 Feb 19 nicklas 442   */
7604 25 Feb 19 nicklas 443   move.clearMapping = function()
7604 25 Feb 19 nicklas 444   {
7604 25 Feb 19 nicklas 445     if (!destPlate) 
7604 25 Feb 19 nicklas 446     {
7604 25 Feb 19 nicklas 447       Forms.showNotification('btnSelectPlate', 'No destination plate has been selected');
7604 25 Feb 19 nicklas 448       return;
7604 25 Feb 19 nicklas 449     }
7604 25 Feb 19 nicklas 450     if (!confirm('This will remove all placed biomaterial. Continue?')) return;
7604 25 Feb 19 nicklas 451     sourcePlate.unmapAll(graphics);
7604 25 Feb 19 nicklas 452     if (selectedSourceWell)
7604 25 Feb 19 nicklas 453     {
7604 25 Feb 19 nicklas 454       selectedSourceWell.setSelected(false);
7604 25 Feb 19 nicklas 455       selectedSourceWell = null;
7604 25 Feb 19 nicklas 456     }
7604 25 Feb 19 nicklas 457     if (selectedDestWell)
7604 25 Feb 19 nicklas 458     {
7604 25 Feb 19 nicklas 459       selectedDestWell.setSelected(false);
7604 25 Feb 19 nicklas 460       selectedDestWell = null;
7604 25 Feb 19 nicklas 461     }
7604 25 Feb 19 nicklas 462   }
7604 25 Feb 19 nicklas 463
7604 25 Feb 19 nicklas 464   /**
7604 25 Feb 19 nicklas 465     Automatically move remaining biomaterial to the destination plate filling rows first.
7604 25 Feb 19 nicklas 466     Biomaterial and wells that have already been mapped are skipped.
7604 25 Feb 19 nicklas 467   */
7604 25 Feb 19 nicklas 468   move.placeByRow = function()
7604 25 Feb 19 nicklas 469   {
7604 25 Feb 19 nicklas 470     if (!destPlate) 
7604 25 Feb 19 nicklas 471     {
7604 25 Feb 19 nicklas 472       Forms.showNotification('btnSelectPlate', 'No destination plate has been selected');
7604 25 Feb 19 nicklas 473       return;
7604 25 Feb 19 nicklas 474     }
7604 25 Feb 19 nicklas 475     var srcRow = 0;
7604 25 Feb 19 nicklas 476     var srcCol = 0;
7604 25 Feb 19 nicklas 477     for (var destRow = 0; destRow < destPlate.rows; destRow++)
7604 25 Feb 19 nicklas 478     {
7604 25 Feb 19 nicklas 479       for (var destCol = 0; destCol < destPlate.columns; destCol++)
7604 25 Feb 19 nicklas 480       {
7604 25 Feb 19 nicklas 481         var destWell = destPlate.getWell(destRow, destCol);
7604 25 Feb 19 nicklas 482         if (!destWell.mappedWell && !destWell.locked)
7604 25 Feb 19 nicklas 483         {
7604 25 Feb 19 nicklas 484           var mapped = false;
7604 25 Feb 19 nicklas 485           var srcWell = sourcePlate.getWell(srcRow, srcCol);
7604 25 Feb 19 nicklas 486           while (srcWell && !mapped)
7604 25 Feb 19 nicklas 487           {
7604 25 Feb 19 nicklas 488             if (srcWell.id && !srcWell.locked && !srcWell.mappedWell)
7604 25 Feb 19 nicklas 489             {
7604 25 Feb 19 nicklas 490               srcWell.mapToWell(destWell);
7604 25 Feb 19 nicklas 491               mapped = true;
7604 25 Feb 19 nicklas 492             }
7604 25 Feb 19 nicklas 493             else
7604 25 Feb 19 nicklas 494             {
7604 25 Feb 19 nicklas 495               srcCol++;
7604 25 Feb 19 nicklas 496               if (srcCol >= sourcePlate.columns)
7604 25 Feb 19 nicklas 497               {
7604 25 Feb 19 nicklas 498                 srcCol = 0;
7604 25 Feb 19 nicklas 499                 srcRow++;
7604 25 Feb 19 nicklas 500               }
7604 25 Feb 19 nicklas 501               srcWell = sourcePlate.getWell(srcRow, srcCol);
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   }
7604 25 Feb 19 nicklas 508   
7604 25 Feb 19 nicklas 509   /**
7604 25 Feb 19 nicklas 510     Automatically move remaining biomaterial to the destination plate filling columns first.
7604 25 Feb 19 nicklas 511     Biomaterial and wells that have already been mapped are skipped.
7604 25 Feb 19 nicklas 512   */
7604 25 Feb 19 nicklas 513   move.placeByColumn = function()
7604 25 Feb 19 nicklas 514   {
7604 25 Feb 19 nicklas 515     if (!destPlate) 
7604 25 Feb 19 nicklas 516     {
7604 25 Feb 19 nicklas 517       Forms.showNotification('btnSelectPlate', 'No destination plate has been selected');
7604 25 Feb 19 nicklas 518       return;
7604 25 Feb 19 nicklas 519     }
7604 25 Feb 19 nicklas 520     var srcRow = 0;
7604 25 Feb 19 nicklas 521     var srcCol = 0;
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     Redraw the link between selected wells when the layout changes
7604 25 Feb 19 nicklas 556   */
7604 25 Feb 19 nicklas 557   move.onLayoutChange = function(event)
7604 25 Feb 19 nicklas 558   {
7604 25 Feb 19 nicklas 559     if (selectedSourceWell)
7604 25 Feb 19 nicklas 560     {
7604 25 Feb 19 nicklas 561       selectedSourceWell.drawLink(graphics, selectedPen, true);
7604 25 Feb 19 nicklas 562     }
7604 25 Feb 19 nicklas 563     else if (selectedDestWell)
7604 25 Feb 19 nicklas 564     {
7604 25 Feb 19 nicklas 565       selectedDestWell.drawLink(graphics, selectedPen, true);
7604 25 Feb 19 nicklas 566     }
7604 25 Feb 19 nicklas 567   }
7604 25 Feb 19 nicklas 568
7604 25 Feb 19 nicklas 569   move.showSourceCoordinatesOnClick = function()
7604 25 Feb 19 nicklas 570   {
7604 25 Feb 19 nicklas 571     var frm = document.forms['main'];
7604 25 Feb 19 nicklas 572     Doc.addOrRemoveClass('plate.dest', 'noinfo', !frm.showSourceCoordinates.checked);
7604 25 Feb 19 nicklas 573   }
7604 25 Feb 19 nicklas 574
7604 25 Feb 19 nicklas 575   move.selectPlateMapping = function()
7604 25 Feb 19 nicklas 576   {
7604 25 Feb 19 nicklas 577     if (!destPlate)
7604 25 Feb 19 nicklas 578     {
7604 25 Feb 19 nicklas 579       Forms.showNotification('btnSelectPlate', 'No destination plate has been selected');
7604 25 Feb 19 nicklas 580       return;
7604 25 Feb 19 nicklas 581     }
7604 25 Feb 19 nicklas 582     var url = '&resetTemporary=1';
7604 25 Feb 19 nicklas 583     url += '&tmpfilter:INT:sourceGeometry.rows='+sourcePlate.rows;
7604 25 Feb 19 nicklas 584     url += '&tmpfilter:INT:sourceGeometry.columns='+sourcePlate.columns;
7604 25 Feb 19 nicklas 585     url += '&tmpfilter:INT:sourceCount=1';
7604 25 Feb 19 nicklas 586     url += '&tmpfilter:INT:destinationGeometry.rows='+destPlate.rows;
7604 25 Feb 19 nicklas 587     url += '&tmpfilter:INT:destinationGeometry.columns='+destPlate.columns;
7604 25 Feb 19 nicklas 588     url += '&tmpfilter:INT:destinationCount=1';
7604 25 Feb 19 nicklas 589     Dialogs.selectItem('PLATEMAPPING', 'btnSelectPlateMapping', 0, url);
7604 25 Feb 19 nicklas 590   }
7604 25 Feb 19 nicklas 591
7604 25 Feb 19 nicklas 592   move.setPlateMappingCallback = function(event)
7604 25 Feb 19 nicklas 593   {
7604 25 Feb 19 nicklas 594     var request = Ajax.getXmlHttpRequest();
7604 25 Feb 19 nicklas 595     var url = '../../lims/platemappings/ajax.jsp?ID='+App.getSessionId();
7604 25 Feb 19 nicklas 596     url += '&cmd=GetMappingDetails&item_id=' + event.detail.id;
7604 25 Feb 19 nicklas 597     request.open("GET", url, false);
7604 25 Feb 19 nicklas 598     request.send(null);
7604 25 Feb 19 nicklas 599     var mappingInfo = JSON.parse(request.responseText);
7604 25 Feb 19 nicklas 600     if (mappingInfo.status != 'ok')
7604 25 Feb 19 nicklas 601     {
7604 25 Feb 19 nicklas 602       Forms.showNotification('btnSelectPlateMapping', plateInfo.message);
7604 25 Feb 19 nicklas 603       return false;
7604 25 Feb 19 nicklas 604     }
7604 25 Feb 19 nicklas 605     
7604 25 Feb 19 nicklas 606     var win = Dialogs.getDialog('SelectPLATEMAPPING') || window;
7604 25 Feb 19 nicklas 607     if (mappingInfo.sourcePlates != 1 || mappingInfo.sourceRows != sourcePlate.rows || mappingInfo.sourceColumns != sourcePlate.columns)
7604 25 Feb 19 nicklas 608     {
7604 25 Feb 19 nicklas 609       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 610     }
7604 25 Feb 19 nicklas 611     else if (mappingInfo.destinationPlates != 1 || mappingInfo.destinationRows != destPlate.rows || mappingInfo.destinationColumns != destPlate.columns)
7604 25 Feb 19 nicklas 612     {
7604 25 Feb 19 nicklas 613       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 614     }
7604 25 Feb 19 nicklas 615     
7604 25 Feb 19 nicklas 616     var numMapped = 0;
7604 25 Feb 19 nicklas 617     for (var i = 0; i < mappingInfo.details.length; i++)
7604 25 Feb 19 nicklas 618     {
7604 25 Feb 19 nicklas 619       var mapping = mappingInfo.details[i].split(',');
7604 25 Feb 19 nicklas 620       var srcWell = sourcePlate.getWell(parseInt(mapping[1]), parseInt(mapping[2]));
7604 25 Feb 19 nicklas 621       var destWell = destPlate.getWell(parseInt(mapping[4]), parseInt(mapping[5]));
7604 25 Feb 19 nicklas 622       if (srcWell && destWell)
7604 25 Feb 19 nicklas 623       {
7604 25 Feb 19 nicklas 624         if (!destWell.mappedWell && !destWell.locked && srcWell.id && !srcWell.locked && !srcWell.mappedWell)
7604 25 Feb 19 nicklas 625         {
7604 25 Feb 19 nicklas 626           srcWell.mapToWell(destWell);
7604 25 Feb 19 nicklas 627           numMapped++;
7604 25 Feb 19 nicklas 628         }
7604 25 Feb 19 nicklas 629       }
7604 25 Feb 19 nicklas 630     }
7604 25 Feb 19 nicklas 631   }
7604 25 Feb 19 nicklas 632   
7604 25 Feb 19 nicklas 633   return move;
7604 25 Feb 19 nicklas 634 }();
7604 25 Feb 19 nicklas 635
7604 25 Feb 19 nicklas 636 Doc.onLoad(MoveBioMaterial.initPage);