/////////////// Date conversion ...

// declare constants ...
var Eday = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
var Emth = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
var Lday = new Array('Dies Dominica', 'Dies Lun\xE6', 'Dies Martis', 'Dies Mercurii', 'Dies Iovis', 'Dies Veneris', 'Dies Saturni');
var Lmth = new Array('Januarius', 'Februarius', 'Martius', 'Aprilis', 'Maius', 'Junius', 'Julius', 'Augustus', 'September', 'October', 'Novembris', 'December');
var Rday = new Array('DIES SOLIS', 'DIES LUN\xC6', 'DIES MARTIS', 'DIES MERCURII', 'DIES IOVIS', 'DIES VENERIS', 'DIES SATURNI');
var Rmth = new Array('IAN', 'FEB', 'MART', 'APR', 'MAI', 'IVN', 'IVL', 'AVG', 'SEP', 'OCT', 'NOV', 'DEC');
var y = 4716, j = 1401, m = 3, n = 12, p = 1461, q = 0, r = 4, s = 153, t = 2, u = 5, v = 3, w = 2;
var g = 10, A = 184, B = 274277, G = -38;

function romanToday() {
var today, D, M, Y, msg = '';

// get today's date ...
today = new Date();
D = today.getDate();
M = today.getMonth() + 1;
Y = today.getFullYear(); if (Y < 1970 ) {Y += 100};
// and assume Gregorian ...
var Y1 = Y + y - Math.floor((n + m - 1 - M) / n);
var M1 = (M - m + n) % n;
var D1 = D - 1;
var c  = Math.floor((p * Y1 + q) / r);
var d  = Math.floor((s * M1 + t) / u);
     
var g   = Math.floor(3 * (Math.floor((Y1 + A) / 100)) / 4) + G;
var J   = c + d + D1 -j - g;
var Gg  = Math.floor(3 * (Math.floor((4 * J + B) / 146097)) / 4) + G;
var GJ1 = J + j + Gg;
var GY1 = Math.floor((r * GJ1 + v) / p);
var GT1 = Math.floor(((r * GJ1 + v) % p) / r);
var GM1 = Math.floor((u * GT1 + w) / s);
var GD1 = Math.floor(((u * GT1 + w) % s) / u);
var GD  = GD1 + 1;
var GM  = ((GM1 + m - 1) % n) + 1;
var GY  = GY1 - y + Math.floor((n + m - 1 - GM) / n);
if (J < 2299161 || J > 3272274 || GD != D || GM != M || GY != Y) {msg = 'Invalid Gregorian date input.'}
else {
  var JJ1 = J + j;  
  var JY1 = Math.floor((r * JJ1 + v) / p);
  var JT1 = Math.floor(((r * JJ1 + v) % p) / r);
  var JM1 = Math.floor((u * JT1 + w) / s);
  var JD1 = Math.floor(((u * JT1 + w) % s) / u);
  var JD  = JD1 + 1;
  var JM  = ((JM1 + m - 1) % n) + 1;
  var JY  = JY1 - y + Math.floor((n + m - 1 - JM) / n)
  }

if (msg == '') {
// output to fields in FORM ...
  var day = (J + 1) % 7, rd, RY = JY + 753; // if (JM == 12 && JD > 13) {RY ++};
  if (JM == 3 || JM == 5 || JM == 7 || JM == 10) {rd = RD(JD, JM, 7, 15, 31)}
  else if (JM == 1 || JM == 8 || JM == 12) {rd = RD(JD, JM, 5, 13, 31)}
  else if (JM == 4 || JM == 6 || JM == 9 || JM == 11) {rd = RD(JD, JM, 5, 13, 30)}
  else if (JY % 4 == 0) {rd = leapFeb(JD)}
  else {rd = RD(JD, JM, 5, 13, 28)};
  return Rday[day] + ' ' + rd + '. ' + cvts(RY) + ' A.U.C.';
  }
else {alert(msg)};
return false;
}

function RD(JD, JM, NON, ID, PKAL) {
    // returns string with date in Roman format (except for leap February) ...
var rd;
if (JD == 1) {rd = 'KAL. ' + Rmth[JM - 1]}
else if (JD < NON - 1) {rd = 'A.D. ' + cvts(NON + 1 - JD) + ' NON. ' + Rmth[JM - 1]}
else if (JD == NON - 1) {rd = 'PRID. NON. ' + Rmth[JM - 1]}
else if (JD == NON) {rd = 'NON. ' + Rmth[JM - 1]}
else if (JD < ID - 1) {rd = 'A.D. ' + cvts(ID + 1 - JD) + ' ID. ' + Rmth[JM - 1]}
else if (JD == ID - 1) {rd = 'PRID. ID. ' + Rmth[JM - 1]}
else if (JD == ID) {rd = 'ID. ' + Rmth[JM - 1]}
else if (JD < PKAL) {rd = 'A.D. ' + cvts(PKAL + 2 - JD) + ' KAL. ' + Rmth[JM % 12]}
else {rd = 'PRID. KAL. ' + Rmth[JM % 12]};
return rd;
}

function leapFeb(JD) {
// returns string with date in Roman format for leap February ...
var rd;
if (JD == 1) {rd = 'KAL. FEB'}
else if (JD < 4) {rd = 'A.D. ' + cvts(6 - JD) + ' NON. FEB'}
else if (JD == 4) {rd = 'PRID. NON. FEB'}
else if (JD == 5) {rd = 'NON. FEB'}
else if (JD < 12) {rd = 'A.D. ' + cvts(14 - JD) + ' ID. FEB'}
else if (JD == 12) {rd = 'PRID. ID. FEB'}
else if (JD == 13) {rd = 'ID. FEB'}
else if (JD < 25) {rd = 'A.D. ' + cvts(30 - JD) + ' KAL. MART'}
else if (JD == 25) {rd = 'BIS VI KAL. MART'}
else if (JD < 29) {rd = 'A.D. ' + cvts(31 - JD) + ' KAL. MART'}
else {rd = 'PRID. KAL. MART'};
return rd;
}

function cvts(n) {
// converts number 1 - 4999 to a subtractive Roman numeral ...
return (cvt1000(n) + cvt100s(n) + cvt10s(n) + cvt1s(n))
}

function cvt1000(n) {
// converts thousands digit to a Roman numeral ...
return ('MMMM'.substr(0, (Math.floor(n / 1000))));
}

function cvt100s(h) {
// converts hundreds digit to a subtractive Roman numeral ...
var m = '', h = Math.floor((h % 1000) / 100);
if (h == 9) {m = 'CM'}
else if (h > 4) {m = 'DCCC'.substr(0, h - 4)}
else if (h == 4) {m = 'CD'}
else {m = 'CCC'.substr(0, h)};
return m;
}

function cvt10s(t) {
// converts tens digit to a subtractive Roman numeral ...
var m = '', t = Math.floor((t % 100) / 10);
if (t == 9) {m = 'XC'}
else if (t > 4) {m = 'LXXX'.substr(0, t - 4)}
else if (t == 4) {m = 'XL'}
else {m = 'XXX'.substr(0, t)};
return m;
}

function cvt1s(u) {
    // converts units digit to a subtractive Roman numeral ...
var m = '', u = u % 10;
if (u == 9) {m = 'IX'}
else if (u > 4) {m = 'VIII'.substr(0, u - 4)}
else if (u == 4) {m = 'IV'}
else {m = 'III'.substr(0, u)};     
return m;
}
