// ******************************************************************
// File:			VNS_Calendar.js
// Date:			July 2005
// Author:			Steve McDonagh
// Version:			1.0.0
// Associated CSS	VNS_Calendar.css
// *******************************************************************
// **Functions in this file**
// VNS_CalOpen		    = builds the calendar container
// VNS_CalFill			= Fills the Calendar Container
// VNS_CalClose		    = closes and destroys the current UI Calendar
// VNS_WhereAmI		    = function attached to MOUSEMOVE event to get pos
// VNS_GetDays		    = Get the number of days in a month
// VNS_IsLeapYear	    = Get the Leap Year status of a Year
// VNS_GetCMth		    = Get the Text Name of the month number passed
// VNS_AdjustMth	    = Adjust the Month +/- 1
// VNS_AdjustYear	    = Adjust the Year  +/- 1
// VNS_GetFormattedDate = Gets the Date formatted as VNS_DateFMT
// VNS_SetId            = Sets the Date ID of the calendar cells
// VNS_CellClick		= Updates the fld with the date of cell clicked
// VNS_SortOutDate		= Get format of date passed
// *********************************************************************
// Global Code 
// *********************************************************************
	var IE = document.all?true:false;
	if (!IE) 
	{
		document.captureEvents(Event.MOUSEMOVE);
	}
	document.onmousemove = VNS_WhereAmI;
	
	var VNS_MouseX = 0;
	var VNS_MouseY = 0;	
	var VNS_ID = new Object
	var VNS_DateFMT = "DD/MM/YYYY";
	var VNS_SelBColor = "lightyellow";
	var VNS_SelFColor = "black";
	var VNS_SelBorder = "1px solid black";
	var VNS_Lockdown = false;
	VNS_ID.id = "";
	VNS_ID.value = "";
