

/**
 * ???
 */
Navigo2.UI.Map = function(	/*HTMLElement*/element, 
							/*SWFHelper.FlashFactory*/factory,
							/*String*/id,
							/*String*/params) {

	var panel = $(element).cloneNode(false);
	
	var initScreen = undefined;
    var initBBox = 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;
    };
	
	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();
        

	});

    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);
		}
	});

	function setInitialScreen() {
		var qry = document.location.href.replace("#", "").toQueryParams();
		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);
					
					//pois_geometry.setScale(scale);
					/*if(handler != undefined && geometry != undefined) {
						handler.setCoords(data.screen.x, data.screen.y, handler.toScaleId(data.screen.scale));
						geometry.coords = [data.screen.x, data.screen.y];
						geometry.scale = data.screen.scale;
					}*/

					Navigo2.emitById("map:home", id, [data.screen.x, data.screen.y], data.screen.scale);
					Navigo2.emitById('map:screen_initialised', id );
				}
			});
		}	
	}

    Event.observe(document, 'map:setDefaultView', function(event) {
        if(event.memo != undefined && !checkFlashId(event.memo.id)) return;

        var qry = document.location.href.replace("#", "").toQueryParams();
		if(!qry.location) {
			Navigo2.DAO.getInitialScreen(function (data) {
				if (data != undefined && data.screen != undefined) {
					setViewportForDefaultView(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, initBBox);
				}
			});
		}
    });
	
	Event.observe(document, 'map:screen_initialised', function(/*Event*/event) {
		if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		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) {
			//geometry.layer = 'poi-s';
			//Navigo2.emitById("map:POIs", event.memo.id, []);
			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);
		}
		//Navigo2.emitById('pois:getById', event.memo.id, true, 2);
		//Navigo2.emitById('pois:findByExtId', 'mva', undefined, 'ias0061kik0vK3RF48g1l256H4el6C73QGM15J04sO811h2Z7i2666knckjO4e5n5', 0, true, false);
	});

	
	/**
	 * ???
	 */
	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);
					var qry = document.location.href.replace("#", "").toQueryParams();
					if(qry.location) {
						Navigo2.emitById('map:decodeLocation', event.memo.id);
					} else {
						if(Navigo2.DAO.getPackage() == 'gold' && (initScreen || initAction == Navigo2.USER_SCREEN)) {
							setInitialScreen();
						}
						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;
		}
		// Navigo2.emitById("map:panelBoxResize", event.memo.id);
	});

	/**
	 * ???
	 */
	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'
			});
		}
		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();
		//pois_geometry.setScale(scale);
		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;
		//pois_geometry.setScale(scale);
		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];
		//pois_geometry.setScale(scale);
		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;
		}
	});
	

	/**
	 * ??? 
	 */
	Event.observe(document, 'map:treeViewSetNodes', function(event)
	{
		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();
		}
	});
	
	/**
	 * ???
	 */
	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);
				geometry.route = route;
			} else {
				handler.routeOff();
				geometry.route = undefined;
			}
		}
	});
	
	/**
	 * ???
	 */
	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.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);
                    }
					
					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);
			/*var bbox = handler.getViewPort();*/
			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--) {
			//alert(i + ' ' + this[i] + ' ' + obj);
			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);
				}	
	
				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:refresh_global_pois', function(/*Event*/event) {
		if(event.memo != undefined && !checkFlashId(event.memo.id)) return;
		/*handler.enablePOIs(lay, true);
		handler.setPOIs(lay, global_geometry.POIs);*/
		//alert(global_geometry.coords + '\n' + geometry.coords + '\n\n' + global_geometry.scale + '\n' + geometry.scale);
		//alert([1,2].compare([1,2]));
		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];
		}
		//alert(global_geometry.scale + '\n' + geometry.scale + '\n\n' + x1 + ', ' + y1 + '\n' + x2 + ', ' + y2);
		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 {
			//alert(global_geometry.layer + '\n' + geometry.globalPOIs);
			handler.enablePOIs(global_geometry.layer, true);
			handler.setPOIs(global_geometry.layer, geometry.globalPOIs, handler.getScaleId(), handler.getViewPort());
			//handler.setPOIs('poi-1', 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 hrefParams;
		if(hrefTab[1]!=undefined) {
			hrefParams = hrefTab[1].toQueryParams(); 
		}

		var params = {
			x:coords[0],
			y:coords[1],
			s:handler.getScaleDenom(),
			l:handler.getCoverId(),
			ex:(panel.map.getWidth() > 600),
			px:[],
			py:[],
			pa:[]
		};

		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];		
		};

		// Ulica
		/*
		if(handler.getObjectId()) {
			params.oid = handler.getObjectId();
			params.pa[0] = handler.getObjectAddress();
		}
		*/

		// Trasa
		if(handler.getRouteId()) {
			params.routeAddress = Navigo2.UI.Route.addr;
			params.routeType = Navigo2.UI.Route.type;
		}		

		var message = href + "?";
		if(hrefParams!=undefined && hrefParams.id!=undefined) {
			message += 'id=' + hrefParams.id + '&'; 
		}
		message += 'location=' + Navigo2.encode64(Object.toQueryString(params)) + "\n";
		message += "\n\nWspolrzedne srodka mapy: " + coords[0] + ", " + coords[1];
		message += "\nData wygenerowania mapy: " + getCurrentDate();

		/*
		var tech = handler.getCoverId(); 
		if(tech > 0) {
			var subject = $A();
			if(tech & 1) subject.push("GSM/GPRS/EDGE");
			if(tech & 2) subject.push("UMTS/HSDPA");
			if(tech & 4) subject.push("WLAN HotSpot");
			var subject = "Zasieg - " + subject.join(", ") + " - sieci Era";
		} else {
		*/
			var subject = "Zobacz na mapie";
		/*
		}
		*/

		var win = window.open('mailto:?subject=' + subject + '&body=' + escape(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)
		};
		
		/*params.fk = filter.keyword;
		params.fid = filter.id; 
		params.fc = filter.categories;
		params.feid = filter.extIds; 
		params.fec = filter.extCategories;
		params.ff = filter.flag; 
		paramsaddr - obiekt JSON zawierajacy wspolrzedne adresu wokol ktorego maja byc szukane punkty {x, y, sys}*/
		
		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 message = href + "?location=" + Navigo2.encode64(Object.toQueryString(params)) + "\n";
			message += "\n\nWspolrzedne srodka mapy: " + coords[0] + ", " + coords[1];
			message += "\nData wygenerowania mapy: " + getCurrentDate();
			message += "\n\n" + poi.info.name;
			message += "\n" + poi.info.description;
			var subject = "Navigo";
			var win = window.open('mailto:?subject=' + subject + '&body=' + escape(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 params = {
			x:coords[0],
			y:coords[1],
			s:handler.getScaleDenom(),
			l:handler.getCoverId(),
			w:width,
			h:height,
			px:[],
			py:[],
			pid:[],
			pnum:[],
			pa:[],
			rx:[],
			ry:[],
			rid:[],
			rnum:[],
			uname:uname,
			adapter:adapter,
			locale:locale,
			iconURL:Navigo2.poisImgURL
		};

		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++;
			};
		}); 

		if(handler.getRouteId()) {
			params.routeId = handler.getRouteId();
			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 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 params = {
			x:coords[0],
			y:coords[1],
			s:handler.getScaleDenom(),
			l:handler.getCoverId(),
			w:width,
			h:height,
			px:[],
			py:[],
			pid:[],
			pnum:[],
			pa:[],
			rx:[],
			ry:[],
			rid:[],
			rnum:[],
			uname:uname,
			adapter:adapter,
			locale:locale,
			iconURL:Navigo2.poisImgURL
		};

		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++;
			};
		}); 

		if(handler.getRouteId()) {
			params.routeId = handler.getRouteId();
			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("print.do?" + Object.toQueryString(params));
		var win = window.open(page, "print", 'menubar=no, toolbar=no, location=no, scrollbars=no, resizable=no, status=no, width=794, height=1123');
		win.focus();
	});
	
	/**
	 * Legenda
	 */
	Element.insert($('wrapper'), { before: "<iframe src='#' name='iframe' id='iframe' frameborder='0' scrolling='no' allowTransparency='true'></iframe>" }); 	  
	Element.insert($('wrapper'), { before: "<div id='iframe2'></div>" }); 	  
	// Element.insert($('wrapper'), { before: "<div id='iframe2' onclick='return Navigo2.emit(\"legend:close\");'></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(legendWindow.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];
        
        //Navigo2.emitById('pois:findByExtId', e.memo.id, e.memo.args[0], e.memo.args[1], e.memo.args[2], e.memo.args[3], e.memo.args[4], undefined, handler.getScaleId(), handler.getViewPort() );

        var filter = {
            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) {
			//alert('cache.last_addr_pois');
			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('pois:present', e.memo.id, { poisDetails: data });
					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) {
			//alert('cache.last_addr_nearest');
			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('pois:present', e.memo.id, { poisDetails: data });
						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) {
			//alert('cache.last_pois');
			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) {
					/*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('pois:present', e.memo.id, { poisDetails: data });
					Navigo2.emitById('map:setPOIs', e.memo.id, data.pois, 'poi-1');
				}
			});
		}
		else if (cache.last_pois_by_ext != undefined) {
			//alert('cache.last_pois_by_ext');
			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) {
					/*if(cache.last_pois_by_ext.zoomMap) {
						if(data.pois.length == 1) {
							Navigo2.emit('map:viewport', [data.bbox[0], data.bbox[2]], 9);
		        			//handler.setCoords(bbox[0], bbox[2], 9);
		        		}
						var bbox = data.bbox;
						Navigo2.emit('map:boundBox',{	left:bbox[0],
				    		    					right:bbox[1],
				        							top:bbox[2],
				        							bottom:bbox[3]});
					}*/
					//Navigo2.emitById('pois:present', e.memo.id, { poisDetails: data });
					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) {
			//alert('cache.last_pois_search');
			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) {
			//alert('cache.last_pois_route');
             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);
					//Navigo2.emitById('map:clear_last_pois');
					//Navigo2.emit('map:save_last_pois', event);
					//Navigo2.emitById('map:save_last_addr_pois', event.memo.id, last_addr);
					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());
					    }
				        //pois_geometry.setViewport();
	        		}
	        		
	        		
					//Navigo2.emit('pois:present', { poisDetails: data });
					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]]);
					/*
					if(last_addr.xMin != "") {
						Navigo2.emit("map:boundBox", {left: last_addr.xMin, right: last_addr.xMax, top: last_addr.yMin, bottom: last_addr.yMax});
					} else {
						Navigo2.emit("map:viewport", [last_addr.x92, last_addr.y92], 1);
					}
					Navigo2.emit("map:home", [last_addr.x92, last_addr.y92], undefined);
					*/
					/*
					if(data.address.level == "street") {
						Navigo2.emit("map:street", data.address.objectId);
					}
					*/
				}
			});
		}
	});
	
	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*/
		//var token = e.memo.args[2];
		//var category = e.memo.args[3];
		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());
					    }
				        //pois_geometry.setViewport();
	        		}
	        		
					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);
                    }
                    
                    


					/*
					if(last_addr.xMin != "") {
						Navigo2.emit("map:boundBox", {left: last_addr.xMin, right: last_addr.xMax, top: last_addr.yMin, bottom: last_addr.yMax});
					} else {
						Navigo2.emit("map:viewport", [last_addr.x92, last_addr.y92], 1);
					}
					Navigo2.emit("map:home", [last_addr.x92, last_addr.y92], undefined);
					*/
					/*
					if(data.address.level == "street") {
						Navigo2.emit("map:street", data.address.objectId);
					}
					*/
				}
			});

            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) 
	{
		// Panel
//		cardsList.fire('pagination:update', { callback: function(/*Array*/data) {
//			event.memo.cardsDetails.each(function(item) {
//				for(var i = 0; i < data.length; i++) {
//					if(data[i].msisdn == item.msisdn) {
//						data[i].status = Navigo2.DAO.getCardStatus(item.state);
//						data[i].checked = (item.selected == true) ? "checked" : "";
//					}
//				}
//			});
//		}});

		// 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)]);
			});
		}
