/* Do not modify the JavaScript in this file, as it may cause the Netopacs booking facility to fail.*/

var dToday; // Insert server time here
var dDateAccessed = new Date(); // Capture the date when the user accesses the page.
var saDays = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
var saMonths = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");

function SetServerDate(year, month, date, hour, minute){
	dToday = new Date(year, month, date, hour, minute);
}

// Toggles the availability of the date fields
function ToggleFields(){
	var frmAmlib = document.forms[0]
	var sBookType = frmAmlib.booktype.value;	
	
	if (sBookType == "DATE"){
		frmAmlib.daysfromtoday.disabled = true;
		frmAmlib.datefrom.focus();
		InitDates();
	}
	else if (sBookType == "DAY"){
		frmAmlib.daysfromtoday.disabled = false;
		frmAmlib.daysfromtoday.focus();
		UpdateDays();
	}
	
	ValidateDate(true);
	ValidateDate(false);
}

function ConfirmBooking(){
	var frmAmlib = document.forms[0];
	var sFromDate = ""
	var sToDate = ""	

	if (ValidateFields() && confirm("Proceed with booking?")){	
		sFromDate = frmAmlib.datefrom.value + "/";
		sFromDate += (parseInt(frmAmlib.monthfrom.value) + 1).toString() + "/";
		sFromDate += frmAmlib.yearfrom.value + " ";
		sFromDate += frmAmlib.timefrom.value;
		
		sToDate = frmAmlib.dateto.value + "/";
		sToDate += (parseInt(frmAmlib.monthto.value) + 1).toString() + "/";
		sToDate += frmAmlib.yearto.value + " ";
		sToDate += frmAmlib.timeto.value;
		
		frmAmlib.v29.value = "Y";
		frmAmlib.v36.value = sFromDate;
		frmAmlib.v37.value = sToDate;		
		
		frmAmlib.submit();
	}
}

function ValidateFields(){
	var frmAmlib = document.forms[0];
	var dDateFrom = GetDateAndTime(true);
	var dDateTo = GetDateAndTime(false);
	var bReturn;	
	
	if (dDateFrom > dDateTo){
		alert("The from date is greater than the to date.");
		bReturn = false;
	}
	else if (dDateFrom < dToday){
		alert("The booking is in the past.");
		bReturn = false;
	}
	else if (frmAmlib.v31.value == ""){
		alert("Please supply your Barcode.");
		bReturn = false;
	}	
	else{
		bReturn = true;
	}
	
	return bReturn;
}

function ChangeLocation(){
	InitTimes();
	ValidateDate(true);
	ValidateDate(false);
}
	
function InitDates(){		
	PopulateDates("datefrom", dToday);
	PopulateDates("dateto", dToday);	
	
	PopulateMonths("monthfrom", dToday);
	PopulateMonths("monthto", dToday);
	
	PopulateYears("yearfrom", dToday);
	PopulateYears("yearto", dToday);
	
	DisplayDay("dayfrom", dToday);
	DisplayDay("dayto", dToday);	
}
	
function InitTimes(){
	PopulateTimes(true);
	PopulateTimes(false);
}
	
function PopulateDates(sDateField, dDate){
	var nMaxDays;
	var nDate, nMonth, nYear;
	var cmbDate;
	var sSelectData = "";
		
	nDate = dDate.getDate();
	nMonth = dDate.getMonth();
	nYear = dDate.getYear();
	cmbDate = document.forms[0].elements[sDateField];
		
	nMaxDays = GetMaxDays(nMonth, nYear);
		
	for (var i=1; i<= nMaxDays; i++){
		if (sSelectData) { sSelectData+= ",";}		
		sSelectData+= i.toString()+ "|" + i.toString();		
	}	
	
	PopulateSelect(cmbDate, sSelectData, nDate);
}
	
function PopulateMonths(sMonthField, dDate){
	var nMonth;
	var cmbMonth;
	var sSelectData = "";
		
	nMonth = dDate.getMonth();
	cmbMonth = document.forms[0].elements[sMonthField];
	
	for (var i=0; i<= 11; i++){
		if (sSelectData) { sSelectData+= ",";}		
		sSelectData+= i.toString() + "|" + saMonths[i];
	}
			
	PopulateSelect(cmbMonth, sSelectData, nMonth);
}
	
