var oDataCalendar = new ActiveXObject("MSXML2.DOMDocument");
var oStyleCalendar = new ActiveXObject("MSXML2.DOMDocument");
var arrDayOfWeek = new Array("S", "M", "T", "W", "T", "F", "S");
var arrMonths = new Array("JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC");
var blnCalendarLoaded = false;

var oCalendar = window.createPopup();
var sDateSelected = '';

oDataCalendar.async = true;
oStyleCalendar.async = true;
      
function dateSelect(sDate) {
  //date returned is in ISO8601 date format
  try {
  	sDateSelected = sDate;
  	oCalendar.hide();
  	// place code to hand date returned here
  	setDate(sDateSelected);
  	//alert('Date: ' + sDateSelected);
  } catch (e) {
  	alert(sDate);
  }
}

function setInitialDate(datIntial) {
  if( !blnCalendarLoaded ) {
    loadCalendar();    
  }
	var sInitial = '';
	
	sInitial = getISOFormat(datIntial);
	var oInitialDate = oDataCalendar.selectSingleNode("dateSelector/initialDate");
	oInitialDate.text = sInitial;
	refreshCalendar();
}

function closeCalendar() {
  try {
  	oCalendar.hide();
  } catch (e) {
  	alert('Close: ' + e.description);
  }
}

function showCalendar(iLeft, iTop, oElement) {
  if( !blnCalendarLoaded ) {
    loadCalendar();    
  }
  oCalendar.show(iLeft, iTop, 142, 192, oElement);  
}

function loadCalendar() {		    
	blnCalendarLoaded = true;
	
	oDataCalendar.loadXML(xmlData.XMLDocument.xml);
	oStyleCalendar.loadXML(xslData.XMLDocument.xml);

	var oToday = new Date();
	var sToday = getISOFormat(oToday);
	var oTodaysDate = oDataCalendar.selectSingleNode("dateSelector/todaysDate");
	oTodaysDate.text = sToday;

  addDaysOfWeek();
  addMonths();
  //addDaysOfMonth();

  oCalendar.document.body.style.backgroundColor = '#FFFFFF';
  oCalendar.document.body.style.fontSize = '8pt';
  
	refreshCalendar();	
}

function refreshCalendar() {
  addDaysOfMonth();
  oCalendar.document.body.innerHTML = oDataCalendar.transformNode(oStyleCalendar);
  //oCalendar.document.all('rightArrow').style.cssText = document.styleSheets('topRow').cssText;
}

function nextMonth() {
	var oInitialDate = oDataCalendar.selectSingleNode("dateSelector/initialDate");
	var sDate = oInitialDate.text;
	var iYear = sDate.substring(0, 4);
	var iMonth = (new Number(sDate.substring(5, 7))) % 12;		 
	if( iMonth == 0 ) { iYear = new Number(iYear) + 1; }
	
	var oDate = new Date(iYear, iMonth, 1);
	oInitialDate.text = getISOFormat(oDate);
	//addDaysOfMonth();
	refreshCalendar();
}
function previousMonth() {
	var oInitialDate = oDataCalendar.selectSingleNode("dateSelector/initialDate");
	var sDate = oInitialDate.text;
	var iYear = sDate.substring(0, 4);
	var iMonth = (new Number(sDate.substring(5, 7)) - 2) % 12;		    
	if( iMonth == 11) { iYear -= 1; }
	
	var oDate = new Date(iYear, iMonth, 1);
	oInitialDate.text = getISOFormat(oDate);
	//addDaysOfMonth();
	refreshCalendar();
}

function addDaysOfWeek() {
	var oDays = oDataCalendar.createElement("weekdays");
	
	for( var i=0; i<arrDayOfWeek.length; i++ ) {
		var oDay = oDataCalendar.createElement('weekday');
		oDay.setAttribute('value', i);
		oDay.setAttribute('string', arrDayOfWeek[i]);
		oDays.appendChild(oDay);
	}
	oDataCalendar.documentElement.appendChild(oDays);
}
function addMonths() {
	var oMonths = oDataCalendar.createElement("months");
	
	for( var i=0; i<arrMonths.length; i++ ) {
		var oMonth = oDataCalendar.createElement('month');
		oMonth.setAttribute('value', i + 1);
		oMonth.setAttribute('string', arrMonths[i]);
		oMonths.appendChild(oMonth);
	}
	oDataCalendar.documentElement.appendChild(oMonths);
}
function addDaysOfMonth() {
	var i, sDay;
	var oInitialDate = oDataCalendar.selectSingleNode("dateSelector/initialDate");
	var sDate = oInitialDate.text;
	var sYear = sDate.substring(0, 4);
	var sMonth = new Number(sDate.substring(5, 7)) - 1;
	var sDay = new Number(sDate.substring(8, 10));
	var oDate = new Date(sYear, sMonth, sDay);

	var oDate = new Date(sYear, sMonth, 1);
	
	var iOffset = oDate.getDay();		    
	var iDaysInMonth = getDaysInMonth(sMonth, sYear);
  
  var oDays = oDataCalendar.selectNodes("//days");
  if( oDays != null ) { oDays.removeAll(); }
        	
	var oDays = oDataCalendar.createElement("days");
	// create blanks
	for( i=0; i<iOffset; i++ ) {
		var oDay = oDataCalendar.createElement('day');
		oDay.setAttribute('value', '');
		oDay.setAttribute('string', '');
		oDays.appendChild(oDay);		    
	}
	// add days of month
	for( i=iOffset; i<(iOffset+iDaysInMonth); i++ ) {
		var oDay = oDataCalendar.createElement('day');
		oDate = new Date(sYear, sMonth, i - iOffset + 1);
		sDay = getISOFormat(oDate);
		oDay.setAttribute('value', sDay);
		oDay.setAttribute('string', i - iOffset + 1);
		oDays.appendChild(oDay);		    		    
	}
	// create blanks
	for( i=iOffset+iDaysInMonth; i<42; i++ ) {
		var oDay = oDataCalendar.createElement('day');
		oDay.setAttribute('value', '');
		oDay.setAttribute('string', '');
		oDays.appendChild(oDay);		    
	}
	oDataCalendar.documentElement.appendChild(oDays);
}

function getISOFormat(inputDate) {
	var sYear, sMonth, sDay;
	
	sYear = inputDate.getFullYear();
	sMonth = inputDate.getMonth() + 1;
	if( sMonth < 10 ) { sMonth = '0' + sMonth; }
	sDay = inputDate.getDate();
	if( sDay < 10 ) { sDay = '0' + sDay; }
	return(sYear + '-' + sMonth + '-' + sDay);               
}

// GET NUMBER OF DAYS IN MONTH
function getDaysInMonth(month, year) {
    var days;
    if (month==0 || month==2 || month==4 || month==6 || month==7 || month==9 || month==11)  days=31;
    else if (month==3 || month==5 || month==8 || month==10) days=30;
    else if (month==1)  {
        if (isLeapYear(year)) { days=29; }
        else { days=28; }
    }
    return (days);
}
// CHECK TO SEE IF YEAR IS A LEAP YEAR
function isLeapYear (Year) {
    if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0)) {
        return (true);
    }
    else {
        return (false);
    }
}
