/**
 * metrics client utilities
 * By Joe Turgeon [http://arithmetric.com]
 * 11/1/2009
 */

var metricsDate = function () {

function format_jd(jd) {
  var da = jd_to_ymd(jd);
  return String(da[0] + '/' + da[1] + '/' + da[2]);
}


//  LEAP_GREGORIAN  --  Is a given year in the Gregorian calendar a leap year ?
function leap_gregorian(year) {
  return ((year % 4) == 0) && (!(((year % 100) == 0) && ((year % 400) != 0)));
}

//  GREGORIAN_TO_JD  --  Determine Julian day number from Gregorian calendar date

var JMJD  = 2400000.5;
var GREGORIAN_EPOCH = 1721425.5;

function ymd_to_jd(year, month, day)
{
    return (GREGORIAN_EPOCH - 1) +
           (365 * (year - 1)) +
           Math.floor((year - 1) / 4) +
           (-Math.floor((year - 1) / 100)) +
           Math.floor((year - 1) / 400) +
           Math.floor((((367 * month) - 362) / 12) +
           ((month <= 2) ? 0 :
                               (leap_gregorian(year) ? -1 : -2)
           ) +
           day) - JMJD;
}

//  JD_TO_GREGORIAN  --  Calculate Gregorian calendar date from Julian day

function jd_to_ymd(X) {
    L = X + 68569 + 2400001;
    N = Math.floor(4 * L / 146097);
    L = L - Math.floor((146097 * N + 3) / 4);
    K = Math.floor(4000 * (L + 1) / 1461001);
    L = L - Math.floor(1461 * K / 4) + 31;
    J = Math.floor(80 * L / 2447);
    D = L - Math.floor(2447 * J / 80);
    L = Math.floor(J / 11);
    M = J + 2 - 12 * L;
    Y = 100 * (N - 49) + K + L;
    return [Y, M, D];
}
/*
function jd_to_ymd(jd) {
    var wjd, depoch, quadricent, dqc, cent, dcent, quad, dquad,
        yindex, dyindex, year, yearday, leapadj;

    jd += JMJD;
    wjd = Math.floor(jd - 0.5) + 0.5;
    depoch = wjd - GREGORIAN_EPOCH;
    quadricent = Math.floor(depoch / 146097);
    dqc = mod(depoch, 146097);
    cent = Math.floor(dqc / 36524);
    dcent = mod(dqc, 36524);
    quad = Math.floor(dcent / 1461);
    dquad = mod(dcent, 1461);
    yindex = Math.floor(dquad / 365);
    year = (quadricent * 400) + (cent * 100) + (quad * 4) + yindex;
    if (!((cent == 4) || (yindex == 4))) {
        year++;
    }
    yearday = wjd - ymd_to_jd(year, 1, 1);
    leapadj = (wjd < ymd_to_jd(year, 3, 1)) ? 0 : (leap_gregorian(year) ? 1 : 2);
    month = Math.floor((((yearday + leapadj) * 12) + 373) / 367);
    day = (wjd - ymd_to_jd(year, month, 1)) + 1;

    return new Array(year, month, day);
}*/

/*  MOD  --  Modulus function which works for non-integers.  */

function mod(a, b)
{
    return a - (b * Math.floor(a / b));
}

//  AMOD  --  Modulus function which returns numerator if modulus is zero

function amod(a, b)
{
    return mod(a - 1, b) + 1;
}


  // Define public methods and properties
  return {
    format_jd: format_jd,
    ymd_to_jd: ymd_to_jd,
    jd_to_ymd: jd_to_ymd
  };
}();



//TODO: add Array.indexOf and Array.forEach for non-complient browsers!

