// Arctus Calendar r1
// This version of the Arctus Calendar is part of the Arctus Ninja software package
//
// The contents of this file are copyright Adrian O'Connor and Arctus Ltd 2005, 2006.
//
// You are not permitted to use this file for any purpose whatsoever other than as part of the normal usage
// of the Arctus Ninja CMS software, though if you wish to learn from it then I can't really stop you
// viewing the source.
//
// If you would like to use the Arctus Calendar in your own project please email me
// (adrian.oconnor@arctus.co.uk) and I would be happy to license it.


 function IsInteger(sText)
{
   var ValidChars = "0123456789";
   var IsNumber=true;
   var Char;

 
   for (i = 0; i < sText.length && IsNumber == true; i++) 
      { 
      Char = sText.charAt(i); 
      if (ValidChars.indexOf(Char) == -1) 
         {
         IsNumber = false;
         }
      }
   return IsNumber;
   
 }
 



function AutoCorrectDate(txtControl)
{
    var strDate = txtControl.value ; 
    
    if (strDate.length == 8 || strDate.length == 6 ) 
    {
        if (strDate.indexOf('/') < 0 ) 
        {
            txtControl.value = strDate.substring(0,2) + '/' + strDate.substring(2,4) + '/' + strDate.substring(4,strDate.length)  ;
        } 
    }
   
    
   var parts ; 

   parts = txtControl.value.split("/");
   if (parts.length ==  3 ) 
   {
   
        if (IsInteger (parts[0])  && IsInteger (parts[1]) && IsInteger (parts[2]) ) 
        {
            if (parts[0].length == 1 ) 
                parts[0] = '0' + parts[0] ; 
                
            if (parts[1].length == 1 ) 
                parts[1] = '0' + parts[1] ; 
                
            if (parts[2].length == 2 ) 
            {
                if (parts[2] > 20 ) 
                    parts[2] = '19' + parts[2] ; 
                else
                    parts[2] = '20' + parts[2] ; 
             }   
            txtControl.value  =    parts[0] + '/' + parts[1] + '/' + parts[2]
        }
    }
    
    
    
}

var undefined;
var Calendar_ActiveField;

var Calendar_CurrentDay = 0;
var Calendar_CurrentMonth = 0;
var Calendar_CurrentYear = 0;
var Calendar_Highlights = new Array();

function ShowCalendar(sender, AttachedTextBox)
{
	if(Calendar_ActiveField != undefined && Calendar_ActiveField == document.getElementById(AttachedTextBox))
	{
		Calendar_CloseOpenCalendar();
		return;
	}

	var Calendar = document.getElementById('CalendarPanel');
    var CalendarIFrame = document.getElementById('CalendarPanelIFrame');	
    
	Calendar_ActiveField = document.getElementById(AttachedTextBox);
	var HighlightDataField = document.getElementById(AttachedTextBox + '_highlights');

	if(HighlightDataField != undefined)
	{
		Calendar_Highlights = HighlightDataField.value;//.split(',');
	}
	
	Calendar_ProcessDateField(Calendar_ActiveField);

	if(Calendar_ActiveField.value.indexOf('/') != -1)
    {
	    var DateString = getFormattedDate(Calendar_ActiveField.value);
        DateString = DateString.split('/'); 

        var selectedMonth = parseInt(getDateNo(DateString[1]));
        var selectedDay = parseInt(getDateNo(DateString[0]));
		var CurrentDate = new Date(DateString[2], selectedMonth - 1, selectedDay);
	    	
		Calendar_CurrentDay = selectedDay;
		Calendar_CurrentMonth = CurrentDate.getMonth() + 1;
		Calendar_CurrentYear = CurrentDate.getYear();
	}
	else	
	{
		var CurrentDate = new Date(); // Today
		CurrentDate = getFormattedDate(CurrentDate);
		
		var dateparts = CurrentDate.split('/');
        var datemonth = parseInt(dateparts[1]);
        var dateday = parseInt(dateparts[0]);
        var dateyear = parseInt(dateparts[2]); 
        
		Calendar_CurrentDay = dateday;
		Calendar_CurrentMonth = datemonth;
		Calendar_CurrentYear = dateyear;
	}

	BuildCalendar(Calendar_CurrentMonth, Calendar_CurrentYear);

	var x = findPosition(Calendar_ActiveField)[0];//.offsetLeft;
	var y = findPosition(Calendar_ActiveField)[1];

	Calendar.style.display = 'block';
	Calendar.style.left = x + 'px';
	Calendar.style.top = y + 'px';	

	CalendarIFrame.style.display = Calendar.style.display;
	CalendarIFrame.style.left = Calendar.style.left;
	CalendarIFrame.style.top = Calendar.style.top;	
	CalendarIFrame.style.width = Calendar.style.width;
	CalendarIFrame.style.height = Calendar.style.height;
}