function PopulateYears(sYearField, dDate){
	var nYear, nStartYear;
	var cmbYear;
	var sSelectData = "";
		
	nYear = dDate.getYear();
	nStartYear = dToday.getYear();
	cmbYear = document.forms[0].elements[sYearField];
	
	for (var i=nStartYear; i<= nStartYear+5; i++){
		if (sSelectData) { sSelectData+= ",";}		
		sSelectData+= i.toString()+ "|" + i.toString();
	}
				
	PopulateSelect(cmbYear, sSelectData, nYear);
}
	
function DisplayDay(sDayField, dDate){
	var txtDay;

	txtDay = document.forms[0].elements[sDayField];
	txtDay.value = saDays[dDate.getDay()];
}
	
// Updates the select fields and ensures only dates from today can be selected.
function UpdateDate(bFromDate){
	var dNewDate = GetSelectedDate(bFromDate);
	var sDateField, sDayField, sMonthField, sYearField;
	
	bFromDate?sDateField="datefrom":sDateField="dateto";
	bFromDate?sDayField="dayfrom":sDayField="dayto";
	bFromDate?sMonthField="monthfrom":sMonthField="monthto";
	bFromDate?sYearField="yearfrom":sYearField="yearto";
		
	PopulateMonths(sMonthField, dNewDate);
	PopulateDates(sDateField, dNewDate);		
	PopulateYears(sYearField, dNewDate);
	DisplayDay(sDayField, dNewDate);
	
	ValidateDate(bFromDate);
}

//Updates to from and to dates to match the number of days from today.
function UpdateDays(){	
	var frmAmlib = document.forms[0];
	
	if (IsNumber(frmAmlib.daysfromtoday, 1, 1)){
	
		var dNewDate = new Date();	
		var nDays = parseInt(frmAmlib.daysfromtoday.value, 10);
		var cmbDateFrom, cmbMonthFrom, cmbYearFrom;
		var cmbDateTo, cmbMonthTo, cmbYearTo;
		var nDate, nMonth, nYear;
	
		cmbDateFrom = frmAmlib.datefrom;
		cmbMonthFrom = frmAmlib.monthfrom;
		cmbYearFrom = frmAmlib.yearfrom;
	
		cmbDateTo = frmAmlib.dateto;
		cmbMonthTo = frmAmlib.monthto;
		cmbYearTo = frmAmlib.yearto;
		
		dNewDate = DateAddDays(dToday, nDays);
		nDate = dNewDate.getDate();
		nMonth = dNewDate.getMonth();
		nYear = dNewDate.getYear();	
	
		PopulateSelect(cmbDateFrom, nDate.toString() + "|" + nDate.toString(), nDate);
		PopulateSelect(cmbMonthFrom, nMonth.toString() + "|" + saMonths[nMonth], nMonth);
		PopulateSelect(cmbYearFrom, nYear.toString() + "|" + nYear.toString(), nYear);
	
		PopulateSelect(cmbDateTo, nDate.toString() + "|" + nDate.toString(), nDate);
		PopulateSelect(cmbMonthTo, nMonth.toString() + "|" + saMonths[nMonth], nMonth);
		PopulateSelect(cmbYearTo, nYear.toString() + "|" + nYear.toString(), nYear);
	
		DisplayDay("dayfrom", dNewDate);
		DisplayDay("dayto", dNewDate);
	
		ValidateDate(true);
		ValidateDate(false);
	}
}

// Adds the specified number of days to the passed date.
function DateAddDays(dDate, nDays){
	var dNewDate = new Date();
	dNewDate.setDate(dDate.getDate() + nDays);	
	return dNewDate;
}

