function init() {
	YAHOO.hudson.bus_flow.setupCalendars();
	YAHOO.hudson.bus_flow.initializeDepartingSelect();
	if (error_msg)
		alert(error_msg);	
};

function validate() {
	var valid = true;
	var no_date = false;
	var bad_date = false;
	var no_puloc = false;
	var no_doloc = false;
	var blankRE=/^[\s]*$/;
	
	// Pickup loc
	if (blankRE.test($('departing_pickup').value)) {
		no_puloc = true; valid = false;
	}
	
	// Dropoff loc
	if (blankRE.test($('departing_dropoff').value)) {
		no_doloc = true; valid = false;
	}
	
	// Date
	if (blankRE.test($('departing_date').value)) {
		no_date = true; valid = false;
	}
	var today = new Date();
	var max_date = new Date(today.getFullYear(), today.getMonth(), today.getDate());
	max_date.setDate(max_date.getDate() + 14);
	var date = Date.parse($('departing_date').value);
	if (date > max_date) {
		bad_date = true; valid = false;
	}
	
	
	var error_msg = "Please supply all information before moving on:";
	if (bad_date)
		error_msg += "\n\tPlease choose a date within the next 14 days.";	
	if (no_date)
		error_msg += "\n\tPlease choose a date.";		
	if (no_puloc)
		error_msg += "\n\tPlease choose a departing location.";
	if (no_doloc)
		error_msg += "\n\tPlease choose a arriving location.";

	if (!valid)
		alert(error_msg);

	return valid;
}

/* --- Value-Pack functions */
YAHOO.hudson.bus_flow.valuePackCheck = function() {
	if ($('add_value_pack').checked) {
		if (!confirm("Are you sure you want to purchase a value pack?\n\nYou will receive 10 tickets to apply to any One-Way or Round trip(s)."))
			$('add_value_pack').checked = false;
	}
}
YAHOO.util.Event.addListener('add_value_pack', 'change', YAHOO.hudson.bus_flow.valuePackCheck);

/* --- Calendar-related funcitons */	
YAHOO.hudson.bus_flow.depCalendarDaySelected = function(type, args, obj) {
	var dates = args[0]; 
	var date = dates[0]; 
	var year = date[0], month = date[1], day = date[2];  

	$('departing_date').value = month + "/" + day + "/" + year; 
	YAHOO.hudson.bus_flow.departure_cal.hide();
}
YAHOO.hudson.bus_flow.setupCalendars = function() {
	var today = new Date();
	var max_date = new Date(today.getFullYear(), today.getMonth(), today.getDate());
	max_date.setDate(max_date.getDate() + 14);
	var calendar_options = {
		pages: 1,
		mindate: today,
		maxdate: max_date
	};

	YAHOO.hudson.bus_flow.departure_cal = new YAHOO.widget.CalendarGroup("departing_calendar_container", calendar_options);
	YAHOO.hudson.bus_flow.departure_cal.render();
	
	YAHOO.util.Event.addListener("departing_date", "click", function() {
		YAHOO.hudson.bus_flow.departure_cal.show();
		$('departing_date').blur();
	}, YAHOO.hudson.bus_flow.departure_cal, true);
		
	YAHOO.hudson.bus_flow.departure_cal.selectEvent.subscribe(YAHOO.hudson.bus_flow.depCalendarDaySelected, 
		YAHOO.hudson.bus_flow.departure_cal, true);			
}


/* Location functions */
YAHOO.util.Event.addListener('departing_pickup', 'change', function() {
	YAHOO.hudson.bus_flow.updateDepartingSelect('departing');
});

YAHOO.hudson.bus_flow.initializeDepartingSelect = function() {
	YAHOO.hudson.bus_flow.updateDepartingSelect('departing');
}

YAHOO.hudson.bus_flow.updateDepartingSelect = function(direction) {
	/* Figure out which pickup optgroup has been selected. */
	var pickup_group = $(direction + '_pickup').options[$(direction + '_pickup').selectedIndex].parentNode.label;
	var dropoff_group = $(direction + '_dropoff').options[$(direction + '_dropoff').selectedIndex].parentNode.label;
	var optgroups = $$('#' + direction + '_dropoff optgroup');

	/* Remove all optgroups from dropoff list */
 	for(i = 0; i < optgroups.length; i++) { optgroups[i].parentNode.removeChild(optgroups[i]); }
	
	if (pickup_group == undefined) return
	
	/* Grab all optgroups from source. */
	var optgroups = $$('#' + direction + '_source optgroup');
  
	/* If pickup value is '', hide all dropoff optgroups. */
	for (i = 0; i < optgroups.length; i++) {
		if (optgroups[i].label != pickup_group)
			$(direction + '_dropoff').appendChild(optgroups[i].cloneNode(true));
	}	
}