// Returns proper date format (Strips preceeding zeros off dates which cause error)
function getFormattedDate(date)
{
    if (date.length > 0 && date.indexOf('/') != -1) // Get date value
    {
        var dateparts = date.split('/');
    
        var datemonth = parseInt(getDateNo(dateparts[1]));
        var dateday = parseInt(getDateNo(dateparts[0]));
        var dateyear = parseInt(getDateNo(dateparts[2]));         
        return dateday + '/' + datemonth + '/' + dateyear;
    }
    else // get Todays date
    {
        var CurrentDate = new Date(); // Today
		dateday = getDateNo(CurrentDate.getDate());
		datemonth = getDateNo(CurrentDate.getMonth()) + 1;
		dateyear = getDateNo(CurrentDate.getFullYear());
        return dateday + '/' + datemonth + '/' + dateyear;
    }
}
function getDateNo(dateno)
{
    if (dateno.length == 2) {
            if (dateno.substring(0,1) == "0") {
                dateno = dateno.substring(1,2);
            }
        }
    return dateno;
}


function findPosition(element)
{
	if(element.offsetParent)
	{
		for(var posX = 0, posY = 0; element.offsetParent; element = element.offsetParent)
		{
			posX += element.offsetLeft;
			posY += element.offsetTop;
		}
		
		return [ posX, posY ];
	}
	else
	{
		return [ element.x, element.y ];
	}
}

function Calendar_CloseOpenCalendar()
{
	Calendar_ActiveField = undefined;
	document.getElementById('CalendarPanel').style.display = 'none';
	document.getElementById('CalendarPanelIFrame').style.display = 'none';
	
	
	// We can define our own js function within the page to handle when a date is selected
	if (typeof calendarDateSelected != "undefined")
	{
	    calendarDateSelected();
	}
}

function AddDays(DateObject, Days)
{
	var NewDate_Day = DateObject.getDate() + Days;
	var NewDate_Month = DateObject.getMonth();
	var NewDate_Year = DateObject.getYear();

	if(NewDate_Year < 1900) NewDate_Year += 1900;

	return new Date(NewDate_Year, NewDate_Month, NewDate_Day);
}

function AddMonths(DateObject, Months)
{
	var NewDate_Day = DateObject.getDate();
	var NewDate_Month = DateObject.getMonth() + Months;
	var NewDate_Year = DateObject.getYear();

	if(NewDate_Year < 1900) NewDate_Year += 1900;

	return new Date(NewDate_Year, NewDate_Month, NewDate_Day);
}

function AddYears(DateObject, Years)
{
	var NewDate_Day = DateObject.getDate();
	var NewDate_Month = DateObject.getMonth();
	var NewDate_Year = DateObject.getYear() + Years;

	if(NewDate_Year < 1900) NewDate_Year += 1900;

	return new Date(NewDate_Year, NewDate_Month, NewDate_Day);
}

function Calendar_ProcessDateField(sender)
{
	var FieldData = new String(sender.value);
	var ProcessedDate = new Date();
	var Process = false;

	if(FieldData == 'today')
	{
		ProcessedDate = AddDays(ProcessedDate, 0);
		Process = true;
	}

	if(FieldData == 'tomorrow')
	{
		ProcessedDate = AddDays(ProcessedDate, 1);
		Process = true;
	}

	var Period = 0;
	var PeriodType = '';

	if(FieldData.indexOf('day') != -1)
	{
		PeriodType = 'day';
	}
	else if(FieldData.indexOf('week') != -1)
	{
		PeriodType = 'week';
	}
	else if(FieldData.indexOf('month') != -1)
	{
		PeriodType = 'month';
	}
	else if(FieldData.indexOf('year') != -1)
	{
		PeriodType = 'year';
	}

	if(PeriodType != '' && !Process)
	{
		var StringData = '';

		if(FieldData.indexOf('next') > -1)
		{
			StringData = '1';
		}
		else
		{
			var FoundNumeric = false;
		
			for(var CharPos = FieldData.indexOf(PeriodType) - 1; CharPos >= 0; CharPos--)
			{
				var TempChar = FieldData.substr(CharPos, 1);	

				if((isNaN(TempChar) || TempChar == ' ') && FoundNumeric == true)
				{
					// We found the number, now exit
					break;
				}
				else if(!isNaN(TempChar)) // e.g. is a number
				{
					StringData = TempChar + StringData;
					FoundNumeric = true;
				} 
			}
		}
		
		if(!isNaN(StringData))
		{
			Period = parseInt(StringData);

			switch(PeriodType)
			{
				case 'day':
					ProcessedDate = AddDays(ProcessedDate, Period);
					break;

				case 'week':
					ProcessedDate = AddDays(ProcessedDate, Period * 7);
					break;

				case 'month':
					ProcessedDate = AddMonths(ProcessedDate, Period);
					break;

				case 'year':
					ProcessedDate = AddYears(ProcessedDate, Period);
					break;
			}

			Process = true;
		}

	}

	if(Process)
	{
		var NewDate_Day = ProcessedDate.getDate();
		var NewDate_Month = ProcessedDate.getMonth() + 1;
		var NewDate_Year = ProcessedDate.getYear();

		if(NewDate_Year < 1900) NewDate_Year += 1900;

		sender.value = NewDate_Day + '/' + NewDate_Month + '/' + NewDate_Year
	}
}

