/* Do not modify the JavaScript in this file, as it may cause the Netopacs booking facility to fail.*/ /* Version History Netopacs 5.2 5.2.0.0 - 07/01/2009 - SR 23664 Replace getYear() with getFullYear() for FF browsers */ 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.getFullYear(); 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.getFullYear(); nStartYear = dToday.getFullYear(); 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.getFullYear(); 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 nMaxDays)?nNewDate=nMaxDays:nNewDate=nNewDate; // Adjust month and year to ensure dates in the past cannot be set. if (nNewYear == dToday.getFullYear()){ 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 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; } }