// JavaScript Document
// custom functions by DBS

// calendar initialisation, calendar support functions, booking form permit visablity toggler, form validation
// © 2006 Matthew Harris, DBS, www.dbs-uk.co.uk

// this MUST be included after calendar and validation JS files

// initialise the calendars
function sparkCalendar()
{
	// build new calendar objects
	var cal_startdate = new CalendarPopup();
	var cal_enddate = new CalendarPopup();

	// calendar formatting
	cal_startdate.setCssPrefix("TEST");	
	cal_enddate.setCssPrefix("TEST");
	
	// disable dates before today (cant book a skip for the past)
	// todo - for the moment dont disable dates on 1st as breaks the day-1 code below
	var now = new Date();
	if(now.getDate() != 1)
	{
		now.setDate(now.getDate()-1);
		cal_startdate.addDisabledDates(null,formatDate(now,"yyyy-MM-dd"));
		cal_enddate.addDisabledDates(null,formatDate(now,"yyyy-MM-dd"));
	}

	// setup return value hooks
	cal_startdate.setReturnFunction("StartDate_SetNewDates");
	cal_enddate.setReturnFunction("EndDate_SetNewDates");
	
	// add event handler for startdate icon click
	document.getElementById('startdate_a').onclick = function(){
		var frm = document.getElementById('bookingfrm');
		var dateStrA = getDateString(frm.startdate_year, frm.startdate_month, frm.startdate_date);
		cal_startdate.showCalendar('startdate_a',dateStrA);
		return false;
	}

	// add event handler for enddate icon click
	document.getElementById('enddate_a').onclick = function(){
		var frm = document.getElementById('bookingfrm');
		var dateStrA = getDateString(frm.enddate_year, frm.enddate_month, frm.enddate_date);
		cal_enddate.showCalendar('enddate_a', dateStrA);
		return false;
	}
	
	return false;	
}

// the function hook for setting values returned from startdate popup
function StartDate_SetNewDates(y,m,d)
{
	 document.forms[0].startdate_year.value=y;
	 document.forms[0].startdate_month.selectedIndex=m;
	 for (var i=0; i<document.forms[0].startdate_date.options.length; i++) {
		  if (document.forms[0].startdate_date.options[i].value==d) {
			   document.forms[0].startdate_date.selectedIndex=i;
			   }
		  }
}

// the function hook for setting values returned from enddate popup
function EndDate_SetNewDates(y,m,d)
{
	 document.forms[0].enddate_year.value=y;
	 document.forms[0].enddate_month.selectedIndex=m;
	 for (var i=0; i<document.forms[0].enddate_date.options.length; i++) {
		  if (document.forms[0].enddate_date.options[i].value==d) {
			   document.forms[0].enddate_date.selectedIndex=i;
			   }
		  }
}

// utility function - ensure two digit date months
function PadDigits(n, totalDigits) 
{ 
	n = n.toString(); 
	var pd = ''; 
	if (totalDigits > n.length) 
	{ 
		for (i=0; i < (totalDigits-n.length); i++) 
		{ 
			pd += '0'; 
		} 
	} 
	return pd + n.toString(); 
} 
	 
// utility function - get end date or null for validation routines
function getEndDateAsString()
{
	 var frm = document.forms["bookingfrm"];
	 var y = frm.enddate_year.value;
	 var m = frm.enddate_month.selectedIndex;
	 var d = frm.enddate_date.value;
	 
	 if (y=="" || m=="" || d=="") { return null; }
	 
	 d = PadDigits(d, 2);
	 m = PadDigits(m, 2);
	 
	 var str = d+'-'+m+'-'+y;
	 
	 return str;
}
	 
// utility function - get start date or null for validation routines
function getStartDateAsString()
{
	 var frm = document.forms["bookingfrm"];
	 var y = frm.startdate_year.value;
	 var m = frm.startdate_month.selectedIndex;
	 var d = frm.startdate_date.value;
	 
	 if (y=="" || m=="" || d=="") { return null; }
	 
	 d = PadDigits(d, 2);	 
	 m = PadDigits(m, 2);	 
	 
	 var str = d+'-'+m+'-'+y;
	 
	 return str;
}		 		 
	 
