var nextNM = 0;
var lastNM = 0;
var thisDate = new Date();
thisDate.setHours(12);
thisDate.setMinutes(0);
thisDate.setSeconds(0);
thisYear = thisDate.getFullYear();
//thisYear = 2014;
// Get dates of solstices and equinoxes for year
var utc0 = CalcEquiSol(4,thisYear-1);
var utc1 = CalcEquiSol(1,thisYear);
var utc2 = CalcEquiSol(2,thisYear);
var utc3 = CalcEquiSol(3,thisYear);
var utc4 = CalcEquiSol(4,thisYear);

// Get New and Full Moon Dates
mDates = new Array();
mDates = moons(thisYear);

oeFullMoonDates = new Array();
oeNewMoonDates = new Array();
oeMonthNames = new Array("Before Yule","After Yule","Wolf","Lenten","Egg","Milk","Flower","Hay","Grain","Fruit","Harvest","Hunter's","Before Yule","After Yule");
oeMonths = new Array();
j = 1;
for (i = 0; i < mDates.length; i++) {
	if (i % 2 == 0)
	{
		oeNewMoonDates[j] = new Date(Math.floor((mDates[i]-2440587.5) * 864e5));
	}
	else
	{
		oeFullMoonDates[j] = new Date(Math.floor((mDates[i]-2440587.5) * 864e5));
		j++;
	}
}

oeBlueMoon = 0;
if (oeFullMoonDates[4] < utc1) {
	oeBlueMoon = 3;
}
else if (oeFullMoonDates[7] < utc2) {
	oeBlueMoon = 6;
}
else if (oeFullMoonDates[10] < utc3) {
	oeBlueMoon = 9;
}
else if (oeFullMoonDates[13] < utc4) {
	oeBlueMoon = 12;
}
for (i = 1; i <= oeMonthNames.length; i++) {
		oeMonths[i] = oeMonthNames[i];
}
if (oeFullMoonDates[1] < utc0) {
	for (i = 1; i <= oeMonthNames.length; i++) {
		oeMonths[i] = oeMonthNames[i-1];
		oeBlueMoon = 0;
	}
}
if (oeBlueMoon > 0) {
	oeMonths[oeBlueMoon]  = 'Blue';
	for (i = oeBlueMoon; i <= oeMonthNames.length; i++) {
		oeMonths[i+1] = oeMonthNames[i];
	}
}

for (k = 1; k < j; k++) {
	oeLastNewMoon = oeNewMoonDates[k];
	oeNextNewMoon = oeNewMoonDates[k+1];
	if ((thisDate > oeLastNewMoon) && (thisDate <= oeNextNewMoon)) {
		nextNM = k+1;
		lastNM = k;
	}
}
oeNextNewMoon = oeNewMoonDates[nextNM];
oeLastNewMoon = oeNewMoonDates[lastNM];
if (oeLastNewMoon.getHours() >= 12) {
	oeLastNewMoon.setDate(oeLastNewMoon.getDate() + 1);
} 
if (oeNextNewMoon.getHours() >= 12) {
	oeNextNewMoon.setDate(oeNextNewMoon.getDate() + 1);
} 
oeLastNewMoon.setHours(0);
oeNextNewMoon.setHours(0);
oeLastNewMoon.setMinutes(0);
oeNextNewMoon.setMinutes(0);
oeLastNewMoon.setSeconds(0);
oeNextNewMoon.setSeconds(0);
oeMonthLength = Math.floor((oeNextNewMoon - oeLastNewMoon)/864e5)+1;
thisDate.setHours(1);
thisDate.setSeconds(1);
oeDayNum = Math.floor((thisDate - oeLastNewMoon)/864e5)+1;
oeMonthName = oeMonths[lastNM];

function getThisDate() {
	getThisDate = this.thisDate;
	return getThisDate;
}

function getOEDayNum() {
	getOEDayNum = this.oeDayNum;
	return getOEDayNum;
}

function getOEMonthName() {
	getOEMonthName = this.oeMonthName;
	return getOEMonthName;
}

function moons(year) {
  // Returns the dates for New and Full Moons.
  // Converted from Basic Sky & Telescope, March, 1985
  var moondates=new Array();
  var R1=Math.PI/180;
  var U=false;
  var Y=year;
  var K0=Math.floor((Y-1900)*12.3685);
  var T=(Y-1899.5)/100;
  var T2=T*T;
  var T3=T*T*T;
  var J0=2415020+29*K0;
  var F0=0.0001178*T2-0.000000155*T3;
  var F0=F0+0.75933+0.53058868*K0;
  var F0=F0-0.000837*T-0.000335*T2;
  var M0=K0*0.08084821133;
  M0=360*(M0-Math.floor(M0))+359.2242;
  M0=M0-0.0000333*T2;
  M0=M0-0.00000347*T3;
  var M1=K0*0.07171366128;
  M1=360*(M1-Math.floor(M1))+306.0253;
  M1=M1+0.0107306*T2;
  M1=M1+0.00001236*T3;
  var B1=K0*0.08519585128;
  B1=360*(B1-Math.floor(B1))+21.2964;
  B1=B1-0.0016528*T2;
  B1=B1-0.00000239*T3;
  for (var K9=0; K9<=28; K9+=1) {
    var J=J0+14*K9;
    var F=F0+0.765294*K9;
    var K=K9/2;
    var M5=(M0+K*29.10535608)*R1;
    var M6=(M1+K*385.81691806)*R1;
    var B6=(B1+K*390.67050646)*R1;
    var F=F-0.4068*Math.sin(M6);
    F=F+(0.1734-0.000393*T)*Math.sin(M5);
    F=F+0.0161*Math.sin(2*M6);
    F=F+0.0104*Math.sin(2*B6);
    F=F-0.0074*Math.sin(M5-M6);
    F=F-0.0051*Math.sin(M5+M6);
    F=F+0.0021*Math.sin(2*M5);
    F=F+0.0010*Math.sin(2*B6-M6);
    J=J+F;
    moondates[K9]=J;
    U=!U;
  }
  return moondates;
}

