www/biomaterials/wizards/place_on_plate.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 PlaceOnPlate = function()
7604 25 Feb 19 nicklas 27 {
7604 25 Feb 19 nicklas 28   var pop = {};
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   var plate;
7604 25 Feb 19 nicklas 35   var selectedWell;
7604 25 Feb 19 nicklas 36   var itemList;
7604 25 Feb 19 nicklas 37   var selectedItem;
7604 25 Feb 19 nicklas 38
7604 25 Feb 19 nicklas 39   /**
7604 25 Feb 19 nicklas 40     Initialize the page.
7604 25 Feb 19 nicklas 41   */
7604 25 Feb 19 nicklas 42   pop.initPage = function()
7604 25 Feb 19 nicklas 43   {
7604 25 Feb 19 nicklas 44     // Save and close buttons
7604 25 Feb 19 nicklas 45     Buttons.addClickHandler('close', App.closeWindow);
7604 25 Feb 19 nicklas 46     Buttons.addClickHandler('btnSave', pop.placeOnPlate);
7604 25 Feb 19 nicklas 47     
7604 25 Feb 19 nicklas 48     // Protocol
7604 25 Feb 19 nicklas 49     Buttons.addClickHandler('protocol_id.select', Wizards.selectProtocol);
7604 25 Feb 19 nicklas 50     Events.addEventHandler('protocol_id', 'base-selected', Wizards.setProtocolCallback);
7604 25 Feb 19 nicklas 51
7604 25 Feb 19 nicklas 52     // Kit
7604 25 Feb 19 nicklas 53     Buttons.addClickHandler('kit_id.select', Wizards.selectKit);
7604 25 Feb 19 nicklas 54     Events.addEventHandler('kit_id', 'base-selected', Wizards.setKitCallback);
7604 25 Feb 19 nicklas 55
7604 25 Feb 19 nicklas 56     // Hardware
7604 25 Feb 19 nicklas 57     Buttons.addClickHandler('hardware_id.select', Wizards.selectHardware);
7604 25 Feb 19 nicklas 58     Events.addEventHandler('hardware_id', 'base-selected', Wizards.setHardwareCallback);
7604 25 Feb 19 nicklas 59
7604 25 Feb 19 nicklas 60     // Toolbar
7604 25 Feb 19 nicklas 61     Buttons.addClickHandler('btnSelectPlate', pop.selectBioPlate);
7604 25 Feb 19 nicklas 62     Events.addEventHandler('btnSelectPlate', 'base-selected', pop.setBioPlateCallback);
7604 25 Feb 19 nicklas 63     Buttons.addClickHandler('btnPlaceByRow', pop.placeByRow);
7604 25 Feb 19 nicklas 64     Buttons.addClickHandler('btnPlaceByColumn', pop.placeByColumn);
7604 25 Feb 19 nicklas 65     Buttons.addClickHandler('btnClearMapping', pop.clearMapping);
7604 25 Feb 19 nicklas 66     
7604 25 Feb 19 nicklas 67     // Initialize graphics
7604 25 Feb 19 nicklas 68     graphics = new jsGraphics(Doc.element('canvas'));
7604 25 Feb 19 nicklas 69     pen = new jsPen(new jsColor('#2288AA'), 1);
7604 25 Feb 19 nicklas 70     selectedPen = new jsPen(new jsColor('#2288AA'), 2);
7604 25 Feb 19 nicklas 71     
7604 25 Feb 19 nicklas 72     // Create the list of items
7604 25 Feb 19 nicklas 73     itemList = new ItemList('itemlist');
7604 25 Feb 19 nicklas 74     var items = Doc.element('itemlist').getElementsByClassName('item');
7604 25 Feb 19 nicklas 75     for (var i = 0; i < items.length; i++)
7604 25 Feb 19 nicklas 76     {
7604 25 Feb 19 nicklas 77       var item = items[i];
7604 25 Feb 19 nicklas 78       var itemId = Data.int(item, 'item-id');
7604 25 Feb 19 nicklas 79       var name = Data.get(item, 'name');
7604 25 Feb 19 nicklas 80       if (itemId) 
7604 25 Feb 19 nicklas 81       {
7604 25 Feb 19 nicklas 82         itemList.addItem(itemId, name);
7604 25 Feb 19 nicklas 83         Events.addEventHandler(item, 'click', pop.itemOnClick);
7604 25 Feb 19 nicklas 84         Events.addEventHandler(item, 'mouseover', pop.itemOnMouseOver);
7604 25 Feb 19 nicklas 85         Events.addEventHandler(item, 'mouseout', pop.itemOnMouseOut);
7604 25 Feb 19 nicklas 86       }
7604 25 Feb 19 nicklas 87     }
7604 25 Feb 19 nicklas 88     // Handle layout changes
7604 25 Feb 19 nicklas 89     Events.addEventHandler('itemlist', 'scroll', pop.onLayoutChange);
7604 25 Feb 19 nicklas 90     Events.addEventHandler(window, 'resize', pop.onLayoutChange);
7604 25 Feb 19 nicklas 91   }
7604 25 Feb 19 nicklas 92   
7604 25 Feb 19 nicklas 93   pop.selectBioPlate = function()
7604 25 Feb 19 nicklas 94   {
7604 25 Feb 19 nicklas 95     if (plate && !confirm('This will remove all placed biomaterial. Continue?')) return;
7604 25 Feb 19 nicklas 96     
7604 25 Feb 19 nicklas 97     var url = '&resetTemporary=1';
7604 25 Feb 19 nicklas 98     var bioMaterialType = Data.int('page-data', 'biomaterial-type');
7604 25 Feb 19 nicklas 99     url += '&tmpfilter:INT:bioPlateType.bioMaterialType='+encodeURIComponent('|'+bioMaterialType);
7604 25 Feb 19 nicklas 100     var commonSubtype = Data.int('page-data', 'common-subtype');
7604 25 Feb 19 nicklas 101     if (commonSubtype)
7604 25 Feb 19 nicklas 102     {
7604 25 Feb 19 nicklas 103       url += '&tmpfilter:INT:bioPlateType.itemSubtype='+encodeURIComponent('|'+commonSubtype);
7604 25 Feb 19 nicklas 104     }
7604 25 Feb 19 nicklas 105     Dialogs.selectItem('BIOPLATE', 'btnSelectPlate', 0, url);
7604 25 Feb 19 nicklas 106   }
7604 25 Feb 19 nicklas 107
7604 25 Feb 19 nicklas 108   pop.setBioPlateCallback = function(event)
7604 25 Feb 19 nicklas 109   {
7604 25 Feb 19 nicklas 110     var request = Ajax.getXmlHttpRequest();
7604 25 Feb 19 nicklas 111     var url = '../bioplates/ajax.jsp?ID='+App.getSessionId()+'&cmd=GetFullPlateInfo&item_id=' + event.detail.id;
7604 25 Feb 19 nicklas 112     request.open("GET", url, false); 
7604 25 Feb 19 nicklas 113     // NOTE! 'false' causes code to wait for the response. aka. 'Synchronous AJAX' or SJAX.
7604 25 Feb 19 nicklas 114     request.send(null);
7604 25 Feb 19 nicklas 115
7604 25 Feb 19 nicklas 116     var plateInfo = JSON.parse(request.responseText);
7604 25 Feb 19 nicklas 117     if (plateInfo.status != 'ok')
7604 25 Feb 19 nicklas 118     {
7604 25 Feb 19 nicklas 119       Forms.showNotification('plate.name', plateInfo.message);
7604 25 Feb 19 nicklas 120       return false;
7604 25 Feb 19 nicklas 121     }
7604 25 Feb 19 nicklas 122     
7604 25 Feb 19 nicklas 123     // Get plate and well information from the AJAX response
7604 25 Feb 19 nicklas 124     var rows = plateInfo.rows;
7604 25 Feb 19 nicklas 125     var columns = plateInfo.columns;
7604 25 Feb 19 nicklas 126     
7604 25 Feb 19 nicklas 127     var bigPlate = rows > 12 || columns > 18;
7604 25 Feb 19 nicklas 128     var plateClass = bigPlate ? 'plate bigplate' : 'plate';
7604 25 Feb 19 nicklas 129
7604 25 Feb 19 nicklas 130     // Remove existing mapping
7604 25 Feb 19 nicklas 131     itemList.unmapAll(graphics);
7604 25 Feb 19 nicklas 132
7604 25 Feb 19 nicklas 133     // Create plate and wells
7604 25 Feb 19 nicklas 134     plate = new Plate('dest', plateInfo.id, plateInfo.name, rows, columns);
7604 25 Feb 19 nicklas 135     for (var i = 0; i < plateInfo.wells.length; i++)
7604 25 Feb 19 nicklas 136     {
7604 25 Feb 19 nicklas 137       var wellInfo = plateInfo.wells[i];
7604 25 Feb 19 nicklas 138       var bmInfo = wellInfo.bioMaterial;
7604 25 Feb 19 nicklas 139       var row = parseInt(wellInfo.row);
7604 25 Feb 19 nicklas 140       var col = parseInt(wellInfo.column);
7604 25 Feb 19 nicklas 141       var well = plate.getWell(row, col);
7604 25 Feb 19 nicklas 142       well.locked = !wellInfo.canAdd || bmInfo;
7604 25 Feb 19 nicklas 143       well.name = bmInfo ? bmInfo.name : '';
7604 25 Feb 19 nicklas 144     }
7604 25 Feb 19 nicklas 145     
7604 25 Feb 19 nicklas 146     Doc.element('plate.name').innerHTML = Strings.encodeTags(plateInfo.name);
7604 25 Feb 19 nicklas 147     
7604 25 Feb 19 nicklas 148     // Create html table representing the bioplate
7604 25 Feb 19 nicklas 149     var html = '<table class="'+plateClass+'">';
7604 25 Feb 19 nicklas 150     html += '<tr><td class="bg-filled-100"></td>';
7604 25 Feb 19 nicklas 151     for (var c = 0; c < plate.columns; c++)
7604 25 Feb 19 nicklas 152     {
7604 25 Feb 19 nicklas 153       html += '<td class="columnheader bg-filled-100">' + (c+1) + '</td>';
7604 25 Feb 19 nicklas 154     }
7604 25 Feb 19 nicklas 155     html += '</tr>';
7604 25 Feb 19 nicklas 156     for (var r = 0; r < plate.rows; r++)
7604 25 Feb 19 nicklas 157     {
7604 25 Feb 19 nicklas 158       html += '<tr><td class="rowheader bg-filled-100">' + Plates.toAlphaCoordinate[r] + '</td>';
7604 25 Feb 19 nicklas 159       for (var c = 0; c < plate.columns; c++)
7604 25 Feb 19 nicklas 160       {
7604 25 Feb 19 nicklas 161         var well = plate.getWell(r, c);
7604 25 Feb 19 nicklas 162         var cls = 'well';
7604 25 Feb 19 nicklas 163         var title = '';
7604 25 Feb 19 nicklas 164         if (well.locked) 
7604 25 Feb 19 nicklas 165         {
7604 25 Feb 19 nicklas 166           cls+= ' unmappable';
7604 25 Feb 19 nicklas 167           if (well.name) 
7604 25 Feb 19 nicklas 168           {
7604 25 Feb 19 nicklas 169             title = 'This well is used by: ' + Strings.encodeTags(well.name);
7604 25 Feb 19 nicklas 170           }
7604 25 Feb 19 nicklas 171           else
7604 25 Feb 19 nicklas 172           {
7604 25 Feb 19 nicklas 173             title = 'This well has already been used';
7604 25 Feb 19 nicklas 174           }
7604 25 Feb 19 nicklas 175         }
7604 25 Feb 19 nicklas 176         else
7604 25 Feb 19 nicklas 177         {
7604 25 Feb 19 nicklas 178           cls += ' empty editable';
7604 25 Feb 19 nicklas 179         }
7604 25 Feb 19 nicklas 180         html += '<td id="dest.'+r+'.'+c+'" class="' + cls + '" data-row="'+r+'" data-column="'+c+'" title="'+title+'"></td>';
7604 25 Feb 19 nicklas 181       }
7604 25 Feb 19 nicklas 182       html += '</tr>';
7604 25 Feb 19 nicklas 183     }
7604 25 Feb 19 nicklas 184     html += '</table>';
7604 25 Feb 19 nicklas 185     Doc.element('plate').innerHTML = html;
7604 25 Feb 19 nicklas 186     
7604 25 Feb 19 nicklas 187     var wells = Doc.element('plate').getElementsByClassName('editable');
7604 25 Feb 19 nicklas 188     for (var i = 0; i < wells.length; i++)
7604 25 Feb 19 nicklas 189     {
7604 25 Feb 19 nicklas 190       var well = wells[i];
7604 25 Feb 19 nicklas 191       Events.addEventHandler(well, 'click', pop.wellOnClick);
7604 25 Feb 19 nicklas 192       Events.addEventHandler(well, 'mouseout', pop.wellOnMouseOut);
7604 25 Feb 19 nicklas 193       Events.addEventHandler(well, 'mouseover', pop.wellOnMouseOver);
7604 25 Feb 19 nicklas 194     }
7604 25 Feb 19 nicklas 195     
7604 25 Feb 19 nicklas 196     Doc.show('toolbar.mappings');
7604 25 Feb 19 nicklas 197   }
7604 25 Feb 19 nicklas 198
7604 25 Feb 19 nicklas 199   
7604 25 Feb 19 nicklas 200   pop.placeOnPlate = function()
7604 25 Feb 19 nicklas 201   {
7604 25 Feb 19 nicklas 202     if (!plate)
7604 25 Feb 19 nicklas 203     {
7604 25 Feb 19 nicklas 204       Forms.showNotification('btnSelectPlate', 'No plate has been selected');
7604 25 Feb 19 nicklas 205       return;
7604 25 Feb 19 nicklas 206     }
7604 25 Feb 19 nicklas 207     var frm = document.forms['main'];
7604 25 Feb 19 nicklas 208     if (Strings.trim(frm.name.value) == '')
7604 25 Feb 19 nicklas 209     {
7604 25 Feb 19 nicklas 210       Forms.showNotification(frm.name, 'You must enter a name for the event');
7604 25 Feb 19 nicklas 211       return;
7604 25 Feb 19 nicklas 212     }
7604 25 Feb 19 nicklas 213     
7604 25 Feb 19 nicklas 214     frm.plate_id.value = plate.id;
7604 25 Feb 19 nicklas 215     frm.rows.value = plate.rows;
7604 25 Feb 19 nicklas 216     frm.columns.value = plate.columns;
7604 25 Feb 19 nicklas 217     
7604 25 Feb 19 nicklas 218     var numMapped = 0;
7604 25 Feb 19 nicklas 219     for (var row = 0; row < plate.rows; row++)
7604 25 Feb 19 nicklas 220     {
7604 25 Feb 19 nicklas 221       for (var column = 0; column < plate.columns; column++)
7604 25 Feb 19 nicklas 222       {
7604 25 Feb 19 nicklas 223         var well = plate.getWell(row, column);
7604 25 Feb 19 nicklas 224         
7604 25 Feb 19 nicklas 225         if (well.mappedItem)
7604 25 Feb 19 nicklas 226         {
7604 25 Feb 19 nicklas 227           Forms.addHidden(frm, 'well.' + row + '.' + column, well.mappedItem.id);
7604 25 Feb 19 nicklas 228           numMapped++;
7604 25 Feb 19 nicklas 229         }
7604 25 Feb 19 nicklas 230       }
7604 25 Feb 19 nicklas 231     }
7604 25 Feb 19 nicklas 232     
7604 25 Feb 19 nicklas 233     if (numMapped == 0)
7604 25 Feb 19 nicklas 234     {
7604 25 Feb 19 nicklas 235       Forms.showNotification('btnSave', 'No biomaterial has been mapped to wells');
7604 25 Feb 19 nicklas 236       return;
7604 25 Feb 19 nicklas 237     }
7604 25 Feb 19 nicklas 238     
7604 25 Feb 19 nicklas 239     frm.submit();
7604 25 Feb 19 nicklas 240   }
7604 25 Feb 19 nicklas 241   
7604 25 Feb 19 nicklas 242   /**
7604 25 Feb 19 nicklas 243     Draw a link between the item and it's mapped well.
7604 25 Feb 19 nicklas 244   */
7604 25 Feb 19 nicklas 245   pop.itemOnMouseOver = function(event)
7604 25 Feb 19 nicklas 246   {
7604 25 Feb 19 nicklas 247     var itemId = Data.get(event.currentTarget, 'item-id');
7604 25 Feb 19 nicklas 248     var item = itemList.getItem(itemId);
7604 25 Feb 19 nicklas 249     item.drawLink(graphics, pen, false);
7604 25 Feb 19 nicklas 250   }
7604 25 Feb 19 nicklas 251   
7604 25 Feb 19 nicklas 252   /**
7604 25 Feb 19 nicklas 253     Hide the link between the item and it's mapped well, 
7604 25 Feb 19 nicklas 254     unless the item (or it's mapped well) is selected.
7604 25 Feb 19 nicklas 255   */
7604 25 Feb 19 nicklas 256   pop.itemOnMouseOut = function(event)
7604 25 Feb 19 nicklas 257   {
7604 25 Feb 19 nicklas 258     var itemId = Data.get(event.currentTarget, 'item-id');
7604 25 Feb 19 nicklas 259     var item = itemList.getItem(itemId);
7604 25 Feb 19 nicklas 260
7604 25 Feb 19 nicklas 261     if (!item.selected && !(item.mappedWell && item.mappedWell.selected)) 
7604 25 Feb 19 nicklas 262     {
7604 25 Feb 19 nicklas 263       item.hideLink(graphics);
7604 25 Feb 19 nicklas 264     }
7604 25 Feb 19 nicklas 265   }
7604 25 Feb 19 nicklas 266
7604 25 Feb 19 nicklas 267   /**
7604 25 Feb 19 nicklas 268     Select the item that is clicked on. The currently selected item
7604 25 Feb 19 nicklas 269     is de-selected. If the clicked item is the same as the currently 
7604 25 Feb 19 nicklas 270     selected item no new item is selected. If a well is already selected
7604 25 Feb 19 nicklas 271     a link is made between the well and the newly selected item.
7604 25 Feb 19 nicklas 272   */
7604 25 Feb 19 nicklas 273   pop.itemOnClick = function(event)
7604 25 Feb 19 nicklas 274   {
7604 25 Feb 19 nicklas 275     var itemId = Data.get(event.currentTarget, 'item-id');
7604 25 Feb 19 nicklas 276     var item = itemList.getItem(itemId);
7604 25 Feb 19 nicklas 277   
7604 25 Feb 19 nicklas 278     // De-select the currently selected item
7604 25 Feb 19 nicklas 279     if (selectedItem) 
7604 25 Feb 19 nicklas 280     {
7604 25 Feb 19 nicklas 281       selectedItem.setSelected(false);
7604 25 Feb 19 nicklas 282       if (item == selectedItem)
7604 25 Feb 19 nicklas 283       {
7604 25 Feb 19 nicklas 284         // Re-draw link with regular pen (eg. same as onmouseover)
7604 25 Feb 19 nicklas 285         selectedItem.drawLink(graphics, pen, true);
7604 25 Feb 19 nicklas 286         selectedItem = null;
7604 25 Feb 19 nicklas 287         return;
7604 25 Feb 19 nicklas 288       }
7604 25 Feb 19 nicklas 289       else
7604 25 Feb 19 nicklas 290       {
7604 25 Feb 19 nicklas 291         selectedItem.hideLink(graphics);
7604 25 Feb 19 nicklas 292       }
7604 25 Feb 19 nicklas 293     }
7604 25 Feb 19 nicklas 294     
7604 25 Feb 19 nicklas 295     // Select the new item and draw link to mapped well
7604 25 Feb 19 nicklas 296     selectedItem = item;
7604 25 Feb 19 nicklas 297     selectedItem.setSelected(true);
7604 25 Feb 19 nicklas 298     selectedItem.drawLink(graphics, selectedPen, true);
7604 25 Feb 19 nicklas 299   
7604 25 Feb 19 nicklas 300     // Map the item to the selected well
7604 25 Feb 19 nicklas 301     if (selectedWell && selectedItem)
7604 25 Feb 19 nicklas 302     {
7604 25 Feb 19 nicklas 303       pop.placeSelectedOnPlate();
7604 25 Feb 19 nicklas 304     }
7604 25 Feb 19 nicklas 305   }
7604 25 Feb 19 nicklas 306
7604 25 Feb 19 nicklas 307   
7604 25 Feb 19 nicklas 308   /**
7604 25 Feb 19 nicklas 309     Draw a link between the well and it's mapped item.
7604 25 Feb 19 nicklas 310   */
7604 25 Feb 19 nicklas 311   pop.wellOnMouseOver = function(event)
7604 25 Feb 19 nicklas 312   {
7604 25 Feb 19 nicklas 313     var row = Data.int(event.currentTarget, 'row');
7604 25 Feb 19 nicklas 314     var column = Data.int(event.currentTarget, 'column');
7604 25 Feb 19 nicklas 315
7604 25 Feb 19 nicklas 316     var well = plate.getWell(row, column);
7604 25 Feb 19 nicklas 317     if (!well || !well.mappedItem) return;
7604 25 Feb 19 nicklas 318     well.mappedItem.scrollIntoView();
7604 25 Feb 19 nicklas 319     well.mappedItem.drawLink(graphics, pen, false);
7604 25 Feb 19 nicklas 320   }
7604 25 Feb 19 nicklas 321   
7604 25 Feb 19 nicklas 322   /**
7604 25 Feb 19 nicklas 323     Hide the link between the well and it's mapped item, 
7604 25 Feb 19 nicklas 324     unless the well (or it's mapped item) is selected.
7604 25 Feb 19 nicklas 325   */
7604 25 Feb 19 nicklas 326   pop.wellOnMouseOut = 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 = plate.getWell(row, column);
7604 25 Feb 19 nicklas 332     if (!well || !well.mappedItem) return;
7604 25 Feb 19 nicklas 333     if (!well.selected && !(well.mappedItem && well.mappedItem.selected)) 
7604 25 Feb 19 nicklas 334     {
7604 25 Feb 19 nicklas 335       well.hideLink(graphics);
7604 25 Feb 19 nicklas 336     }
7604 25 Feb 19 nicklas 337   }
7604 25 Feb 19 nicklas 338   
7604 25 Feb 19 nicklas 339   /**
7604 25 Feb 19 nicklas 340     Select the well that is clicked on. The currently selected well is
7604 25 Feb 19 nicklas 341     de-selected. If the clicked well is the same as the currently 
7604 25 Feb 19 nicklas 342     selected well no new well is selected. If an item is already selected
7604 25 Feb 19 nicklas 343     a link is made between the item and the newly selected well.
7604 25 Feb 19 nicklas 344   */
7604 25 Feb 19 nicklas 345   pop.wellOnClick = function(event)
7604 25 Feb 19 nicklas 346   {
7604 25 Feb 19 nicklas 347     var row = Data.int(event.currentTarget, 'row');
7604 25 Feb 19 nicklas 348     var column = Data.int(event.currentTarget, 'column');
7604 25 Feb 19 nicklas 349     var well = plate.getWell(row, column);
7604 25 Feb 19 nicklas 350   
7604 25 Feb 19 nicklas 351     // De-select the currently selected well
7604 25 Feb 19 nicklas 352     if (selectedWell) 
7604 25 Feb 19 nicklas 353     {
7604 25 Feb 19 nicklas 354       selectedWell.setSelected(false);
7604 25 Feb 19 nicklas 355       if (well == selectedWell)
7604 25 Feb 19 nicklas 356       {
7604 25 Feb 19 nicklas 357         // Re-draw link with regular pen (eg. same as onmouseover)
7604 25 Feb 19 nicklas 358         selectedWell.drawLink(graphics, pen, true);
7604 25 Feb 19 nicklas 359         selectedWell = null;
7604 25 Feb 19 nicklas 360         return;
7604 25 Feb 19 nicklas 361       }
7604 25 Feb 19 nicklas 362       else
7604 25 Feb 19 nicklas 363       {
7604 25 Feb 19 nicklas 364         selectedWell.hideLink(graphics);
7604 25 Feb 19 nicklas 365       }
7604 25 Feb 19 nicklas 366     }
7604 25 Feb 19 nicklas 367     
7604 25 Feb 19 nicklas 368     selectedWell = well;
7604 25 Feb 19 nicklas 369     selectedWell.setSelected(true);
7604 25 Feb 19 nicklas 370     selectedWell.drawLink(graphics, selectedPen, true);
7604 25 Feb 19 nicklas 371   
7604 25 Feb 19 nicklas 372     if (selectedWell && selectedItem)
7604 25 Feb 19 nicklas 373     {
7604 25 Feb 19 nicklas 374       var nextItem = Doc.element('autoSelectUnmappedItem').checked ? 
7604 25 Feb 19 nicklas 375           itemList.nextUnmappedItem(selectedItem) : null;
7604 25 Feb 19 nicklas 376       pop.placeSelectedOnPlate();
7604 25 Feb 19 nicklas 377       if (nextItem)
7604 25 Feb 19 nicklas 378       {
7604 25 Feb 19 nicklas 379         nextItem.setSelected(true);
7604 25 Feb 19 nicklas 380         nextItem.scrollIntoView();
7604 25 Feb 19 nicklas 381         selectedItem = nextItem;
7604 25 Feb 19 nicklas 382       }
7604 25 Feb 19 nicklas 383     }
7604 25 Feb 19 nicklas 384   }
7604 25 Feb 19 nicklas 385   
7604 25 Feb 19 nicklas 386   /**
7604 25 Feb 19 nicklas 387     Redraw the link to the selected item/well when the item list scrolls.
7604 25 Feb 19 nicklas 388   */
7604 25 Feb 19 nicklas 389   pop.onLayoutChange = function(event)
7604 25 Feb 19 nicklas 390   {
7604 25 Feb 19 nicklas 391     var item = selectedItem;
7604 25 Feb 19 nicklas 392     if (!item && selectedWell) item = selectedWell.mappedItem;
7604 25 Feb 19 nicklas 393     if (item) item.drawLink(graphics, selectedPen, true);
7604 25 Feb 19 nicklas 394   }
7604 25 Feb 19 nicklas 395
7604 25 Feb 19 nicklas 396
7604 25 Feb 19 nicklas 397   /**
7604 25 Feb 19 nicklas 398     Map the selected item with the selected well. Hide and
7604 25 Feb 19 nicklas 399     redraw links as needed.
7604 25 Feb 19 nicklas 400   */
7604 25 Feb 19 nicklas 401   pop.placeSelectedOnPlate = function()
7604 25 Feb 19 nicklas 402   {
7604 25 Feb 19 nicklas 403     // Hide any links that are currently displayed
7604 25 Feb 19 nicklas 404     selectedItem.hideLink(graphics);
7604 25 Feb 19 nicklas 405     selectedWell.hideLink(graphics);
7604 25 Feb 19 nicklas 406     
7604 25 Feb 19 nicklas 407     // Map to the new well and draw link
7604 25 Feb 19 nicklas 408     if (selectedItem.mappedWell != selectedWell)
7604 25 Feb 19 nicklas 409     {
7604 25 Feb 19 nicklas 410       selectedItem.mapToWell(selectedWell);
7604 25 Feb 19 nicklas 411       selectedItem.scrollIntoView();
7604 25 Feb 19 nicklas 412       selectedItem.drawLink(graphics, pen, true);
7604 25 Feb 19 nicklas 413     }
7604 25 Feb 19 nicklas 414     else
7604 25 Feb 19 nicklas 415     {
7604 25 Feb 19 nicklas 416       selectedItem.unmapWell();
7604 25 Feb 19 nicklas 417     }
7604 25 Feb 19 nicklas 418     
7604 25 Feb 19 nicklas 419     // De-select everything
7604 25 Feb 19 nicklas 420     selectedItem.setSelected(false);
7604 25 Feb 19 nicklas 421     selectedWell.setSelected(false);
7604 25 Feb 19 nicklas 422     selectedItem = null;
7604 25 Feb 19 nicklas 423     selectedWell = null;
7604 25 Feb 19 nicklas 424   }
7604 25 Feb 19 nicklas 425
7604 25 Feb 19 nicklas 426   /**
7604 25 Feb 19 nicklas 427     Remove all mappings that have been made so far.
7604 25 Feb 19 nicklas 428   */
7604 25 Feb 19 nicklas 429   pop.clearMapping = function()
7604 25 Feb 19 nicklas 430   {
7604 25 Feb 19 nicklas 431     if (!plate)
7604 25 Feb 19 nicklas 432     {
7604 25 Feb 19 nicklas 433       Forms.showNotification('btnSelectPlate', 'No destination plate has been selected');
7604 25 Feb 19 nicklas 434       return;
7604 25 Feb 19 nicklas 435     }
7604 25 Feb 19 nicklas 436     if (!confirm('This will remove all placed biomaterial. Continue?')) return;
7604 25 Feb 19 nicklas 437     itemList.unmapAll(graphics);
7604 25 Feb 19 nicklas 438     if (selectedItem)
7604 25 Feb 19 nicklas 439     {
7604 25 Feb 19 nicklas 440       selectedItem.setSelected(false);
7604 25 Feb 19 nicklas 441       selectedItem = null;
7604 25 Feb 19 nicklas 442     }
7604 25 Feb 19 nicklas 443     if (selectedWell)
7604 25 Feb 19 nicklas 444     {
7604 25 Feb 19 nicklas 445       selectedWell.setSelected(false);
7604 25 Feb 19 nicklas 446       selectedWell = null;
7604 25 Feb 19 nicklas 447     }
7604 25 Feb 19 nicklas 448   }
7604 25 Feb 19 nicklas 449
7604 25 Feb 19 nicklas 450   /**
7604 25 Feb 19 nicklas 451     Automatically place unplaced biomaterial on the plate filling rows first.
7604 25 Feb 19 nicklas 452     Biomaterial and wells that have already been mapped are skipped.
7604 25 Feb 19 nicklas 453   */
7604 25 Feb 19 nicklas 454   pop.placeByRow = function()
7604 25 Feb 19 nicklas 455   {
7604 25 Feb 19 nicklas 456     if (!plate)
7604 25 Feb 19 nicklas 457     {
7604 25 Feb 19 nicklas 458       Forms.showNotification('btnSelectPlate', 'No destination plate has been selected');
7604 25 Feb 19 nicklas 459       return;
7604 25 Feb 19 nicklas 460     }
7604 25 Feb 19 nicklas 461     var index = 0;
7604 25 Feb 19 nicklas 462     var numItems = itemList.items.length;
7604 25 Feb 19 nicklas 463     for (var row = 0; row < plate.rows; row++)
7604 25 Feb 19 nicklas 464     {
7604 25 Feb 19 nicklas 465       for (var column = 0; column < plate.columns; column++)
7604 25 Feb 19 nicklas 466       {
7604 25 Feb 19 nicklas 467         var well = plate.getWell(row, column);
7604 25 Feb 19 nicklas 468         if (!well.mappedItem && !well.locked)
7604 25 Feb 19 nicklas 469         {
7604 25 Feb 19 nicklas 470           var mapped = false;
7604 25 Feb 19 nicklas 471           while (index < itemList.items.length && !mapped)
7604 25 Feb 19 nicklas 472           {
7604 25 Feb 19 nicklas 473             var item = itemList.items[index];
7604 25 Feb 19 nicklas 474             index++;
7604 25 Feb 19 nicklas 475             if (!item.mappedWell)
7604 25 Feb 19 nicklas 476             {
7604 25 Feb 19 nicklas 477               item.mapToWell(well);
7604 25 Feb 19 nicklas 478               mapped = true;
7604 25 Feb 19 nicklas 479             }
7604 25 Feb 19 nicklas 480           }
7604 25 Feb 19 nicklas 481         }
7604 25 Feb 19 nicklas 482       }
7604 25 Feb 19 nicklas 483     }
7604 25 Feb 19 nicklas 484   }
7604 25 Feb 19 nicklas 485   
7604 25 Feb 19 nicklas 486   /**
7604 25 Feb 19 nicklas 487     Automatically place unplaced biomaterial on the plate filling columns first.
7604 25 Feb 19 nicklas 488     Biomaterial and wells that have already been mapped are skipped.
7604 25 Feb 19 nicklas 489   */
7604 25 Feb 19 nicklas 490   pop.placeByColumn = function()
7604 25 Feb 19 nicklas 491   {
7604 25 Feb 19 nicklas 492     if (!plate)
7604 25 Feb 19 nicklas 493     {
7604 25 Feb 19 nicklas 494       Forms.showNotification('btnSelectPlate', 'No destination plate has been selected');
7604 25 Feb 19 nicklas 495       return;
7604 25 Feb 19 nicklas 496     }
7604 25 Feb 19 nicklas 497     var index = 0;
7604 25 Feb 19 nicklas 498     var numItems = itemList.items.length;
7604 25 Feb 19 nicklas 499     for (var column = 0; column < plate.columns; column++)
7604 25 Feb 19 nicklas 500     {
7604 25 Feb 19 nicklas 501       for (var row = 0; row < plate.rows; row++)
7604 25 Feb 19 nicklas 502       {
7604 25 Feb 19 nicklas 503         var well = plate.getWell(row, column);
7604 25 Feb 19 nicklas 504         if (!well.mappedItem && !well.locked)
7604 25 Feb 19 nicklas 505         {
7604 25 Feb 19 nicklas 506           var mapped = false;
7604 25 Feb 19 nicklas 507           while (index < itemList.items.length && !mapped)
7604 25 Feb 19 nicklas 508           {
7604 25 Feb 19 nicklas 509             var item = itemList.items[index];
7604 25 Feb 19 nicklas 510             index++;
7604 25 Feb 19 nicklas 511             if (!item.mappedWell)
7604 25 Feb 19 nicklas 512             {
7604 25 Feb 19 nicklas 513               item.mapToWell(well);
7604 25 Feb 19 nicklas 514               mapped = true;
7604 25 Feb 19 nicklas 515             }
7604 25 Feb 19 nicklas 516           }
7604 25 Feb 19 nicklas 517         }
7604 25 Feb 19 nicklas 518       }
7604 25 Feb 19 nicklas 519     }
7604 25 Feb 19 nicklas 520   }
7604 25 Feb 19 nicklas 521
7604 25 Feb 19 nicklas 522   return pop;
7604 25 Feb 19 nicklas 523 }();
7604 25 Feb 19 nicklas 524
7604 25 Feb 19 nicklas 525 Doc.onLoad(PlaceOnPlate.initPage);