//JavaScript name="jsIO.js" date="6/7/2001" author="mxk121" email="mxk121@rsphysse.anu.edu.au"
//JavaScript name="jsIO.js" date="15/11/2004" author="Mitsu Kono" email="mitsu.kono@anu.edu.au"

var jsIO_undef;

function jsIO_get(dat, row_max, col_min) {
var dat;
var arr;
var arr_col;
var row_i;
var row_max;
var col_i;
var col_max;
var col_min;
var str;
var pos;
var mem;
var reg;
if (row_max == jsIO_undef) { row_max = 1000; };
if (col_min == jsIO_undef) { col_min = 1; };
   mem = window.status;
   window.status = 'reading ...';
   reg = new RegExp('\r\n|\r|\n', 'g');
   dat = dat.replace(reg, ';');
   reg = new RegExp(',\t|\t,|\t', 'g');
   dat = dat.replace(reg, ',');
/*
   pos = dat.indexOf('\r\n', 0);
   while (pos != -1) {
      dat = dat.replace('\r\n', ';');
      pos = dat.indexOf('\r\n', pos);
   };
   pos = dat.indexOf('\r', 0);
   while (pos != -1) {
      dat = dat.replace('\r', ';');
      pos = dat.indexOf('\r', pos);
   };
   pos = dat.indexOf('\n', 0);
   while (pos != -1) {
      dat = dat.replace('\n',';');
      pos = dat.indexOf('\n', pos);
   };
   pos = dat.indexOf(',\t', 0);
   while (pos != -1) {
      dat = dat.replace(',\t', ',');
      pos = dat.indexOf(',\t', pos);
   };
   pos = dat.indexOf('\t,', 0);
   while (pos != -1) {
      dat = dat.replace('\t,', ',');
      pos = dat.indexOf('\t,', pos);
   };
   pos = dat.indexOf('\t', 0);
   while (pos != -1) {
      dat = dat.replace('\t', ',');
      pos = dat.indexOf('\t', pos);
   };
*/
   arr = dat.split(';', row_max); 
   while (arr[arr.length - 1] < ' ') {
      arr = arr.slice(0, arr.length - 1);
   }; 

   row_max = arr.length;
   for (row_i = 0; row_i < row_max; row_i++) {
      dat = arr[row_i];
      arr_col = dat.split(',', 26); 
      col_max = arr_col.length;
      if (col_max < col_min) { 
         alert('Error [' + row_i + ']'); 
         window.status = mem;
         return false;
      };
      arr[row_i] = new Array(col_max);
      for (col_i = 0; col_i < col_max; col_i++) {
         arr[row_i][col_i] = arr_col[col_i];
      }; 
   };

   window.status = mem;
   return arr;
};

function jsIO_put(arr) {
var arr;
var row_i;
var col_i;
var mem = window.status;
var dat = '';
   window.status = 'writing...';
   for (row_i = 0; row_i < arr.length; row_i++) {
      for (col_i = 0; col_i < arr[row_i].length - 1; col_i++) {
         dat += arr[row_i][col_i] + ', ';
      }; 
      col_i = arr[row_i].length - 1;
      dat += arr[row_i][col_i] + '\n';
   };

   window.status = mem;
   return dat;
};

function jsIO_read(dat, dat_max) {
var dat;
var arr;
var dat_i;
var dat_max;
var pos;
var mem;
var reg;
if (dat_max == jsIO_undef) { dat_max = 10000; };
   mem = window.status;
   window.status = 'reading ...';
   reg = new RegExp('\r\n|\r|\n', 'g');
   dat = dat.replace(reg, ',');
/*
   pos = dat.indexOf('\r\n', 0);
   while (pos != -1) {
      dat = dat.replace('\r\n', ',');
      pos = dat.indexOf('\r\n', pos);
   };
   pos = dat.indexOf('\r', 0);
   while (pos != -1) {
      dat = dat.replace('\r', ',');
      pos = dat.indexOf('\r', pos);
   };
   pos = dat.indexOf('\n', 0);
   while (pos != -1) {
      dat = dat.replace('\n',',');
      pos = dat.indexOf('\n', pos);
   };
*/
   arr = dat.split(',', dat_max); 
   while (arr[arr.length - 1] < ' ') {
      arr = arr.slice(0, arr.length - 1);
   }; 

   window.status = mem;
   return arr;
};

