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

Code
Comments
Other
Rev Date Author Line
3352 26 May 15 olle 1 var ExtractUtils = function()
3352 26 May 15 olle 2 {
3352 26 May 15 olle 3   var exutils = {};
3352 26 May 15 olle 4   var debug = 0;
3352 26 May 15 olle 5
3354 27 May 15 olle 6   exutils.getQiacubeSortedPrefixes = function(primaryQiacubePrefix, secondaryQiacubePrefix)
3354 27 May 15 olle 7   {
3354 27 May 15 olle 8     // Default value for primary QIAcube prefix is "B", and for secondary is "C"
3354 27 May 15 olle 9     if (primaryQiacubePrefix == null || primaryQiacubePrefix == '')
3354 27 May 15 olle 10     {
3354 27 May 15 olle 11       primaryQiacubePrefix = 'B';
3354 27 May 15 olle 12     }
3354 27 May 15 olle 13     if (secondaryQiacubePrefix == null || secondaryQiacubePrefix == '')
3354 27 May 15 olle 14     {
3354 27 May 15 olle 15       secondaryQiacubePrefix = 'C';
3354 27 May 15 olle 16     }
3352 26 May 15 olle 17
3354 27 May 15 olle 18     // Get string of current QIAcube prefixes in order
3354 27 May 15 olle 19     var fullSortedPrefixSet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
3354 27 May 15 olle 20     var sortedPrefixes = '' + primaryQiacubePrefix + secondaryQiacubePrefix;
3354 27 May 15 olle 21     for (var i = 0; i < fullSortedPrefixSet.length; i++)
3354 27 May 15 olle 22     {
3354 27 May 15 olle 23       // Get next prefix
3354 27 May 15 olle 24       var prefix = fullSortedPrefixSet.substring(i, i+1);
3354 27 May 15 olle 25       // Add prefix to string of sorted prefixes, if not already present
3354 27 May 15 olle 26       if (prefix != primaryQiacubePrefix && prefix != secondaryQiacubePrefix)
3354 27 May 15 olle 27       {
3354 27 May 15 olle 28         sortedPrefixes += prefix;
3354 27 May 15 olle 29       }
3354 27 May 15 olle 30     }
3354 27 May 15 olle 31     return sortedPrefixes;
3354 27 May 15 olle 32   }
3354 27 May 15 olle 33
3354 27 May 15 olle 34   /**
3354 27 May 15 olle 35     Returns a QIAcube position string with optional instrument
3354 27 May 15 olle 36     letter prefix A-Z for vial 'i', when 'nitems' vials are
3354 27 May 15 olle 37     to be analyzed on at most two instruments.
3354 27 May 15 olle 38
3354 27 May 15 olle 39     If the number of items is <= 12, all will be placed in
3354 27 May 15 olle 40     the QIAcube with the primary prefix. If the number of items
3354 27 May 15 olle 41     is > 12 and <= 24, they will be distributed between
3354 27 May 15 olle 42     two instruments as evenly as possible, except that one
3354 27 May 15 olle 43     tries to avoid having 11 vials in the instrument with
3354 27 May 15 olle 44     most vials, as this would require a counterbalance. For 23
3354 27 May 15 olle 45     vials the instruments with less vials (11) will need a
3354 27 May 15 olle 46     counterbalance. 
3354 27 May 15 olle 47    */
3354 27 May 15 olle 48   exutils.getDetailedQiaCubePosition = function(nitems, i, qiacubeSortedPrefixes)
3352 26 May 15 olle 49   {
3352 26 May 15 olle 50     var dpos = null;
3352 26 May 15 olle 51     var qiacubePos = null;
3354 27 May 15 olle 52     // Two QIAcube instruments are available, default is 'B' and 'C'
3352 26 May 15 olle 53     var qiacubeId = qiacubeSortedPrefixes.substring(0, 1);
3352 26 May 15 olle 54     if (nitems == null || nitems < 1 || nitems > 24)
3352 26 May 15 olle 55     {
3352 26 May 15 olle 56       return null;
3352 26 May 15 olle 57     }
3352 26 May 15 olle 58     if (i == null || i < 1 || i > nitems)
3352 26 May 15 olle 59     {
3352 26 May 15 olle 60       return null;
3352 26 May 15 olle 61     }
3352 26 May 15 olle 62     if (nitems <= 12)
3352 26 May 15 olle 63     {
3352 26 May 15 olle 64       qiacubePos = exutils.getQiaCubePosition(nitems, i);
3352 26 May 15 olle 65     }
3352 26 May 15 olle 66     else
3352 26 May 15 olle 67     {
3352 26 May 15 olle 68       var numItemsQiaCube1 = Math.floor((nitems + 1)/2);
3352 26 May 15 olle 69       if (numItemsQiaCube1 == 11)
3352 26 May 15 olle 70       {
3352 26 May 15 olle 71         numItemsQiaCube1 = 12;
3352 26 May 15 olle 72       }
3352 26 May 15 olle 73       if (i <= numItemsQiaCube1)
3352 26 May 15 olle 74       {
3352 26 May 15 olle 75         // Place sample in first QIAcube
3352 26 May 15 olle 76         qiacubePos = exutils.getQiaCubePosition(numItemsQiaCube1, i);
3352 26 May 15 olle 77       }
3352 26 May 15 olle 78       else
3352 26 May 15 olle 79       {
3352 26 May 15 olle 80         // Place sample in second QIAcube
3352 26 May 15 olle 81         var numItemsQiaCube2 = nitems - numItemsQiaCube1;
3352 26 May 15 olle 82         qiacubePos = exutils.getQiaCubePosition(numItemsQiaCube2, i - numItemsQiaCube1);
3352 26 May 15 olle 83         qiacubeId = qiacubeSortedPrefixes.substring(1, 2);
3352 26 May 15 olle 84       }
3352 26 May 15 olle 85     }
3352 26 May 15 olle 86     if (qiacubeId != null && qiacubePos != null)
3352 26 May 15 olle 87     {
3352 26 May 15 olle 88       dpos = qiacubeId + qiacubePos;
3352 26 May 15 olle 89     }
3352 26 May 15 olle 90     return dpos;
3352 26 May 15 olle 91   }
3352 26 May 15 olle 92
3354 27 May 15 olle 93   /**
3354 27 May 15 olle 94     Returns a QIAcube position number in a single instrument
3354 27 May 15 olle 95     for vial 'i', when 'nitems' vials are placed in the instrument.
3354 27 May 15 olle 96     The numbers are based on recommendations from the manufacturer,
3354 27 May 15 olle 97     in order to ensure balance stability of the centrifuge.
3354 27 May 15 olle 98     For a total of 1 or 11 items, it is assumed that a counterbalance
3354 27 May 15 olle 99     in the proper positions is used.
3354 27 May 15 olle 100    */
3352 26 May 15 olle 101   exutils.getQiaCubePosition = function(nitems, i)
3352 26 May 15 olle 102   {
3352 26 May 15 olle 103     var pos = null;
3352 26 May 15 olle 104     if (nitems == null || nitems < 1 || nitems > 12)
3352 26 May 15 olle 105     {
3352 26 May 15 olle 106       return null;
3352 26 May 15 olle 107     }
3352 26 May 15 olle 108     if (i == null || i < 1 || i > nitems)
3352 26 May 15 olle 109     {
3352 26 May 15 olle 110       return null;
3352 26 May 15 olle 111     }
3352 26 May 15 olle 112     var posArr = ['1','2','3','4','5','6','7','8','9','10','11','12'];
3352 26 May 15 olle 113     if (nitems == 2)
3352 26 May 15 olle 114     {
3352 26 May 15 olle 115       posArr = ['1','7','','','','','','','','','',''];
3352 26 May 15 olle 116     }
3352 26 May 15 olle 117     else if (nitems == 3)
3352 26 May 15 olle 118     {
3352 26 May 15 olle 119       posArr = ['1','5','9','','','','','','','','',''];
3352 26 May 15 olle 120     }
3352 26 May 15 olle 121     else if (nitems == 4)
3352 26 May 15 olle 122     {
3352 26 May 15 olle 123       posArr = ['1','2','7','8','','','','','','','',''];
3352 26 May 15 olle 124     }
3352 26 May 15 olle 125     else if (nitems == 5)
3352 26 May 15 olle 126     {
3352 26 May 15 olle 127       posArr = ['1','2','5','8','9','','','','','','',''];
3352 26 May 15 olle 128     }
3352 26 May 15 olle 129     else if (nitems == 6)
3352 26 May 15 olle 130     {
3352 26 May 15 olle 131       posArr = ['1','2','3','7','8','9','','','','','',''];
3352 26 May 15 olle 132     }
3352 26 May 15 olle 133     else if (nitems == 7)
3352 26 May 15 olle 134     {
3352 26 May 15 olle 135       posArr = ['1','2','3','6','7','9','10','','','','',''];
3352 26 May 15 olle 136     }
3352 26 May 15 olle 137     else if (nitems == 8)
3352 26 May 15 olle 138     {
3352 26 May 15 olle 139       posArr = ['1','2','3','4','7','8','9','10','','','',''];
3352 26 May 15 olle 140     }
3352 26 May 15 olle 141     else if (nitems == 9)
3352 26 May 15 olle 142     {
3352 26 May 15 olle 143       posArr = ['1','2','3','5','6','7','9','10','11','','',''];
3352 26 May 15 olle 144     }
3352 26 May 15 olle 145     else if (nitems == 10)
3352 26 May 15 olle 146     {
3352 26 May 15 olle 147       posArr = ['1','2','3','4','5','7','8','9','10','11','',''];
3352 26 May 15 olle 148     }
3352 26 May 15 olle 149     else if (nitems == 11)
3352 26 May 15 olle 150     {
3352 26 May 15 olle 151       // Counterbalance blank vial filled with water needed i position 12.
3352 26 May 15 olle 152       posArr = ['1','2','3','4','5','6','7','8','9','10','11',''];
3352 26 May 15 olle 153     }
3352 26 May 15 olle 154     pos = posArr[i-1];
3352 26 May 15 olle 155     return pos;
3352 26 May 15 olle 156   }
3352 26 May 15 olle 157
3352 26 May 15 olle 158   /**
3352 26 May 15 olle 159     Returns a QIAcube position string with optional instrument
3352 26 May 15 olle 160     letter prefix A-Z from a pure integer position value.
3352 26 May 15 olle 161
3352 26 May 15 olle 162     Examples for qiacubeSortedPrefixes = 'BCADEFGHIJKLMNOPQRSTUVWXYZ' ("B" is default)
3352 26 May 15 olle 163     intPosition (  1 -  12) => positionStr = 'B' + integer
3352 26 May 15 olle 164     intPosition ( 13 -  24) => positionStr = 'C' + (integer - 12)
3352 26 May 15 olle 165     intPosition (301 - 312) => positionStr = 'Z' + (integer - 300)
3352 26 May 15 olle 166    */
3354 27 May 15 olle 167   exutils.getDetailedQiacubePosition = function(intPosition, qiacubeSortedPrefixes)
3352 26 May 15 olle 168   {
3352 26 May 15 olle 169     var qiacubePositionStr = null;
3352 26 May 15 olle 170     if (intPosition && intPosition > 0)
3352 26 May 15 olle 171     {
3352 26 May 15 olle 172       var numPrefixes = qiacubeSortedPrefixes.length;
3352 26 May 15 olle 173       var prefixIndex = Math.floor(intPosition/12);
3352 26 May 15 olle 174       if (prefixIndex < numPrefixes)
3352 26 May 15 olle 175       {
3352 26 May 15 olle 176         var qiacubePrefix = qiacubeSortedPrefixes.substring(prefixIndex, prefixIndex + 1);
3352 26 May 15 olle 177         var qiacubePos = intPosition - 12*prefixIndex;
3352 26 May 15 olle 178         qiacubePositionStr = qiacubePrefix + qiacubePos;
3352 26 May 15 olle 179       }
3352 26 May 15 olle 180       else
3352 26 May 15 olle 181       {
3352 26 May 15 olle 182         qiacubePositionStr = '' + intPosition;
3352 26 May 15 olle 183       }
3352 26 May 15 olle 184     }
3352 26 May 15 olle 185     return qiacubePositionStr;
3352 26 May 15 olle 186   }
3352 26 May 15 olle 187
3352 26 May 15 olle 188   /**
3352 26 May 15 olle 189     Returns a pure integer position value from a QIAcube position
3352 26 May 15 olle 190     string with optional instrument letter prefix A-Z.
3352 26 May 15 olle 191     Returns `null` if input position string is `null`.
3352 26 May 15 olle 192
3352 26 May 15 olle 193     positionStr = integer          => QIAcube position = integer (1-12)
3352 26 May 15 olle 194     positionStr = Prefix + integer => QIAcube position = integer + 12*<Prefix order number 0-25>
3352 26 May 15 olle 195    */
3354 27 May 15 olle 196   exutils.getIntQiacubePosition = function(positionStr, qiacubeSortedPrefixes)
3352 26 May 15 olle 197   {
3352 26 May 15 olle 198     var intPos = null;
3352 26 May 15 olle 199     if (positionStr)
3352 26 May 15 olle 200     {
3352 26 May 15 olle 201       // Check if string contains uppercase letter + QIAcube position number 1-12
3352 26 May 15 olle 202       if (/^[A-Z]([2-9]|1[0-2]?)$/.test(positionStr))
3352 26 May 15 olle 203       {
3352 26 May 15 olle 204         var qiaCubePrefix = positionStr.substring(0,1);
3352 26 May 15 olle 205         // Get QIAcube prefix order number 0-25
3352 26 May 15 olle 206         var qiacubePrefixOrder = qiacubeSortedPrefixes.indexOf(qiaCubePrefix);
3352 26 May 15 olle 207         if (qiacubePrefixOrder >= 0)
3352 26 May 15 olle 208         {
3352 26 May 15 olle 209           intPos = parseInt(positionStr.substring(1)) + 12*qiacubePrefixOrder;
3352 26 May 15 olle 210         }
3352 26 May 15 olle 211       }
3352 26 May 15 olle 212       if (intPos == null)
3352 26 May 15 olle 213       {
3352 26 May 15 olle 214         intPos = parseInt(positionStr);
3352 26 May 15 olle 215       }
3352 26 May 15 olle 216     }
3352 26 May 15 olle 217     return intPos;
3352 26 May 15 olle 218   }
3352 26 May 15 olle 219
3432 29 Jun 15 olle 220   exutils.isMeludiItem = function(item)
3432 29 Jun 15 olle 221   {
3432 29 Jun 15 olle 222     var isMeludiItem = false;
3432 29 Jun 15 olle 223     if (item != null)
3432 29 Jun 15 olle 224     {
3432 29 Jun 15 olle 225       var name = item.name;
3432 29 Jun 15 olle 226       if (name != null)
3432 29 Jun 15 olle 227       {
3432 29 Jun 15 olle 228         // Check that item name starts with "ML" to exclude extra items
3432 29 Jun 15 olle 229         if (name.indexOf('ML') == 0)
3432 29 Jun 15 olle 230         {
3432 29 Jun 15 olle 231           isMeludiItem = true;
3432 29 Jun 15 olle 232         }
3432 29 Jun 15 olle 233       }
3432 29 Jun 15 olle 234     }
3432 29 Jun 15 olle 235     return isMeludiItem;
3432 29 Jun 15 olle 236   }
3432 29 Jun 15 olle 237
3432 29 Jun 15 olle 238   exutils.isExtraMaterial = function(item)
3432 29 Jun 15 olle 239   {
3432 29 Jun 15 olle 240     var isExtraMaterial = false;
3432 29 Jun 15 olle 241     if (item != null)
3432 29 Jun 15 olle 242     {
3432 29 Jun 15 olle 243       var name = item.name;
3432 29 Jun 15 olle 244       if (name != null)
3432 29 Jun 15 olle 245       {
3432 29 Jun 15 olle 246         // Check that item name does not start with "ML" to exclude MeLuDI items
3432 29 Jun 15 olle 247         if (name.indexOf('ML') != 0)
3432 29 Jun 15 olle 248         {
3432 29 Jun 15 olle 249           isExtraMaterial = true;
3432 29 Jun 15 olle 250         }
3432 29 Jun 15 olle 251       }
3432 29 Jun 15 olle 252     }
3432 29 Jun 15 olle 253     return isExtraMaterial;
3432 29 Jun 15 olle 254   }
3432 29 Jun 15 olle 255
3352 26 May 15 olle 256   exutils.isSpecimen = function(item)
3352 26 May 15 olle 257   {
3352 26 May 15 olle 258     var isSpecimen = false;
3352 26 May 15 olle 259     if (item != null)
3352 26 May 15 olle 260     {
3432 29 Jun 15 olle 261       var name = item.name;
3432 29 Jun 15 olle 262       if (name != null)
3352 26 May 15 olle 263       {
3432 29 Jun 15 olle 264         // Check that item name ends with single dot "." followed by a natural number (>0)
3432 29 Jun 15 olle 265         // "\x2E" represents a dot "." (2E is the hexadecimal ASCII code for ".")
3638 02 Dec 15 olle 266         var pattern = /^[0-9_-]*[A-Za-z]+[A-Za-z0-9_-]*\x2E[1-9]+[0-9]*$/
3432 29 Jun 15 olle 267         if (pattern.test(name))
3352 26 May 15 olle 268         {
3432 29 Jun 15 olle 269           isSpecimen = true;
3352 26 May 15 olle 270         }
5225 14 Jan 19 olle 271         else
5225 14 Jan 19 olle 272         {
5225 14 Jan 19 olle 273           // New name convention
5225 14 Jan 19 olle 274           // Check that item name ends with single dot "." followed by a natural number (>0) followed by ".s"
5225 14 Jan 19 olle 275           var pattern2 = /^[0-9_-]*[A-Za-z]+[A-Za-z0-9_-]*\x2E[1-9]+[0-9]*\x2E[s]$/
5225 14 Jan 19 olle 276           if (pattern2.test(name))
5225 14 Jan 19 olle 277           {
5225 14 Jan 19 olle 278             isSpecimen = true;
5225 14 Jan 19 olle 279           }
5225 14 Jan 19 olle 280         }
3352 26 May 15 olle 281       }
3352 26 May 15 olle 282     }
3352 26 May 15 olle 283     return isSpecimen;
3352 26 May 15 olle 284   }
3352 26 May 15 olle 285
3352 26 May 15 olle 286   exutils.isRna = function(item)
3352 26 May 15 olle 287   {
3352 26 May 15 olle 288     var isRna = false;
3352 26 May 15 olle 289     if (item != null)
3352 26 May 15 olle 290     {
3352 26 May 15 olle 291       var name = item.name;
3352 26 May 15 olle 292       if (name != null)
3352 26 May 15 olle 293       {
3352 26 May 15 olle 294         // Check if item name ends with ".r"
3352 26 May 15 olle 295         if (name.indexOf('.r') == (name.length - 2))
3352 26 May 15 olle 296         {
3352 26 May 15 olle 297           isRna = true;
3352 26 May 15 olle 298         }
3352 26 May 15 olle 299       }
3352 26 May 15 olle 300     }
3352 26 May 15 olle 301     return isRna;
3352 26 May 15 olle 302   }
3352 26 May 15 olle 303
3352 26 May 15 olle 304   exutils.isDna = function(item)
3352 26 May 15 olle 305   {
3352 26 May 15 olle 306     var isDna = false;
3352 26 May 15 olle 307     if (item != null)
3352 26 May 15 olle 308     {
3352 26 May 15 olle 309       var name = item.name;
3352 26 May 15 olle 310       if (name != null)
3352 26 May 15 olle 311       {
3352 26 May 15 olle 312         // Check if item name ends with ".d"
3352 26 May 15 olle 313         if (name.indexOf('.d') == (name.length - 2))
3352 26 May 15 olle 314         {
3352 26 May 15 olle 315           isDna = true;
3352 26 May 15 olle 316         }
3352 26 May 15 olle 317       }
3352 26 May 15 olle 318     }
3352 26 May 15 olle 319     return isDna;
3352 26 May 15 olle 320   }
3352 26 May 15 olle 321
3352 26 May 15 olle 322   exutils.findSeparator = function(data, searchString)
3352 26 May 15 olle 323   {
3352 26 May 15 olle 324     // Searches for the first line containing the input search string, then returns next character as separator
3352 26 May 15 olle 325     var separator = null;
3352 26 May 15 olle 326     if (data != null && searchString != null)
3352 26 May 15 olle 327     {
3352 26 May 15 olle 328       var lines = data.split(/[\n\r]+/);
3352 26 May 15 olle 329       var found = false;
3352 26 May 15 olle 330       for (var i = 0; (i < lines.length && !found); i++)
3352 26 May 15 olle 331       {
3352 26 May 15 olle 332         if (lines[i].match(/^\s*$/)) continue; // Ignore empty lines
3352 26 May 15 olle 333         var line = lines[i];
3352 26 May 15 olle 334         var index = line.indexOf(searchString);
3352 26 May 15 olle 335         if (index >= 0)
3352 26 May 15 olle 336         {
3352 26 May 15 olle 337           // Get next character after first column header as separator
3352 26 May 15 olle 338           var separatorIndex = index + searchString.length;
3352 26 May 15 olle 339           separator = line.substring(separatorIndex, separatorIndex+1);
3352 26 May 15 olle 340           found = true;
3352 26 May 15 olle 341         }
3352 26 May 15 olle 342       }
3352 26 May 15 olle 343     }
3352 26 May 15 olle 344     return separator;
3352 26 May 15 olle 345   }
3352 26 May 15 olle 346
5313 27 Feb 19 olle 347   exutils.findSeparatorFromJSONArray = function(data, jsonKey)
5313 27 Feb 19 olle 348   {
5313 27 Feb 19 olle 349     // Searches for the first occurrence of comma, semicolon, or tab in the first line of data
5313 27 Feb 19 olle 350     var separator = null;
5313 27 Feb 19 olle 351 //alert("extraction_utils.js::findSeparatorFromJSONArray(): jsonKey = '" + jsonKey + "' data = '" + JSON.stringify(data) + "'.");
5313 27 Feb 19 olle 352     if (data != null)
5313 27 Feb 19 olle 353     {
5313 27 Feb 19 olle 354       var lines = data[jsonKey];
5313 27 Feb 19 olle 355       var found = false;
5313 27 Feb 19 olle 356       for (var i = 0; (i < lines.length && !found); i++)
5313 27 Feb 19 olle 357       {
5313 27 Feb 19 olle 358         if (lines[i].match(/^\s*$/)) continue; // Ignore empty lines
5313 27 Feb 19 olle 359         var line = lines[i];
5313 27 Feb 19 olle 360         var index = 1000000;
5313 27 Feb 19 olle 361         var commaIndex = line.indexOf(",");
5313 27 Feb 19 olle 362         var semicolonIndex = line.indexOf(";");
5313 27 Feb 19 olle 363         //var tabChar = "\\t";
5313 27 Feb 19 olle 364         var tabChar = String.fromCharCode(9);
5313 27 Feb 19 olle 365         var tabIndex = line.indexOf(tabChar);
5313 27 Feb 19 olle 366 //alert("extraction_utils.js::findSeparatorFromJSONArray(): line[" + i + "] = '" + line + "' commaIndex = " + commaIndex + " semicolonIndex = " + semicolonIndex + " tabIndex = " + tabIndex + ".");
5313 27 Feb 19 olle 367         if (commaIndex >= 0)
5313 27 Feb 19 olle 368         {
5313 27 Feb 19 olle 369           index = commaIndex;
5313 27 Feb 19 olle 370           separator = ",";
5313 27 Feb 19 olle 371           found = true;
5313 27 Feb 19 olle 372         }
5313 27 Feb 19 olle 373         if (semicolonIndex >= 0 && semicolonIndex < index)
5313 27 Feb 19 olle 374         {
5313 27 Feb 19 olle 375           index = semicolonIndex;
5313 27 Feb 19 olle 376           separator = ";";
5313 27 Feb 19 olle 377           found = true;
5313 27 Feb 19 olle 378         }
5313 27 Feb 19 olle 379         if (tabIndex >= 0 && tabIndex < index)
5313 27 Feb 19 olle 380         {
5313 27 Feb 19 olle 381           index = tabIndex;
5313 27 Feb 19 olle 382           separator = tabChar;
5313 27 Feb 19 olle 383           found = true;
5313 27 Feb 19 olle 384         }
5313 27 Feb 19 olle 385       }
5313 27 Feb 19 olle 386     }
5313 27 Feb 19 olle 387     return separator;
5313 27 Feb 19 olle 388   }
5313 27 Feb 19 olle 389
3352 26 May 15 olle 390   exutils.setDecimalDotInsideDoubleQuotes = function(line)
3352 26 May 15 olle 391   {
3352 26 May 15 olle 392     var lineParts = line.split(/ *" */);
3352 26 May 15 olle 393     var procLine = lineParts[0];
3352 26 May 15 olle 394     var numAddedDblQts = 0;
3352 26 May 15 olle 395     for (var i = 1; i < lineParts.length; i++)
3352 26 May 15 olle 396     {
3352 26 May 15 olle 397       var str = lineParts[i];
3352 26 May 15 olle 398       if (i % 2 == 1)
3352 26 May 15 olle 399       {
3352 26 May 15 olle 400         // Inside double quotes
3352 26 May 15 olle 401         // Replace decimal comma with decimal dot
3352 26 May 15 olle 402         str = str.replace(/,/, '.');
3352 26 May 15 olle 403       }
3352 26 May 15 olle 404       // Add string to processed line
3352 26 May 15 olle 405       procLine += '"' + str;
3352 26 May 15 olle 406       numAddedDblQts++;
3352 26 May 15 olle 407     }
3352 26 May 15 olle 408     if (numAddedDblQts % 2 == 1)
3352 26 May 15 olle 409     {
3352 26 May 15 olle 410       // Add terminal double quote      
3352 26 May 15 olle 411       procLine += '"';
3352 26 May 15 olle 412     }
3352 26 May 15 olle 413     // Return processed line
3352 26 May 15 olle 414     return procLine;
3352 26 May 15 olle 415   }
3352 26 May 15 olle 416
3352 26 May 15 olle 417   exutils.getNumber = function(sValue)
3352 26 May 15 olle 418   {
3352 26 May 15 olle 419     return parseFloat(sValue.replace(/,/, '.'));
3352 26 May 15 olle 420   }
3352 26 May 15 olle 421
3352 26 May 15 olle 422   return exutils;
3352 26 May 15 olle 423 }();
3352 26 May 15 olle 424
3352 26 May 15 olle 425 //Doc.onLoad(ExtractUtils.initPage);
3352 26 May 15 olle 426