//-----Calculate and Display a single event for a single year (Either a Equiniox or Solstice)
function CalcEquiSol( i, year ) {
	var k = i - 1;
	var str;
	var JDE0 = 0 ; var Y = (year-2000)/1000;
	if (k==0) JDE0 = 2451623.80984 + 365242.37404*Y + 0.05169*Math.pow(Y,2) - 0.00411*Math.pow(Y,3) - 0.00057*Math.pow(Y,4);
	if (k==1) JDE0 = 2451716.56767 + 365241.62603*Y + 0.00325*Math.pow(Y,2) + 0.00888*Math.pow(Y,3) - 0.00030*Math.pow(Y,4);
	if (k==2) JDE0 = 2451810.21715 + 365242.01767*Y - 0.11575*Math.pow(Y,2) + 0.00337*Math.pow(Y,3) + 0.00078*Math.pow(Y,4);
	if (k==3) JDE0 = 2451900.05952 + 365242.74049*Y - 0.06223*Math.pow(Y,2) - 0.00823*Math.pow(Y,3) + 0.00032*Math.pow(Y,4);
	var T = ( JDE0 - 2451545.0) / 36525;
	var W = 35999.373*T - 2.47;
	var dL = 1 + 0.0334*Math.cos( W * Math.PI/180 ) + 0.0007*Math.cos( (2*W) * Math.PI/180 );
	var S = Periodic24( T );
	var JDE = JDE0 + ( (0.00001*S) / dL ); 	// This is the answer in Julian Emphemeris Days
	var UTC = JDtoUTC( JDE );				// Convert Julian Days to UTC as a Date Object
	return UTC
} 

//-----Calculate 24 Periodic Terms----------------------------------------------------
function Periodic24( T ) {
	var A = new Array(485,203,199,182,156,136,77,74,70,58,52,50,45,44,29,18,17,16,14,12,12,12,9,8);
	var B = new Array(324.96,337.23,342.08,27.85,73.14,171.52,222.54,296.72,243.58,119.81,297.17,21.02,
			247.54,325.15,60.93,155.12,288.79,198.04,199.76,95.39,287.11,320.81,227.73,15.45);
	var C = new Array(1934.136,32964.467,20.186,445267.112,45036.886,22518.443,
			65928.934,3034.906,9037.513,33718.147,150.678,2281.226,
			29929.562,31555.956,4443.417,67555.328,4562.452,62894.029,
			31436.921,14577.848,31931.756,34777.259,1222.114,16859.074);
	var S = 0;
	for( var i=0; i<24; i++ ) { S += A[i]*Math.cos( (B[i] + (C[i]*T)) * Math.PI/180 ); }
	return S;
} 

//-----Julian Date to UTC Date Object----------------------------------------------------
function JDtoUTC( JD ){
	// JD = Julian Date, possible with fractional days
	// Output is a JavaScript UTC Date Object
    var A, alpha;
    var Z = Math.floor( JD + 0.5 ); // Integer JD's
    var F = (JD + 0.5) - Z;	 // Fractional JD's
    if (Z < 2299161) { A = Z }
    else {
    	alpha = Math.floor( (Z-1867216.25) / 36524.25 );
    	A = Z + 1 + alpha - Math.floor( alpha / 4 );
    }
    var B = A + 1524;
    var C = Math.floor( (B-122.1) / 365.25 );
    var D = Math.floor( 365.25*C );
    var E = Math.floor( ( B-D )/30.6001 );
    var DT = B - D - Math.floor(30.6001*E) + F;	// Day of Month with decimals for time
    var Mon = E - (E<13.5?1:13);			// Month Number
    var Yr  = C - (Mon>2.5?4716:4715);		// Year    
    var Day = Math.floor( DT ); 					// Day of Month without decimals for time
    var H = 24*(DT - Day);					// Hours and fractional hours 
    var Hr = Math.floor( H ); 						// Integer Hours
    var M = 60*(H - Hr);					// Minutes and fractional minutes
    var Min = Math.floor( M );						// Integer Minutes
    var Sec = Math.floor( 60*(M-Min) );			// Integer Seconds (Milliseconds discarded)
    //Create and set a JavaScript Date Object and return it
    var utcDate = new Date(0);
    utcDate.setUTCFullYear(Yr, Mon-1, Day);
    utcDate.setUTCHours(Hr, Min, Sec);
    return( utcDate );
} 