function log(msg){
    try{
        var current = new Date();
        console.log( (current).toGMTString()+":" + current.getSeconds()+":"+current.getMilliseconds() +' ' + msg);
    }catch(ex){
    }
}

/**
 * ???
 */
Navigo2.UI.Map = function(	/*HTMLElement*/element,
							/*SWFHelper.FlashFactory*/factory,
							/*String*/id,
							/*String*/params) {

	var panel = $(element).cloneNode(false);

	var initScreen = undefined;
    var initBBox = undefined;
    var initScreenData = undefined;

    var initial_adress = undefined;

        this.setInitialAddress = function(initialAddress) {
            initial_adress = initialAddress;
        }

    var disable_qry = undefined;

        this.setDisableQry = function(disable_qry) {
            disable_qry = disable_qry;
        }

    /*
     * Biezacy panel ustawiany zdarzeniem map:setCurrentPanel
     * Dozwolone wartosci:
     * address, nearestpoi, route, pois
     *
     */
    var currentPanel = undefined;

    /*
     * Parametry wyszukiwania POI
     */
     var currentSearch = {
     	category: undefined,
     	radius: undefined
     };

	this.setInitScreen = function(initialScreen) {
		initScreen = initialScreen;
	};

	var initAction = Navigo2.HP_POIS;
	this.setInitAction = function(action) {
		initAction = action;
	};

	var clipUrl = undefined;
	this.setClipUrl = function(clip) {
		clipUrl = clip;
	};

	var clipConfigUrl = undefined;
	this.setClipConfigUrl = function(clipConfig) {
		clipConfigUrl = clipConfig;
	};

	var handler = undefined;

	/* wysokosc mapki */
	var mapHeight = undefined;

	this.setHeight = function(mh) {
		mapHeight = mh;
	};

	var geometry = undefined;

	var global_geometry = { layer: 'poi-1', points: true, hist: false, radius: false };

	var events = {pois: {event:'flash:refresh'}};

	var cache = {
		last_addr_pois: undefined,
		last_addr_nearest: undefined,
		last_pois: undefined,
		last_pois_by_ext: undefined,
		last_pois_search: undefined,
		last_pois_paging: undefined,
        last_pois_route: undefined
	};

	var	pois_geometry = function() {
		return new Navigo2.Geometry({ layer: 'poi-1', points: true,	hist: false, radius: false });
	}();

    var checkFlashId = function(compId) {
       if(compId == undefined || compId == id) {
           return true;
       }
       return false;
    };

	/*
	 * Zwraca boundBox zawierajacy w sobie wszystkie trasy.
	 */
    var expandBoundBox = function(routes /*[route]*/) {
    	if (routes != undefined) {
			var left = routes[0].left;
			var right = routes[0].right;
			var top = routes[0].top;
			var bottom = routes[0].bottom;
			for (var i = 1; i < routes.length; i++) {
				if(routes[i] != false) {
					if (routes[i].left < left) left = routes[i].left;
					if (routes[i].right > right) right = routes[i].right;
					if (routes[i].top > top) top = routes[i].top;
					if (routes[i].bottom < bottom) bottom = routes[i].bottom;
				}
			}
			return {
				left: left,
				right: right,
				top: top,
				bottom: bottom
			}
		} else {
			return false;
		}
    };

	Event.observe(document, 'map:setCurrentPanel', function(/*Event*/event) {
		if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		currentPanel = event.memo.args[0];
	});

	Event.observe(document, 'map:setCurrentSearch', function(/*Event*/event) {
		if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		currentSearch = {
			category: event.memo.args[0],
			radius:   event.memo.args[1]
		}
	});

	Event.observe(document, 'map:save_last_addr_pois', function(/*Event*/event) {
		if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		cache.last_addr_pois = event.memo.args[0];
		cache.last_addr_nearest = undefined;
	});

	Event.observe(document, 'map:save_last_addr_nearest', function(/*Event*/event) {
		if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		cache.last_addr_pois = undefined;
		cache.last_addr_nearest = event.memo.args[0];
	});

	Event.observe(document, 'map:save_last_pois', function(/*Event*/event) {
		if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		cache.last_pois = undefined;

		e = event.memo.args[0];
		cache.last_pois = { 'pois': event.memo.args[1],
							'token': e.memo.args[0],
							'categories': e.memo.args[1],
							'flag': e.memo.args[4]
						};
	});


	Event.observe(document, 'map:save_last_pois_route', function(/*Event*/e) {
		if(e.memo != undefined && !checkFlashId(e.memo.id)) return;
		cache.last_pois_route = undefined;

		cache.last_pois_route = { 'token': e.memo.args[0],
                                  'busImages': e.memo.args[1],
                                  'busTooltips': e.memo.args[2]
                                };
	});

	Event.observe(document, 'map:save_last_pois_by_ext', function(/*Event*/event) {
		if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		cache.last_pois_by_ext = undefined;

		e = event.memo.args[0];
		cache.last_pois_by_ext = { 'extIds': e.memo.args[0],
							'extCategories': e.memo.args[1],
							'flag': e.memo.args[2],
							'showOnMap': e.memo.args[3],
							'zoomMap': e.memo.args[4]
						};
	});

	Event.observe(document, 'map:save_last_pois_search', function(/*Event*/event) {
		if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		cache.last_pois_search = event.memo.args[0];
	});

	Event.observe(document, 'map:save_last_pois_paging', function(/*Event*/event) {
		if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		cache.last_pois_paging = event.memo.args[0];
	});

	Event.observe(document, 'map:clear_last_pois', function(/*Event*/event) {
		if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		cache.last_addr_pois = undefined;
		cache.last_addr_nearest = undefined;
		cache.last_pois = undefined;
		cache.last_pois_by_ext = undefined;
		cache.last_pois_search = undefined;
		cache.last_pois_paging = undefined;
        cache.last_pois_route = undefined;
	});

    Event.observe(document, 'map:clear_last_route_pois', function(/*Event*/event) {
        cache.last_pois_route = undefined;
	});

	Event.observe(document, 'map:bus_pois', function(/*Event*/event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;

        var token = event.memo.args[0];
        var busImage = event.memo.args[1];
        var busTooltips = event.memo.args[2];

        var denom = handler.getScaleDenom();

        Navigo2.emitById('map:clear_last_pois', event.memo.id);
        Navigo2.emitById("map:save_last_pois_route", event.memo.id, token, busImage, busTooltips);

        Navigo2.DAO.getBusStaions(token, denom, busImage, function (data) {
                if (data != undefined) {
                    if(data.pois != undefined) {
                        Navigo2.emitById('map:setPOIs', event.memo.id, data.pois, 'poi-1', busTooltips);
                        Navigo2.emitById('map:request_pois_updates', event.memo.id, 'poi-1', 1.0, 0.8);
                    }
                }

            });

	});

    Event.observe(document, 'map:route_pois', function(/*Event*/event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;

        var token = event.memo.args[0];
        var denom = handler.getScaleDenom();

            Navigo2.emitById('map:clear_last_pois', event.memo.id);
            Navigo2.emitById('map:setPOIs', event.memo.id, [], 'poi-1', true);
            Navigo2.emitById('map:request_pois_updates', event.memo.id, 'poi-1', 1.0, 0.8);


	});

    Event.observe(document, 'map:geometry', function(/*Event*/event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		if(event.memo.args[0] != undefined) {
			event.memo.args[0].show(handler);
		}
	});

        var qryEnabled = function () {
            if(disable_qry != undefined) {
               return document.location.href.replace("#", "").toQueryParams();
            } else {
               return {};
            }
        }

	function setInitialScreen() {

		var qry = qryEnabled();
		if(!qry.location) {
			Navigo2.DAO.getInitialScreen(function (data) {
				if (data != undefined && data.screen != undefined) {
					Navigo2.emitById("map:viewport", id, [data.screen.x, data.screen.y], data.screen.scale);

					Navigo2.emitById("map:home", id, [data.screen.x, data.screen.y], data.screen.scale);
					Navigo2.emitById('map:screen_initialised', id );

                    initScreenData = data.screen;
				}
			});
		}
	}

        this.setNavigoLayer = function(/*String*/ id) {
            if(handler != undefined) {
                handler.setNavigoActiveLayer(id);
            }
        }

        this.getNavigoLayer = function() {
            if(handler != undefined) {
                return handler.getNavigoActiveLayer();
            }
            return undefined;
        }

        function setInitialAddressScreen() {
            var qry = qryEnabled();
		if(!qry.location) {
			Navigo2.DAO.getAddressData(initial_adress , 0 , id , function(data)
			{
				if(data.address) {
					var count = data.address.count;
                                        if(count == 1) {
                                            Navigo2.emitById("map:viewport", id, [data.address.x92, data.address.y92], 1);
                                            Navigo2.emitById("map:home", id, [data.address.x92, data.address.y92], 1);
                                            Navigo2.emitById('map:screen_initialised', id );
                                        }
				}
			});
		}
        }

        Event.observe(document, 'map:setInitilScreen', function(event) {
            if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
            if(event.memo.args[0] != undefined && event.memo.args[1] != undefined && event.memo.args[2] != undefined) {
                var x = event.memo.args[0];
                var y = event.memo.args[1];
                var denom = event.memo.args[2];

                var screen = {
                    x : x,
                    y : y,
                    scale : denom
                }

                Navigo2.emitById("map:viewport", id, [screen.x, screen.y], screen.scale);
                Navigo2.emitById("map:home", id, [screen.x, screen.y], screen.scale);

                Navigo2.emitById('map:screen_initialised', event.memo.id );

                initScreenData = screen;

            }
        });

    Event.observe(document, 'map:setDefaultView', function(event) {
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;

        var qry = qryEnabled();
		if(!qry.location) {
            if (initScreenData != undefined && initScreenData) {
                setViewportForDefaultView(id, [initScreenData.x, initScreenData.y], initScreenData.scale);


                Navigo2.emitById("map:home", id, [initScreenData.x, initScreenData.y], initScreenData.scale);
                Navigo2.emitById('map:screen_initialised', id, initBBox.bbox);
            }
		}
    });

    Event.observe(document, "flash:refresh", function(/*Event*/event) {
		var flash_id = event.memo.args[event.memo.args.length-1];

        if(currentPanel=='address') {
            Navigo2.emitById('addresse:flashRefresh', flash_id, event);
        } else if(currentPanel=='nearestpoi') {
            Navigo2.emitById('nearestpoi:flashRefresh', flash_id, event);
        } else if (currentPanel==undefined) {
            Navigo2.emitById('map:refresh', flash_id, event, null);
        }
    });

	Event.observe(document, 'map:screen_initialised', function(/*Event*/event) {
		if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
                if(initAction != Navigo2.NO_ACTION) {
                    if(initAction == Navigo2.POI) {
                            Navigo2.emitById('pois:getById', event.memo.id, true);
                    }
                    var bbox = event.memo.args[0] || handler.getViewPort() ;
                    if(initAction == Navigo2.HP_POIS) {
                            var zoomMap;
                            if(initScreen == undefined) {
                                    zommMap = false;
                            }
                            else {
                                    zoomMap = !initScreen;
                            }
                    initBBox = handler.getViewPort();
                            global_geometry.layer = 'poi-1';
                            Navigo2.emitById('pois:search', event.memo.id, undefined, undefined, true, zoomMap, false, 'poi-1', handler.getScaleId(), bbox);
                    }
                }
	});


	/**
	 * ???
	 */
	Event.observe(document, 'map:show', function(event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		if(!panel.initialised) {
			Navigo2.DAO.init();
			if(clipUrl == undefined) {
				clipUrl = Navigo2.normalisedURL('mva.swf');
			}
			if(clipConfigUrl == undefined) {
				clipConfigUrl = Navigo2.normalisedURL('config.xml');
			}
			Navigo2.DAO.getMapComponent(clipUrl,clipConfigUrl, params, id, function(html) {
				html = Navigo2.normalisedHTML(html);
				panel.update(html);
				panel.map = panel.select("div[panelType='map']")[0];

				factory.initFlash(id, function() {
					handler = this;
					handler.defaultScaleDenom();
					handler.defaultCoords();

					Navigo2.emitById('map:resize', event.memo.id);
					Navigo2.emitById('map:ready', event.memo.id);
                                        Navigo2.emitById('map:extReady', event.memo.id);
					var qry = qryEnabled();

                    updateCategoryTreeView(event.memo.id);

					if(qry.location && qry.mvaId == event.memo.id) {
						Navigo2.emitById('map:decodeLocation', event.memo.id);
					} else {
						if(Navigo2.DAO.getPackage() == 'gold' && (initScreen || initAction == Navigo2.USER_SCREEN)) {
							setInitialScreen();
						} else {
                                                    if(initial_adress != undefined) {
                                                            setInitialAddressScreen();
                                                    } else {
							Navigo2.emitById('map:screen_initialised', event.memo.id);
                                                    }
						}
					}
				});

				Event.observe(window, 'resize', function(event) {
					Navigo2.emit("map:resize");
				});

				element = $($(element).identify());
				panel.initialised = true;
			});
		}

		$(panel.id).replace(panel.show());
		Navigo2.emitById("map:visible", event.memo.id);
	});

	/**
	 * ???
	 */
	Event.observe(document, 'map:resize', function(event)
	{
		var size = mapHeight;
		if(size == undefined) {
			var height = document.viewport.getHeight();
			size = Math.max(370, (height - 140));
			size = Math.min(size, 560);
			size = size + 'px';
		}
		if(panel.map!=undefined) {
			panel.map.style.height = size;
		}
	});

	/**
	 * ???
	 */
	Event.observe(document, 'map:panelBoxResize', function(event)
	{
		if (panel.map == undefined) {
			return;
		}

		panelBoxHeight = panel.map.style.height.slice(0, panel.map.style.height.indexOf('px'));

		if ($('navigomenu')) {
			navigomenuHeight = $('navigomenu').getHeight();
		} else {
			navigomenuHeight = 0;
		}
		if ($('routeSwitchPanel')) {
			routeSwitchPanelHeight = $('routeSwitchPanel').getHeight()
		} else {
			routeSwitchPanelHeight = 0;
		}

		var poisPanelHeight = 0;
		var poisMRHHeight = 0;
		var poisNaviHeight = 0;
		if ($('iPoisPanel')) {
			poisPanelHeight = $('iPoisPanel').getHeight()
		}
		if ($('iPoisMultiresultHeader')) {
			poisMRHHeight = $('iPoisMultiresultHeader').getHeight()
		}
		if ($('iPaginationNavi')) {
			poisNaviHeight = $('iPaginationNavi').getHeight()
		}

		itineraryHeight = (panelBoxHeight - (navigomenuHeight + routeSwitchPanelHeight));
		var poisMultiresultHeight = (panelBoxHeight - navigomenuHeight - poisPanelHeight - poisMRHHeight - poisNaviHeight - 11);

		if ($$('div.pagination_body')[0]) {
			$$('div.pagination_body')[0].setStyle({
				height:  poisMultiresultHeight + 'px'
			});
		}

		if ($$('div.itinerary')[0]) {
			$$('div.itinerary')[0].setStyle({
				height:  itineraryHeight + 'px'
			});
		}
		// http://redmine.becomo/issues/3629
		/*
		if ($$('div#panelbox')[0]) {
			$$('div#panelbox')[0].setStyle({
				height: panelBoxHeight + 'px'
			});
		}
		*/
	});

	/**
	 * ???
	 */
	Event.observe(document, 'map:viewport', function(event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		var scale = event.memo.args[1] || handler.getScaleDenom();
		if(handler != undefined && geometry != undefined) {
			var coords = event.memo.args[0] || handler.getCoords();
			handler.setCoords(coords[0], coords[1], handler.toScaleId(scale));
			geometry.coords = coords;
			geometry.scale = scale;
		}
	});

    var setViewportForDefaultView = function (mvaId, coords, scale) {
        if(mvaId != undefined && !checkFlashId(mvaId)) return;
		if(handler != undefined && geometry != undefined) {
			handler.setCoords(coords[0], coords[1], handler.toScaleId(scale));
			geometry.coords = coords;
			geometry.scale = scale;
		}
    }

	/**
	 * Centruje mape na punkcie POI
	 */
	Event.observe(document, 'map:center_to_poi', function(event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
        var type = event.memo.args[0];
		var poi_id = event.memo.args[1];
		if(handler != undefined && geometry != undefined) {
			var coords = handler.getPOI(type,poi_id);
			handler.setCoords(coords[0], coords[1], 13);
			geometry.coords = [coords[0], coords[1]];
			geometry.scale = 13;
		}
	});


	var temp_nodes = undefined;
    var countId = undefined;
    var wait = function() {
        if(handler != undefined) {
            clearInterval(countId);
            handler.treeViewSetNodes(temp_nodes);
        }
    }

	/**
	 * ???
	 */
	Event.observe(document, 'map:treeViewSetNodes', function(event)
	{
        temp_nodes = event.memo.args[0];
		if(handler!=undefined) {
			handler.treeViewSetNodes(event.memo.args[0]);
        }
	});

	/**
	 * ???
	 */
	Event.observe(document, 'map:boundBox', function(event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		var bbox = event.memo.args[0] || handler.getViewPort();
		pois_geometry.setBBox({	left:bbox[0],
			right:bbox[1],
			top:bbox[2],
			bottom:bbox[3]});
		if(handler != undefined && geometry != undefined) {
			handler.fitBBox(bbox.left, bbox.top, bbox.right, bbox.bottom);
			geometry.coords = handler.getCoords();
			geometry.scale = handler.getScaleDenom();
		}
	});

	/**
	 * Ustawia boundBox dla tablicy tras.
	 */
	Event.observe(document, 'map:routesBoundBox', function(event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		var bbox = expandBoundBox(event.memo.args[0]) || handler.getViewPort();
		pois_geometry.setBBox({	left:bbox[0],
			right:bbox[1],
			top:bbox[2],
			bottom:bbox[3]});
		if(handler != undefined && geometry != undefined) {
			handler.fitBBox(bbox.left, bbox.top, bbox.right, bbox.bottom);
			geometry.coords = handler.getCoords();
			geometry.scale = handler.getScaleDenom();
		}
	});

	/**
	 * ???
	 */
	Event.observe(document, 'map:route', function(event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		if(handler != undefined && geometry != undefined) {
			var route = event.memo.args[0] || false;
			if(route != false) {
				handler.routeOff();
				handler.routeOn(route.token, route.left, route.top, route.right, route.bottom, route.type);
				geometry.route = route;
			} else {
				handler.routeOff();
				geometry.route = undefined;
			}
		}
	});

	/**
	 * Wyswietlanie kilku tras
	 */
	Event.observe(document, 'map:routes', function(event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		if(handler != undefined && geometry != undefined) {
			var routes = event.memo.args[0] || false;
			if (routes != false) {
				var tokens = [routes[0].token];
				for (var i = 1; i < routes.length; i++) {
					if(routes[i] != false) {
						tokens.push(routes[i].token);
					} else {
						handler.routeOff();
					}
				}
				var boundBox = expandBoundBox(routes);
				['poi-r', 'poi-s', 'poi-1'].each(function(lay) {
					handler.removePopups(lay);
				});
				handler.routeOff();
				handler.routesOn(tokens, boundBox.left, boundBox.top, boundBox.right, boundBox.bottom);
			} else {
				handler.routesOff();
			}
		}
	});

	/**
	 * ???
	 */
	Event.observe(document, 'map:POIs', function(event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		if(handler != undefined && geometry != undefined) {
			var POIs = event.memo.args[0] || handler.getPOIs();
			var layer = (geometry != undefined && geometry.layer) || 'poi-r';
			if(event.memo.args[1]!=undefined) {
				layer = event.memo.args[1];
			}
			handler.clearPOIs(layer);
			handler.setPOIs(layer, POIs);
		}
	});

	/**
	 * ???
	 */
	Event.observe(document, 'map:setPOIs', function(event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		if(handler != undefined) {
            var tooltip_tempalte_brief = undefined;

            if(event.memo.args.length > 2 && event.memo.args[2] != undefined && event.memo.args[2].brief != undefined) {
                tooltip_tempalte_brief = event.memo.args[2].brief;
            } else {
                tooltip_tempalte_brief = tooltip_brief_body;
            }

            var tooltip_tempalte_details = undefined;
            if(event.memo.args.length > 2 && event.memo.args[2] != undefined && event.memo.args[2].detailed != undefined) {
                tooltip_tempalte_details = event.memo.args[2].detailed;
            } else {
                tooltip_tempalte_details = tooltip_detailed_body;
            }

            var tooltip_tempalte_label = undefined;
            if(event.memo.args.length > 2 && event.memo.args[2] != undefined && event.memo.args[2].label != undefined) {
                tooltip_tempalte_label = event.memo.args[2].label;
            } else {
                tooltip_tempalte_label = tooltip_label_body;
            }

			var poisList = [];
			if(event.memo.args[0]!=undefined) {
				event.memo.args[0].each(function(poi, index) {

					var tooltip_brief_tmpl = new Template(tooltip_tempalte_brief);

		            if(tooltip_brief_tmpl == undefined) {
		                tooltip_brief_tmpl = '';
		            }
		            if(tooltip_detailed_tmpl == undefined) {
		                tooltip_detailed_tmpl = '';
		            }

					if(poi.image!=undefined) {
						poi.image.url = Navigo2.normalisedPoisImgURL(poi.image.url);
						poi.image.height = Math.ceil(poi.image.height* 100 / poi.image.width);
	                    poi.image.width = 100;
					}
					else {
						poi.image = {};
					}
					poi.poisImgURL = Navigo2.poisImgURL;
					poi.poisImgInternalURL = Navigo2.poisImgInternalURL;
					poi.html = Navigo2.unescape(poi.html);

					if (poi.address.zipCode != undefined && poi.address.zipCode.length > 0) {
						poi.address.zipCode = poi.address.zipCode + " ";
					}

					var tooltip_detailed_tmpl = undefined;
					if (typeof tooltip_tempalte_details == 'function') {
						var tmpl = tooltip_tempalte_details(poi);
						tooltip_detailed_tmpl = new Template(tmpl);
					} else {
						tooltip_detailed_tmpl = new Template(tooltip_tempalte_details);
					}

                    var brief = tooltip_brief_tmpl.evaluate(poi);
                    var detailed = tooltip_detailed_tmpl.evaluate(poi);
                    if(poi.info.name == undefined) {
                        brief = undefined;
                        detailed = undefined;
                    }

                    var label = poi.info.name;

                    if(tooltip_tempalte_label != undefined) {
                        var tooltip_label_tmpl = new Template(tooltip_tempalte_label);
                        label = tooltip_label_tmpl.evaluate(poi);
                    }

					if (poi.templates != undefined) {
						brief = poi.templates.brief.evaluate(poi);
						if (poi.templates.detailed != undefined) {
							detailed = poi.templates.detailed.evaluate(poi);
						} else {
							detailed = undefined;
						}
					}

					poisList[index] = [poi.x,
					                   poi.y,
					                   poi.id+'',
					                   undefined,
					                   label,
					                   brief,  /*dymek prosty*/
					                   detailed, /*dymek szczegolowy*/
					                   undefined, /* promien obwodki */
					                   Navigo2.normalisedPoisImgURL(poi.icon.url) /* sciezka do ikony */
					                   ];
				});
			}
			else {
				poisList = handler.getPOIs()
			}
			var layer = (geometry != undefined && geometry.layer) || 'poi-r';
			if(event.memo.args[1]!=undefined) {
				layer = event.memo.args[1];
			}
			handler.clearPOIs(layer);
			handler.enablePOIs(layer, true);
			handler.setPOIs(layer, poisList, handler.getScaleId(), handler.getViewPort());
		}
	});

	/**
	 * ???
	 */
	Event.observe(document, 'map:home', function(event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		if(event.memo.args.length > 0) {
			var coords = event.memo.args[0] || handler.getCoords();
			var scale = event.memo.args[1] || handler.getScaleDenom();
			handler.setHomePoint(coords, scale);
		} else {
			handler.showHomePoint();
		}
	});

	/**
	 * ???
	 */
	var callback = function(name) { return Navigo2.emit.bind(handler, name); };

	var callbackById = function(name, id) { return Navigo2.emitById.bind(handler, name, id); };

	Array.prototype.contains = function(obj) {
		var i = this.length;
		while (i--) {
			if (this[i] === obj) {
				return true;
			}
		}
		return false;
	}


	/**
	 * ???
	 */
	var setGeometry = function(data, mvaId) {
		if(handler != undefined) {
			if(global_geometry!=undefined) {
				global_geometry.coords = handler.getCoords();
				global_geometry.scale = handler.getScaleDenom();
				global_geometry.POIs = handler.getPOIs(global_geometry.layer);
				for(var i=0; i<global_geometry.POIs.length; i++) {
					global_geometry.POIs[i][3] = undefined;
				}
				if(geometry!=undefined) {
					geometry.globalPOIs = global_geometry.POIs;
				}
			}
			if(geometry != undefined) {
				var layer = geometry.layer || ['poi-r'];
				geometry.coords = handler.getCoords();
				geometry.scale = handler.getScaleDenom();
				layer.each(function(lay) {
					geometry.POIs[lay] = handler.getPOIs(lay);
				});
				geometry = undefined;
			}
			if(data != undefined) {
				geometry = data;
				if(geometry.scale != undefined && geometry.coords != undefined) {
					handler.setCoords(geometry.coords[0], geometry.coords[1], handler.toScaleId(geometry.scale));
				}
				if(geometry.route != undefined) {
					handler.routeOff();
					handler.routeOn(geometry.route.token, geometry.route.left, geometry.route.top, geometry.route.right, geometry.route.bottom, geometry.type);
				}

				var layer = geometry.layer || ['poi-r'];
				['poi-r', 'poi-s', 'poi-1'].each(function(lay) {
					handler.clearPOIs(lay);
					handler.enableHistory(lay, (layer.contains(lay) && geometry.hist == true) ? true : false);
					handler.enableRadius(lay, (layer.contains(lay) && geometry.radius == true) ? true : false);
					handler.enablePOIs(lay, (layer.contains(lay) && geometry.points == true) ? true : false);
					//alert(lay + ' ' + (lay == layer && geometry.points == true))
					if(geometry.POIs != undefined && layer.contains(lay)) {
						handler.setPOIs(lay, geometry.POIs[lay]);
					}
					if(global_geometry.layer == lay && !layer.contains(global_geometry.layer)) {
						Navigo2.emitById('map:refresh_global_pois', mvaId);
					}
				}, handler);
			}
		}
	};

	Event.observe(document, 'map:clearPOIs', function(event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		if(handler != undefined && geometry != undefined) {
			var layer = (geometry != undefined && geometry.layer) || 'poi-r';
			if(event.memo.args[1]!=undefined) {
				layer = event.memo.args[1];
			}
			handler.clearPOIs(layer);
		}
	});

	Event.observe(document, 'map:refresh_global_pois', function(/*Event*/event) {
		if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		var x1 = global_geometry.coords[0];
		var y1 = global_geometry.coords[1];
		var x2 = undefined;
		var y2 = undefined;
		if(geometry.coords != undefined) {
			x2 = geometry.coords[0];
			y2 = geometry.coords[1];
		}
		else {
			var coords = handler.getCoords();
			geometry.scale = handler.getScaleDenom();
			x2 = coords[0];
			y2 = coords[1];
		}
		if(x1==x2 && y1==y2 && global_geometry.scale == geometry.scale) {
			geometry.globalPOIs = global_geometry.POIs;
		}
		if(geometry.globalPOIs==undefined) {
			Navigo2.emitById('pois:search', event.memo.id, global_geometry.poisFilter, undefined, true, false, false, global_geometry.layer, handler.getScaleId(), handler.getViewPort());
		}
		else {
			handler.enablePOIs(global_geometry.layer, true);
			handler.setPOIs(global_geometry.layer, geometry.globalPOIs, handler.getScaleId(), handler.getViewPort());
		}
	});

	var setEvents = function(data) {
		if(handler != undefined) {
			if(events != undefined) {
				$H(events.simple).each(function(pair) { handler.clearCallback(pair.key); });
				$H(events.menu).each(function(pair) { handler.removePOIsMenu(pair.value.layer, false, pair.key)});
				$H(events.point).each(function(pair) { handler.removePOIsMenu(pair.value.layer, true, pair.key)});
				events = undefined;
			}
			if(data != undefined) {
				events = data;
				$H(events.simple).each(function(pair) {
					if (pair.value.identified) {
						handler.setCallback(pair.key, callbackById(pair.value.event));
					} else {
						handler.setCallback(pair.key, callback(pair.value.event));
					}
				} );
				$H(events.menu).each(function(pair) {
					var description = Navigo2.DAO.getMessage(pair.value.description) || pair.value.description;
					if (pair.value.identified) {
						handler.addPOIsMenu(pair.value.layer, false, pair.key, description, callbackById(pair.value.event));
					} else {
						handler.addPOIsMenu(pair.value.layer, false, pair.key, description, callback(pair.value.event));
					}
				 });
				$H(events.point).each(function(pair) {
					var description = Navigo2.DAO.getMessage(pair.value.description) || pair.value.description;
					handler.addPOIsMenu(pair.value.layer, true, pair.key, description, callback(pair.value.event)); });
			}
		}
	};

	/**
	 * Start pois refresing during scale is changing
	 */
	Event.observe(document, 'map:request_pois_updates', function(/*Event*/event) {
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		if(handler!=undefined) {
			var layer = event.memo.args[0]; /*String*/
			var size_fc = event.memo.args[1]; /*Number*/
			var shift_th = event.memo.args[2]; /*Number*/
			handler.requestPOIsUpdates(layer, size_fc, shift_th, callback(events.pois.event));
		}
	});

	/**
	 * Stop pois refresing during scale is changing
	 */
	Event.observe(document, 'map:cancel_pois_updates', function(/*Event*/event) {
		if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
        if(handler != undefined) {
			var layer = event.memo.args[0]; /*String*/
			handler.cancelPOIsUpdates(layer);
		}
	});

	/**
	 * ???
	 */
	Event.observe(document, 'map:flash', function(event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		if(handler != undefined) {
			setGeometry(event.memo.args[0], event.memo.id);
			setEvents(event.memo.args[1]);
		}
	});

	/**
	 * Wywolanie dymka prostego
	 */
	Event.observe(document, 'map:simulate_poi_mouse_over', function(event) {
		if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		var layer = event.memo.args[0];
		var poi_id = event.memo.args[1];
		handler.simulatePoiMouseOver(layer, poi_id);
	});

	/**
	 * Opuszczenie pojki przez kursor
	 */
	Event.observe(document, 'map:simulate_poi_mouse_out', function(event) {
		if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		var layer = event.memo.args[0];
		var poi_id = event.memo.args[1];
		handler.simulatePoiMouseOut(layer, poi_id);
	});

	/**
	 * Wywolanie dymka szczegolowego
	 */
	Event.observe(document, 'map:simulate_poi_mouse_click', function(event) {
		if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		var layer = event.memo.args[0];
		var poi_id = event.memo.args[1];
		handler.simulatePoiMouseClick(layer, poi_id);
	});

	/**
	 * ???
	 */
	Event.observe(document, 'map:mailto', function(event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		var coords = handler.getCoords();
		var POIs = handler.getPOIs('poi-r');
		var hrefTab = document.location.href.split("?");
		var href = hrefTab[0];

		var params = {
			x:coords[0],
			y:coords[1],
			s:handler.getScaleDenom(),
			l:handler.getCoverId(),
			ex:$('maincontent_nrc') ? true : false,
			px:[],
			py:[],
			pa:[],
            mvaId: event.memo.id
		};

		for(var i = 0; i < POIs.length; i++) {
			params.px[i] = POIs[i][0];
			params.py[i] = POIs[i][1];
			params.pa[i] = POIs[i][4];
		};

		// Trasa
		if(handler.getRouteId()) {
			params.routeAddress = Navigo2.UI.Route.addr;
			params.routeType = Navigo2.UI.Route.type;
			var pois = geometry.routePOIs;
    		if (pois) {
    			if (pois.from) {
    				params.f = pois.from.id;
    			}
    			if (pois.to) {
    				params.t = pois.to.id;
    			}
    		}
		}

                 if(Navigo2.UI.Route.departureTime != undefined) {
                    params.departureTime = Navigo2.UI.Route.departureTime.value;
                 } else {
                    params.departureTime = undefined;
                 }

		// Trasy
		if(handler.getRouteIds()) {
			params.routeAddress = Navigo2.UI.Route.addr;
			params.routeAddress2 = Navigo2.UI.Route.addr2;
			params.routeType = Navigo2.UI.Route.type;
			var pois = geometry.routePOIs;
    		if (pois) {
    			if (pois.from) {
    				params.f = pois.from.id;
    			}
    			if (pois.to) {
    				params.t = pois.to.id;
    			}
    			if (pois.to2) {
    				params.u = pois.to2.id;
    			}
    		}
		}

		// Biezacy panel
		if (currentPanel != undefined) {
			params.p = currentPanel;
			if (currentPanel == 'pois') {
				params.c = currentSearch.category;
				params.r = currentSearch.radius;
			}
		}
		//alert(Object.toQueryString(params));
		var loc = href + "?";

		var id = document.location.href.replace("#", "").toQueryParams().id

		if(id!=undefined) {
			loc += 'id=' + id + '&';
		}

        loc += 'mvaId=' + event.memo.id + '&';

        loc += 'location=' + Navigo2.encode64(Object.toQueryString(params));

        var message = escape(loc) + "</br>";
		message += "<br/><br/>" + Navigo2.DAO.getMessage('javascript.print.title.midCoord') + ": " + coords[0] + ", " + coords[1];
		message += "<br/>"+Navigo2.DAO.getMessage('javascript.print.title.dateGen')+": " + getCurrentDate();

		var subject = Navigo2.DAO.getMessage('javascript.map.buttons.label.mail');
		var win = window.open('mailto:?subject=' + subject + '&body=' + message, 'mailto');
		if(win && win.open && !win.closed) win.close();
	});

	/**
	 * ???
	 */
	Event.observe(document, 'map:pois_mailto', function(event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
        var poi_id = event.memo.args[0];
		var coords = handler.getCoords();
		var href = document.location.href.split("?")[0];

		var filter = cache.last_pois_search;
		var pagingFilter = cache.last_pois_paging;

		var params = {
			x:coords[0],
			y:coords[1],
			s:handler.getScaleDenom(),
			l:handler.getCoverId(),
			ex:(panel.map.getWidth() > 600)
		};

		if(filter.keyword!=undefined) params.fk = filter.keyword;
    	if(filter.id) params.fid = filter.id;
    	if(filter.categories) params.fc = filter.categories;
    	if(filter.extIds) params.feids = filter.extIds;
    	if(filter.extCategories) params.fecs = filter.extCategories;
    	if(filter.flag) params.ff = filter.flag;
    	if(filter.addr) { params.fx = filter.addr.x; params.fy = filter.addr.y; params.fsys = filter.addr.sys; }

    	if(pagingFilter != undefined) {
    		if(pagingFilter.page != undefined) params.fp = pagingFilter.page;
    		if(pagingFilter.perPage != undefined) params.fpp = pagingFilter.perPage;
    	}

		// Trasa
		if(handler.getRouteId()) {
			params.routeAddress = Navigo2.UI.Route.addr;
			params.routeType = Navigo2.UI.Route.type;
		}

		var flt = {
			id:  poi_id
		};
		Navigo2.emitById('pois:getById', event.memo.id, false, poi_id, function(poi) {

            var loc = href + "?location=" + Navigo2.encode64(Object.toQueryString(params))+"&";
            loc += "mvaId=" + event.memo.id;

            var message = escape(loc) + "<br/>"

            message += "<br/><br/>" + Navigo2.DAO.getMessage('javascript.print.title.midCoord') + ": " + coords[0] + ", " + coords[1];
            message += "<br/>"+Navigo2.DAO.getMessage('javascript.print.title.dateGen')+": " + getCurrentDate();
			message += "<br/><br/>" + poi.info.name;
			message += "<br/>" + poi.info.description;
			var subject = Navigo2.DAO.getMessage('javascript.map.buttons.label.mail');
			var win = window.open('mailto:?subject=' + subject + '&body=' + message, 'mailto');
			if(win && win.open && !win.closed) win.close();
		});
	});

	var getCurrentDate = function() {
		var date = new Date();
		var result = "";
		result += date.getFullYear() + "-";
		result += (date.getMonth() + 1) + "-";
		result += date.getDate();
		return result;
	};

	function stripHTML(html){
        var re = /(<([^>]+)>)/gi;
        return html.replace(re, "");
	}

	/**
	 * ???
	 */
	Event.observe(document, 'map:pdf', function(event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		var coords = handler.getCoords();

		var width = panel.map.getWidth();
		var ratio = 450 / 500; // height and width set in export.jrxml
		var height = Math.round(width * ratio);

                var l = 0;
                try {
                    l = handler.getCoverId();
                } catch (ex) {
                    l = handler.getNavigoActiveLayer();
                }

		var params = {
			x:coords[0],
			y:coords[1],
			s:handler.getScaleDenom(),
			l:l,
			w:width,
			h:height,
			pid:[],
			rx:[],
			ry:[],
			rid:[],
			rnum:[],
			uname:uname,
			adapter:adapter,
			locale:locale,
			iconURL:Navigo2.poisImgInternalURL
		};

		var i = 0;
		['poi-1', 'poi-s'].each(function(lay) {
			var POIs = handler.getPOIs(lay);
			for(var j = 0; j < POIs.length; j++) {
				params.pid[i] = POIs[j][2];
				i++;
			};
		});

		i = 0;
		['poi-r'].each(function(lay) {
			var POIs = handler.getPOIs(lay);
			for(var j = 0; j < POIs.length; j++) {
				params.rx[i] = POIs[j][0];
				params.ry[i] = POIs[j][1];
				params.rid[i] = POIs[j][2];
				params.rnum[i] = POIs[j][3];
				i++;
			};
		});

		// Trasa
		if(handler.getRouteId()) {
			params.routeId = handler.getRouteId();
			params.left = handler.getRouteLeft();
			params.right = handler.getRouteRight();
			params.top = handler.getRouteTop();
			params.bottom = handler.getRouteBottom();
            params.routeType = handler.getRouteType();
            if(params.routeType == 'Bus' && Navigo2.UI.Route.busImages != undefined) {

                params.ubi = Navigo2.UI.Route.busImages.urlBusImage;
                params.usi = Navigo2.UI.Route.busImages.urlBusImage;
                params.iubi = Navigo2.UI.Route.busImages.internalUrlBusImage;
                params.iusi = Navigo2.UI.Route.busImages.internaUrlBusImage;
                params.sf =  Navigo2.UI.Route.busImages.specialFormula;
                if(Navigo2.UI.Route.busImages.changeImage != undefined ) {

                    params.uci = Navigo2.UI.Route.busImages.changeImage.url;
                    params.iuci = Navigo2.UI.Route.busImages.changeImage.iurl;
                    params.ch = Navigo2.UI.Route.busImages.changeImage.h;
                    params.cw = Navigo2.UI.Route.busImages.changeImage.w;
                    params.cfs = Navigo2.UI.Route.busImages.changeImage.fontSize;
                    params.cfc = Navigo2.UI.Route.busImages.changeImage.fontColor;
                    params.pcx = Navigo2.UI.Route.busImages.changeImage.posX;
                    params.pcy = Navigo2.UI.Route.busImages.changeImage.posY;
                }
            }

		}

		// Tablica tras
		if(handler.getRouteIds()) {
			params.routeIds = handler.getRouteIds();
			params.left = handler.getRouteLeft();
			params.right = handler.getRouteRight();
			params.top = handler.getRouteTop();
			params.bottom = handler.getRouteBottom();
		}

		if(handler.getObjectId()) {
			params.oid = handler.getObjectId();
			params.pa[0] = handler.getObjectAddress();
		}

		var page = Navigo2.normalisedURL("pdf.do?" + Object.toQueryString(params));
                var pdfDone = false
                if(page.length > 2048){
                    try{
                        var queryParams = Object.toQueryString(params);
                        var queryParamsSplited = queryParams.split('&');
                        var myPostForm = document.createElement("form");
                        myPostForm.setAttribute("method", "POST");
                        myPostForm.setAttribute("target", "pdf");
                        myPostForm.setAttribute("action", Navigo2.normalisedURL("pdf.do"));
                        myPostForm.setAttribute("onsubmit", "javascript:window.open('pdf.do?close=true','menubar=no, toolbar=no, location=no, scrollbars=no, resizable=no, status=no, width=800, height=600')");
                        for(var param = 0; param < queryParamsSplited.length; param++){
                            var keyvalue = queryParamsSplited[param].split('=');
                            var myInput = document.createElement("input");
                            myInput.setAttribute('type', 'hidden');
                            myInput.setAttribute('name', keyvalue[0]);
                            myInput.setAttribute('value', keyvalue[1]);
                            myPostForm.appendChild(myInput);
                        }
                        $$('head')[0].appendChild(myPostForm);
                        myPostForm.submit();
                        pdfDone = true;
                    }catch(ex){
                    }
                }
                if(pdfDone == false){
                    var win = window.open(page, "pdf", 'menubar=no, toolbar=no, location=no, scrollbars=no, resizable=no, status=no, width=800, height=600');
                }
	});

	/**
	 * ???
	 */
	Event.observe(document, 'map:print', function(event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		var coords = handler.getCoords();

        var width = panel.map.getWidth();
		var ratio = 450 / 500; // unification of pdf and print view
		var height = Math.round(width * ratio);

                var l = 0;
                try {
                    l = handler.getCoverId();
                } catch (ex) {
                    l = handler.getNavigoActiveLayer();
                }

		var params = {
			x:coords[0],
			y:coords[1],
			s:handler.getScaleDenom(),
			l:l,
			w:width,
			h:height,
			px:[],
			py:[],
			pid:[],
			pnum:[],
			pa:[],
			rx:[],
			ry:[],
			rid:[],
			rnum:[],
			uname:uname,
			adapter:adapter,
			locale:locale,
			iconURL:Navigo2.poisImgInternalURL
		};

		var i = 0;
		['poi-1', 'poi-s'].each(function(lay) {
			var POIs = handler.getPOIs(lay);
			for(var j = 0; j < POIs.length; j++) {
				params.px[i] = POIs[j][0];
				params.py[i] = POIs[j][1];
				params.pid[i] = POIs[j][2];
				params.pnum[i] = POIs[j][3];
				params.pa[i] = stripHTML(POIs[j][4]);
				i++;
			};
		});

		i = 0;
		['poi-r'].each(function(lay) {
			var POIs = handler.getPOIs(lay);
			for(var j = 0; j < POIs.length; j++) {
				params.rx[i] = POIs[j][0];
				params.ry[i] = POIs[j][1];
				params.rid[i] = POIs[j][2];
				params.rnum[i] = POIs[j][3];
				i++;
			};
		});

		//Pojedyncza trasa
		if(handler.getRouteId()) {
			params.routeId = handler.getRouteId();
			params.left = handler.getRouteLeft();
			params.right = handler.getRouteRight();
			params.top = handler.getRouteTop();
			params.bottom = handler.getRouteBottom();
            params.routeType = handler.getRouteType();
            if(params.routeType == 'Bus' && Navigo2.UI.Route.busImages != undefined) {

                params.ubi = Navigo2.UI.Route.busImages.urlBusImage;
                params.usi = Navigo2.UI.Route.busImages.urlBusImage;
                params.iubi = Navigo2.UI.Route.busImages.internalUrlBusImage;
                params.iusi = Navigo2.UI.Route.busImages.internaUrlBusImage;
                params.sf =  Navigo2.UI.Route.busImages.specialFormula;
                if(Navigo2.UI.Route.busImages.changeImage != undefined ) {

                    params.uci = Navigo2.UI.Route.busImages.changeImage.url;
                    params.iuci = Navigo2.UI.Route.busImages.changeImage.iurl;
                    params.ch = Navigo2.UI.Route.busImages.changeImage.h;
                    params.cw = Navigo2.UI.Route.busImages.changeImage.w;
                    params.cfs = Navigo2.UI.Route.busImages.changeImage.fontSize;
                    params.cfc = Navigo2.UI.Route.busImages.changeImage.fontColor;
                    params.pcx = Navigo2.UI.Route.busImages.changeImage.posX;
                    params.pcy = Navigo2.UI.Route.busImages.changeImage.posY;
                }
            }
		}

		// Tablica tras
		if(handler.getRouteIds()) {
			params.routeIds = handler.getRouteIds();
			params.left = handler.getRouteLeft();
			params.right = handler.getRouteRight();
			params.top = handler.getRouteTop();
			params.bottom = handler.getRouteBottom();
		}

		if(handler.getObjectId()) {
			params.oid = handler.getObjectId();
			params.pa[0] = handler.getObjectAddress();
		}

                var queryParams = Object.toQueryString(params);
                var queryParamsSplited = queryParams.split('&');
                var myPostForm = document.createElement("form");
                myPostForm.setAttribute("method", "POST");
                myPostForm.setAttribute("target", "fenster");
                myPostForm.setAttribute("action", Navigo2.normalisedURL("print.do"));
                myPostForm.setAttribute("onsubmit", "javascript:window.open('print.do','menubar=no, toolbar=no, location=no, scrollbars=no, resizable=no, status=no, width=800, height=600')");
                for(var param = 0; param < queryParamsSplited.length; param++){
                    var keyvalue = queryParamsSplited[param].split('=');
                    var myInput = document.createElement("input");
                    myInput.setAttribute('type', 'hidden');
                    myInput.setAttribute('name', keyvalue[0]);
                    myInput.setAttribute('value', keyvalue[1]);
                    myPostForm.appendChild(myInput);
                }
                $$('head')[0].appendChild(myPostForm);
                myPostForm.submit();
	});

	/**
	 * Legenda
	 */
	//Element.insert($('wrapper'), { before: "<iframe src='#' name='iframe' id='iframe' frameborder='0' scrolling='no' allowTransparency='true' onclick=\"Navigo2.emit('legend:close');\"></iframe>" });
	Element.insert($('wrapper'), { before: "<div id='iframe2'></div>" });

	//var legendWindow = $('iframe');
	var legendWindow2 = $('iframe2');
	Event.observe(document, 'map:legend', function(event)
	{
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		var scale = handler.getScaleDenom();
		var href = document.location.href.split("?")[0];
		//legendWindow.style.display = 'block';
		legendWindow2.style.display = "block";
		doResize();

		var url = Navigo2.normalisedURL("default.do?viewName=component.legend." + scale);
		Navigo2.DAO.ask(url, function(html) {
			html = Navigo2.normalisedHTML(html);
			legendWindow2.innerHTML = html;
		});
	});

	var doResize = function(event) {
		if(legendWindow2.style.display == 'block') {
		    var height = window.document.viewport.getHeight();
		    var width = window.document.viewport.getWidth();
			var offset = window.document.viewport.getScrollOffsets();
			var top = offset.top + ((height-450) / 2);
			var left = offset.left + ((width-740) / 2);
			//legendWindow.setStyle({ top: top + "px", left: left + "px"});
			legendWindow2.setStyle({ top: top + "px", left: left + "px"});
		}

		Navigo2.emit('map:resize');
	};

	Event.observe(window, 'resize', doResize);
	Event.observe(window, 'scroll', doResize);

	Event.observe(document, 'legend:close', function(event)
	{
	    legendWindow2.style.display = 'none';
	    //legendWindow.style.display = 'none';
	});

    Event.observe(document, 'map:poisSearchWithScale', function(/*Event*/e) {
        if(e.memo != undefined && !checkFlashId(e.memo.id)) return;

        var category = e.memo.args[1];
        var categoryExt = e.memo.args[1];

        //wiem ze dziwinie wyglada zmian na prosbe Konrada :(
        if(category.startsWith('id_')) {
            category = category.gsub('id_','');
            categoryExt = undefined;
        } else {
            categoryExt = category.gsub('ext_','');
            category = undefined;
        }

        global_geometry.poisFilter = {};
        global_geometry.poisFilter.extIds = e.memo.args[0];
        global_geometry.poisFilter.extCategories = category;
        global_geometry.poisFilter.categories = categoryExt;
        global_geometry.poisFilter.flag = e.memo.args[2];

        var filter = {
            type : 'tree_category',
            categories : category,
            extCategories : categoryExt
        };

        Navigo2.emitById('pois:search', e.memo.id, filter, undefined, e.memo.args[3], e.memo.args[4], false, 'poi-1', handler.getScaleId(), handler.getViewPort());
    });

	Event.observe(document, 'map:refresh', function(/*Event*/e) {
		if(e.memo != undefined && !checkFlashId(e.memo.id)) return;
		var event = e.memo.args[0];
		var scale = event.memo.args[2];
		var bbox = event.memo.args[3];
		var last_addr = e.memo.args[1]; /*Address*/
		var token = e.memo.args[2];
		var category = e.memo.args[3];
		Navigo2.info('javascript.info.dataReading');
		if (cache.last_addr_pois != undefined) {
            if(cache.last_addr_pois != undefined) {
                Navigo2.DAO.getPoisNearTo(last_addr.x92, last_addr.y92, scale, bbox, token, category, /*locale,*/ function(/*Object*/data) {
                    Navigo2.info(false);
                    if(data != undefined) {
                        pois_geometry.setBBox(  { left: event.memo.args[2][0],
                                         right: event.memo.args[2][1],
                                         top: event.memo.args[2][2],
                                         bottom: event.memo.args[2][3]
                                        });
                        pois_geometry.setScale(event.memo.args[1]);
                        Navigo2.emitById('map:setPOIs', e.memo.id, data.pois, 'poi-1');
                        Navigo2.emitById("map:POIs", e.memo.id,  [[last_addr.x92, last_addr.y92, "0", 0, last_addr.full]]);
                    }
                });
            }
		} else if (cache.last_addr_nearest != undefined) {
			if (last_addr != undefined) {
				Navigo2.DAO.getPoiNearestTo(last_addr.x92, last_addr.y92, event.memo.args[1], /*token, category,*/ function(/*Object*/data) {
					Navigo2.info(false);
					if(data != undefined) {
						pois_geometry.setBBox(  { left: event.memo.args[2][0],
									 right: event.memo.args[2][1],
									 top: event.memo.args[2][2],
									 bottom: event.memo.args[2][3]
									});
						pois_geometry.setScale(event.memo.args[1]);
						Navigo2.emitById('map:setPOIs', e.memo.id, data.pois, 'poi-1');
						Navigo2.emitById("map:POIs", e.memo.id, [[last_addr.x92, last_addr.y92, "-2", -2, last_addr.full]], 'poi-r');
					}
				});
			};
		}
		else if (cache.last_pois != undefined) {
			Navigo2.DAO.findPois(cache.last_pois.token, cache.last_pois.categories, cache.last_pois.flag, scale, bbox, function(data) {
				Navigo2.info(false);
				if(data.pois != undefined) {
					Navigo2.emitById('map:setPOIs', e.memo.id, data.pois, 'poi-1');
				}
			});
		}
		else if (cache.last_pois_by_ext != undefined) {
			Navigo2.DAO.findPoisByExtId(cache.last_pois_by_ext.extIds, cache.last_pois_by_ext.extCategories, cache.last_pois_by_ext.flag, scale, bbox, function(data) {
				Navigo2.info(false);
				if(data.pois != undefined) {
					Navigo2.emitById('map:setPOIs', e.memo.id, data.pois, 'poi-1');
				}
				else {
					Navigo2.emitById('map:setPOIs', e.memo.id, [], 'poi-1');
				}
			});
		}
		else if(cache.last_pois_search != undefined) {
			Navigo2.DAO.searchPOIs( cache.last_pois_search, undefined, scale, bbox, function(data) {
				Navigo2.info(false);
				if(data.pois != undefined) {
					Navigo2.emitById('map:setPOIs', e.memo.id, data.pois, 'poi-1');
				}
				else {
					Navigo2.emitById('map:setPOIs', e.memo.id, [], 'poi-1');
				}
			});
		} else if(cache.last_pois_route != undefined) {
             Navigo2.DAO.getBusStaions(cache.last_pois_route.token, handler.getScaleDenom(), cache.last_pois_route.busImages, function (data) {
                if (data != undefined) {
                    if(data.pois != undefined) {

                        Navigo2.emitById('map:setPOIs', e.memo.id, data.pois, 'poi-1', cache.last_pois_route.busTooltips );

                    }
                } else {
                        Navigo2.emitById('map:setPOIs', e.memo.id, [], 'poi-1', cache.last_pois_route.busTooltips);
				}

            });
            Navigo2.info(false);
    	} else {
			Navigo2.info(false);
		}
	});


	Event.observe(document, 'map:show_pois', function(/*Event*/e)
	{
        if(e.memo != undefined && !checkFlashId(e.memo.id)) return;
		var event = e.memo.args[0];
		var last_addr = e.memo.args[1]; /*Address*/
		var token = e.memo.args[2];
		var category = e.memo.args[3];
		if(last_addr != undefined) {
			Navigo2.info("Odczytuję dane...");
			Navigo2.DAO.getPoisNearTo(last_addr.x92, last_addr.y92, handler.getScaleId(), undefined, token, category, /*locale,*/ function(/*Object*/data)
			{
				if(data != undefined) {
					Navigo2.info(false);
					var bbox = data.bbox;
			        if (bbox != undefined) {
		        		pois_geometry.setBBox({	left:bbox[0],
	    		    					right:bbox[1],
	        							top:bbox[2],
	        							bottom:bbox[3]});
		        		if(handler.getScaleId() != undefined) {
					        pois_geometry.setScale(handler.getScaleId());
					    }
	        		}

					Navigo2.emitById('map:setPOIs', e.memo.id, data.pois, 'poi-1');
					Navigo2.emitById("map:POIs", e.memo.id, [[last_addr.x92, last_addr.y92, "0", 0, last_addr.full]]);
				}
			});
		}
	});

	Event.observe(document, 'map:show_nearest_poi', function(/*Event*/e)
	{
        if(e.memo != undefined && !checkFlashId(e.memo.id)) return;
		var event = e.memo.args[0];
		var last_addr = e.memo.args[1]; /*Address*/
		if(last_addr != undefined) {
			Navigo2.info("Odczytuję dane...");
			Navigo2.DAO.getPoiNearestTo(last_addr.x92, last_addr.y92, handler.getScaleId(), /*token, category,*/ function(/*Object*/data)
			{
				if(data != undefined) {
					Navigo2.info(false);
					var bbox = data.bbox;
			        if (bbox != undefined) {
		        		pois_geometry.setBBox({	left:bbox[0],
	    		    					right:bbox[1],
	    		    					top:bbox[2],
	        							bottom:bbox[3]});
		        		if(handler.getScaleId() != undefined) {
					        pois_geometry.setScale(handler.getScaleId());
					    }
	        		}

					Navigo2.emitById('pois:present', event.memo.id, { poisDetails: data });
					Navigo2.emitById("map:POIs", e.memo.id, [[last_addr.x92, last_addr.y92, "0", 0, last_addr.full]]);
                    if(data.pois != undefined) {
                        var last_pois = { pois : data.pois,
                                          scale : handler.getScaleId(),
                                          last_addr : last_addr,
                                          bbox: bbox
                        };
                        Navigo2.emitById('nearestpoi:last_poi_save', event.memo.id, last_pois);
                    } else {
                        Navigo2.emitById('nearestpoi:last_poi_save', event.memo.id, undefined);
                    }
				}
			});

            Navigo2.emitById('nearestpoi:last_poi_save', event.memo.id, undefined);
		}
	});




	/**
	 * Prezentacja punktow poi na mapie
	 * @Deprecated zamiast tego map:setPOIs
	 */
	Event.observe(document, 'pois:present', function(/*Event*/event)
	{
		// Map
   		pois_geometry.clearPOIs();
		var tooltip_brief_tmpl = new Template(tooltip_brief_body);
		var tooltip_detailed_tmpl = new Template(tooltip_detailed_body);
		var pois = event.memo.args[0].poisDetails.pois;
		if(pois != undefined) {
			pois.each(function(poi, index) {
				pois_geometry.getPOIs().set(poi.id,
						[poi.x,
						 poi.y,
						 poi.id+'',
						 undefined,
						 poi.info.name,
						 tooltip_brief_tmpl.evaluate(poi),
						 tooltip_detailed_tmpl.evaluate(poi),
						 undefined,
						 Navigo2.normalisedPoisImgURL(poi.icon.url)]);
			});
		}
		Navigo2.emitById('map:geometry', id, pois_geometry);

		// Info
		if(event.memo.info == true) { alert("Odświeżono pozycje punktów"); }
	});

	Event.observe(document, 'map:decodeLocation', function(event)
	{
		var qry = document.location.href.replace("#", "").toQueryParams();
		if(qry.location && qry.mvaId == event.memo.id) {
			qry = Navigo2.decode64(qry.location).toQueryParams();

            if(qry.mvaId == event.memo.id) {
				if(qry.p != undefined && qry.p == 'address') {
					var poiA = Object.isArray(qry.pa) ? qry.pa : [qry.pa].compact();
					Navigo2.emitById('address:reload', qry.mvaId, poiA);
				} else if(qry.p != undefined && qry.p == 'nearestpoi') {
					var poiA = Object.isArray(qry.pa) ? qry.pa : [qry.pa].compact();
					Navigo2.emitById('nearestpoi:reload', qry.mvaId, poiA);
				} else if(qry.p != undefined && qry.p == 'pois') {
					var poiA = Object.isArray(qry.pa) ? qry.pa : [qry.pa].compact();
					Navigo2.emitById('pois:reload', qry.mvaId, poiA, qry.c, qry.r);
				} else {
					if(geometry == undefined) {
						geometry = {
							coords: undefined,
							scale: undefined,
							cover: undefined,
							POIs: undefined
						}
					}

                                        if(qry.departureTime != undefined && Navigo2.UI.Route.departureTime != undefined) {
                                            Navigo2.UI.Route.departureTime.value = qry.departureTime;
                                        }

					geometry.coords = [qry.x, qry.y];
					geometry.scale = qry.s;
					geometry.cover = qry.l;

					var poiX = Object.isArray(qry.px) ? qry.px : [qry.px].compact();
					var poiY = Object.isArray(qry.py) ? qry.py : [qry.py].compact();
					var poiA = Object.isArray(qry.pa) ? qry.pa : [qry.pa].compact();

					if(poiA!=undefined && poiA.length > 0) {
						if(poiX.length > 0 && poiY.length > 0) {
							geometry.POIs = [[poiX[0], poiY[0], "0", 0, poiA[0]]];
						}
					}

					if(qry.routeAddress != undefined && qry.routeAddress.length > 0) {
						var routeIds = [];
						if (qry.f) {
							routeIds.push(qry.f);
						}
						if (qry.t) {
							routeIds.push(qry.t);
						}
						if (qry.u) {
							routeIds.push(qry.u);
						}
						if (routeIds.length > 0) {
							var filter = {id: routeIds};
							Navigo2.DAO.searchPOIs(filter, undefined, undefined, undefined, function(data) {
								if(data.pois != undefined) {
									geometry.routePOIs = {
									};
									for (var i = 0; i < data.pois.length; i++) {
										if (qry.f == data.pois[i].id) {
											geometry.routePOIs.from = data.pois[i];
										}
										if (qry.t == data.pois[i].id) {
											geometry.routePOIs.to = data.pois[i];
										}
										if (qry.u == data.pois[i].id) {
											geometry.routePOIs.to2 = data.pois[i];
										}
									}
								}
							});
						}
						Navigo2.emitById('route:show', qry.mvaId);
						/* Ten fragment zostaje tylko dla IKEA */
						if (qry.routeAddress2 != undefined && qry.routeAddress2.length > 0) {
							Navigo2.emitById('route:reloadRoutes', qry.mvaId, qry.routeAddress, qry.routeAddress2, qry.routeType, geometry.routePOIs);
						} else {
							Navigo2.emitById('route:reload', qry.mvaId, qry.routeAddress, qry.routeType, geometry.routePOIs);
						}
						/***************************************/
					}

					var filter = {
						keyword: qry.fk,
						id: qry.fid,
						categories: qry.fc,
						extIds: qry.feids,
						extCategories: qry.fecs,
						flag: qry.ff,
						addr: {x: qry.fx, y: qry.fy, sys: qry.fsys}
					};

					var pagingFilter = {
						page: qry.fp,
						perPage: qry.fpp
					};

					Navigo2.emitById('map:viewport', qry.mvaId, geometry.coords, geometry.scale);
					Navigo2.emitById('map:home', qry.mvaId, geometry.coords, geometry.scale);

					if(qry.fp!=undefined) {
						Navigo2.emitById('pois:show',qry.mvaId);
						Navigo2.emitById('pois:search', event.memo.id, filter, pagingFilter, true, false, true, 'poi-s');
					}
				}
			}

		} else {
			geometry.cover = "3";
		}
		Navigo2.emitById('map:screen_initialised', id);
	});

        Event.observe(document, 'map:serchPoiForCategory', function(/*Event*/e) {
        if(e.memo != undefined && !checkFlashId(e.memo.id)) return;


        global_geometry.poisFilter = {};
        global_geometry.poisFilter.extIds = undefined;
        global_geometry.poisFilter.extCategories = e.memo.args[0];


        var filter = {
            type : 'tree_category',
            extCategories : e.memo.args[0]
        };

        Navigo2.emitById('pois:search', e.memo.id, filter, undefined, true, false, false, 'poi-1', handler.getScaleId(), handler.getViewPort());
    });

    Event.observe(document, 'map:hideCategoryPois', function(/*Event*/e) {
        if(e.memo != undefined && !checkFlashId(e.memo.id)) return;
        Navigo2.emitById('map:clear_last_pois' ,  e.memo.id )
        Navigo2.emitById('map:setPOIs', e.memo.id, [], 'poi-1', true);
        Navigo2.emitById('map:request_pois_updates', e.memo.id, 'poi-1', 1.0, 0.8);
    });

};