// Get the X,Y Co-ordinates of the mouse ********************************
function VNS_WhereAmI(e) 
{
  if (IE) 
  { 
    VNS_MouseX = event.clientX + document.body.scrollLeft
    VNS_MouseY = event.clientY + document.body.scrollTop
  } else {  
    VNS_MouseX = e.pageX
    VNS_MouseY = e.pageY
  }  
  if (VNS_MouseX < 0){VNS_MouseX = 0}
  if (VNS_MouseY < 0){VNS_MouseY = 0}  
  if (VNS_Lockdown==true)  
  {
  		VNS_work0 = document.getElementById('caldiv').style.top;
		VNS_work1 = VNS_work0.indexOf("px");
		VNS_work2 = Number(VNS_work0.substr(0,VNS_work1));
		
		VNS_work0 = document.getElementById('caldiv').style.left;
		VNS_work1 = VNS_work0.indexOf("px");
		VNS_work3 = Number(VNS_work0.substr(0,VNS_work1));
		
		VNS_work4 = VNS_work3+150;
		VNS_work5 = VNS_work2+168;
		if (VNS_MouseX < VNS_work3)
		{
			VNS_CalClose()
			
		}
		if (VNS_MouseY < VNS_work2)
		{
			VNS_CalClose()
			
		}
		if (VNS_MouseX > VNS_work4)
		{
			VNS_CalClose()
		}
		if (VNS_MouseY > VNS_work5)
		{
			VNS_CalClose()
		}
  }
}
// ***********************************************************************
function VNS_CalOpen(VNS_Target)
{
	VNS_Target.blur();
	if (document.getElementById("caldiv"))
	{
		VNS_CalClose();
	}
	var VNS_MyCal 	= document.createElement('div');
	document.body.appendChild(VNS_MyCal);
	// Set up the Properties of the new object
	VNS_MyCal.id = 'caldiv';
	VNS_MouseY-165<0?VNS_MouseY=VNS_MouseY:VNS_MouseY=VNS_MouseY-165;
	VNS_MyCal.style.top =  (VNS_MouseY+4)+"px";
	VNS_MyCal.style.left = (VNS_MouseX-6)+"px";	
	VNS_MyCal.className = 'caldiv';
	VNS_CalFill(VNS_Target);
	VNS_Lockdown=true;
	
}
// ***********************************************************************
function VNS_CalFill(VNS_Target)
{	
	var VNS_MyCal = document.getElementById("caldiv");
	var VNS_MyHTML 	= '';
	var VNS_MyDate1	= new Date();
	var VNS_MyDate2 = new Date();
	// The Object passed in has data in it construct a Date Object ******
	if (VNS_Target.value!="")
	{
		VNS_AryDate = VNS_SortOutDate(VNS_Target.value);
		var VNS_Day = VNS_AryDate[0];
		var VNS_Mth = VNS_AryDate[1];
		var VNS_Yer = VNS_AryDate[2];
			
		if (VNS_Mth < 1 || VNS_Mth >12)
		{
			alert("An Invalid Date is being displayed, (Month is < 0 or > 12)");
			VNS_CalClose();
			return;
		}
		VNS_Check = VNS_GetDays( VNS_Mth,VNS_Yer);
		if (VNS_Day > VNS_Check)
		{
			alert("An Invalid Date is being displayed (Exceeded valid days for month)");
			VNS_CalClose();
			return;
		}
		if (isNaN(VNS_Mth))
		{
			alert("An Invalid Date is being displayed (Incorrect format used)");
			VNS_CalClose();
			return;
		}					
		
			VNS_MyDate1.setFullYear(VNS_Yer,VNS_Mth-1,VNS_Day);		
			VNS_MyDate2.setFullYear(VNS_Yer,VNS_Mth-1,VNS_Day);	
		
	}
	// Get the number of days in this month *****************************
	VNS_DaysThis = VNS_GetDays( VNS_MyDate1.getMonth()+1,VNS_MyDate1.getYear() );
	// Get the number of days last month ********************************
	VNS_DaysLast = VNS_GetDays( VNS_MyDate1.getMonth(),VNS_MyDate1.getYear() );
	// 	Set This Year
	VNS_ThisYear = VNS_MyDate1.getFullYear();
	VNS_ThisMonth = VNS_MyDate1.getMonth()+1;
	VNS_Mth = VNS_ThisMonth;
	VNS_Yer = VNS_ThisYear;
	if (VNS_Mth-1 == 0)
	{
		VNS_LastMonth = 12;
		VNS_LastYear = VNS_Yer-1;
	} else {	
		VNS_LastMonth = VNS_Mth-1;
		VNS_LastYear = VNS_Yer;
	}
	if (VNS_Mth+1 ==13)
	{
		VNS_NextMonth = 1;
		VNS_NextYear = VNS_Yer+1;		
	} else {
		VNS_NextMonth = VNS_Mth+1
		VNS_NextYear = VNS_Yer;
	}	
	
	// Build the internal static HTML ***********************************
	VNS_MyHTML=VNS_MyHTML+"       <div class='caltitlediv'>";
	VNS_MyHTML=VNS_MyHTML+"		<table width='100%'>";
	VNS_MyHTML=VNS_MyHTML+"			<tr> ";
	VNS_MyHTML=VNS_MyHTML+"				<td width='153px' class='caltitle' id='VNS_Title'></td>";
	VNS_MyHTML=VNS_MyHTML+"				<td width='15px' class='calclose' onclick='VNS_CalClose()'>X</td></tr>";
	VNS_MyHTML=VNS_MyHTML+"		</table>";
	VNS_MyHTML=VNS_MyHTML+"		</div>";
    VNS_MyHTML=VNS_MyHTML+"        <div class='calnavdiv'>";
    VNS_MyHTML=VNS_MyHTML+"                <table width=100%>";
    VNS_MyHTML=VNS_MyHTML+"                    <tr>";
    VNS_MyHTML=VNS_MyHTML+"                        <td class='calnavbut' onclick='VNS_AdjustYear(-1)'>Y-</td>";
    VNS_MyHTML=VNS_MyHTML+"                        <td class='calnavbut' onclick='VNS_AdjustMth(-1)'>M-</td>";
    VNS_MyHTML=VNS_MyHTML+"                        <td></td>";
    VNS_MyHTML=VNS_MyHTML+"                        <td class='calnavbut' onclick='VNS_AdjustMth(1)'>+M</td>";
    VNS_MyHTML=VNS_MyHTML+"                        <td class='calnavbut' onclick='VNS_AdjustYear(1)'>+Y</td>";
    VNS_MyHTML=VNS_MyHTML+"                    </tr>";
    VNS_MyHTML=VNS_MyHTML+"                </table>";
    VNS_MyHTML=VNS_MyHTML+"        </div>";
    VNS_MyHTML=VNS_MyHTML+"        <div class='caldetail'>";
	VNS_MyHTML=VNS_MyHTML+"			<table width='100%' cellspacing='2px'>";
	VNS_MyHTML=VNS_MyHTML+"				<tr>";
	VNS_MyHTML=VNS_MyHTML+"				<td class='caldaycell'>M</td>";
	VNS_MyHTML=VNS_MyHTML+"				<td class='caldaycell'>T</td>";
	VNS_MyHTML=VNS_MyHTML+"				<td class='caldaycell'>W</td>";
	VNS_MyHTML=VNS_MyHTML+"				<td class='caldaycell'>T</td>";
	VNS_MyHTML=VNS_MyHTML+"				<td class='caldaycell'>F</td>";
	VNS_MyHTML=VNS_MyHTML+"				<td class='caldaycell'>S</td>";
	VNS_MyHTML=VNS_MyHTML+"				<td class='caldaycell'>S</td>";
	VNS_MyHTML=VNS_MyHTML+"				</tr>";
	
	// Set the date to be the start of the month *************************
	VNS_MyDate2.setDate(1);
	VNS_SOMDay = VNS_MyDate2.getDay();
	// Adjust Sunday (0) to be the End of the week ***********************
	VNS_SOMDay==0?VNS_SOMDay=7:VNS_SOMDay=VNS_SOMDay;
	// Open a new row to put the first week in ***************************
	VNS_MyHTML=VNS_MyHTML+"<tr>";
	// Calculate were the calendar will start in last month **************
	VNS_StrLast = (VNS_DaysLast - VNS_SOMDay)+2;
	// Fill in the underlap days of the first week ***********************
	VNS_Temp1=0;
	for(VNS_Count=VNS_StrLast;VNS_Count<=VNS_DaysLast;VNS_Count++)
	{
		VNS_MyHTML=VNS_MyHTML+"<td id='"+VNS_SetId(VNS_Count,VNS_LastMonth,VNS_LastYear)+"' onclick='VNS_CellClick(this)' class='calcellnot'>"+VNS_Count+"</td>";		
		VNS_Temp1=VNS_Temp1+1;
	}
	// Fill in the rest of the week **************************************
	VNS_Temp2=1;
	for(VNS_Count=VNS_Temp1;VNS_Count<7;VNS_Count++)
	{
	VNS_MyHTML=VNS_MyHTML+"<td id='"+VNS_SetId(VNS_Temp2,VNS_ThisMonth,VNS_ThisYear)+"' onclick='VNS_CellClick(this)' class='calcell'>"+VNS_Temp2+"</td>";
		VNS_Temp2=VNS_Temp2+1;
	}
	VNS_MyHTML=VNS_MyHTML+"</tr>";
	// Fill in the rest of the Month *************************************
	VNS_Temp3=1;
	for (VNS_Count=VNS_Temp2;VNS_Count<=VNS_DaysThis;VNS_Count++)
	{
		VNS_MyHTML=VNS_MyHTML+"<td id='"+VNS_SetId(VNS_Count,VNS_ThisMonth,VNS_ThisYear)+"' onclick='VNS_CellClick(this)' class='calcell'>"+VNS_Count+"</td>";
		VNS_Temp3++;
		if (VNS_Temp3==8) 
		{
			VNS_MyHTML=VNS_MyHTML+"</tr><tr>";
			VNS_Temp3 = 1;
		}
	}
	// Fill in the overlapp days from Next Month *************************
	VNS_Temp4 = 1;
	for (VNS_Count=VNS_Temp3;VNS_Count<8;VNS_Count++)
	{
	  VNS_MyHTML=VNS_MyHTML+"<td id='"+VNS_SetId(VNS_Temp4,VNS_NextMonth,VNS_NextYear)+"' onclick='VNS_CellClick(this)' class='calcellnot'>"+VNS_Temp4+"</td>";
	  VNS_Temp4++;  	  
	}
	VNS_MyHTML=VNS_MyHTML+"</tr></table></div>";
	// Place the built HTML into the New DIV *****************************
	VNS_MyCal.innerHTML = VNS_MyHTML;
	// Set the Title of the DIV to be the current Month/year *************
	document.getElementById("VNS_Title").innerHTML =VNS_GetCMth( VNS_MyDate1.getMonth() ) + " "+ VNS_MyDate1.getFullYear();	
	// Highlight the Selected Date's cell ********************************
	VNS_FindMe = document.getElementById(VNS_Target.id).value;
	if (VNS_FindMe=="") 
	{
		VNS_FindMe = VNS_GetFormattedDate(VNS_MyDate1)
	}
	var VNS_SelCell = document.getElementById(VNS_FindMe);
	if (VNS_SelCell)
	{
		VNS_SelCell.style.backgroundColor =VNS_SelBColor;
		VNS_SelCell.style.color = VNS_SelFColor;
		VNS_SelCell.style.border =VNS_SelBorder;
	}	
	// Set the global VNS_ID object to hold the data whilst the user uses
	VNS_ID.id = VNS_Target.id;
	VNS_ID.value = VNS_GetFormattedDate(VNS_MyDate1);
	document.getElementById("caldiv").style.display="inline";
}
function VNS_CalClose()
{
	var a = document.getElementById('caldiv');
	document.body.removeChild(a);	
	VNS_ID.id = "";
	VNS_ID.value = "";
	VNS_Lockdown = false;
}
// ***********************************************************************
function VNS_GetDays(VNS_Month,VNS_Year)
{
	var VNS_Days;
	if (VNS_Month == 0) {VNS_Month = 12};
	
	if (VNS_Month==1 || VNS_Month==3 || VNS_Month==5 || VNS_Month==7 || VNS_Month==8 || VNS_Month==10 || VNS_Month==12)
	{
	  VNS_Days=31;
	} else if (VNS_Month==4 || VNS_Month==6 || VNS_Month==9 || VNS_Month==11) 
	{
	  VNS_Days=30;
	} else if (VNS_Month==2)  
	{
		if (VNS_IsLeapYear(VNS_Year)) 
		{ 
			VNS_Days=29; 
		} else { 
			VNS_Days=28; 
		}
	}		
	return (VNS_Days);
}
// ***********************************************************************
function VNS_IsLeapYear (VNS_Year1) 
{
	if (((VNS_Year1 % 4)==0) && ((VNS_Year1 % 100)!=0) || ((VNS_Year1 % 400)==0)) {
	
	return (true);
	} else { 
	
	return (false); }
}
// ***********************************************************************
function VNS_GetCMth(VNS_MonthNum)
{
	switch(VNS_MonthNum)
	{
		case 0:
			VNS_MthName = 'January';
			break;
		case 1:
			VNS_MthName = 'February';
			break;
		case 2:
			VNS_MthName = 'March';
			break;
		case 3:
			VNS_MthName = 'April';
			break;
		case 4:
			VNS_MthName = 'May';
			break;
		case 5:
			VNS_MthName = 'June';
			break;
		case 6:
			VNS_MthName = 'July';
			break;
		case 7:
			VNS_MthName = 'August';
			break;
		case 8:
			VNS_MthName = 'September';
			break;
		case 9:
			VNS_MthName = 'October';
			break;
		case 10:
			VNS_MthName = 'November';
			break;
		case 11:
			VNS_MthName = 'December';
			break;		
	}
	return VNS_MthName;
}
// ***********************************************************************
function VNS_AdjustMth(VNS_By)
{	
	var VNS_AryDate = VNS_SortOutDate(VNS_ID.value);
	var VNS_Day = VNS_AryDate[0];
	var VNS_Mth = VNS_AryDate[1];
	var VNS_Yer = VNS_AryDate[2];		
	VNS_Mth = VNS_Mth-1;
	var VNS_MyDate1 = new Date(VNS_Yer,VNS_Mth+VNS_By,VNS_Day);
	VNS_ID.value = VNS_GetFormattedDate(VNS_MyDate1);
	VNS_CalFill(VNS_ID);
}
// ***********************************************************************
function VNS_AdjustYear(VNS_By)
{
	var VNS_AryDate = VNS_SortOutDate(VNS_ID.value);
	var VNS_Day = VNS_AryDate[0];
	var VNS_Mth = VNS_AryDate[1];
	var VNS_Yer = VNS_AryDate[2];
	VNS_Mth = VNS_Mth-1;		
	var VNS_MyDate1 = new Date(VNS_Yer+VNS_By,VNS_Mth,VNS_Day);
	VNS_ID.value = VNS_GetFormattedDate(VNS_MyDate1);
	VNS_CalFill(VNS_ID);
}
// ***********************************************************************
function VNS_GetFormattedDate(VNS_QDate)
{
	var VNS_Day = VNS_QDate.getDate();
	var VNS_Mth = VNS_QDate.getMonth()+1;
	var VNS_Year= VNS_QDate.getFullYear();
	var VNS_CYear = VNS_Year.toString();
	VNS_Day<10?VNS_CDay="0"+VNS_Day.toString():VNS_CDay=VNS_Day.toString();
	VNS_Mth<10?VNS_CMth="0"+VNS_Mth.toString():VNS_CMth=VNS_Mth.toString();
	if (VNS_DateFMT == "DD/MM/YYYY") {return VNS_CDay+"/"+VNS_CMth+"/"+VNS_CYear}
	if (VNS_DateFMT == "MM/DD/YYYY") {return VNS_CMth+"/"+VNS_CDay+"/"+VNS_CYear}
	if (VNS_DateFMT == "YYYY/MM/DD") {return VNS_CYear+"/"+VNS_CMth+"/"+VNS_CDay}
}
// ***********************************************************************
function VNS_SetId(VNS_xDay,VNS_xMth,VNS_xYer)
{
	var VNS_yDay ="00";
	var VNS_yMth = "00";
    VNS_xDay<10?VNS_yDay="0"+VNS_xDay.toString():VNS_yDay=VNS_xDay.toString();
	VNS_xMth<10?VNS_yMth="0"+VNS_xMth.toString():VNS_yMth=VNS_xMth.toString();
	VNS_yYer = VNS_xYer.toString();	
	if (VNS_DateFMT == "DD/MM/YYYY") {return VNS_yDay+"/"+VNS_yMth+"/"+VNS_yYer}
	if (VNS_DateFMT == "MM/DD/YYYY") {return VNS_yMth+"/"+VNS_yDay+"/"+VNS_yYer}
	if (VNS_DateFMT == "YYYY/MM/DD") {return VNS_yYer+"/"+VNS_yMth+"/"+VNS_yDay}	
}
// ***********************************************************************
function VNS_CellClick(VNS_Cell)
{
	var VNS_Update= document.getElementById(VNS_ID.id);
	VNS_Update.value = VNS_Cell.id;
	VNS_CalClose();	
}
// ***********************************************************************
function VNS_SortOutDate(VNS_Stuff)
{
	
 var VNS_RetVar = new Array();
if (VNS_DateFMT=="DD/MM/YYYY")
	{
		VNS_RetVar[0] = Number(VNS_Stuff.substr(0,2));
		VNS_RetVar[1] = Number(VNS_Stuff.substr(3,2));
		VNS_RetVar[2] = Number(VNS_Stuff.substr(6,4));		
	} 
if (VNS_DateFMT=="MM/DD/YYYY")
	{
		VNS_RetVar[0] = Number(VNS_Stuff.substr(3,2));
		VNS_RetVar[1] = Number(VNS_Stuff.substr(0,2));
		VNS_RetVar[2] = Number(VNS_Stuff.substr(6,4));				
	} 
if (VNS_DateFMT=="YYYY/MM/DD")
	{
		VNS_RetVar[0] = Number(VNS_Stuff.substr(8,2));
		VNS_RetVar[1] = Number(VNS_Stuff.substr(5,2));
		VNS_RetVar[2] = Number(VNS_Stuff.substr(0,4));				
	} 
	return VNS_RetVar;	
}