function jsIO_write(arr) {
var arr;
var dat_i;
var mem = window.status;
var dat = '';
   window.status = 'writing...';
   for (dat_i = 0; dat_i < arr.length - 1; dat_i++) {
      dat += arr[dat_i] + ', ';
   }; 
   dat_i = arr.length - 1;
   dat += arr[dat_i] + '\n';

   window.status = mem;
   return dat;
};

function jsIO_load(dat, dat_max) {
var dat;
var arr;
var dat_i;
var dat_max;
var pos;
var mem;
var reg;
if (dat_max == jsIO_undef) { dat_max = 10000; };
   mem = window.status;
   window.status = 'reading ...';
   reg = new RegExp('\r\n|\r|\n', 'g');
   dat = dat.replace(reg, ';');
/*
   pos = dat.indexOf('\r\n', 0);
   while (pos != -1) {
      dat = dat.replace('\r\n', ';');
      pos = dat.indexOf('\r\n', pos);
   };
   pos = dat.indexOf('\r', 0);
   while (pos != -1) {
      dat = dat.replace('\r', ';');
      pos = dat.indexOf('\r', pos);
   };
   pos = dat.indexOf('\n', 0);
   while (pos != -1) {
      dat = dat.replace('\n',';');
      pos = dat.indexOf('\n', pos);
   };
*/
   arr = dat.split(';', dat_max); 
   while (arr[arr.length - 1] < ' ') {
      arr = arr.slice(0, arr.length - 1);
   }; 

   window.status = mem;
   return arr;
};

function jsIO_save(arr) {
var arr;
var dat_i;
var mem = window.status;
var dat = '';
   window.status = 'writing...';
   for (dat_i = 0; dat_i < arr.length; dat_i++) {
      dat += arr[dat_i] + '\n';
   }; 

   window.status = mem;
   return dat;
};

function jsIO_ana_col(arr, col_i) {
var arr;
var col_i;
var obj = new Object();
var row_i;
var ava_i = 0;
var nan_i = 0;
var inf_i = 0;
var max_i = Number.NaN;
var min_i = Number.NaN;
var jsIO_max = Number.NEGATIVE_INFINITY;
var jsIO_min = Number.POSITIVE_INFINITY;
var jsIO_sum = 0;
var jsIO_sum2 = 0;
var mem = window.status;
   window.status = 'analysing...';
   for (row_i = 0; row_i < arr.length; row_i++) {
      if (arr[row_i].length - 1 < col_i) { arr[row_i][col_i] = Number.NaN; };
      if (isNaN(arr[row_i][col_i])) { nan_i++; continue; };
      if (Math.abs(arr[row_i][col_i]) == Number.POSITIVE_INFINITY) { inf_i++; continue; }; 
      ava_i++;
      jsIO_sum += (arr[row_i][col_i] - 0);
      jsIO_sum2 += ((arr[row_i][col_i] - 0) * (arr[row_i][col_i] - 0));
      jsIO_max = Math.max(jsIO_max, arr[row_i][col_i]); 
         max_i = (jsIO_max == arr[row_i][col_i]) ? row_i : max_i; 
      jsIO_min = Math.min(jsIO_min, arr[row_i][col_i]);
         min_i = (jsIO_min == arr[row_i][col_i]) ? row_i : min_i; 
   }; 
   if (jsIO_max < jsIO_min) { 
      jsIO_max = Number.NaN;
      jsIO_min = Number.NaN;
   }; 
   obj.max = jsIO_max;
   obj.min = jsIO_min;
   obj.mid = (jsIO_max + jsIO_min) / 2;
   obj.absmax = Math.max(jsIO_max, -jsIO_min);
   obj.sum = jsIO_sum;
   obj.sum2 = jsIO_sum2;
   obj.ave = (ava_i == 0) ? Number.NaN : (jsIO_sum / ava_i);
   obj.sdev = (ava_i < 2) ? Number.NaN : Math.sqrt((jsIO_sum2 - ava_i * obj.ave * obj.ave) / (ava_i - 1));
   obj.maxloc = max_i;
   obj.minloc = min_i;
   obj.absmaxloc = (obj.absmax == obj.max) ? obj.maxloc : obj.minloc; 
   obj.num = arr.length;
   obj.numava = ava_i;
   obj.numNaN = nan_i;
   obj.numInf = inf_i;
   window.status = mem;
   return obj;
};

