//alan.warriner@bigfoot.com
//http://www.alan-warriner.co.uk
//date difference calculation functions DateInfo(Date1,Date2,DateInfoObject)
//Javascript 1.3

//***************
//*  Functions  *
//***************
//initialising constructor for DateInfo type
function DateInfo(Date1,Date2)
{
if (arguments.length<2)
	{
	Date2=new Date();
	}
if (arguments.length==0)
	{
	Date1=new Date();
	}
DateDiff(Date1,Date2,this);
}


//**************************************************
//calc years, months & days between two dates
function DateDiff(PDate1,PDate2,DI)
{
//ensure date objects
var Date1=new Date(PDate1);
var Date2=new Date(PDate2);

//swap?
if (Date2.getTime()<Date1.getTime())
	{
		var td=new Date();
		td=Date1;
		Date1=Date2;
		Date2=td;
		}
	
 var nowdate,nowyear,nowmonth;
 var secconst=1000;
 var minconst=60;
 var hourconst=60;
 var dayconst=24*secconst*minconst*hourconst;	

 fdate=Date1.getDate();
 fmonth=Date1.getMonth();
 fyear=Date1.getFullYear();	
	
 secdate=Date2.getDate();
 secmonth=Date2.getMonth();
 secyear=Date2.getFullYear();	

 DI.YearsDiff=secyear-fyear-1;
 if (secmonth>fmonth || (secmonth==fmonth && secdate>(fdate-1)))
  {
  DI.YearsDiff++;
  }

 DI.MonthsDiff=secmonth-fmonth-1;	
 if (DI.MonthsDiff<0)
  {
  DI.MonthsDiff=12+DI.MonthsDiff;
  }

 if (secdate>fdate-1)
  {
  DI.MonthsDiff++;
  }
 if(DI.MonthsDiff==12)
  {	
 DI.MonthsDiff=0;
  }

 DI.DaysDiff=secdate-fdate;

 if (DI.DaysDiff<0)
 {
 var ty,tm;
	
 //create next month
 ty=secyear;
 tm=secmonth-1;

 if (tm<0)
 {
 tm=11;
 ty--;
 }

 //1st of final month
 var lm=new Date(secyear,secmonth,1);
	
 //1st of previous month
 var fm=new Date(ty,tm,1);

 //days in 1st month
 var td=Math.round((lm.getTime()/dayconst)-(fm.getTime()/dayconst));

 DI.DaysDiff=td+DI.DaysDiff;
 }

//total number of seconds
DI.TotalSeconds=Math.round((Date2.getTime()-Date1.getTime())/secconst);

//total number of minutes
DI.TotalMinutes=Math.round(DI.TotalSeconds/minconst);

//total number of hours
DI.TotalHours=Math.round(DI.TotalMinutes/hourconst);

//total number of days
DI.TotalDays=Math.round((Date2.getTime()-Date1.getTime())/dayconst);

//convert to text
DaysMonthsYearsText(DI);

}

//********************************
//convert to text
function DaysMonthsYearsText(DI)
{
var ytxt="",mtxt="",dtxt="";
var punc1="",punc2="";
var ynum="",mnum="",dnum="";


if (DI.YearsDiff>0)
	{
	ynum=DI.YearsDiff.toString();
	
	if (DI.YearsDiff==1)
		{
		ytxt=" year";
		}
	else
		{
		ytxt=" years";
		}
	}

if (DI.MonthsDiff>0)
	{
	mnum=DI.MonthsDiff.toString();
	
	if (DI.MonthsDiff==1)
		{
		mtxt=" month";
		}
	else
		{
		mtxt=" months";
		}
	}

if (DI.DaysDiff>0)
	{
	dnum=DI.DaysDiff.toString();
	
	if (DI.DaysDiff==1)
		{
		dtxt=" day";
		}
	else
		{
		dtxt=" days";
		}
	}


if (DI.YearsDiff>0 && DI.MonthsDiff>0 && DI.DaysDiff>0)
	{
	punc1=", ";
	punc2=" and ";
	}
else if ((DI.YearsDiff>0 && DI.MonthsDiff>0) || (DI.YearsDiff>0 && DI.DaysDiff>0)) 
	{
	punc1=" and ";
	}
else if (DI.MonthsDiff>0 && DI.DaysDiff>0)	
	{
	punc2=" and ";
	}

//difference text
DI.DiffText=ynum+ytxt+punc1+mnum+mtxt+punc2+dnum+dtxt;
if (DI.DiffText=="")DI.DiffText="0 days";

//seconds text
DI.SecondsText=DI.TotalSeconds.toString()+" second";
if (DI.TotalSeconds!=1) DI.SecondsText+="s";

//minutes text
DI.MinutesText=DI.TotalMinutes.toString()+" minute";
if (DI.TotalMinutes!=1) DI.MinutesText+="s";

//hours text
DI.HoursText=DI.TotalHours.toString()+" hour";
if (DI.TotalHours!=1) DI.HoursText+="s";

//days text
DI.DaysText=DI.TotalDays.toString()+" day";
if (DI.TotalDays!=1) DI.DaysText+="s";
}