//		else {
//			pois_geometry.clearPOIs();
		//}	
		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 = Navigo2.decode64(qry.location).toQueryParams();

            if(geometry == undefined) {
                geometry = {
                    coords: undefined,
                    scale: undefined,
                    cover: undefined,
                    POIs: undefined
                }
            }

			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 (panel.address) {
					panel.address.value = poiA;
				}	
			}

			if(qry.routeAddress != undefined && qry.routeAddress.length > 0) {

				Navigo2.emitById('route:show', event.memo.id);
				Navigo2.emitById('route:reload', event.memo.id, qry.routeAddress, qry.routeType);
			}
			//if(qry.ex == "true") Navigo2.toggleMap();
			
			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', event.memo.id, geometry.coords, geometry.scale);
			Navigo2.emitById('map:home', event.memo.id, geometry.coords, geometry.scale);
			
			if(qry.fp!=undefined) {
				Navigo2.emitById('pois:show',event.memo.id);
				Navigo2.emitById('pois:search', event.memo.id, filter, pagingFilter, true, false, true, 'poi-s');
			}
			
		
		} else {
			geometry.cover = "3";
		}
		Navigo2.emitById('map:screen_initialised', id);
//		alert('x = ' + geometry.coords[0] + ' y = ' + geometry.coords[1]);
//		alert('scale = ' + geometry.scale + ' cover = ' + geometry.cover);
	});	
	
};


/**
 * Uaktualnia flashowe drzewo kategorii.
 */
function updateCategoryTreeView(categoryTemplate) {
	Navigo2.DAO.getPoisCategories(function (data) {
		if(data.categories) {
			nodes_str = buildTree(data.categories);
			
			eval('nodes=[' +nodes_str+ ']');
			Event.observe(document, 'map:ready', function(event) {
				if(event.memo.id == 'mva') {
					Navigo2.emitById("map:treeViewSetNodes", 'mva', 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;
}