function jsIO_ana(arr) {
var arr;
var obj = new Object();
var dat_i;
var ava_i = 0;
var nan_i = 0;
var inf_i = 0;
var max_i = Number.NaN;
var min_i = Number.NaN;
var jsIO_max = Number.NEGATIVE_INFINITY;
var jsIO_min = Number.POSITIVE_INFINITY;
var jsIO_sum = 0;
var jsIO_sum2 = 0;
var mem = window.status;
   window.status = 'analysing...';
   for (dat_i = 0; dat_i < arr.length; dat_i++) {
      if (isNaN(arr[dat_i])) { nan_i++; continue; };
      if (Math.abs(arr[dat_i]) == Number.POSITIVE_INFINITY) { inf_i++; continue; }; 
      ava_i++;
      jsIO_sum += (arr[dat_i] - 0);
      jsIO_sum2 += ((arr[dat_i] - 0) * (arr[dat_i] - 0));
      jsIO_max = Math.max(jsIO_max, arr[dat_i]); 
         max_i = (jsIO_max == arr[dat_i]) ? dat_i : max_i; 
      jsIO_min = Math.min(jsIO_min, arr[dat_i]);
         min_i = (jsIO_min == arr[dat_i]) ? dat_i : min_i; 
   }; 
   if (jsIO_max < jsIO_min) { 
      jsIO_max = Number.NaN;
      jsIO_min = Number.NaN;
   }; 
   obj.max = jsIO_max;
   obj.min = jsIO_min;
   obj.mid = (jsIO_max - jsIO_min) / 2;
   obj.absmax = Math.max(jsIO_max, -jsIO_min);
   obj.sum = jsIO_sum;
   obj.sum2 = jsIO_sum2;
   obj.ave = (ava_i == 0) ? Number.NaN : (jsIO_sum / ava_i);
   obj.sdev = (ava_i < 2) ? Number.NaN : Math.sqrt((jsIO_sum2 - ava_i * obj.ave * obj.ave) / (ava_i - 1));
   obj.maxloc = max_i;
   obj.minloc = min_i;
   obj.absmaxloc = (obj.absmax == obj.max) ? obj.maxloc : obj.minloc; 
   obj.num = arr.length;
   obj.numava = ava_i;
   obj.numNaN = nan_i;
   obj.numInf = inf_i;
   window.status = mem;
   return obj;
};

function jsIO_sortfunc(comp_1, comp_2) {
   return eval(comp_1) - eval(comp_2);
};

function jsIO_index_col(arr, col_i) {
var arr, col_i;
var str;
var sor = new Array(arr.length);
var ind = new Array(arr.length);
var mem = window.status;
   window.status = 'sorting...';
   for (i = 0; i < arr.length; i++) {
      sor[i] = i + ',' + arr[i][col_i];
   };
   sor = sor.sort(jsIO_sortfunc);
   for (i = 0; i < arr.length; i++) {
      str = sor[i];
      ind[i] = str.substr(0, str.indexOf(","));
   };
   window.status = mem;
   return ind;
};

function jsIO_index(arr) {
var arr;
var str;
var sor = new Array(arr.length);
var ind = new Array(arr.length);
var mem = window.status;
   window.status = 'sorting...';
   for (i = 0; i < arr.length; i++) {
      sor[i] = i + ',' + arr[i];
   };
   sor = sor.sort(jsIO_sortfunc);
   for (i = 0; i < arr.length; i++) {
      str = sor[i];
      ind[i] = str.substr(0, str.indexOf(","));
   };
   window.status = mem;
   return ind;
};