// Ensures the date is field (eg not a closed day or holiday.
function ValidateDate(bFromDate){
	var dDate = new Date();	
	var dOtherData = new Date();
	
	dDate = GetSelectedDate(bFromDate);
	if (IsClosedDay(dDate.getDay()) || IsHoliday(dDate)){
		UpdateFieldColour(bFromDate, "#FF0000");
		bValidDate = false;		
	}
	else{
		UpdateFieldColour(bFromDate, "#000000");
		bValidDate = true;
	}
	
	// If there was one valid date, check if the other one is valid to and enable disable the book button.
	if (bValidDate){
		dOtherData = GetSelectedDate(!bFromDate);
		if (IsClosedDay(dOtherData.getDay()) || IsHoliday(dOtherData)){
			document.forms[0].bookitem.disabled = true;
		}
		else{
			document.forms[0].bookitem.disabled = false;
		}		
	}
	else{
		document.forms[0].bookitem.disabled = true;
	}	
}

// Detrmines if the day is a closed day.
function IsClosedDay(nDay){
	var sLoc = document.forms[0].v33.value;
	var sAllClosedDays = document.forms[0].closeddays.value;
	var saAllClosedDays = new Array();
	var nAllClosedDays = StringToArray(sAllClosedDays, ",", saAllClosedDays);
	
	for (var i=0; i<nAllClosedDays; i++){
		var saLocations = new Array();
		StringToArray(saAllClosedDays[i], ":", saLocations);
		
		if (saLocations[0] == sLoc){
			var saLocClosedDays = new Array();
			var nLocClosedDays = StringToArray(saLocations[1], "|", saLocClosedDays);
			
			for (var j=0; j<nLocClosedDays; j++){
				if (nDay == parseInt(saLocClosedDays[j], 10)){
					return true;
				}
			}
		}		
	}
	
	return false;	
}

// Determines if the passed dat is a holiday.
function IsHoliday(dDate){
	var sLoc = document.forms[0].v33.value;
	var sAllHolidays = document.forms[0].holidays.value;
	var saAllHolidays = new Array();
	var nAllHolidays = StringToArray(sAllHolidays, ",", saAllHolidays);
	var nYear, nMonth, nDate;
	var sMonth, sDate;
	var sDate;
	
	nYear = dDate.getYear();
	nMonth = dDate.getMonth();
	nDate = dDate.getDate();
	
	nMonth++;
	(nMonth<10)?sMonth="0" + nMonth:sMonth=nMonth.toString();	
	(nDate<10)?sDate="0" + nDate:sDate=nDate.toString();
	
	sDate = nYear + sMonth + sDate;
	
	for (var i=0; i<nAllHolidays; i++){
		var saLocations = new Array();
		StringToArray(saAllHolidays[i], ":", saLocations);
		
		if (saLocations[0] == sLoc || saLocations[0] == "**" ){
			var saLocHolidays = new Array();
			var nLocHolidays = StringToArray(saLocations[1], "|", saLocHolidays);
			
			for (var j=0; j<nLocHolidays; j++){
				if (sDate == saLocHolidays[j]){
					return true;
				}
			}
		}		
	}
	
	return false;
}

