// collection of javascript utility functions for dealing with arrays, object collections
// mathematical operations, etc.
// created by Denis Lepage, Bird Studies Canada - http://www.bsc-eoc.org
// requires jquery (developped with version 1.4.2)

function round(x, p) {
  x = x * Math.pow(10,p);
  x = parseInt(x);
  x = x / Math.pow(10,p);
  return x;
}

function getDDMMYY(d) {
  if (typeof(d) == "string") d = new Date(d);
  var s = (d.getDate() < 10 ? '0' : '') + d.getDate() + "/";
  s += (d.getMonth() + 1 < 10 ? '0' : '') + (d.getMonth() + 1) + "/";
  s += d.getFullYear();
  return s;
}

function getDDMMYYHHMM(d) {
  if (typeof(d) == "string") d = new Date(d);
  var s = getDDMMYY(d) + "  ";
  s += (d.getHours() < 10? '0' : '') + d.getHours() + ":";
  s += (d.getMinutes() < 10? '0' : '') + d.getMinutes();
  return s;
}

function populateDropdown(select, data, selectedOption, addNone, idField, nameField) {
    select.html('');
    if (!idField) idField = "id";
    if (!nameField) nameField = "name";

    var options = select.attr('options');
    if (!options) options = {};
    if (addNone) options[0] = new Option("None selected", "0");
    if (!data) return;
    $.each(data, function(i, node) {
      if (node) options[options.length] = new Option(node[nameField], node[idField]);
    });
    if (selectedOption != "") select.val(selectedOption);
    if (!select.val() && addNone) select.val("0");
}

function renameIndex(obj, oldIndex, newIndex) {
    var newArray = {};
    $.each(userList[localStorage.currentProject], function(i, node) {
      if (node && node.id == oldIndex) obj[i][newIndex] = node;
      else if (obj[i]) obj[i][node.id] = node;
    });
    obj = newArray;
}

function removeObject(obj, index) {
    var newArray = {};
    var n = 0;
    $.each(obj, function(i, node) {
      if (node && i != index) {
        newArray[i] = node;
        n++;
      }
    });
    return newArray;
}

function removeObjectAt(obj, pos, levels, cnt) {
    var newArray = {};
    if (!cnt) cnt = 0;
    $.each(obj, function(i, node) {
      if (levels && levels > 1) {
        newArray[i] = removeObjectAt(node, pos, levels - 1, cnt);
      } else if (cnt != pos) {
        newArray[i] = node;
      }
    });
    return newArray;
}

function replaceObject(obj, obj2, index, index2) {
    var newArray = {};
    var n = 0;
    $.each(obj, function(i, node) {
      if (node && i != index) {
        newArray[i] = node;
      } else if (i == index) {
        newArray[index2] = obj2;
      }
    });
    return newArray;
}
function countNodes(obj, levels) {
    var n = 0;
    if (obj) {
      $.each(obj, function(i, node) {
        if (!levels || levels <= 1) n++;
        else n += countNodes(node, levels - 1); // recurse
     });
    }
    return n;
}

function getObjectAt(obj, pos, levels, cnt) {
    if (!cnt) cnt = 0;
    var myNode = null;
    $.each(obj, function(i, node) {
      if (!levels || levels <= 1) {
        if (cnt++ == pos) {
          myNode = node;
        }
      } else {
        myNode = getObjectAt(node, pos, levels -1, cnt);
        //if (myNode) $.break;
      }
    });
    return myNode;
}

var sortBy = function(field, reverse, primer){
   reverse = (reverse) ? -1 : 1;
   return function(a,b){
       a = a[field];
       b = b[field];
       if (typeof(primer) != 'undefined'){
           a = primer(a);
           b = primer(b);
       }
       if (a<b) return reverse * -1;
       if (a>b) return reverse * 1;
       return 0;
   }
}

function sortObject(obj, field) {
    var newObj = {};
    var keys = [];
    var n = 0;
    if (obj) {
      $.each(obj, function(i, node) {
        keys[n++] = {"key": (field?node[field]:i), "index": i};
       });
      keys.sort(sortBy("key"));
      $.each(keys, function(i, node) {
        newObj[node["index"]] = obj[node["index"]];
       });
    }
    return newObj;
}


