// ---------------------------------------------------------
// VRouteUtil class
// Утилита для расчета маршрутов.
// ---------------------------------------------------------

RouteUtil.prototype.startMarker;
RouteUtil.prototype.finishMarker;
RouteUtil.prototype._map;
RouteUtil.prototype._main_route;
RouteUtil.prototype._enabled = false;

var Karpela_Route_Util;

/** Возвращает значение флага enabled. */
RouteUtil.prototype.isEnabled = function() { return(this._enabled); }

/** Возвращает маркер начала маршрута. */
RouteUtil.prototype.getStartMarker = function() { return(this.startMarker); }

/** Возвращает маркер окончания маршрута. */
RouteUtil.prototype.getFinishMarker = function() { return(this.finishMarker); }

/**
 *  GUI утилита для расчета маршрутов.
 *  @constructor
 */
function RouteUtil(map) {
	this._map = map;
	Karpela_Route_Util = this;
	return(this);
}

/**
 *  Создание маркеров.
 */
RouteUtil.prototype._createRouteMarkers = function() {
	var rect = this._map.getClientRect();
	var min = rect.getMinPoint();
	var max = rect.getMaxPoint();
	var middleY = min.getY() + ((max.getY() - min.getY()) / 2);
	var offset = (max.getX() - min.getX()) / 2.5;
	var startX = min.getX() + offset;
	var finishX = max.getX() - offset;
	
	// Маркеры для указания старта и финиша маршрута
	var startIcon = new VMarkerIcon(27, 35, './images/markers/route-s.png');  
	startIcon.setAlphaEnable(true);
	this.startMarker = new VMarker(new VPoint(startX, middleY), startIcon);
	this.startMarker.setDraggable(true);
	
	var stopIcon = new VMarkerIcon(27, 35, './images/markers/route-f.png');  
	stopIcon.setAlphaEnable(true); 
	this.finishMarker = new VMarker(new VPoint(finishX, middleY), stopIcon);
	this.finishMarker.setDraggable(true);
	
	this._map.addMarker(this.startMarker);
	this._map.addMarker(this.finishMarker);
	
	var _this = this;
	
	VEvents.addListener(this.startMarker, "enddrag",
		function(point) {
			if (_this._main_route != null) {
				_this._map.removeRoute(_this._main_route);
				_this._map.repaintMap();
			}
			
			var routeService = new VRouteService();
			routeService.calculateRoute(point, _this.finishMarker.getPoint(),
				function(route) {
					_this._map.addRoute(route);
					_this._main_route = route;
					
					var infoWindow = new VInfoWindow("Маршрут", "~ " + _this._formatDistance(route.getDistance()));
					infoWindow.setSize(VInfoWindow.SMALL);
					// InfoWindow
					_this.startMarker.bindInfoWindow(infoWindow);
					_this.finishMarker.bindInfoWindow(infoWindow);
					// Hint
					_this.startMarker.setHint(_this._formatDistance(route.getDistance()));
					_this.finishMarker.setHint(_this._formatDistance(route.getDistance()));
					
					_this._map.repaintMap();
				}
			);
		}
	);
	VEvents.addListener(this.finishMarker, "enddrag",
		function(point) {
			if (_this._main_route != null) {
				_this._map.removeRoute(_this._main_route);
				_this._map.repaintMap();
			}
			
			var routeService = new VRouteService();
			routeService.calculateRoute(_this.startMarker.getPoint(), point,
				function(route) {
					_this._map.addRoute(route);
					_this._main_route = route;
					
					var infoWindow = new VInfoWindow("Маршрут", "~ " + _this._formatDistance(route.getDistance()));
					infoWindow.setSize(VInfoWindow.SMALL);
					// InfoWindow
					_this.startMarker.bindInfoWindow(infoWindow);
					_this.finishMarker.bindInfoWindow(infoWindow);
					// Hint
					_this.startMarker.setHint(_this._formatDistance(route.getDistance()));
					_this.finishMarker.setHint(_this._formatDistance(route.getDistance()));
					
					_this._map.repaintMap();
				}
			);
		}
	);
	
	this._enabled = true;
}

/**
 *  Скрытие маркеров.
 */
RouteUtil.prototype._hideRouteMarkers = function() {
	this.startMarker.hide();
	this.finishMarker.hide();
	this._map.removeRoute(this._main_route);
	
	this._enabled = false;
}

/**
 *  Перерисовка маршрута.
 */
RouteUtil.prototype._repaintMainRoute = function() {
	var _this = this;
	
	var routeService = new VRouteService();
	routeService.calculateRoute(this.startMarker.getPoint(), this.finishMarker.getPoint(),
		function(route) {
			_this._map.addRoute(route);
			_this._main_route = route;
			
			var infoWindow = new VInfoWindow("Маршрут", "~ " + _this._formatDistance(route.getDistance()));
			infoWindow.setSize(VInfoWindow.SMALL);
			// InfoWindow
			_this.startMarker.bindInfoWindow(infoWindow);
			_this.finishMarker.bindInfoWindow(infoWindow);
			// Hint
			_this.startMarker.setHint(_this._formatDistance(route.getDistance()));
			_this.finishMarker.setHint(_this._formatDistance(route.getDistance()));
			
			_this._map.repaintMap();
		}
	);
}

/**
 *  Включение/выключение.
 */
RouteUtil.prototype._toggleRouteMarkers = function() {
	if ((this.startMarker != null) && this.startMarker.isVisible()) {
		this._hideRouteMarkers();
		document.getElementById("route_button").className = "viewport_button";
	} else {
		this._createRouteMarkers();
		this._repaintMainRoute();
		document.getElementById("route_button").className = "viewport_button_active";
	}
	
	this._map.repaintMap();
}

/**
 *  Форматирование дистанции.
 */
RouteUtil.prototype._formatDistance = function(meters) {
	if (meters > 1000) {
		var prec = Math.round(meters / 1000000) + 3;
		return((meters/1000).toPrecision(prec) + " км.");
	} else
		return(Math.round(meters) + " м.");
    
}