function UpdateFieldColour(bFromDate, sColour){
	var sDayField, sDateField, sMonthField, sYearField, sTimeField
	
	if(bFromDate){
		sDayField = "dayfrom"
		sDateField = "datefrom"
		sMonthField = "monthfrom"
		sYearField = "yearfrom"
		sTimeField = "timefrom"
	}	
	else{
		sDayField = "dayto"
		sDateField = "dateto"
		sMonthField = "monthto"
		sYearField = "yearto"
		sTimeField = "timeto"
	}
	
	document.forms[0].elements[sDayField].style.color = sColour;
	document.forms[0].elements[sDateField].style.color = sColour;
	document.forms[0].elements[sMonthField].style.color = sColour;
	document.forms[0].elements[sYearField].style.color = sColour;
	document.forms[0].elements[sTimeField].style.color = sColour;	
}


	
// Builds a date object from the data stored in the select fields.
function GetSelectedDate(bFromDate){
	var sDateField, sDayField, sMonthField, sYearField;
	var nNewDate, nNewDay, nNewMonth, nNewYear;
	var nDate, nDay, nMonth, nYear;
	var nMaxDays;
		
	// Get date fields and values.
	bFromDate?sDateField="datefrom":sDateField="dateto";
	bFromDate?sDayField="dayfrom":sDayField="dayto";
	bFromDate?sMonthField="monthfrom":sMonthField="monthto";
	bFromDate?sYearField="yearfrom":sYearField="yearto";
		
	nNewDate = parseInt(document.forms[0].elements[sDateField].value, 10);
	nNewDay = parseInt(document.forms[0].elements[sDayField].value, 10);
	nNewMonth = parseInt(document.forms[0].elements[sMonthField].value, 10);
	nNewYear = parseInt(document.forms[0].elements[sYearField].value, 10);
		
	nMaxDays = GetMaxDays(nNewMonth, nNewYear);
	(nNewDate > nMaxDays)?nNewDate=nMaxDays:nNewDate=nNewDate;
		
	// Adjust month and year to ensure dates in the past cannot be set.
	if (nNewYear == dToday.getYear()){
		nNewMonth = Math.max(nNewMonth, dToday.getMonth());
		
		if (nNewMonth == dToday.getMonth()){
			nNewDate = Math.max(nNewDate, dToday.getDate());
		}
	}
		
	// Create the new date object.
	var dNewDate = new Date(nNewYear, nNewMonth, nNewDate );
		
	return dNewDate;
}

// Builds the full date and time for the specified fields
function GetDateAndTime(bFromDate){
	var frmAmlib = document.forms[0];	
	var nYear, nMonth, nDate;
	var sTime;
	var saTime = new Array();
	var nHour, nMinute;
	
	var sYearField, sMonthField, sDateField, sTimeField;
	
	bFromDate?sYearField="yearfrom":sYearField="yearto";
	bFromDate?sMonthField="monthfrom":sMonthField="monthto";
	bFromDate?sDateField="datefrom":sDateField="dateto";	
	bFromDate?sTimeField="timefrom":sTimeField="timeto";		

	nYear = parseInt(frmAmlib.elements[sYearField].value, 10);
	nMonth = parseInt(frmAmlib.elements[sMonthField].value, 10);
	nDate = parseInt(frmAmlib.elements[sDateField].value, 10);
	
	sTime = frmAmlib.elements[sTimeField].value;
	sTime = ConvertToMilitary(sTime);
	StringToArray(sTime, ":", saTime);
	nHour = parseInt(saTime[0], 10);
	nMinute = parseInt(saTime[1], 10);
	
	var dDateAndTime = new Date(nYear, nMonth, nDate, nHour, nMinute);
	
	return dDateAndTime;	
}

function PopulateTimes(bFromTime){
	// Need to get the currently selected day to work out the time.
	var dSelectedDate = GetSelectedDate(true);
	var nDay = dSelectedDate.getDay();	
	
	var nOpen = GetHour(nDay, true);
	var nClosed = GetHour(nDay, false);
	var nSession = parseInt(document.forms[0].sessionlength.value);
	
	var sSelectData = "";
	var cmbTime;
	var nMinTime, nMaxTime;
	var sTimeField;
	
	(bFromTime)?nMinTime=nOpen:nMinTime=TimeAddMinutes(nOpen,nSession);	
	(bFromTime)?nMaxTime=TimeAddMinutes(nClosed, -nSession):nMaxTime=nClosed;
	(bFromTime)?sTimeField="timefrom":sTimeField="timeto";	
	
	while (nMinTime <= nMaxTime){
		var sTime = ConvertFromMilitary(ConvertTime(nMinTime));
		if (sSelectData) { sSelectData+= ",";}
		sSelectData+= sTime + "|" + sTime;
		nMinTime = TimeAddMinutes(nMinTime, nSession);
	}	
	
	cmbTime = document.forms[0].elements[sTimeField]
	PopulateSelect(cmbTime, sSelectData, nMinTime);
}