/**
 * Uaktualnia flashowe drzewo kategorii.
 */
function updateCategoryTreeView(id) {
	Navigo2.DAO.getPoisCategories(function (data) {
		if(data.categories) {
			var nodes_str = buildTree(data.categories);

			var nodes = eval('nodes=[' +nodes_str+ ']');

		    Navigo2.emitById("map:treeViewSetNodes", id, nodes);

		}
	});
}

/**
 * Buduje rekurencyjnie drzewo kategorii.
 */
function buildTree(categories) {
	if(categories==undefined)
		return '';

	var categoryTemplate = new Template('["#{externalId}", "#{name}", ["#{image_url}", #{image_width}, #{image_height}], [#{child}]]');
	var nodes_tmp = '';



	categories.each(function(category) {

            var id = undefined;

            if(category.externalId) {
                id = 'ext_' +  category.externalId;
            } else {
                id = 'id_' +  category.id;
            }
            values = {
				externalId: id,
				name: category.name,
				image_url: Navigo2.normalisedPoisImgURL(category.icon.url),
				image_width: category.icon.width,
				image_height: category.icon.height,
				child: buildTree(category.categories)
			};

			nodes_tmp = nodes_tmp + categoryTemplate.evaluate(values) + ',';
	});

	if (nodes_tmp.charAt(nodes_tmp.length-1) == ",") {
		nodes_tmp = nodes_tmp.slice(0, nodes_tmp.length-1);
	}

	return nodes_tmp;
}
