extensions/net.sf.basedb.reggie/trunk/resources/mipsprep/plate.js

Code
Comments
Other
Rev Date Author Line
5390 29 Apr 19 nicklas 1
5390 29 Apr 19 nicklas 2 var Plate = function()
5390 29 Apr 19 nicklas 3 {
5390 29 Apr 19 nicklas 4   var plate = {};
5390 29 Apr 19 nicklas 5   plate.rows = 8;
5390 29 Apr 19 nicklas 6   plate.columns = 12;
5390 29 Apr 19 nicklas 7   plate.wells = [];
5390 29 Apr 19 nicklas 8   plate.wellPainter = null;
5390 29 Apr 19 nicklas 9   
5390 29 Apr 19 nicklas 10   /**
5390 29 Apr 19 nicklas 11     Initialize a plate with the given number of rows and columns.
5390 29 Apr 19 nicklas 12   */
5392 02 May 19 nicklas 13   plate.init = function(rows, columns, wellPainter)
5390 29 Apr 19 nicklas 14   {
5390 29 Apr 19 nicklas 15     if (rows) plate.rows = rows;
5390 29 Apr 19 nicklas 16     if (columns) plate.columns = columns;
5390 29 Apr 19 nicklas 17     if (wellPainter) plate.wellPainter = wellPainter;
5390 29 Apr 19 nicklas 18     
5390 29 Apr 19 nicklas 19     for (var c = 0; c < plate.columns; c++)
5390 29 Apr 19 nicklas 20     {
5390 29 Apr 19 nicklas 21       for (var r = 0; r < plate.rows; r++)
5390 29 Apr 19 nicklas 22       {
5390 29 Apr 19 nicklas 23         plate.wells[plate.wells.length] = new Well(r, c);
5390 29 Apr 19 nicklas 24       }
5390 29 Apr 19 nicklas 25     }
5390 29 Apr 19 nicklas 26   }
5390 29 Apr 19 nicklas 27   
5390 29 Apr 19 nicklas 28   /**
5390 29 Apr 19 nicklas 29     Change the well painter for the plate.
5390 29 Apr 19 nicklas 30   */
5390 29 Apr 19 nicklas 31   plate.setWellPainter = function(wellPainter)
5390 29 Apr 19 nicklas 32   {
5390 29 Apr 19 nicklas 33     plate.wellPainter = wellPainter;
5390 29 Apr 19 nicklas 34   }
5390 29 Apr 19 nicklas 35   
5390 29 Apr 19 nicklas 36   /**
5390 29 Apr 19 nicklas 37     Get the number of rows on the plate.
5390 29 Apr 19 nicklas 38   */
5390 29 Apr 19 nicklas 39   plate.getRows = function()
5390 29 Apr 19 nicklas 40   {
5390 29 Apr 19 nicklas 41     return plate.rows;
5390 29 Apr 19 nicklas 42   }
5390 29 Apr 19 nicklas 43
5390 29 Apr 19 nicklas 44   /**
5390 29 Apr 19 nicklas 45     Get the number of columns on the plate.
5390 29 Apr 19 nicklas 46   */
5390 29 Apr 19 nicklas 47   plate.getColumns = function()
5390 29 Apr 19 nicklas 48   {
5390 29 Apr 19 nicklas 49     return plate.columns;
5390 29 Apr 19 nicklas 50   }
5390 29 Apr 19 nicklas 51
5392 02 May 19 nicklas 52   plate.getFirstEmptyColumn = function()
5390 29 Apr 19 nicklas 53   {
5392 02 May 19 nicklas 54     for (var column = 0; column < plate.columns; column++)
5392 02 May 19 nicklas 55     {
5392 02 May 19 nicklas 56       var colIsEmpty = true;
5392 02 May 19 nicklas 57       var wellNo = column * plate.rows;
5392 02 May 19 nicklas 58       for (var row = 0; row < plate.rows; row++)
5392 02 May 19 nicklas 59       {
5392 02 May 19 nicklas 60         if (plate.wells[wellNo+row].extract) break;
5392 02 May 19 nicklas 61       }
5392 02 May 19 nicklas 62       if (row == plate.rows) return column;
5392 02 May 19 nicklas 63     }
5392 02 May 19 nicklas 64     return -1;
5390 29 Apr 19 nicklas 65   }
5390 29 Apr 19 nicklas 66   
5390 29 Apr 19 nicklas 67   /**
5390 29 Apr 19 nicklas 68     Get all wells on the plate.
5390 29 Apr 19 nicklas 69   */
5390 29 Apr 19 nicklas 70   plate.getWells = function()
5390 29 Apr 19 nicklas 71   {
5390 29 Apr 19 nicklas 72     return plate.wells;
5390 29 Apr 19 nicklas 73   }
5390 29 Apr 19 nicklas 74   
5390 29 Apr 19 nicklas 75   /**
5390 29 Apr 19 nicklas 76     Get all wells in the given row. First row is 0.
5390 29 Apr 19 nicklas 77   */
5390 29 Apr 19 nicklas 78   plate.getRow = function(row)
5390 29 Apr 19 nicklas 79   {
5390 29 Apr 19 nicklas 80     var result = [];
5390 29 Apr 19 nicklas 81     for (var i = row; result.length < plate.columns; i += plate.rows)
5390 29 Apr 19 nicklas 82     {
5390 29 Apr 19 nicklas 83       result[result.length] = plate.wells[i];
5390 29 Apr 19 nicklas 84     }
5390 29 Apr 19 nicklas 85     return result;
5390 29 Apr 19 nicklas 86   }
5390 29 Apr 19 nicklas 87   
5390 29 Apr 19 nicklas 88   /**
5390 29 Apr 19 nicklas 89     Get all wells in the given column. First column is 0.
5390 29 Apr 19 nicklas 90   */
5390 29 Apr 19 nicklas 91   plate.getColumn = function(column)
5390 29 Apr 19 nicklas 92   {
5390 29 Apr 19 nicklas 93     var result = [];
5390 29 Apr 19 nicklas 94     for (var i = column*plate.rows; result.length < plate.rows; i++)
5390 29 Apr 19 nicklas 95     {
5390 29 Apr 19 nicklas 96       result[result.length] = plate.wells[i];
5390 29 Apr 19 nicklas 97     }
5390 29 Apr 19 nicklas 98     return result;
5390 29 Apr 19 nicklas 99   }
5390 29 Apr 19 nicklas 100
5390 29 Apr 19 nicklas 101   /**
5446 24 May 19 nicklas 102     Get all wells between the given start and end column (inclusive).
5440 20 May 19 nicklas 103   */
5446 24 May 19 nicklas 104   plate.getPool = function(startCol, endCol)
5440 20 May 19 nicklas 105   {
5440 20 May 19 nicklas 106     var result = [];
5446 24 May 19 nicklas 107     var numCols = endCol - startCol + 1;
5446 24 May 19 nicklas 108     for (var i = startCol*plate.rows; result.length < plate.rows*numCols; i++)
5440 20 May 19 nicklas 109     {
5446 24 May 19 nicklas 110       result[result.length] = plate.wells[i];
5440 20 May 19 nicklas 111     }
5440 20 May 19 nicklas 112     return result;
5440 20 May 19 nicklas 113   }
5440 20 May 19 nicklas 114
5440 20 May 19 nicklas 115   
5440 20 May 19 nicklas 116   /**
5390 29 Apr 19 nicklas 117     Get the well at the given coordinate.
5390 29 Apr 19 nicklas 118   */
5390 29 Apr 19 nicklas 119   plate.getWell = function(row, column)
5390 29 Apr 19 nicklas 120   {
5390 29 Apr 19 nicklas 121     return plate.wells[row + column * plate.rows];
5390 29 Apr 19 nicklas 122   }
5390 29 Apr 19 nicklas 123   
5397 03 May 19 nicklas 124   plate.getWellByLocation = function(location)
5397 03 May 19 nicklas 125   {
5397 03 May 19 nicklas 126     var row = Reggie.alphaToWell(location.substring(0,1));
5397 03 May 19 nicklas 127     var column = parseInt(location.substring(1))-1;
5397 03 May 19 nicklas 128     return plate.getWell(row, column);
5397 03 May 19 nicklas 129   }
5397 03 May 19 nicklas 130   
5390 29 Apr 19 nicklas 131   /**
5390 29 Apr 19 nicklas 132     Get all wells that contains extract with a given name.
5390 29 Apr 19 nicklas 133   */
5390 29 Apr 19 nicklas 134   plate.getWellsByName = function(name)
5390 29 Apr 19 nicklas 135   {
5390 29 Apr 19 nicklas 136     var result = [];
5390 29 Apr 19 nicklas 137     for (var i = 0; i < plate.wells.length; i++)
5390 29 Apr 19 nicklas 138     {
5390 29 Apr 19 nicklas 139       var well = plate.wells[i];
5390 29 Apr 19 nicklas 140       if (well.extract && well.extract.name == name)
5390 29 Apr 19 nicklas 141       {
5390 29 Apr 19 nicklas 142         result[result.length] = plate.wells[i];
5390 29 Apr 19 nicklas 143       }
5390 29 Apr 19 nicklas 144     }
5390 29 Apr 19 nicklas 145     return result;
5390 29 Apr 19 nicklas 146   }
5390 29 Apr 19 nicklas 147   
5390 29 Apr 19 nicklas 148   /**
5390 29 Apr 19 nicklas 149     Get all wells that are selected.
5390 29 Apr 19 nicklas 150   */
5390 29 Apr 19 nicklas 151   plate.getSelected = function()
5390 29 Apr 19 nicklas 152   {
5390 29 Apr 19 nicklas 153     var selected = [];
5390 29 Apr 19 nicklas 154     for (var i = 0; i < plate.wells.length; i++)
5390 29 Apr 19 nicklas 155     {
5390 29 Apr 19 nicklas 156       var well = plate.wells[i];
5390 29 Apr 19 nicklas 157       if (well.selected)
5390 29 Apr 19 nicklas 158       {
5390 29 Apr 19 nicklas 159         selected[selected.length] = well;
5390 29 Apr 19 nicklas 160       }
5390 29 Apr 19 nicklas 161     }
5390 29 Apr 19 nicklas 162     return selected;
5390 29 Apr 19 nicklas 163   }
5390 29 Apr 19 nicklas 164
5390 29 Apr 19 nicklas 165   /**
5390 29 Apr 19 nicklas 166     Set the selected status for all wells in the array.
5390 29 Apr 19 nicklas 167     The wells are automatically repainted.
5390 29 Apr 19 nicklas 168   */
5390 29 Apr 19 nicklas 169   plate.setSelected = function(wells, select)
5390 29 Apr 19 nicklas 170   {
5390 29 Apr 19 nicklas 171     for (var i = 0; i < wells.length; i++)
5390 29 Apr 19 nicklas 172     {
5390 29 Apr 19 nicklas 173       var well = wells[i];
5390 29 Apr 19 nicklas 174       well.selected = select;
5390 29 Apr 19 nicklas 175       well.paint(plate.wellPainter, plate.poolSchema);
5390 29 Apr 19 nicklas 176     }
5390 29 Apr 19 nicklas 177   }
5390 29 Apr 19 nicklas 178   
5390 29 Apr 19 nicklas 179   /**
5390 29 Apr 19 nicklas 180     Get all wells which are used (well.extract has been set)
5390 29 Apr 19 nicklas 181   */
5390 29 Apr 19 nicklas 182   plate.getUsed = function()
5390 29 Apr 19 nicklas 183   {
5390 29 Apr 19 nicklas 184     var used = [];
5390 29 Apr 19 nicklas 185     for (var i = 0; i < plate.wells.length; i++)
5390 29 Apr 19 nicklas 186     {
5390 29 Apr 19 nicklas 187       var well = plate.wells[i];
5390 29 Apr 19 nicklas 188       if (well.extract)
5390 29 Apr 19 nicklas 189       {
5390 29 Apr 19 nicklas 190         used[used.length] = well;
5390 29 Apr 19 nicklas 191       }
5390 29 Apr 19 nicklas 192     }
5390 29 Apr 19 nicklas 193     return used;
5390 29 Apr 19 nicklas 194   }
5390 29 Apr 19 nicklas 195   
5392 02 May 19 nicklas 196   /**
5392 02 May 19 nicklas 197     Remove extract from all wells.
5392 02 May 19 nicklas 198   */
5392 02 May 19 nicklas 199   plate.clear = function(wells, clearSelected)
5392 02 May 19 nicklas 200   {
5392 02 May 19 nicklas 201     if (wells.length == 0) return;
5392 02 May 19 nicklas 202     for (var i = 0; i < wells.length; i++)
5392 02 May 19 nicklas 203     {
5392 02 May 19 nicklas 204       var well = wells[i];
5392 02 May 19 nicklas 205       well.extract = null;
5440 20 May 19 nicklas 206       well.poolNum = -1;
5392 02 May 19 nicklas 207       if (clearSelected) well.selected = false;
5392 02 May 19 nicklas 208     }
5392 02 May 19 nicklas 209   }
5390 29 Apr 19 nicklas 210   
5390 29 Apr 19 nicklas 211   /**
5390 29 Apr 19 nicklas 212     Toggle the selected status for all wells in the array.
5390 29 Apr 19 nicklas 213     The next status is determined by the current status of 
5390 29 Apr 19 nicklas 214     the first well in the array.
5390 29 Apr 19 nicklas 215   */
5390 29 Apr 19 nicklas 216   plate.toggleSelected = function(wells)
5390 29 Apr 19 nicklas 217   {
5390 29 Apr 19 nicklas 218     if (wells.length == 0) return;
5390 29 Apr 19 nicklas 219     plate.setSelected(wells, !wells[0].selected);
5390 29 Apr 19 nicklas 220   }
5390 29 Apr 19 nicklas 221   
5390 29 Apr 19 nicklas 222   /**
5392 02 May 19 nicklas 223     Test the filter function on all wells and select or de-select
5392 02 May 19 nicklas 224     the well if it matches/not matches.
5392 02 May 19 nicklas 225   */
5392 02 May 19 nicklas 226   plate.selectByFilter = function(wells, filter)
5392 02 May 19 nicklas 227   {
5392 02 May 19 nicklas 228     for (var i = 0; i < wells.length; i++)
5392 02 May 19 nicklas 229     {
5392 02 May 19 nicklas 230       var well = wells[i];
5392 02 May 19 nicklas 231       well.selected = filter(well);
5392 02 May 19 nicklas 232     }
5392 02 May 19 nicklas 233     plate.paint(wells);
5392 02 May 19 nicklas 234   }
5392 02 May 19 nicklas 235   
5392 02 May 19 nicklas 236   /**
5390 29 Apr 19 nicklas 237     Enable or disable highlight of the given wells.
5390 29 Apr 19 nicklas 238   */
5390 29 Apr 19 nicklas 239   plate.setHighlight = function(wells, highlightClass, on)
5390 29 Apr 19 nicklas 240   {
5390 29 Apr 19 nicklas 241     var tmpClass = on ? highlightClass : null;
5390 29 Apr 19 nicklas 242     for (var i = 0; i < wells.length; i++)
5390 29 Apr 19 nicklas 243     {
5390 29 Apr 19 nicklas 244       var well = wells[i];
5390 29 Apr 19 nicklas 245       well.highlightClass = tmpClass;
5390 29 Apr 19 nicklas 246       Doc.addOrRemoveClass(well.tag, highlightClass, on);
5390 29 Apr 19 nicklas 247     }
5390 29 Apr 19 nicklas 248   }
5390 29 Apr 19 nicklas 249   
5390 29 Apr 19 nicklas 250   /**
5390 29 Apr 19 nicklas 251     Paint the given wells.
5390 29 Apr 19 nicklas 252   */
5390 29 Apr 19 nicklas 253   plate.paint = function(wells)
5390 29 Apr 19 nicklas 254   {
5390 29 Apr 19 nicklas 255     for (var i = 0; i < wells.length; i++)
5390 29 Apr 19 nicklas 256     {
5392 02 May 19 nicklas 257       wells[i].paint(plate.wellPainter);
5390 29 Apr 19 nicklas 258     }
5390 29 Apr 19 nicklas 259   }
5390 29 Apr 19 nicklas 260   
5390 29 Apr 19 nicklas 261   return plate;
5390 29 Apr 19 nicklas 262 }();
5390 29 Apr 19 nicklas 263
5390 29 Apr 19 nicklas 264 /**
5390 29 Apr 19 nicklas 265   Represents a well on the plate. Each well is created when 
5390 29 Apr 19 nicklas 266   the page is loaded and is initially empty.
5390 29 Apr 19 nicklas 267 */
5390 29 Apr 19 nicklas 268 function Well(row, column)
5390 29 Apr 19 nicklas 269 {
5390 29 Apr 19 nicklas 270   this.row = row;
5390 29 Apr 19 nicklas 271   this.column = column;
5440 20 May 19 nicklas 272   this.poolNum = -1;
5390 29 Apr 19 nicklas 273   this.selected = false;
5390 29 Apr 19 nicklas 274   this.highlighClass = null;
5390 29 Apr 19 nicklas 275   this.extract = null;
5390 29 Apr 19 nicklas 276   this.warning = null;
5390 29 Apr 19 nicklas 277   this.error = null;
5390 29 Apr 19 nicklas 278   
5390 29 Apr 19 nicklas 279   this.tag = document.getElementById('well.'+row+'.'+column);
5390 29 Apr 19 nicklas 280 }
5390 29 Apr 19 nicklas 281
5390 29 Apr 19 nicklas 282 /**
5390 29 Apr 19 nicklas 283   Set the extract item that is put into this well. Use
5390 29 Apr 19 nicklas 284   'null' to clear the well. The extract should always
5390 29 Apr 19 nicklas 285   have a 'name' property, and an 'id' property if it 
5390 29 Apr 19 nicklas 286   exists in the database.
5390 29 Apr 19 nicklas 287 */
5390 29 Apr 19 nicklas 288 Well.prototype.setExtract = function(extract)
5390 29 Apr 19 nicklas 289 {
5390 29 Apr 19 nicklas 290   this.extract = extract;
5390 29 Apr 19 nicklas 291 }
5390 29 Apr 19 nicklas 292
5390 29 Apr 19 nicklas 293 Well.prototype.setWarning = function(warning)
5390 29 Apr 19 nicklas 294 {
5390 29 Apr 19 nicklas 295   this.warning = warning;
5390 29 Apr 19 nicklas 296 }
5390 29 Apr 19 nicklas 297
5390 29 Apr 19 nicklas 298 Well.prototype.hasWarning = function()
5390 29 Apr 19 nicklas 299 {
5401 07 May 19 nicklas 300   return this.warning != null || this.extract && this.extract.warning != null;
5390 29 Apr 19 nicklas 301 }
5390 29 Apr 19 nicklas 302
5390 29 Apr 19 nicklas 303 Well.prototype.setError = function(error)
5390 29 Apr 19 nicklas 304 {
5390 29 Apr 19 nicklas 305   this.error = error;
5390 29 Apr 19 nicklas 306 }
5390 29 Apr 19 nicklas 307
5390 29 Apr 19 nicklas 308 Well.prototype.hasError = function()
5390 29 Apr 19 nicklas 309 {
5401 07 May 19 nicklas 310   return this.error != null || this.extract && this.extract.error != null;
5390 29 Apr 19 nicklas 311 }
5390 29 Apr 19 nicklas 312
5392 02 May 19 nicklas 313 Well.prototype.getClassName = function(wellPainter)
5390 29 Apr 19 nicklas 314 {
5390 29 Apr 19 nicklas 315   var c = this.column;
5390 29 Apr 19 nicklas 316   var cls = 'well col-'+c;
5390 29 Apr 19 nicklas 317   if (this.selected) cls += ' selected';
5390 29 Apr 19 nicklas 318   if (!this.extract) cls += ' empty';
5390 29 Apr 19 nicklas 319   if (this.hasError()) cls += ' err';
5390 29 Apr 19 nicklas 320   if (this.hasWarning()) cls += ' warning';
5390 29 Apr 19 nicklas 321   if (this.highlightClass) cls += ' ' + this.highlightClass;
5390 29 Apr 19 nicklas 322
5390 29 Apr 19 nicklas 323   if (wellPainter)
5390 29 Apr 19 nicklas 324   {
5392 02 May 19 nicklas 325     cls += ' ' + wellPainter.getClassNameForWell(this);
5390 29 Apr 19 nicklas 326   }
5390 29 Apr 19 nicklas 327   return cls;
5390 29 Apr 19 nicklas 328 }
5390 29 Apr 19 nicklas 329
5392 02 May 19 nicklas 330 Well.prototype.getText = function(wellPainter)
5390 29 Apr 19 nicklas 331 {
5390 29 Apr 19 nicklas 332   var text = '';
5390 29 Apr 19 nicklas 333   if (wellPainter)
5390 29 Apr 19 nicklas 334   {
5392 02 May 19 nicklas 335     text = wellPainter.getWellText(this);
5390 29 Apr 19 nicklas 336   }
5390 29 Apr 19 nicklas 337   else
5390 29 Apr 19 nicklas 338   {
5390 29 Apr 19 nicklas 339     if (this.extract)
5390 29 Apr 19 nicklas 340     {
5399 06 May 19 nicklas 341       text += '<div class="name">'+Strings.encodeTags(this.extract.name)+'</div>'
5390 29 Apr 19 nicklas 342     }
5390 29 Apr 19 nicklas 343   }
5390 29 Apr 19 nicklas 344   if (this.hasError())
5390 29 Apr 19 nicklas 345   {
5399 06 May 19 nicklas 346     text += '<div class="err-msg">'+(this.error || this.extract.error)+'</div>';
5390 29 Apr 19 nicklas 347   }
5390 29 Apr 19 nicklas 348   if (this.hasWarning())
5390 29 Apr 19 nicklas 349   {
5401 07 May 19 nicklas 350     text += '<div class="warn-msg">'+(this.warning || this.extract.warning)+'</div>';
5390 29 Apr 19 nicklas 351   }
5390 29 Apr 19 nicklas 352   return text;
5390 29 Apr 19 nicklas 353 }
5390 29 Apr 19 nicklas 354
5392 02 May 19 nicklas 355 Well.prototype.paint = function(wellPainter)
5390 29 Apr 19 nicklas 356 {
5390 29 Apr 19 nicklas 357   this.warning = null;
5390 29 Apr 19 nicklas 358   this.error = null;
5392 02 May 19 nicklas 359   this.tag.innerHTML = this.getText(wellPainter);
5392 02 May 19 nicklas 360   this.tag.className = this.getClassName(wellPainter);
5390 29 Apr 19 nicklas 361 }
5390 29 Apr 19 nicklas 362
5448 27 May 19 nicklas 363 /**
5448 27 May 19 nicklas 364   Helper class for counting items with the same 'key' value.
5448 27 May 19 nicklas 365   The 'key' that has the highest count is stored in 'maxKey'
5448 27 May 19 nicklas 366   and the count for that key in 'maxCount'. All other keys
5448 27 May 19 nicklas 367   and counts are found in the 'counts' map.
5448 27 May 19 nicklas 368  */
5448 27 May 19 nicklas 369 function ItemCounter()
5448 27 May 19 nicklas 370 {
5448 27 May 19 nicklas 371   this.numCounted = 0;
5448 27 May 19 nicklas 372   this.maxCount = 0;
5460 03 Jun 19 nicklas 373   this.maxKey = '';
5448 27 May 19 nicklas 374   this.counts = {};
5448 27 May 19 nicklas 375 }
5390 29 Apr 19 nicklas 376
5448 27 May 19 nicklas 377 ItemCounter.prototype.count = function(key)
5448 27 May 19 nicklas 378 {
5448 27 May 19 nicklas 379   if (!key) return;
5448 27 May 19 nicklas 380   this.numCounted++;
5448 27 May 19 nicklas 381   var c = this.counts[key];
5448 27 May 19 nicklas 382   c = c ? c+1 : 1;
5448 27 May 19 nicklas 383   this.counts[key] = c;
5448 27 May 19 nicklas 384   if (c > this.maxCount)
5448 27 May 19 nicklas 385   {
5448 27 May 19 nicklas 386     this.maxKey = key;
5448 27 May 19 nicklas 387     this.maxCount = c;
5448 27 May 19 nicklas 388   }
5448 27 May 19 nicklas 389 }
5448 27 May 19 nicklas 390
5448 27 May 19 nicklas 391 ItemCounter.prototype.numKeys = function()
5448 27 May 19 nicklas 392 {
5448 27 May 19 nicklas 393   return Object.keys(this.counts).length;
5448 27 May 19 nicklas 394 }
5448 27 May 19 nicklas 395
5518 20 Jun 19 nicklas 396 var MipsColor = function()
5518 20 Jun 19 nicklas 397 {
5518 20 Jun 19 nicklas 398   var color = {};
5518 20 Jun 19 nicklas 399   
5519 20 Jun 19 nicklas 400   var PRESET = { 
5599 13 Sep 19 nicklas 401     'ID': 'bg-green', 
5599 13 Sep 19 nicklas 402     'B1B2': 'bg-blue'
5519 20 Jun 19 nicklas 403   };
5599 13 Sep 19 nicklas 404   var MORE_COLORS = ['bg-yellow', 'bg-gray', 'bg-green-dk', 'bg-blue-dk', 'bg-yellow-dk'];
5519 20 Jun 19 nicklas 405   
5518 20 Jun 19 nicklas 406   var nextColor = 0;
5518 20 Jun 19 nicklas 407   var colorMap = {};
5518 20 Jun 19 nicklas 408   
5518 20 Jun 19 nicklas 409   color.reset = function()
5518 20 Jun 19 nicklas 410   {
5518 20 Jun 19 nicklas 411     colorMap = {};
5518 20 Jun 19 nicklas 412     nextColor = 0;
5518 20 Jun 19 nicklas 413   }
5518 20 Jun 19 nicklas 414   
5519 20 Jun 19 nicklas 415   /*
5600 13 Sep 19 nicklas 416     Get a color preset for the given MIPs panel. A preset is selected
5600 13 Sep 19 nicklas 417     if the mipsPanel starts with the name of one of the entries in PRESET.
5600 13 Sep 19 nicklas 418     For example: ID_v1 --> ID --> bg-green
5519 20 Jun 19 nicklas 419   */
5600 13 Sep 19 nicklas 420   color.getPresetColor = function(mipsPanel)
5519 20 Jun 19 nicklas 421   {
5519 20 Jun 19 nicklas 422     for (var p in PRESET)
5519 20 Jun 19 nicklas 423     {
5600 13 Sep 19 nicklas 424       if (mipsPanel.indexOf(p) == 0)
5519 20 Jun 19 nicklas 425       {
5519 20 Jun 19 nicklas 426         return PRESET[p];
5519 20 Jun 19 nicklas 427       }
5519 20 Jun 19 nicklas 428     }
5519 20 Jun 19 nicklas 429     return null;
5519 20 Jun 19 nicklas 430   }
5519 20 Jun 19 nicklas 431   
5519 20 Jun 19 nicklas 432   /**
5600 13 Sep 19 nicklas 433     Get a color for the given MIPs panel. If a color has already been
5519 20 Jun 19 nicklas 434     assigned, the same color is returned. Otherwise, we check if the MIPs
5600 13 Sep 19 nicklas 435     panel is one of the presets. If not, a color is assigned from
5519 20 Jun 19 nicklas 436     MORE_COLORS in order.
5519 20 Jun 19 nicklas 437   */
5600 13 Sep 19 nicklas 438   color.getColor = function(mipsPanel)
5518 20 Jun 19 nicklas 439   {
5600 13 Sep 19 nicklas 440     var c = colorMap[mipsPanel];
5518 20 Jun 19 nicklas 441     if (!c) 
5518 20 Jun 19 nicklas 442     {
5600 13 Sep 19 nicklas 443       c = color.getPresetColor(mipsPanel);
5519 20 Jun 19 nicklas 444       if (!c)
5519 20 Jun 19 nicklas 445       {
5519 20 Jun 19 nicklas 446         c = MORE_COLORS[nextColor++];
5519 20 Jun 19 nicklas 447         if (nextColor >= MORE_COLORS.length) nextColor = 0;
5519 20 Jun 19 nicklas 448       }
5600 13 Sep 19 nicklas 449       colorMap[mipsPanel] = c;
5518 20 Jun 19 nicklas 450     }
5518 20 Jun 19 nicklas 451     return c;
5518 20 Jun 19 nicklas 452   }
5518 20 Jun 19 nicklas 453   
5518 20 Jun 19 nicklas 454   return color;
5518 20 Jun 19 nicklas 455 }();