// Adds the passed number of minutes to the passed time.
// The time should be an integer representation of the time in 24hours. 
function TimeAddMinutes(nTime, nAddMinutes){
	var sTime = ConvertTime(nTime);
	var saTime = new Array();
	var nHours, nMinutes;
	var sHours, sMinutes;
	var dTime = new Date();	
	
	StringToArray(sTime, ":", saTime);
	nHours = parseInt(saTime[0], 10);
	nMinutes = parseInt(saTime[1], 10);
	
	dTime.setHours(nHours);
	dTime.setMinutes(nMinutes);	
	dTime.setMinutes(dTime.getMinutes() + nAddMinutes);
	
	nHours = dTime.getHours();
	nMinutes = dTime.getMinutes();
	
	sHours = nHours.toString();	
	(nMinutes < 10)?sMinutes = "0" + nMinutes.toString():sMinutes = nMinutes.toString();
	
	sTime = sHours + sMinutes;	
	return parseInt(sTime);
}

// Converts the passed number into the format xx:yy;
function ConvertTime(nTime){	
	var sTime = nTime.toString();
	var nLength = sTime.length;
	var sHours;	
	var sMinutes;	
	
	if (nLength == 4 || nLength == 3){
		(sTime.length==4)?sHours=sTime.substr(0,2):sHours=sTime.substr(0,1);
		sMinutes = (sTime.substr((sTime.length-2),2));		
		sTime = sHours + ":" + sMinutes;
	}
	else{
		sTime = "";
	}
	
	return sTime
}
	
function GetHour(nDay, bOpen){
	var sLoc = document.forms[0].v33.value;
	var sHours = document.forms[0].openhours.value;
	var saLocations = new Array();
	var nLocations = StringToArray(sHours, "$", saLocations);
	
	for (var i=0; i<nLocations; i++){		
		var saAllHours = new Array();
		StringToArray(saLocations[i], ":", saAllHours);		
			
		if (saAllHours[0] == sLoc){
						
			var saDayHours = new Array();
			var nDayHours = StringToArray(saAllHours[1], ",", saDayHours);
				
			for (var j=0; j<nDayHours; j++){
				var saNextDay = new Array();
				StringToArray(saDayHours[j], "|", saNextDay);
					
				if (parseInt(saNextDay[0], 10) == nDay ){
					var nHour;
					(bOpen)?nHour=saNextDay[1]:nHour=saNextDay[2];
					return parseInt(nHour, 10);
				}
			}			
		}						
	}
}
	
// Returns the maximum number of days for the given month and year
// nMonth is assumed to be a value between 0 and 11.
function GetMaxDays(nMonth, nYear){
	var nMaxDays;
	nMonth++;
		
	switch (nMonth){
		case 1: case 3: case 5: case 7: case 8: case 10: case 12:
			nMaxDays = 31;
			break;
		case 4: case 6:	case 9:	case 11:
			nMaxDays = 30;
			break;
		case 2:
			// February - work out if the year is a leap year.
			IsLeapYear(nYear)?nMaxDays=29:nMaxDays=28;
			break;
	}
		
	return nMaxDays;
}
	
function IsLeapYear(nYear){	
	if (nYear%4==0){
		if (nYear%100==0){
			if (nYear%400==0){
				return true;
			}
			else{
				return false;
			}
		}
		else{
			return true;
		}
	}
	else{
		return false;
	}		
}
	
// Populates the passed select box with data contained in the data string.
// The data string is a comma separated list of value|description items.
function PopulateSelect(cmbSelect, sData, sSelected){

	var saData = new Array();	 
	var saSubData = new Array();
	var nLength;
	var nSelected = -1;	
	 
	cmbSelect.length = 0;	 
	nLength = StringToArray( sData, ",", saData);
	 
	for (var i=0; i < nLength; i++){
 		StringToArray(saData[i], "|", saSubData);
	
		if (saSubData[0] == sSelected || saSubData[1] == sSelected){
			nSelected = i;
		}
		
		if (saSubData[1]){
			cmbSelect[i] = new Option(saSubData[1], saSubData[0]);
		}
		else{
			cmbSelect[i] = new Option(saSubData[0]);
		}	 	
 	}
	 
	if (nSelected == -1){ nSelected = 0; }
	
	cmbSelect.selectedIndex = nSelected;
}
		
// Creates an array from a delimited string
// sString: String to process
// sDelim: The delimiter used to break up the string
// saArray: The array to modify

