﻿//******datetime.js********	
	
	function weekDayByDate(yyyy,mm,dd)
	// Return a weekday (1-7) by a date
	{
		var myDate = new Date(yyyy,mm,dd)
		var daydiff = myDate.getDay()+ 5
		return  (daydiff > 7 ? daydiff -7 : daydiff)
		
	}
	
	//================================================================

	
	function weekDay(dayNum,numChr)
	// Return numChr charcters of a weekday (0 = return the full name)
	// dayNum = 1 Sunday 7=Saturday)	
	{
		var dow = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday")
		var strday
		if (dayNum < 1 || dayNum > 7)
		{
			alert('Illegal day number: ' + dayNum + '\n\nDay Number must be a number between 1 and 7')
			return null 
		}
		strday = dow[dayNum - 1]
		return (numChr <= 0 || numChr >= strday.length ? strday : strday.substring(0,numChr))				
	}

	//======================================================

	function monthName(mthNum, numChr)
	// Reurn a numChrs char of the month name, 0 return the full name.
	{
		var month = new Array("January","February","March","April","May","June","July","August","September","October","November","December")
		var strmth
		
		if (mthNum < 1 || mthNum > 12)
		{
			alert('Illegal month number: ' + mthNum + '\n\nMonth Number must be a number between 1 and 12')
			return null 
		}
		strmth = month[mthNum - 1]
		return (numChr <= 0 || numChr >= strmth.length ? strmth : strmth.substring(0,numChr))
			
	}
	
	//=============================================
	
	
	function homeTime(timeZone, zoneOffset)
	// Calculate website home date (e.g. Sydney = GMT +10 EAST)
	// NOTE: timeZone is expressed in HOURS with OPPOSITE sign to Javascrip standard  e.g (Sth Australia ST)= GMT + 9hr-30m =9.5 hrs; [US] EST = -5)

	// zoneOffset is the DST offset (normally 1 hr when applicable),expressed in Hours
	// DST not yet allowed for automatically - manual for now
	// Author: Jacob Klamer
	{
		var myZone = (timeZone + zoneOffset) * 60
		var myDST = Boolean(false)
		var yrClock = new Date()
		var yrZone = - yrClock.getTimezoneOffset()
		gmtDay = yrClock.getUTCDay() + 1
		gmtDate = yrClock.getUTCDate()
		gmtMonth = yrClock.getUTCMonth() + 1
		gmtYear = yrClock.getUTCFullYear()
		gmtHour =yrClock.getUTCHours()
		gmtMin = yrClock.getUTCMinutes()
		
		// Set My Time
		var myYear = gmtYear
		var myMonth = gmtMonth
		var myDate = gmtDate
		var myDay = gmtDay
		var myHour = gmtHour
		var myMin = gmtMin
		
		var myHrZone = Math.floor(myZone / 60) 
		var myMinZone = (myZone %  60) + (myZone < 0 ? 1 : 0)
		
		myMin = myMin + myMinZone
		
		//Min out or range
		if (myMin >= 60)
		{
			myMin = myMin - 60;
			myHour = myHour + 1;
		}
		else if (myMin < 0)
		{
			myMin = myMin + 60;
			myHour = myHour -1;
		}
		
		myHour = myHour + myHrZone
		
		//Hour out of range
		if (myHour >= 24)
		{
			myHour = myHour - 24;
			myDay = myDay + 1;
			myDay = (myDay > 7 ? 1 : myDay);
			myDate = myDate + 1;
		}
		else if (myHour < 0)
		{
			myHour = myHour + 24;
			myDay =	myDay - 1;
			myDay = (myDay < 1 ? 7 : myDay);
			myDate = myDate - 1;
		}
		
		// Date out of Range
		if (myDate > lastMonthDay(myMonth,myYear))
		{
			myDate = 1;
			myMonth = myMonth + 1;
		}
		else if (myDate < 1)
		{
			myDate = 31;
			myMonth = myMonth - 1;
		}
		
		//Month out of range
		if (myMonth > 12)
		{
			myMonth = 1;
			myYear = myYear + 1	;		
		}
		else if (myMonth < 1)
		{
			myMonth = 12;
			myYear = myYear -1;
		}
		
		myDate = (myDate > lastMonthDay(myMonth, myYear) ? 1 : myDate)
		
		
 		//alert('My Time  is: ' + myDay + '-' + myDate + '/' + myMonth + '/' + myYear + ' ' + myHour + ':' + myMin)

		// temprary string
		var dateStr = weekDay(myDay,0) + ', ' + myDate + ' ' + monthName(myMonth,0) + ', ' + myYear
		// + ' ' + myHour + ':' + myMin
		// + '<br />' + myHour + ':' + myMin
		return dateStr
		//return null
	}
	
	//=============================================================================
	function dayStamp(timeZone,dstOffset,locName,tzAbbv)
	// Return a day stamp dddd, dd mmmm,yyyy location and zone name
		// e.g: Sydney Std Time 
		//      (EAST: GMT+10) 		
		//      Thursday, 17 June 2010
	// REQUIRES homeTime() function to be accessible
	// timeZone: in full hours, sign opposite to JS standard (Adelaide 9 hrs 30 min later than GMT = 9.5; [US] EST = -5)
	// dstOffset: Dayligh saving Offset in hours (normally +1 hr)
	// Loacname: Location to display (e.g. 'Sydney'
	//	tz Abbv: Time zone name abbriviation (e.g. 'EA' for 'Eastern Australia') 'ST' or 'DT' added automatically.
	// Author: Jacob Klamer
	{
		var strCal = homeTime(timeZone,dstOffset)
		var actZone = timeZone + dstOffset
		//var stamp = locName + (dstOffset == 0 ? ' Std ' : ' DS ') + 'Time <br />(' + tzAbbv +
		//			(dstOffset == 0 ? 'S' : 'D') + 'T: GMT' + (actZone < 0 ? '-' : '+') + actZone + ')<br /><br />' + strCal
		var stamp = strCal + '<br /><br />' + locName + '<br /> ' + (dstOffset == 0 ? 'Standard' : 'Daylight Saving') + ' Time<br />(GMT'
		+ (actZone < 0 ? '-' : ' + ') + actZone + ' Hrs)'
		return stamp
	}

	
	//=====================================================================
	function isLeapYear(nYear)
	// Return true for a leap year, false for others
	// nYear must be a 4 digit year
	// The rule: Leap year is every year that divides by 4 except if it divides by 100
	// but still (a leap year) if divides by 400 (i.e 1900 was not a leap year, but 2000 was)
	// Author: Jacob Klamer
	{
		if (nYear % 4 == 0)
		{
			if (nYear % 100 == 0)
			{
				return (nYear % 400 == 0 ? true : false) 
			}
			return true	
		}
		else
		{
			return false
		}
	}

	
	// ==================================================
	
	function lastMonthDay(iMonth, iYear)
	// Return the number of days in a given month, allowing for leap years 
	// iMonth 1=Jan; 12 = Dec  iYear mst be 4 digits year
	{
		var mthDays = new Array(31,28,31,30,31,30,31,31,30,31,30,31)
		if (iMonth < 1 || iMonth > 12)
		{
			alert('Invalid month: ' + iMonth + '\n\nMust be a number between 1 and 12')
			return 0
		}
		else if (iMonth == 2 && isLeapYear(iYear))
		{
			return 29
		}
		else
		{
			return mthDays[iMonth - 1]
		}
		return null
	}	
	
	// =======================================================
	
	
	function periodAdd(bsDate,bsMonth,bsYear, idPeriod, numPeriods)
	
	// Return a date string of a date after numPerods have been added to it
	// idPeriod 1= days, 2= weeks, 3 =fortnight 4= month, 5= qarters, 6= years
	// use negative mumPeriods to substract
	// Author: Jacob Klamer
	{
		var perName = new Array("dummy","day","week","forthnight","month","quarter","year")
		var myDate = bsDate
		var myMonth = bsMonth
		var myYear = bsYear
		var posInd = (numPeriods >= 0 ? Boolean(true) : Boolean(false))
		var eom
		if (myMonth < 1 || myMonth >12)
		{
			alert('Invalid Month: ' + myMonth + '\n\nMonth must be a number between 1 and 12')
			return false
		}
		eom = lastMonthDay(myMonth,myYear)
		myDate = (myDate > eom ? eom : myDate)
		myDate = (myDate < 1 ? 1 : myDate)
		var eomInd = (myDate == lastMonthDay(myMonth,myYear) ? Boolean(true) : Boolean(false))
		
		
		//alert('PosInd = ' + posInd)
		//alert('PeriodID = ' +idPeriod)
		//alert('is End Of Month? ' +eomInd)
		
		switch(idPeriod)
		{
			case 1:
			//days
				for (i = 1; i <= Math.abs(numPeriods); i++)
				
				{
					myDate = myDate + (posInd ? 1 : -1)
					//alert('Cur Date = ' + myDate)
					if (myDate > lastMonthDay(myMonth,myYear))
					{
						myDate = 1
						myMonth = myMonth +1
						if (myMonth > 12)
						{
							myMonth = 1
							myYear = myYear + 1
						}
					}
					else if (myDate < 1)
					{
						myMonth = myMonth - 1
						if (myMonth < 1)
						{
							myYear = myYear -1
							myMonth = 12
						}
						myDate = lastMonthDay(myMonth,myYear)		
					}
										
				}
				//End For
				break;
			
			case 2:
			//weeks
				for (i = 1; i <= Math.abs(numPeriods); i++)
				{
					myDate = myDate + (posInd ? 7 : -7)
					eom =lastMonthDay(myMonth,myYear)

					if (myDate > eom)
					{
						//myDate = myDate - lastMonthday(myMonth,myYear);
						myDate = myDate - eom;
						myMonth = myMonth +1;
						if (myMonth > 12)
						{
							myMonth = 1;
							myYear = myYear + 1;
						}
					}
					else if (myDate < 1)
					{
						myMonth = myMonth - 1
						if (myMonth < 1)
						{
							myYear = myYear -1
							myMonth = 12
						}
						myDate = lastMonthDay(myMonth,myYear) + myDate		
					}
										
				}
				//End For
				break;
			
			case 3:
			//Fortnight
				for (i = 1; i <= Math.abs(numPeriods); i++)
				{
					myDate = myDate + (posInd ? 14 : -14)
					eom =lastMonthDay(myMonth,myYear)
					if (myDate > eom)
					{
						//myDate = myDate - lastMonthday(myMonth,myYear);
						myDate = myDate - eom;
						myMonth = myMonth +1;
						if (myMonth > 12)
						{
							myMonth = 1;
							myYear = myYear + 1;
						}
					}
					else if (myDate < 1)
					{
						myMonth = myMonth - 1
						if (myMonth < 1)
						{
							myYear = myYear -1
							myMonth = 12
						}
						myDate = lastMonthDay(myMonth,myYear) + myDate		
					}
										
				}
				//End For
				break;
				
			case 4:
			// Months
				
				for (i = 1; i<= Math.abs(numPeriods); i++)
				{
					myMonth = myMonth + (posInd ? 1 : -1)
					if (myMonth > 12)
					{
						myMonth = 1;
						myYear =myYear + 1;
					}
					else if (myMonth <1)
					{
						myMonth = 12
						myYear = myYear - 1
					}
				}
				// End For
				eom = lastMonthDay(myMonth,myYear)
				myDate = (myDate > eom || eomInd ? eom : myDate)
				break;
			
			case 5:
			// Quarters
				
				for (i = 1; i<= Math.abs(numPeriods); i++)
				{
					myMonth = myMonth + (posInd ? 3 : -3)
					//alert('Cur Month =' +myMonth)
					if (myMonth > 12)
					{
						myMonth = myMonth - 12;
						myYear = myYear + 1;
					}
					else if (myMonth < 1)
					{
						myMonth = 12 + myMonth;
						myYear = myYear - 1;
					}
				}
				// End For
				eom = lastMonthDay(myMonth,myYear)
				myDate = (myDate > eom || eomInd ? eom : myDate)
				break;
				
			case 6:
			//Years
				for (i = 1; i<= Math.abs(numPeriods); i++)
				{
					myYear = myYear + (posInd ? 1 : -1)
					//alert('Cur year = ' + myYear)
					
				}
				//End For
				eom = lastMonthDay(myMonth,myYear)
				myDate = (myDate > eom || eomInd ? eom : myDate)
				break;
				
			
			
			
		}
		//End Switch
		
		var dateStr =  myDate + ' ' + monthName(myMonth,3) + ' ' + myYear
		return dateStr
		
	}
	//==========================================
	