function GetFirstDayOfMonth(Month, Year)
{
	var d = new Date();

	d.setDate(1);
	d.setMonth(Month - 1); // Base zero
	d.setYear(Year);

	var FirstDay = d.getDay();

	if(FirstDay == 0) FirstDay = 6; else FirstDay--;

	return FirstDay + 1;
}

function IsLeapYear(Year)
{
	return (Year % 4 == 0) && ((Year % 100 != 0) || (Year % 400 == 0));
}

function DaysInMonth(Month, Year)
{
	var DayCount = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	var Days = (Month != 2 || !IsLeapYear(Year)) ? DayCount[Month - 1] : 29;

	return Days;
}

function MonthName(Month)
{
	var Months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
	return Months[Month - 1];
}

function BuildCalendar(Month, Year)
{
	//var Calendar = document.getElementById('CalendarPanel');

	if(Year < 1900) Year += 1900;

	Calendar_CurrentMonth = Month;
	Calendar_CurrentYear = Year;

	document.getElementById('CalHead_Month').innerHTML = MonthName(Month);
	document.getElementById('CalHead_Year').innerHTML = Year;

    var Days = DaysInMonth(getDateNo(Month), Year);
	var StartDay = GetFirstDayOfMonth(getDateNo(Month), Year);

	var CurrentDay = 0; // Counts through the days as we create each entry
	var Row = 1;
	var Col = 1;

	var RowSix = document.getElementById('Cal_R6');
	RowSix.style.display = 'none';

	for(var i = 0; i < 42; i++) // 42 is the number of day-cells
	{

		var CurrentCell = document.getElementById('Cal_R' + Row + 'C' + Col);

		if(i >= StartDay && CurrentDay < Days)
		{
			CurrentDay++;

			var HighlightCell = false;
			var CurrentCellIsSelected = false;
			var CurrentDate = CurrentDay + '/' + Calendar_CurrentMonth + '/' + Calendar_CurrentYear;

			if((',' + Calendar_Highlights + ',').indexOf(CurrentDate) != -1) HighlightCell = true;
			

			if(getFormattedDate(Calendar_ActiveField.value) == CurrentDate) CurrentCellIsSelected = true;


			CurrentCell.innerHTML = CurrentDay;
			CurrentCell.title = "Select " + CurrentDate;
			CurrentCell.style.display = 'inline';
			CurrentCell.style.fontWeight = HighlightCell ? 'bold' : 'normal';
			CurrentCell.style.textDecoration = CurrentCellIsSelected ? 'underline' : 'none';

			if(Row == 6) RowSix.style.display = '';

		}
		else
		{
			CurrentCell.innerHTML = '';
			CurrentCell.style.display = 'none';
		}

		if(++Col > 7)
		{
			Col = 1;
			Row++;
		}
	}

}

function Calendar_PreviousMonth()
{
	Calendar_CurrentMonth--;
	
	if(Calendar_CurrentMonth == 0)
	{
		Calendar_CurrentMonth = 12;
		Calendar_CurrentYear--;
	}

	BuildCalendar(Calendar_CurrentMonth, Calendar_CurrentYear);
}

function Calendar_NextMonth()
{
	Calendar_CurrentMonth++;
	
	if(Calendar_CurrentMonth == 13)
	{
		Calendar_CurrentMonth = 1;
		Calendar_CurrentYear++;
	}

	BuildCalendar(Calendar_CurrentMonth, Calendar_CurrentYear);
}

function Calendar_PreviousYear()
{
	BuildCalendar(Calendar_CurrentMonth, --Calendar_CurrentYear);
}

function Calendar_NextYear()
{
	BuildCalendar(Calendar_CurrentMonth, ++Calendar_CurrentYear);
}

function Calendar_SelectDay(sender)
{
    var senderLocal = "0" + sender.innerHTML;
    var monthLocal = "0" + Calendar_CurrentMonth;
    
	Calendar_ActiveField.value = Right(senderLocal, 2) + '/' + Right(monthLocal, 2) + '/' + Calendar_CurrentYear;

	Calendar_CloseOpenCalendar();
}

function Right(str, n)
{
    if (n <= 0)
       return "";
    else if (n > String(str).length)
       return str;
    else {
       var iLen = String(str).length;
       return String(str).substring(iLen, iLen - n);
    }
}