function StringToArray(sString, sDelim, saArray){

	var sItem;
	var nOffset;	
	var nStart = 0;
	var nCount = 0;
	
	while (sString.length > 0){	
	
		// Get the next occurrence of the delimiter
		nOffset = sString.indexOf(sDelim, nStart); 
		
		// Check if the last element has been reached.
		if (nOffset == -1 && sString.length > 0){
			sItem = sString;
			sString = "";
		}
		else {		
			// Extract the first item from the string
			sItem = sString.slice(nStart, nOffset);			
			sString = sString.slice(nOffset+1, sString.length);
		}
		
		// Add the item to the array
		saArray[nCount] = sItem;
		nCount++;		
	}

	return saArray.length;
}

// Converts the passed time in hh:mm AMPM to military time.
function ConvertToMilitary(sTime){
	var reTimeFMT = GetTimeFormat(0);
	var sNewTime;
	var sHour, sMinute, sAMPM;
	var nHour;
	
	if (reTimeFMT.test(sTime)){
		sHour = RegExp.$1;
		sMinute = RegExp.$2;
		sAMPM = RegExp.$3;
		nHour = Number(sHour);
	
		if (sAMPM == "AM"){
			if (nHour == 12){
				sNewTime = "0:" + sMinute;
			}
			else{
				sNewTime = sHour + ":" + sMinute;
			}
		}
		else if (sAMPM == "PM"){
			if (nHour == 12){
				sNewTime = sHour + ":" + sMinute;
			}
			else{
				sNewTime = (nHour + 12) + ":" + sMinute;
			}
		}
	}
	else{
		sNewTime = "";
	}
	
	return sNewTime;
}

// Converts the the passed military time to hh:mm AMPM format.
function ConvertFromMilitary(sTime){	
	var re24HourFMT = GetMilitaryTimeFormat(0);
	var sHour, sMinute, sNewTime;
	var nHour;
	if (re24HourFMT.test(sTime)){
		sHour = RegExp.$1;
		sMinute = RegExp.$2;
		nHour = Number(sHour)

		if (nHour == 0){
			sNewTime = "12:" + sMinute + " AM";
		}
		else if (nHour == 12){
			sNewTime = sHour + ":" + sMinute + " PM";
		}
		else if (nHour >= 13 && nHour <= 23){
			sNewTime = (nHour - 12) + ":" + sMinute + " PM";	
		}		
		else{
			sNewTime = sHour + ":" + sMinute + " AM";
		}
	}
	else{
		sNewTime = "";
	}
	return sNewTime;
}

// Returns a regular expression that can be used to validate a time in the format hh:mm AMPM
// bVariation will return a regular expression that will validate the time format hh:mmAMPM
// (no space between mm and AMPM).
function GetTimeFormat(bVariation){
	if (bVariation){
		// Validates a time in the format hh:mmAMPM (no space between mm and AMPM).
		return /^(1[0-2]{1}|[1-9]{1}):([0-5]{1}\d{1})(AM|PM)$/;
	}
	else{		
		// Validates a time in the format hh:mm AMPM.
		return /^(1[0-2]{1}|[1-9]{1}):([0-5]{1}\d{1}) (AM|PM)$/;
	}
}

// Returns a regular expression that can be used to validate a time in military time format (HH:MM).
// bVariation will return a regular expression that will validate a number between 0 and 23.
function GetMilitaryTimeFormat(bVariation){
	if (bVariation){
		// Validates a number between 0 and 23		
		return /^(1{1}\d{1}|2{1}[0-3]{1}|\d{1})$/;
	}
	else{		
		// Validates military time (HH:MM).
		return /^(1{1}\d{1}|2{1}[0-3]{1}|\d{1}):([0-5]{1}\d{1})$/;
	}
}

// Makes sure the passed field contains a number.
function IsNumber(sField, bAlert, bFocus){	
	if (isNaN(sField.value) && sField.value!= ""){
		if (bAlert){
			alert("A number is required.");
		}
		if (bFocus){
			sField.focus();
			sField.select();
		}
		return false;
	}
	else{
		return true;
	}
}