function MapRoute(map) {
	this.map = map;
	this.directions = null;
	this.initialized = false;
	this.from = '';
	
	this.setEventListener();
}

/**
 * Sets event listeners.
 */
MapRoute.prototype.setEventListener = function() {
	var submitButton = document.getElementById(this.map.divID+'RouteSubmitButton');
	if (submitButton) {
		submitButton.onclick = GEvent.callback(this, this.onSubmit);
	}
	var inputField = document.getElementById(this.map.divID+'RouteInput');
	if (inputField) {
		inputField.onkeyup = GEvent.callback(this, this.onKeyUp);
	}
}

/**
 * Initializes the route directions.
 */
MapRoute.prototype.init = function() {
	this.initialized = true;
	this.directions = new GDirections(this.map.gmap);
	
	GEvent.bind(this.directions, "load", this, this.showResults);
        GEvent.bind(this.directions, "error", this, this.handleErrors);
}

/**
 * Shows the results.
 */
MapRoute.prototype.showResults = function() {
	// show results
	var resultContainer = document.getElementById(this.map.divID+'RouteResult');
	if (resultContainer) {
		resultContainer.className = 'formElement';
	}
	var directionContainer = document.getElementById(this.map.divID+'RouteDirection');
	if (directionContainer) {
		directionContainer.innerHTML = this.from + ' &gt; ' + this.map.location;
	}
	var infoContainer = document.getElementById(this.map.divID+'RouteInfo');
	if (infoContainer) {
		infoContainer.innerHTML = this.directions.getSummaryHtml();
	}
	
	// hide error
	var errorContainer = document.getElementById(this.map.divID+'RouteInputElement');
	if (errorContainer) {
		errorContainer.className = 'formElement';
	}
	var errorMessage = document.getElementById(this.map.divID+'RouteError');
	if (errorMessage) {
		errorMessage.className += ' hidden';
	}
}

/**
 * Handles errors.
 */
MapRoute.prototype.handleErrors = function() {
	// show error
	var errorContainer = document.getElementById(this.map.divID+'RouteInputElement');
	if (errorContainer) {
		errorContainer.className = 'formElement formError';
	}
	var errorMessage = document.getElementById(this.map.divID+'RouteError');
	if (errorMessage) {
		errorMessage.className = errorMessage.className.replace(/hidden/);
	}
}

/**
 * Submits the route.
 */
MapRoute.prototype.onSubmit = function() {
	if (!this.initialized) {
		this.init();
	}
	
	// get value
	var inputField = document.getElementById(this.map.divID+'RouteInput');
	if (inputField) {
		this.from = inputField.value;
		if (this.from) {
			this.directions.load("from: " + this.from + " to: " + this.map.location);
		}
	}
}

/**
 * Handles keyboard events.
 */
MapRoute.prototype.onKeyUp = function(event) {
	if (!event) event = window.event;
	
	// get key code
	var keyCode = 0;
	if (event.which) keyCode = event.which;
	else if (event.keyCode) keyCode = event.keyCode;
	
	// enter
	if (keyCode == '13') {
		this.onSubmit();
	}
}
