
/**
 * ???
 */
Navigo2.UI.Route = function(/*HTMLElement*/element) 
{
	var panel = $(element); //.cloneNode(false);

	var	geometry = { layer: ['poi-r'], points: true,	hist: false, radius: false, POIs: {}, globalPOIs: [], routePOIs: {} };
	
	var addr = undefined;

    var departureTime = undefined;

    var departureDate = undefined;

    var nbTransfer = undefined;   
	
	var type = undefined;

    var itineraryTemplate = undefined;


	var events = {
		simple: {
			'mva_center': { event: 'flash:center' },
			'pm_poi_move': { event: 'route:poiMove' },
			'tree_node_selected': { event: 'flash:treeNodeViewSelected'}
		},
		menu: {
			'menu1': { event: 'flash:routeStartAdd', layer: 'poi-r', description: 'Zaznacz poczatek trasy' },
			'menu2': { event: 'flash:routeViaAdd', layer: 'poi-r', description: 'Zaznacz punkt posredni' },
			'menu3': { event: 'flash:routeStopAdd', layer: 'poi-r', description: 'Zaznacz koniec trasy' },
			'menu4': { event: 'flash:routeSearch', layer: 'poi-r', description: 'Znajdz trase' }	
		},
		point: {
			'menu5': { event: 'flash:routeMarkRemove', layer: 'poi-r', description: 'Usuń punkt trasy' }
		},
		pois: {event:'flash:refresh'}
	};

    var busImages = undefined;

    this.setBusStationImages = function(/*Object*/ imagesBus) {
        busImages = imagesBus;
    }

    var busTooltips = undefined;    

    this.setBusTooltips = function(tooltips) {
        busTooltips = tooltips;
    }


    this.addDepartureTime = function(/*HTMLElement*/elem) {
        departureTime = elem;
    }

    this.addNbTransfer = function(/*HTMLElement*/elem) {
        nbTransfer = elem;
    }

    this.setItineraryTemplate = function(/*String*/carTemplate, /*String*/busTemplate, /*String*/carTemplateElement, /*String*/busTemplateElement /*String*/,busAlternateContainer) {
        if(itineraryTemplate == undefined) {
            itineraryTemplate = {div: {templateCar: undefined,
                                       templateBus: undefined,
                                       templateBusAlternateContainer: undefined,
                                       templateCarElement: undefined,
                                       templateBusElement: undefined }
                                };
        }

        if(carTemplate != undefined) {
            itineraryTemplate.div.templateCar = carTemplate;
        }
        if(busTemplate != undefined) {
            itineraryTemplate.div.templateBus = busTemplate;
        }

        if(carTemplateElement != undefined) {
            itineraryTemplate.div.templateCarElement = carTemplateElement;
        }
        if(busTemplateElement != undefined) {
            itineraryTemplate.div.templateBusElement = busTemplateElement;
        }
        if(busAlternateContainer != undefined) {
            itineraryTemplate.div.templateBusAlternateContainer = busAlternateContainer;
        }
    }
	
	/**
	 * ???
	 */
	var validRouteFields = function() 
	{
		return panel.address.inject(true, function(valid, address, index) {
			if((index == 0 || index == panel.section.length - 1) && panel.section[index].visible() && address.value == "") {
				address.addClassName("error");
				return valid && false;
			} else {
				address.removeClassName("error");
				return valid && true;
			}
			return valid;
		});
	}

	/**
	 * ???
	 */
	var getRoutePointNum = function(type) 
	{
		if(type == 'start')return 0;
		if(type == 'stop')return panel.address.length - 1;
		if(type == 'via') {
			var num = $R(1, panel.address.length - 2).find(function(num) { 
				return (geometry.POIs[num] == undefined) ? true : false;
			});
			if(num != undefined) return num;
		}
		return undefined;
	}

	/**
	 * ???
	 */
	var getRoutePointType = function(num) 
	{
		num = Math.min(num, panel.address.length - 1);
		if(num == 0) return "start";
		if(num == panel.address.length - 1) return "stop";
		if(num < panel.address.length - 1) return "via";
		return undefined;
	}
	
	this.hintsOn = function() {
		hints_on();
	}
	
	/**
	 * ???
	 */
	var hints_on = function()
	{
		if(panel.address == undefined) {
			panel.address = $A();
		}
		if(panel.addressIds == undefined) {
			panel.addressIds = $A();
		}
		if(panel.hint == undefined) {
			panel.hint = $A();
		}
		panel.select("input[elementType='address']").each(function(address) {
			var hint = address.adjacent("input[hintType='address']")[0];
			var addressId = address.adjacent("input[elementType='addressId']")[0];
			address.value = "";

			var url = Navigo2.normalisedURL("getCityHints.do");
			Navigo2.Hint.decorate(address, hint, url, 
			{ 
				method: 'get', 
				paramName: "address", 
				minChars: 2,
				elementId: addressId
			});

			panel.address.push(address);
			panel.addressIds.push(addressId);
			panel.hint.push(hint);
		});
		
		panel.select("select[elementType='address']").each(function(address) {
			address.value = "";
			panel.address.push(address);
			var addressId = address.adjacent("input[elementType='addressId']")[0];
			panel.addressIds.push(addressId);
		});
        panel.initialised = true;
	}

	panel.section = $A();
	
	/**
	 * Set type of route
	 */
	var add_address = function(/*HTMLElement*/elem) {
		['show', 'hide', 'toggle'].each(function(name) {
			elem[name] = elem[name].wrap(function(proceed) {
				var element = proceed();
				document.fire('route:resize');
				return element;
			});
		});
		panel.section.push(elem);
	}
	this.addAddress = function(/*HtmlElement*/element) {
		add_address(element);
	}
	
	/**
	 * Set itinerary html element for route
	 */
	var set_itinerary = function(/*HTMLElement*/element) {
		panel.itinerary = element;
	}
	this.setRouteItinerary = function(/*HtmlElement*/element) {
		set_itinerary(element);
	}
	
	/**
	 * Set type of route
	 */
	var set_route_type = function(/*HTMLElement*/element) {
		panel.type = element;
	}
	this.setRouteType = function(/*HtmlElement*/element) {
		set_route_type(element);
	}
	
	
	

	/**
	 * ???
	 */
	Event.observe(document, 'route:show', function(event) 
	{
		if(!panel.initialised) {
			Navigo2.DAO.getComponent("component.route", function(html) {
				panel.update(html);
				panel.address = $A();
				panel.hint = $A();
				panel.section = $A();
				
				hints_on();
							
				panel.select("div[sectionType='address']").each(function(section) {
					add_address(section)
				});
				
				set_itinerary(panel.select("div[sectionType='itinerary']")[0]);
				set_route_type(panel.select("select[elementType='routeType']")[0]);
				
				Event.observe(window, 'resize', function(event) {
					Navigo2.emit("route:resize");
				});
				panel.initialised = true;
			});
		}

		$(panel.id).replace(panel.show());
		Navigo2.emitById("route:visible", event.memo.id);
		//Navigo2.emitById('map:cancel_pois_updates', event.memo.id, 'poi-1');
		Navigo2.emitById('menu:switch', event.memo.id, 0);
	});

	/**
	 * ???
	 */
	Event.observe(document, 'route:visible', function(event) 
	{
		var qry = document.location.href.toQueryParams();
		if(qry.x && qry.y && qry.s) {
			geometry.coords = [qry.x, qry.y]
			geometry.scale = qry.s;

			var poiX = Object.isArray(qry.px) ? qry.px : [qry.px].compact();
			var poiY = Object.isArray(qry.py) ? qry.py : [qry.py].compact();
			
			//if(poiX.length > 0 && poiY.length > 0) {
				//Navigo2.emit('route:locate', 'start', 0, [poiX[0], poiY[0]], qry.s);
			//}
			// route token (?)

			if(qry.ex == "true") Navigo2.toggleMap();
		}
		Navigo2.emitById('map:flash', event.memo.id, geometry, events);
	});	

	/**
	 * ???
	 */
	Event.observe(document, 'route:enable', function(event)
	{
		panel.section.find(function(section, index) {
			if(section == panel.section.first()) return false;
			if(section == panel.section.last()) return false;
			return !section.visible() && section.show();
		});
	});

	/**
	 * ???
	 */
	Event.observe(document, 'route:disable', function(event)
	{
		if(event.memo.args[0] > panel.address.length - 1)
			event.memo.args[0] = panel.address.length - 1;
		panel.section.find(function(section, index) {
			if(section == panel.section.first()) return false;
			if(section == panel.section.last()) return false;
			if(index == event.memo.args[0]) {
				section.hide();
				Navigo2.emitById('route:search', 'mva');
			}	
			return index == event.memo.args[0];
		});
		panel.address[event.memo.args[0]].value = "";
		
		geometry.POIs[event.memo.args[0]] = undefined;
		Navigo2.emitById("map:POIs", event.memo.id, geometry.POIs);
	});

	/**
	 * ???
	 */
	Event.observe(document, 'route:reverse', function(event)
	{
        var pois = event.memo.args[0];
        var dont_reverse_values = event.memo.args[1];
        Navigo2.emitById("map:clear_last_route_pois", event.memo.id);

		panel.itinerary.hide();

        if(validRouteFields()) {
            var addressIds = new Array;
            var values = panel.address.collect(function(address, index) {
                if(panel.addressIds!=undefined) {
                    if(panel.section[index].visible() && address.value != "" ) {
                        var addressId = panel.addressIds[index].value;
                        addressIds[index] = (panel.section[index].visible() && addressId != "") ? addressId : 0;

                    }
				}
                return (panel.section[index].visible() && address != "") ? address.value : undefined;
            });
            values = values.compact().reverse();
            addressIds = addressIds.compact().reverse();
            
            if(dont_reverse_values == undefined) {
                panel.address.each(function(address, index) {
                    if(panel.section[index].visible()) address.value = values.shift();
                });
                
                values = panel.address.collect(function(address, index) {
                    if(panel.addressIds!=undefined) {
                        if(panel.section[index].visible() && address.value != "" ) {
                            var addressId = panel.addressIds[index].value;
                            addressIds[index] = (panel.section[index].visible() && addressId != "") ? addressId : 0;

                        }
                    }
                    return panel.section[index].visible() ? address.value : undefined;
                });
                
                if(panel.addressIds!=undefined) {
                	panel.addressIds.each(function(addressId, index) {
    					if(panel.section[index].visible()) addressId.value = addressIds.shift();
    				});
                	
    				addressIds = panel.addressIds.collect(function(addressId, index) {
    					return (panel.section[index].visible()) ? addressId.value : undefined;
    				});
    			}
            }

			Navigo2.info("Szukam trasy...");
            if(dont_reverse_values == undefined) {
				findRoute(values, addressIds, panel.type.value, pois, event.memo.id);
            } else {
                findRouteOrReverse(values, addressIds, panel.type.value, pois, event.memo.id, dont_reverse_values);
            }
			if ($('routeSwitchPanel') && $('routeUI')) {
				$('routeSwitchPanel').show();
                $('routeShowDirections').hide();
				$('routeShowPanel').show();
				$('routeUI').hide();
			}
		} else {
			Navigo2.warning("Wypełnij niezbędne pola");
		}



		/*panel.address.each(function(address, index) {
			if(panel.section[index].visible()) address.value = values.shift();
		});*/

		/*var POIs = geometry.POIs.compact().reverse();
		$R(0, panel.address.length - 1).each(function(num) {
			if(geometry.POIs[num] != undefined) {
				var isLast = (num == panel.address.length - 1);
				geometry.POIs[num] = POIs.shift();
				geometry.POIs[num][2] = (isLast) ? "6" : "" + num;
				geometry.POIs[num][3] = (isLast) ? -1 : num;
			}	
		});
		Navigo2.emitById("map:POIs", event.memo.id, geometry.POIs);*/



	});

	/**
	 * ???
	 */
	Event.observe(document, 'route:locate', function(event)
	{
		if(!isNaN(event.memo.args[1]) && event.memo.args[2] != undefined) {
			event.memo.args[1] = Math.min(event.memo.args[1], panel.address.length - 1);            
			panel.section[event.memo.args[1]].show();
            
            var isReverseWithSelect = false;

            if(geometry.routePOIs != undefined && geometry.routePOIs.from != undefined) {
                isReverseWithSelect = true;                
            }

			Navigo2.DAO.findAddress(event.memo.args[0], event.memo.args[1], event.memo.args[2], function(data) {
				    
                    var pos = (event.memo.args[0] != "stop") ? data.point : -1;
                    var pid = (event.memo.args[0] != "stop") ? data.point : 6;
                    if(isReverseWithSelect) {
                        if(panel.address[data.point].tagName == 'SELECT') {
                            panel.address[0].value = data.address.address_full;
                            panel.addressIds[0].value = data.id;
                        } else {
                            panel.address[data.point].value = data.address.address_full;
                            panel.addressIds[data.point].value = data.id;
                        }
                    } else {
                        panel.address[data.point].value = data.address.address_full;
                        panel.addressIds[data.point].value = data.id;
                    }

                    geometry.POIs[data.point] = [data.x92, data.y92, "" + pid, pos, data.address.address_full];
                    Navigo2.emitById('map:POIs', event.memo.id, geometry.POIs);
                    var scale = event.memo.args[3] || undefined;
                    //Navigo2.emitById('map:viewport', event.memo.id, [data.x92, data.y92], scale);
                    //Navigo2.emitById("map:home", event.memo.id, [data.x92, data.y92], undefined);
                     if(!isReverseWithSelect) {
                        Navigo2.emitById('route:search', 'mva');
                    } else {
                        //Mode for IKEA
                        Navigo2.emitById('route:reverse', 'mva', geometry.routePOIs, true);
                    }
			})
		}
	});

    Event.observe(document, 'route:route_pois', function(event)
	{
           var token = event.memo.args[0];
           var type = event.memo.args[1];

           if(type == 'Bus') {
                Navigo2.emitById('map:bus_pois', event.memo.id, token, busImages, busTooltips);
           } else {
               Navigo2.emitById('map:route_pois', event.memo.id, token);
           }

	});

    var findRoute = function(address, addressIds, type, pois, compId) {
        findRouteOrReverse(address, addressIds, type, pois, compId, undefined);
    }

    var findAlternateRoute = function(token, type, compId) {

            Navigo2.DAO.getAlternateRouteData(token , function(data)
            {
                Navigo2.info(false);
                Navigo2.emitById('map:flash', compId, geometry, events);                
                
                Navigo2.emitById('map:POIs', compId, geometry.POIs);
                var route = data.bbox;
                route.token = data.token;
                Navigo2.emitById('map:route', compId, route);
                Navigo2.emitById('route:route_pois', compId, route.token, type);
                Navigo2.emitById("map:boundBox", compId, {
                    left: route.left,
                    right: route.right,
                    top: route.top,
                    bottom: route.bottom
                    });
                Navigo2.emitById("map:home", compId, undefined, undefined);
            });
        }

	var findRouteOrReverse = function(address, addressIds, type, pois, compId, dont_reverse) {
			if(pois != undefined) {
				geometry.routePOIs = pois;
			}		
            Navigo2.UI.Route.addr = address;
			Navigo2.UI.Route.type = type;
            var nbTransferValue = undefined;
            if(nbTransfer != undefined) {
                nbTransferValue = nbTransfer.value;
            }
            var departureTimeValue = undefined;
            if(departureTime != undefined) {
                departureTimeValue = departureTime.value;
            }

			Navigo2.DAO.getRouteData(address.compact(), addressIds.compact(), type, nbTransferValue , departureTimeValue, undefined, true, undefined, function(data)
			{
				if(data.route != undefined) {
                    Navigo2.info(false);
                    //Navigo2.emitById('map:flash', compId, geometry, events);
                    var tooltip_brief_tmpl = new Template(tooltip_brief_body);
                    var tooltip_detailed_tmpl = new Template(tooltip_detailed_body);
                    //panel.itinerary.update(Navigo2.unescape(data.itenary_body));
                    $H(data.route).each(function(pair) {
                        var pos = (pair.key * 1) + 1;
                        if(pair.key == 'from') pos = 0;
                        if(pair.key == 'to') pos = panel.address.length - 1;
                        if(dont_reverse == undefined) {
                            if(panel.address[pos].tagName != 'SELECT') {
                                panel.address[pos].value = pair.value.address;
                            }
                        }
                        if(panel.hint[pos]!=undefined) {
                            panel.hint[pos].data = pair.value.hints;
                            panel.hint[pos][pair.value.count > 1 ? "show" : "hide"]();
                        }
                    });
                    prepareItinerary(data);
                    panel.itinerary.show();
                    var pointsAsPois = [];
                    geometry.POIs = [];
                    $H(data.route).each(function(pair) {
                        var pos = (pair.key * 1) + 1;
                        var poi = undefined;
                        if(pair.key == 'from') {
                            pos = 0;
                            poi = geometry.routePOIs['from'];
                        }
                        if(pair.key == 'to') {
                            poi = geometry.routePOIs['to'];
                            pos = -1;
                        }
                        var pid = (pos < 0) ? 6 : pos;
                        var num = (pos < 0) ? panel.address.length - 1 : pos;

                        if(poi != undefined) {
                            pointsAsPois.push(poi);
                        }
                        else {
                            geometry.POIs[num] = [pair.value.x92, pair.value.y92, ""+pid, pos, pair.value.address];
                        }
                    });
                    Navigo2.emitById('map:POIs', compId, geometry.POIs);
                    Navigo2.emitById('map:setPOIs', compId, pointsAsPois, 'poi-s');
                    var route = data.bbox;
                    route.token = data.token;
                    Navigo2.emitById('map:route', compId, route);
                    Navigo2.emitById('route:route_pois', compId, route.token, type);
                    Navigo2.emitById("map:boundBox", compId, {left: route.left, right: route.right, top: route.top, bottom: route.bottom});
                    Navigo2.emitById("map:home", compId, undefined, undefined);
                } else {
                    if(data.message != undefined) {
                        Navigo2.warning(data.message);
                    }
                }
			});

	}    

    /**
	 *
	 */
    var prepareItinerary = function(data) {
         if(data.route_type == 'Bus') {
                var content = '';
                var cont = undefined;
                if(data.alternateRoutes == undefined || data.alternateRoutes.length == 0){
                    data.itinerary.each(function(item) {
                        var template = new Template(itineraryTemplate.div.templateBusElement);
                        if(item.busStationInfo != undefined) {
                            item.busStationInfo.each(function(bsi) {
                                content = content + template.evaluate(bsi);
                            });
                        }
                    });

                    var template = new Template(itineraryTemplate.div.templateBus);
                    cont = {
                        content: content,
                        total_time: data.total_time,
                        total_distance: data.total_distance,
                        average_speed: data.average_speed
                        };
                    panel.itinerary.update(template.evaluate(cont));
                } else {
                    var allRoutes = '';
                    data.alternateRoutes.each(function(alternate) {
                        alternate.itinerary.each(function(item) {
                            if(item.busStationInfo != undefined) {
                                var template = new Template(itineraryTemplate.div.templateBusElement);
                                item.busStationInfo.each(function(bsi) {
                                    content = content + template.evaluate(bsi);
                                });
                            }
                        });
                        var template = new Template(itineraryTemplate.div.templateBusAlternateContainer);
                        cont = {
                            content: content,
                            token: alternate.token,
                            total_time: alternate.total_time,
                            total_distance: alternate.total_distance,
                            average_speed: alternate.average_speed,
                            nb : alternate.nb
                        };
                        content = '';
                        allRoutes = allRoutes + template.evaluate(cont);
                    });

                    var template = new Template(itineraryTemplate.div.templateBus);
                    var all = {content: allRoutes};
                    panel.itinerary.update(template.evaluate(all));

                }
            } else {
            var content = '';
            data.itinerary.each(function(item) {
               var template = new Template(itineraryTemplate.div.templateCarElement);
               var msg = Navigo2.DAO.getMessage('javascript.route.itinerary.label.' + item.type);
			   item.city = item.city.replace(/,\s*/g, ', ');
               //adres moze zawierac: miasto + ulica, miasto
               var address = '';
               if(item.city == undefined || item.city == '') {
                   address = '';
               } else if(item.street == undefined || item.street == '') {
                   address = item.city;
               } else {
                   address = item.city + ' ,' + item.street;
               }
               //localization moze zawierac: miasto + ulica, miasto, ulica
               var localization = '';
               if (item.city != undefined && item.city != ''){
                   localization = item.city;
                   if (item.street != undefined && item.street != ''){
                       localization += ', ';
                   }
               }
               if (item.street != undefined && item.street != ''){
                   localization += item.street;
               }

               var dir = {direction: item, trans: msg, address: address, localization: localization};
               content = content + template.evaluate(dir);
            });
            var template = new Template(itineraryTemplate.div.templateCar);
            var cont = {content: content, total_time: data.total_time, total_distance: data.total_distance, average_speed: data.average_speed};
            panel.itinerary.update(template.evaluate(cont));
        }
    }
	
	/**
	 * ???
	 */
	Event.observe(document, 'route:search', function(event)
	{
		var pois = event.memo.args[0];
		panel.itinerary.hide();
        Navigo2.emitById("map:clear_last_route_pois", event.memo.id);
		// Navigo2.emitById("map:panelBoxResize", event.memo.id);
        
		if(validRouteFields()) {
			Navigo2.info("Szukam trasy");
            var addressIds = new Array;
			var address = panel.address.collect(function(address, index) {
                if(panel.addressIds!=undefined) {
                    if(panel.section[index].visible() && address.value != "" ) {
                        var addressId = panel.addressIds[index].value;
                        addressIds[index] = (panel.section[index].visible() && addressId != "") ? addressId : 0;

                    }
				}
				return (panel.section[index].visible() && address.value != "") ? address.value : undefined;
			});
            
			findRoute(address, addressIds, panel.type.value, pois, event.memo.id);
			if ($('routeSwitchPanel') && $('routeUI')) {
				$('routeSwitchPanel').show();
                $('routeShowDirections').hide();
				$('routeShowPanel').show();
				$('routeUI').hide();
			}
		} else {
			Navigo2.warning("Wypełnij niezbędne pola");
		}
	});

	/**
	 * ???
	 */
	Event.observe(document, 'route:showDirections', function(event)
	{
        $('routeShowDirections').toggle();
		$('routeShowPanel').toggle();
		$('routeUI').toggle();
		($$('div.itinerary')[0]).toggle();
	});
	
	/**
	 * ???
	 */
	Event.observe(document, 'route:showPanel', function(event)
	{
        $('routeShowDirections').toggle();
		$('routeShowPanel').toggle();
		$('routeUI').toggle();
		($$('div.itinerary')[0]).toggle();
	});

    /**
	 * ???
	 */
	Event.observe(document, 'route:alternateSearch', function(event)
	{
		var token = event.memo.args[0];
        var type = event.memo.args[1];

        Navigo2.emitById("map:clear_last_route_pois", event.memo.id);


        findAlternateRoute(token, type, event.memo.id);

	});

	Event.observe(document, 'route:reload', function(event)
	{
		Navigo2.info("Szukam trasy...");
		var address = event.memo.args[0];
		var type = event.memo.args[1];
		findRoute(address, $A(), type, undefined, event.memo.id);
	});

	/**
	 * ???
	 *
	Event.observe(document, 'route:resize', function(event)
	{
		var size = sections.inject(118, function(acc, sect) { 
			return acc + (sect != undefined && sect.visible() ? sect.getHeight() : 0); });
	    var height = document.viewport.getHeight();
	    var max = Math.max(450, (height - 116));
		itinerary.style.height = 
			(itinerary.visible()) ? (max - size) + "px" : "0px";
		size += itinerary.getHeight();
		itinerary.parentNode.style.height = size + "px";

//		TODO Jakas konfiguracja (420, 560, 120)
//	    var size = Math.max(420, (height - 120));
//	    var size = Math.min(size, 560);

	});*/

	/**
	 * ???
	 */
	Event.observe(document, 'map:ready', function(event) 
	{
		if($(panel.id) == $(panel)) {
			Navigo2.emitById('map:flash', event.memo.id, geometry, events);
		}
	});

	/**
	 * ???
	 */
	Event.observe(document, 'flash:center', function(event) {
		Navigo2.emitById('map:home', event.memo.id);
	});

	/**
	 * ???
	 */
	Event.observe(document, 'route:poiMove', function(event) {
		var type = event.memo.args[1];
		var num = event.memo.args[2];
		var coords = event.memo.args[3];
		var type = getRoutePointType(num);
		if(type!='stop') {
			panel.addressIds[num].value = "";
		}
		else {
			panel.addressIds[panel.addressIds.length-1].value = "";
		}
		Navigo2.emitById("route:locate", event.memo.id, type, num, coords, undefined);
	});

	/**
	 * ???
	 */
	Event.observe(document, 'flash:routeStartAdd', function(event) {
		var coords = event.memo.args[1];
		Navigo2.emitById("route:locate", event.memo.id, 'start', getRoutePointNum('start'), coords, undefined);
	});

	/**
	 * ???
	 */
	Event.observe(document, 'flash:routeViaAdd', function(event) {
		var coords = event.memo.args[1];
		Navigo2.emitById("route:locate", event.memo.id, 'via', getRoutePointNum('via'), coords, undefined);
	});

	/**
	 * ???
	 */
	Event.observe(document, 'flash:routeStopAdd', function(event) {
		var coords = event.memo.args[1];
		Navigo2.emitById("route:locate", event.memo.id, 'stop', getRoutePointNum('stop'), coords, undefined);
	});

	/**
	 * ???
	 */
	Event.observe(document, 'flash:routeSearch', function(event) {
		Navigo2.emitById('route:search', event.memo.id);
	});

	/**
	 * ???
	 */
	Event.observe(document, 'flash:routeMarkRemove', function(event) {
		Navigo2.emitById('route:disable', event.memo.id, event.memo.args[1]);
	});

    Event.observe(document, 'route:iteniraryInit', function(event) {
        if(itineraryTemplate == undefined) {
            itineraryTemplate = {div: {templateCar: '<div class="itineraryHeader"><p class="routeDetails">' + Navigo2.DAO.getMessage('javascript.route.itinerary.label.total_distance') + ': <strong>#{total_distance}</strong> ' + Navigo2.DAO.getMessage('javascript.route.itinerary.label.total_time') + ' <strong>#{total_time}</strong> (' + Navigo2.DAO.getMessage('javascript.route.itinerary.label.average_speed') + ': <strong>#{average_speed}</strong>)</p></div><div>#{content}</div>',
                                   templateBus: '<div><table>#{content}</table></div>',
                                   templateBusAlternateContainer: '<div><div>#{nb} .  </div></br><table>#{content}</table></div>',
                                   templateCarElement: '<div style=\"padding-top:5px; padding-bottom:5px; border-bottom:1px solid #e0e0e0;\">' +
                                   							'<span style="float: right; width: 40px; height: 45px; text-align: center;"><img style="vertical-align: middle" src="' + Navigo2.normalisedURL('image/directions/#{direction.type}.png') + '"/></span>' +
                                   							'<span style=\"float:left; font-weight: bold;\">#{direction.num} #{trans}</span><br/>' +
                                   							'<span style=\"float:left\"><small>Dystans:&nbsp;</small></span>' +
                                   							'<span style=\"float:left\"><small><b><nobr>#{direction.distance} / #{direction.longDistance}</nobr></b></small></span><br/>' +
                                   							'<b style=\"color:#7f7f7f;\">#{address}</b><br/>' +
                                   						'</div>' ,
                                   templateBusElement: '<tr style="padding-top:5px; padding-bottom:5px; border-bottom:1px solid #e0e0e0;"><td style="float:left"> #{getOnTime} </td><td style="float:center"> #{getOffTime} </td><td style="float:center"> #{stationName} </td><td style="float:right"> #{lineName} </td></tr>' }
            };
        }
    });
    
}