// utility function - generic date checker used by calendar display function (date icon on form)
function getDateString(y_obj,m_obj,d_obj)
{
	 var y = y_obj.options[y_obj.selectedIndex].value;
	 var m = m_obj.selectedIndex;
	 var d = d_obj.options[d_obj.selectedIndex].value;

	 // if no valid date return today
	 if (isNaN(y) || m < 1 || isNaN(d))
	 {
		 var today = new Date();
		 return str = today.getFullYear() + '-' + (today.getMonth()+1) + '-' + today.getDate();
	 }
	 
	 // valid date found so return it
	 return str = y+'-'+m+'-'+d;
}
	 
// hide or show the permit
function togglepermit(showpermit)
{
	if(showpermit)
	{
		document.getElementById("permitwrap").style.display = "block";
	}
	else
	{
		document.getElementById("permitwrap").style.display = "none";
	}
}


// form validation - get the value of a radio button group
function GetRadioButtonValue(btn)
{
	var cnt = -1;
	for (var i=btn.length-1; i > -1; i--)
	{
		if (btn[i].checked) {cnt = i; break;}
	}
	
	if (cnt > -1) return btn[cnt].value;
	else return null;
}
					
// form validation - additional custom validation steps
function DoCustomValidation()
{
	  // grab a reference to the form
	  var frm = document.forms["bookingfrm"];
	  
	  // ensure that the permit has been filled out if its applicable
	  if((GetRadioButtonValue(frm.offroad) == "no"))
	  {
		if(!frm.permitby.value)
		{
		alert("As your skip will be on-road, please enter the permit granter");
		return false;
		}
	  }
	  
	  // compare dates to ensure end not before start
	  if((getEndDateAsString() != null) && (getStartDateAsString() != null))
	  {
		//both valid dates
		
		var DateResult = compareDates(getStartDateAsString(),"dd-MM-yyyy", getEndDateAsString(), "dd-MM-yyyy");
		
		if(DateResult == 1)
		{ 
			alert("Please enter a start date that is BEFORE the end date");
			return false;
		}
		
		if(DateResult == -1)
		{ 
			alert("Please enter a valid start date and end date - -1");
			alert("start - " + getStartDateAsString());
			alert("end - " + getEndDateAsString());
			
			return false;
		}
		
		// DateResult must be == 0, so it has passed, continue
	  }
	  else
	  {
		alert("Please enter a valid start date and end date - null");
		return false;
	  }

	  // validate the telephone number
	  if(!frm.telephone.value.match(/^\+?[\d\s]+$/))
	  {
		alert("Please enter a valid phone number");
		return false;
	  }
	
	// no errors found throughout, return true
	return true;
}
		
// form validation - core validation routine
function setupValidation()
{
	var frmvalidator = new Validator("bookingfrm");
	frmvalidator.addValidation("siteaddress", "req", "Please enter a delivery address");
	frmvalidator.addValidation("startdate_month", "dontselect=0", "Please select a month for the start date");
	frmvalidator.addValidation("enddate_month", "dontselect=0", "Please select a month for the end date");
	frmvalidator.addValidation("startdate_date", "dontselect=0", "Please select a day for the start date");
	frmvalidator.addValidation("enddate_date", "dontselect=0", "Please select a day for the end date");
	frmvalidator.addValidation("startdate_year", "dontselect=0", "Please select a year for the start date");
	frmvalidator.addValidation("enddate_year", "dontselect=0", "Please select a year for the end date");
	frmvalidator.setAddnlValidationFunction("DoCustomValidation");
}

// remove the booking link onclick event
function removeBookingLink()
{
	var booklink = document.getElementById('bookonlinelink').parentNode;
	
	if(booklink)
	{
		booklink.style.cursor = "default";
		booklink.onclick = function(){ return false; };
	}
	
	return false;
}

// global startup function
/////////////////////////////////////////////////
if(document.getElementById && document.createTextNode)
{
	window.onload=function()
	{
		removeBookingLink();
		sparkCalendar();
		setupValidation();
	}
}