var stops = new LandingStops();
var places = new LandingPlaces();
var routes = new Routes();
var polylines = new Polylines();
var paths = new Paths();
var path_categories = new Array();
var converter;

var poi_markers = new Array();
var poi_info_window_htmls = new Array();
var pois_data = new Array();

var path_polylines = new Array();
var search_polylines = new Array();
var route_polylines = new Object();
var walk_polylines = new Array();
var markers_info_window_htmls = new Array();

var path_high_landings = new Array();
var path_high_landings_html = new Array();
var path_old_landing_ids = new Array();
var path_high_pois = new Array();
var path_high_pois_html = new Array();
var path_old_poi_ids = new Array();

var highlighted_start;
var highlighted_start_html;
var old_start_id;
var highlighted_end;
var highlighted_end_html;
var old_end_id;
var highlighted_change;
var highlighted_change_html;
var old_change_id;
var index = 0;
var search_data = new Array();

var is_first_path_click = true;

var last_search_xml;

var time_default_value = 'hh:mm';
var print_link = '<a style="margin-top: -20px; float: right;" href="javascript: void()" onclick="window.print()">'
               + '<img title="' + dic.print + '" alt="' + dic.print + '" src="' + project_path + 'map_browser/print_icon.gif">'
               + '</a>';
var init_latlng = new GLatLng(parseFloat(45.439529), parseFloat(12.335827));
var init_zoom_level = 13;

var zoom_level = 'small';

var debug_data;
var DEBUG = false;
var JS_ANALYTICS_TRACKING=true;

//
// alert message
//
function log(message) {
    if (DEBUG) {
        alert('Note: you are in DEBUG mode\n\n' + message);
    }
}

function addAnalyticsJsTracking(evento, parametro)
{
	link_to_log = '';
	switch(evento)
	{
		case 'show_route':
			link_to_log = '/show_route/line_'+parametro;
			break;
		case 'show_path_object':
			link_to_log = '/show_path/path_name_'+escape(parametro);
			break;
		case 'show_poi_info_window':
			link_to_log = '/show_poi_informations/id_'+parametro;
			break;
		case 'land_route_timetable':
			link_to_log = '/show_timetable_land_route/id_'+escape(parametro);
			break;
		case 'land_route_map':
			link_to_log = '/show_map_land_route/id_'+escape(parametro);
			break;
		case 'search':
			link_to_log = '/search/submit_search';
			break;
			
	}
	if(JS_ANALYTICS_TRACKING)
		pageTracker._trackPageview(link_to_log);
}
//
// display <code>message</code> inside firebug console
//
function log_console(message) {
    if (typeof console != 'undefined' && DEBUG) {
        console.log(message);
    }
}

//
// callback after start place select
//
function selectStart(start_place_id) {
    $('#start').val(start_place_id);
    markers[start_place_id].closeInfoWindow();
    remove_path_polylines();
    remove_walk_polylines();
    highlightLandingMarker(start_place_id, 'start');
    showAllMarkers();
    //filterEnd(start_place_id);
}

//
// callback after end place select
//
function selectEnd(end_place_id) {
    $('#end').val(end_place_id);
    markers[end_place_id].closeInfoWindow();
    remove_path_polylines();
    remove_walk_polylines();
    highlightLandingMarker(end_place_id, 'end');
}

//
// callback on time field focus
//
function timeFocus() {
    if($('#time').val() == time_default_value) {
        $('#time').val('');
    }
}

//
// callback on time field blur
//
function timeBlur() {
    if($('#time').val() == '') {
        $('#time').val(time_default_value);
    }
}

//
// hide all markers
//
function hideAllMarkers() {
    for(var i in markers) {
        markers[i].hide();
    }
}

//
// show all markers
//
function showAllMarkers() {
    for(var i in markers) {
        markers[i].show();
    }
}

//
// show markers in show_markers array
//
function showMarkers(show_markers) {
    hideAllMarkers();
    for(var i in show_markers) {
        if(typeof markers[show_markers[i]] != 'undefined') {
            markers[show_markers[i]].show();
        }
    }
}

//
// remove all polylines (route polylines and path polylines)
//
function remove_all_polylines() {
    for(var route_name in route_polylines) {
        remove_route_polyline(route_name);
        reset_route_checkbox(route_name);
    }
    remove_path_polylines();
    remove_walk_polylines();
    remove_search_polylines();
}

//
// remove search polylines
//
function remove_search_polylines() {
    // delete search polylines if presents
    for(var i = 0; i < search_polylines.length; i++) {
        document.map.removeOverlay(search_polylines[i]);
    }
    search_polylines = new Array();
}

//
// remove path polylines
//
function remove_path_polylines() {
    // delete path polylines if presents
    for(var i = 0; i < path_polylines.length; i++) {
        document.map.removeOverlay(path_polylines[i]);
    }
    path_polylines = new Array();
}

//
// remove walk polylines
//
function remove_walk_polylines() {
    // delete walk polylines if presents
    for(var i = 0; i < walk_polylines.length; i++) {
        document.map.removeOverlay(walk_polylines[i]);
    }
    walk_polylines = new Array();
}

//
// remove a route polyline
//
function remove_route_polyline(route_name) {
    // delete route polylines if presents
    for(var i = 0; i < route_polylines[route_name].length; i++) {
        document.map.removeOverlay(route_polylines[route_name][i]);
    }
    route_polylines[route_name] = new Array();
}

//
// routes reset function
//
function reset_routes() {
    for(var route_name in route_polylines) {
        remove_route_polyline(route_name);
        reset_route_checkbox(route_name);
    }
}

//
// reset route checkbox
//
function reset_route_checkbox(route_name) {
    $('#route_' + route_name).attr('checked', false);
}

//
// paths reset function
//
function reset_paths() {
    remove_path_polylines();
    remove_walk_polylines();
    remove_path_highlights();
    
    $('#paths_container input[type=radio]').each(function() {
        $(this).attr('checked', false);
    });
    
    $('#search_results').slideUp();
}

//
// search reset function
//
function reset_search() {
    //remove_search_polylines();
    reset_search_form();
    //remove_search_highlights();
    $('#search_results').slideUp();
    $('#time').val('hh:mm');
    update_map();
}

//
// highlight landing marker
//
function highlightLandingMarker(place_id, place_desc) {
    var highlighted_marker;
    
    if(place_id !== '' && typeof markers[place_id] != 'undefined') {
        markers[place_id].hide();
        if(place_desc == 'change') {
            highlighted_marker = createMarker(markers[place_id].getLatLng().lat(), markers[place_id].getLatLng().lng(), 'change');
        }
        else {
            highlighted_marker = createMarker(markers[place_id].getLatLng().lat(), markers[place_id].getLatLng().lng(), 'landing_active');
        }
        document.map.addOverlay(highlighted_marker);
    }
    
    switch(place_desc) {
        case 'start':
            if(typeof highlighted_start != 'undefined' && highlighted_start != null) {
                markers[old_start_id].show();
                document.map.removeOverlay(highlighted_start);
            }
            highlighted_start = highlighted_marker;
            old_start_id = place_id;
            break;
        case 'end':
            if(typeof highlighted_end != 'undefined' && highlighted_end != null) {
                markers[old_end_id].show();
                document.map.removeOverlay(highlighted_end);
            }
            highlighted_end = highlighted_marker;
            old_end_id = place_id;
            break;
        case 'change':
            if(typeof highlighted_change != 'undefined' && highlighted_change != null) {
                markers[old_change_id].show();
                document.map.removeOverlay(highlighted_change);
            }
            highlighted_change = highlighted_marker;
            old_change_id = place_id;
            break;
    }
}

//
// filters end locations according to start landing place
//
function filterEnd(start_place_id) {
    // check start place field
    if(start_place_id == '') {
        return;
    }
    
    $('#loading').show();
    
    $.getJSON(project_path + 'map_browser/filter_end.php?start=' + places.findPlaceById(start_place_id).code, function(data) {
        var values = new Array();
        var keys = new Array();
        
        for(var i = 0; i < data.length; i++) {
            values.push(places.findPlaceById(converter.findPlaceIdByPlaceCode(data[i])).description);
            keys.push(places.findPlaceById(converter.findPlaceIdByPlaceCode(data[i])).id);
        }
        
        createOptions('end', dic.end_place, keys, values);
        showMarkers(keys);
        
        $('#loading').hide();
    });
}

//
// show route
//
// this function is triggered by a route checkbox click
//
function show_route(route_name) {
    // route checked
    if($('#route_' + route_name).is(':checked')) {
        var route = routes.findRouteByRouteName(route_name);
       	addAnalyticsJsTracking('show_route', route_name);
        //alert("route name: " + route_name + "\nstart id: " + route.places[0] + "\nend id" + route.places[route.places.length - 1]);
        
        show_path(route.places[0], route.places[route.places.length - 1], route_name, 'route');
    }
    // route unchecked
    else {
        remove_route_polyline(route_name);
    }
}

//
// show search result path
//
function show_path(start_place_id, end_place_id, route_name, type) {
    var points = new Array();
    var between;
    var route = routes.findRouteByRouteName(route_name);
    
// A! 
//   try {
//        if(route.findOrder(start_place_id, end_place_id) != 0) {
//            var temp = start_place_id;
//            start_place_id = end_place_id;
//            end_place_id = temp;
//        }
//    } catch(e) {
//        alert('Exception: ' + e);
//        return;
//    }
    
// aggiunto per gestire percorsi che ritornano su alcuni punti
//    between = route.findInnerSet(start_place_id, end_place_id);
	if(type==undefined || type=='search')
	{
	 	if(route.findOrder(start_place_id, end_place_id) != 0) {
           var temp = start_place_id;
            start_place_id = end_place_id;
            end_place_id = temp;
        }
		between = route.findInnerSet(start_place_id, end_place_id);
	}
	else //se non devo fare ricerche, uso la ricerca con 'memoria'
		between = route.findInnerSet2(start_place_id, end_place_id);
	
    points.push(start_place_id);
    
    for(var i = 0; i < between.length; i++) {
        points.push(between[i]);
    }
	//A
    points.push(end_place_id);
    
    //A! I initialize the check for occurrence
    
    var start_place_occurrence = new Array();
    for(var i in points)
    	start_place_occurrence[points[i]] = 0;
    
    route_polylines[route_name] = new Array();
    for(var i = 0; i < points.length-1; i++) {
    	
    	//if(points[i] == points[i+1] || points[i]==undefined || points[i+1]==undefined) continue;
        
        var polyline = new GPolyline([], '#' + route.color, 4, .6);
        document.map.addOverlay(polyline);
        paramx = places.findPlaceById(points[i]).lat;
        paramy = places.findPlaceById(points[i]).lng;
        polyline.insertVertex(0, new GLatLng(paramx,paramy));
        
        var route_polylines_object = polylines.findRoutePolylinesByRouteName(route_name);
        if(typeof route_polylines_object != 'undefined' && route_polylines_object != null) {
        	//if(type=='undefined' || type=='search')
        	//	var polyline_object = route_polylines_object.findPolylineByStartPlaceId(points[i]);
        	if(type=='undefined' || type=='search')
        	{
        		var polyline_object = route_polylines_object.findPolylineByStartPlaceAndEndPlace(points[i], points[i+1]);
        	}
        	else
        	{
           		 var polyline_object = route_polylines_object.findPolylineByStartPlaceIdImproved(points[i],start_place_occurrence[points[i]]);
             	 start_place_occurrence[points[i]]+=1;
            }
            if(polyline_object==undefined) continue;
           
            //if(polyline_object.start==start_place_id) continue;
            
            if(polyline_object != null) {
                for(var j = 0; j < polyline_object.points.length; j++) {
                    polyline.insertVertex(j+1, new GLatLng(polyline_object.points[j][0], polyline_object.points[j][1]));
                }
                
               polyline.insertVertex(polyline_object.points.length + 1, new GLatLng(places.findPlaceById(polyline_object.end).lat, places.findPlaceById(polyline_object.end).lng));
            }
            else {
           //     alert('Can\'t find a route polyline between ' + start_place_id + ' and ' + end_place_id + ' for route ' + route_name);
            }
        }
        
        if(typeof type == 'undefined') {
            path_polylines.push(polyline);
        }
        else {
            switch(type) {
                case 'route':
                    route_polylines[route_name].push(polyline);
                    break;
                case 'search':
                    search_polylines.push(polyline);
                    break;
            }
        }
    }
}

//
// show walk path
//
// this function is used to render walk paths between poi and poi or landing and poi
//
function show_walk(start_point, end_point, path) {
    var polyline = new GPolyline([], '#00ccff', 4, .6);
    document.map.addOverlay(polyline);
    
    var start_lat_lng = start_point.type == 'landing' ? new GLatLng(places.findPlaceById(start_point.id).lat, places.findPlaceById(start_point.id).lng) : new GLatLng(pois_data[start_point.id].latitude, pois_data[start_point.id].longitude);
    var end_lat_lng   = end_point.type   == 'landing' ? new GLatLng(places.findPlaceById(end_point.id).lat  , places.findPlaceById(end_point.id).lng)   : new GLatLng(pois_data[end_point.id].latitude  , pois_data[end_point.id].longitude);
    
    // add start point
    polyline.insertVertex(0, start_lat_lng);
    
    log_console(path);
    log_console(start_point);
    var polyline_object = path.findPolylineByStartPoint(start_point);
    log_console(polyline_object);
    
    var points_number = 0
    if(polyline_object != null) {
        for(var j = 0; j < polyline_object.points.length; j++) {
            polyline.insertVertex(j+1, new GLatLng(polyline_object.points[j][0], polyline_object.points[j][1]));
        }
        
        // add end point
        polyline.insertVertex(polyline_object.points.length + 1, end_lat_lng);
    }
    else {
        log('Can\'t find a walk polyline between ' + start_point.id + ' (' + start_point.type + ') and ' + end_point.id + ' (' + end_point.type + ') for path ' + path.name);
    }
    
    walk_polylines.push(polyline);
}

//
// search function
//
// FIX: first_search parameter is useless
//
function search(start_place_id, end_place_id, arrival_time, first_search, change) {
//	alert('cerco..');
    // check search parameters
    if(start_place_id == '') {
        alert(dic.search_error_start);
        return;
    }
    
    if(end_place_id == '') {
        alert(dic.search_error_end);
        return;
    }
    
    var search_hour;
    var search_minute;
    if(/^\s*([0-9]{1})([0-9]{0,1})\s*[:|\.]{0,1}\s*([0-9]{0,1})([0-9]{0,1})\s*$/.test(arrival_time)) {
        search_hour = RegExp.$1 + ((typeof RegExp.$2 == 'undefined') ? '' : RegExp.$2);
        search_minute = ((RegExp.$3 == '') ? '0' : RegExp.$3) + ((RegExp.$4 == '') ? '0' : RegExp.$4);
        
        //alert(RegExp.$1 + '\n' + RegExp.$2 + '\n' + RegExp.$3 + '\n' + RegExp.$4 + '\n' + typeof RegExp.$1 + '\n' + typeof RegExp.$2 + '\n' + typeof RegExp.$3 + '\n' + typeof RegExp.$4 + '\n');
        
        arrival_time = search_hour + ':' + search_minute;
        $('#time').val(arrival_time);
    }
    else {
        alert(dic.search_error_time);
        return;
    }
    
    arrival_time_array = arrival_time.split(':');
    
    var arr_time = new Date(0, 0, 0, new Number(arrival_time_array[0]), new Number(arrival_time_array[1]), 0);
    
    var search_query = 'departure_' + places.findPlaceById(start_place_id).code + '_'
                     + 'arrival_' + places.findPlaceById(end_place_id).code + '_'
                     + ((typeof change != 'undefined' && change) ? 'depth_1_' : '')
                     + 'departureTime_null_arrivalTime_' + arrival_time.replace(':', '%3A');
                     
    addAnalyticsJsTracking('search', search_query);
    var request_url = 'jsp/it/ippercorso/' + search_query + '.jsp';
//   alert(request_url);
    $('#loading').show();
    $('#search_results').slideUp();
    
    $.get(project_path + 'map_browser/php_proxy.php?path=' + request_url, function(data) {
        if(!change) {
            var results = data.getElementsByTagName('result');
            
            if(results[0].getElementsByTagName('fermata').length < 1) {
                return search(start_place_id, end_place_id, arrival_time, first_search, true);
            }
        }
        
        last_search_xml = data;
        
        // sort search result data by trip duration
        var sorted_data = sort_search_result(data, change);
        
        $('#search_results').html(search_output(sorted_data, first_search, change));
        $('#search_results').slideDown();
        $('#loading').hide();
    });
}

//
// render search
//
function render_search(search_id) {
    remove_all_polylines();
    remove_path_highlights();
    
    var start_place_id = converter.findPlaceIdByPlaceCode(new Number(get_text_content(search_data[search_id].start.getElementsByTagName('placeCode')[0])));
    var end_place_id   = converter.findPlaceIdByPlaceCode(new Number(get_text_content(search_data[search_id].end.getElementsByTagName('placeCode')[0])));
    var route_name     = get_text_content(search_data[search_id].start.getElementsByTagName('line')[0]);
    
    highlightLandingMarker(start_place_id, 'start');
    var dep_time = string_to_date(get_text_content(search_data[search_id].start.getElementsByTagName('time')[0]));
    highlighted_start_html = '<h2>' + get_text_content(search_data[search_id].start.getElementsByTagName('description')[0]) + '</h2>'
                           + '<p>'
                           + dic.route + ': ' + route_name + '<br/>'
                           + dic.departure_time + ': ' + format_date_to_time(dep_time) + '<br/>'
                           + '</p>';
    highlighted_start.bindInfoWindowHtml(highlighted_start_html);
    
    highlightLandingMarker(end_place_id, 'end');
    var arr_time = string_to_date(get_text_content(search_data[search_id].end.getElementsByTagName('time')[0]));
    highlighted_end_html = '<h2>' + get_text_content(search_data[search_id].end.getElementsByTagName('description')[0]) + '</h2>'
                         + '<p>'
                         + dic.arrival_time + ': ' + format_date_to_time(arr_time) + '<br/>'
                         + '</p>';
    highlighted_end.bindInfoWindowHtml(highlighted_end_html);
    
    if(typeof search_data[search_id].change != 'undefined') {
        var change_place_id = converter.findPlaceIdByPlaceCode(new Number(get_text_content(search_data[search_id].change.getElementsByTagName('placeCode')[0])));
        var route_b_name    = get_text_content(search_data[search_id].end.getElementsByTagName('line')[0]);
        highlightLandingMarker(change_place_id, 'change');
        var dep_time = string_to_date(get_text_content(search_data[search_id].change_dep.getElementsByTagName('time')[0]));
        var arr_time = string_to_date(get_text_content(search_data[search_id].change.getElementsByTagName('time')[0]));
        highlighted_change_html = '<h2>' + get_text_content(search_data[search_id].change.getElementsByTagName('description')[0]) + '</h2>'
                                + '<h3>' + dic.warning + ': ' + dic.change_route + '</h3>'
                                + '<p>'
                                + dic.route + ': ' + route_name + '<br/>'
                                + dic.arrival_time + ': ' + format_date_to_time(arr_time) + '<br/>'
                                + '</p>'
                                + '<p>'
                                + dic.route + ': ' + route_b_name + '<br/>'
                                + dic.departure_time + ': ' + format_date_to_time(dep_time) + '<br/>'
                                + '</p>';
        highlighted_change.bindInfoWindowHtml(highlighted_change_html);
        
        show_path(start_place_id, change_place_id, route_name, 'search');
        show_path(change_place_id, end_place_id, route_b_name, 'search');
    }
    else {
        show_path(start_place_id, end_place_id, route_name, 'search');
    }
}

//
// search data sort function
//
// this function sort the result of a search webservice query by trip duration
//
function sort_search_result(data, change) {
    //var results = data.getElementsByTagName('result');
    //var sorted_array = results.sort(function(a, b) {
        //var dep_time = string_to_date(get_text_content(landings[k].getElementsByTagName('time')[0]));
        //var arr_time = string_to_date(get_text_content(landings[k+1].getElementsByTagName('time')[0]));
    //});
    
    //return sorted_array;
    
    return data;
}

//
// parse and print search results
//
// FIX: first_search parameter is useless
//
function search_output(data, first_search, change) {
    var results = data.getElementsByTagName('result');
    
    var output = (first_search ? '<h2>' + dic.search_results + '</h2>' + print_link : '')
               + '<div class="search_data"><p>'
               + dic.from + ' ' + get_text_content(results[0].getElementsByTagName('departureDescription')[0]) + ' '
               + dic.to + ' ' + get_text_content(results[0].getElementsByTagName('arrivalDescription')[0])
               + '<br/>'
               + dic.arrival_time + ' ' + $('#time').val()
               + '</p>';
        
    for(var i = 0; i < results.length; i++) {
        var subset = results[i].getElementsByTagName((change ? 'cambio' : 'diretti'));
            
        // this search has some results
        if(subset.length > 0) {
            output += '<img src="' + project_path + 'map_browser/images/' + ((typeof change != 'undefined' && change) ? 'change' : 'direct') + '_route.gif">'
                    + '<h3>' + ((typeof change != 'undefined' && change) ? dic.change_route : dic.direct_route) + '</h3>'
                    + '</div><div style="clear: both;"></div>'
                    + '<table>'
                    + '<thead>'
                    + '<tr>'
                    + '<th class="view_route"><img src="' + project_path + 'map_browser/images/view_route.gif"/></th>'
                    + '<th class="route">' + dic.route + '</th>'
                    + '<th class="departure_stop">' + dic.departure_stop + '</th>'
                    + '<th class="departure_time">' + dic.departure_time + '</th>'
                    + '<th class="arrival_stop">' + dic.arrival_stop + '</th>'
                    + '<th class="arrival_time">' + dic.arrival_time + '</th>'
                    + '<th class="duration">' + dic.duration + '</th>'
                    + '<th class="validity">' + dic.validity + '</th>'
                    + '<th class="timetable">' + dic.timetable + '</th>'
                    + '</tr>'
                    + '</thead>'
                    + '<tbody>';
        
            for(var j = 0; j < subset.length; j++) {
                search_data[j] = new Object();
                
                var landings = subset[j].getElementsByTagName('fermata');
    
                output += (j > 0) ? '<tr class="results_separator"><td colspan="8"></td></tr>' : '';
                
                for(var k = 0; k+1 < landings.length; k = k+2) {
                    if(k == 0) {
                        if(change) {
                            search_data[j].start = landings[k];
                            search_data[j].change = landings[k+1];
                        }
                        else {
                            search_data[j].start = landings[k];
                            search_data[j].end = landings[k+1];
                        }
                    }
                    
                    if(k == 2) {
                        if(change) {
                            search_data[j].change_dep = landings[k];
                            search_data[j].end = landings[k+1];
                        }
                        else {
                            // never because max searches depth is 1
                        }
                    }
                    
                    var dep_time = string_to_date(get_text_content(landings[k].getElementsByTagName('time')[0]));
                    var arr_time = string_to_date(get_text_content(landings[k+1].getElementsByTagName('time')[0]));
                    
                    try {
                        output += '<tr class="' + ((j%2 == 0) ? 'odd' : 'even') + '">'
                                + ((k == 0) ? '<td class="view_route" ' + ((typeof change != 'undefined' && change) ? 'rowspan="2"' : '') + '><input type="radio" name="view_path" ' + ((j == 0) ? 'checked="checked"' : '') + ' onclick="render_search(' + j + ')"></td>' : '')
                                + '<td class="route"><img src="' + project_path + 'map_browser/images/routes/' + get_text_content(landings[k].getElementsByTagName('line')[0]) + '.gif"/></td>'
                                + '<td class="departure_stop">' + get_text_content(landings[k].getElementsByTagName('description')[0]) + '</td>'
                                + '<td class="departure_time">' + format_date_to_time(dep_time) + '</td>'
                                + '<td class="arrival_stop">' + get_text_content(landings[k+1].getElementsByTagName('description')[0]) + '</td>'
                                + '<td class="arrival_time">' + format_date_to_time(arr_time) + '</td>'
                                + '<td class="duration">' + format_date_to_time(time_difference(dep_time, arr_time)) + '</td>'
                                + '<td class="validity">' + get_text_content(landings[k].getElementsByTagName('validity')[0]) + '</td>'
                                + '<td class="timetable"><a target="_blank" href="http://www.hellovenezia.com/jspvenezia/jsp/web/' + get_text_content(landings[k].getElementsByTagName('link')[0]) + '"><img src="' + project_path + 'map_browser/images/timetable.gif"/></a></td>'
                                + '</tr>';
                    } catch(e) {}
                }

                // render first search result
                if(j == 0) {
                    // remove change marker if present
                    if(typeof highlighted_change != 'undefined') {
                        document.map.removeOverlay(highlighted_change);
                    }
                    
                    render_search(0);
                }
            }
            
            output += '</tbody>'
                    + '</table>';
        }
        else {
            output += '<div style="clear: both;"></div><h3 class="no_results">' + dic.no_results + '</h3></div>';
        }
    }
    
    return output;
}

//
// remove path highlighted markers
//
function remove_path_highlights() {
    for(var i = 0; i < path_high_landings.length; i++) {
        document.map.removeOverlay(path_high_landings[i]);
        markers[path_old_landing_ids[i]].show();
    }
    path_high_landings = new Array();
    
    for(var i = 0; i < path_high_pois.length; i++) {
        document.map.removeOverlay(path_high_pois[i]);
        poi_markers[path_old_poi_ids[i]].show();
    }
    path_high_pois = new Array();
}

//
// remove search highlighted markers
//
function remove_search_highlights() {
    // remove search points
    if(typeof highlighted_start != 'undefined' && highlighted_start != null) {
        document.map.removeOverlay(highlighted_start);
        highlighted_start = null;
        markers[old_start_id].show();
    }
    
    if(typeof highlighted_end != 'undefined' && highlighted_end != null) {
        document.map.removeOverlay(highlighted_end);
        highlighted_end = null;
        markers[old_end_id].show();
    }
    
    if(typeof highlighted_change != 'undefined' && highlighted_change != null) {
        document.map.removeOverlay(highlighted_change);
        highlighted_change = null;
        markers[old_change_id].show();
    }
}

//
// reset search form
//
function reset_search_form() {
    $('#start').val('');
    $('#end').val('');
}

//
// show path
//
function show_path_object(path_count) {
    var path = paths.paths[path_count];
    
    remove_all_polylines();
    remove_path_highlights();
    
    if(typeof path != 'undefined') {
        if($('#path_' + path_count).is(':checked')) {
            var output = '<h2>' + dic.path + '</h2>' + print_link
                       + '<div class="path_data">'
                       + '<h3>' + path.name + '</h3>'
                       + path.description
                       + '</div><div style="clear: both;"></div>';
            
            reset_search_form();
            remove_search_highlights();
            addAnalyticsJsTracking('show_path_object', path.name);
                       
            for(var i = 0; i < path.points.length; i++) {
                if(path.points[i].type == 'landing') {
                    var temp_marker = createMarker(places.places[path.points[i].id].lat, places.places[path.points[i].id].lng, 'landing_active');
                    path_high_landings.push(temp_marker);
                    path_old_landing_ids.push(path.points[i].id);
                    markers[path.points[i].id].hide();
                    document.map.addOverlay(temp_marker);
                    
                    var info_window = '<h2>' + places.findPlaceById(path.points[i].id).description + '</h2>'
                                    + '<p>' + dic.route + ': ' + path.points[i].route_name + '</p>';
                                    
                    path_high_landings_html.push(info_window);
                    temp_marker.bindInfoWindow(info_window);
                    
                    // show a route path
                    if(typeof path.points[i+1] != 'undefined' && path.points[i+1].type == 'landing') {
                        show_path(path.points[i].id, path.points[i+1].id, path.points[i].route_name);
                        
                        output += '<table class="path">'
                                + '<thead>'
                                + '<tr>'
                                + '<th class="route">' + dic.route + '</th>'
                                + '<th class="departure_stop">' + dic.departure_stop + '</th>'
                                + '<th class="arrival_stop">' + dic.arrival_stop + '</th>'
                                + '</tr>'
                                + '</thead>'
                                + '<tbody>'
                                + '<tr class="odd">'
                                + '<td class="route"><img src="' + project_path + 'map_browser/images/routes/' + path.points[i].route_name + '.gif"/></td>'
                                + '<td class="departure_stop">' + places.findPlaceById(path.points[i].id).description + '</td>'
                                + '<td class="arrival_stop">' + places.findPlaceById(path.points[i+1].id).description + '</td>'
                                + '</tr>'
                                + '</tbody>'
                                + '</table>';
                    }
                    else {
                        // render a walk polyline
                        if(typeof path.points[i+1] != 'undefined') {
                            show_walk(path.points[i], path.points[i+1], path);
                        }
                    }
                }
                else {
                    var temp_marker = createMarker(poi_markers[path.points[i].id].getLatLng().lat(), poi_markers[path.points[i].id].getLatLng().lng(), poi_icon(pois_data[path.points[i].id].type, true));
                    temp_marker.type = pois_data[path.points[i].id].type;
                    path_high_pois.push(temp_marker);
                    path_high_pois_html.push(poi_info_window_htmls[path.points[i].id]);
                    path_old_poi_ids.push(path.points[i].id);
                    poi_markers[path.points[i].id].hide();
                    document.map.addOverlay(temp_marker);
                    
                    temp_marker.bindInfoWindow(poi_info_window_htmls[path.points[i].id], {maxWidth: 300});
                    
                    output += '<div class="poi_description">'
                            + '<h3>' + pois_data[path.points[i].id].title + '</h3>'
                            + '<p>' + pois_data[path.points[i].id].body + '</p>'
                            + '</div>';
                       
                    // render a walk polyline
                    if(typeof path.points[i+1] != 'undefined') {
                        show_walk(path.points[i], path.points[i+1], path);
                    }
                }
            }
            
            $('#search_results').slideUp();
            $('#search_results').html(output);
            $('#search_results').slideDown();
        }
    }
}

//
// format date to time
//
function format_date_to_time(date) {
    var hours = date.getHours();
    if(hours < 10) { hours = '0' + hours; }
    
    var minutes = date.getMinutes();
    if(minutes < 10) { minutes = '0' + minutes; }
    
    return hours + ':' + minutes;
}

//
// parse time from string
//
// parse a string in the format hh:mm:ss to a Date object
//
function string_to_date(string) {
    var string_array = string.split(':');
    var date = new Date(0, 0, 0, new Number(string_array[0]), new Number(string_array[1]), new Number(string_array[2]));
    
    return date;
}

//
// calculate time difference between time_start and time_end
//
function time_difference(time_start, time_end) {
    var diff = time_end - time_start;
    
    var seconds = Math.floor(diff / 1000);
    var minutes = Math.floor(seconds / 60);
    var hours   = Math.floor(minutes / 60);
    
    minutes = minutes - hours * 60;
    seconds = seconds - minutes * 60 - hours * 3600;
    
    return new Date(0, 0, 0, hours, minutes, seconds);
}

//
// show a pi marker info window and center the map position
//
function show_poi_info_window(nid) {
    if(typeof poi_markers[nid] != 'undefined') {
    	document.map.setCenter(poi_markers[nid].getLatLng(), 15);
    	addAnalyticsJsTracking('show_poi_info_window', nid);
        poi_markers[nid].openInfoWindowHtml(poi_info_window_htmls[nid], {maxWidth: 300});
    }
}

//
// show map loading
//
function show_map_loading() {
    $($('#map > div').get(0)).css('width', 0);
}

//
// hide map loading
//
function hide_map_loading() {
    $($('#map > div').get(0)).css('width', '100%');
}

//
// zoom end callback
//
function zoomend_callback(oldlevel, newlevel) {
    log_console("zoom end event!");
    log_console("zoom old level: " + oldlevel);
    log_console("zoom new level: " + newlevel);
    
    var current_zoom = get_zoom(newlevel);
    
    // poi markers
    for(var i = 0; i < pois_data.length; i++) {
        if(typeof poi_markers[i] != 'undefined' && !poi_markers[i].isHidden()) {
            log_console("poi (id: " + i + ") " + pois_data[i].title + " zoom: " + pois_data[i].zoom + " current zoom: " + newlevel);
            
            document.map.removeOverlay(poi_markers[i]);
            var old_marker = poi_markers[i];
            poi_markers[i] = createMarker(poi_markers[i].getLatLng().lat(), poi_markers[i].getLatLng().lng(), poi_icon(pois_data[i].type));
            log_console("poi type: " + pois_data[i].type + " poi icon prefix: " + poi_icon(pois_data[i].type));
            
            poi_markers[i].bindInfoWindow(poi_info_window_htmls[i], {maxWidth: 300});
            
            if(pois_data[i].zoom <= newlevel) {
                log_console("latitude: " + poi_markers[i].getLatLng().lat() + " longitude: " + poi_markers[i].getLatLng().lng());
                log_console("ok... show it!");
                document.map.addOverlay(poi_markers[i]);
                $('#poi_' + i).slideDown();
            }
            else {
                $('#poi_' + i).slideUp();
            }
            
            //if(old_marker.isHidden()) {
            //    poi_markers[i].hide();
            //}
        }
        else {
            if(typeof pois_data[i] != 'undefined') {
                if(pois_data[i].zoom <= newlevel) {
                    poi_markers[i] = createMarker(pois_data[i].latitude, pois_data[i].longitude, poi_icon(pois_data[i].type));
                    log_console("poi type: " + pois_data[i].type + " poi icon prefix: " + poi_icon(pois_data[i].type));
                    poi_markers[i].bindInfoWindow(poi_info_window_htmls[i], {maxWidth: 300});
                    document.map.addOverlay(poi_markers[i]);
                }
            }
        }
    }
    
    // path highlighted poi markers
    for(var i = 0; i < path_high_pois.length; i++) {
        document.map.removeOverlay(path_high_pois[i]);
        var temp = createMarker(path_high_pois[i].getLatLng().lat(), path_high_pois[i].getLatLng().lng(), poi_icon(path_high_pois[i].type, true));
        temp.type = path_high_pois[i].type;
        path_high_pois[i] = temp;
        path_high_pois[i].bindInfoWindow(path_high_pois_html[i], {maxWidth: 300});
        document.map.addOverlay(path_high_pois[i]);
    }
    
    // chance markers icons
    if (current_zoom != zoom_level) {
        // landing markers
        for(var i = 0; i < markers.length; i++) {
            if(typeof markers[i] != 'undefined') {
                document.map.removeOverlay(markers[i]);
                var old_marker = markers[i];
                markers[i] = createMarker(markers[i].getLatLng().lat(), markers[i].getLatLng().lng(), 'landing');
                markers[i].bindInfoWindow(markers_info_window_htmls[i]);
                
                document.map.addOverlay(markers[i]);
                
                if(old_marker.isHidden()) {
                    markers[i].hide();
                }
            }
        }
        
        // path highlighted landing markers
        for(var i = 0; i < path_high_landings.length; i++) {
            document.map.removeOverlay(path_high_landings[i]);
            path_high_landings[i] = createMarker(path_high_landings[i].getLatLng().lat(), path_high_landings[i].getLatLng().lng(), 'landing_active');
            path_high_landings[i].bindInfoWindow(path_high_landings_html[i]);
            document.map.addOverlay(path_high_landings[i]);
        }

        // search highlighted start marker
        if(typeof highlighted_start != 'undefined' && highlighted_start != null) {
            document.map.removeOverlay(highlighted_start);
            highlighted_start = createMarker(highlighted_start.getLatLng().lat(), highlighted_start.getLatLng().lng(), 'landing_active');
            highlighted_start.bindInfoWindow(highlighted_start_html);
            document.map.addOverlay(highlighted_start);
        }
        
        // search highlighted end marker
        if(typeof highlighted_end != 'undefined' && highlighted_end != null) {
            document.map.removeOverlay(highlighted_end);
            highlighted_end = createMarker(highlighted_end.getLatLng().lat(), highlighted_end.getLatLng().lng(), 'landing_active');
            highlighted_end.bindInfoWindow(highlighted_end_html);
            document.map.addOverlay(highlighted_end);
        }
        
        // search highlighted change marker
        if(typeof highlighted_change != 'undefined' && highlighted_change != null) {
            document.map.removeOverlay(highlighted_change);
            highlighted_change = createMarker(highlighted_change.getLatLng().lat(), highlighted_change.getLatLng().lng(), 'change');
            highlighted_change.bindInfoWindow(highlighted_change_html);
            document.map.addOverlay(highlighted_change);
        }
    }
    
    zoom_level = current_zoom;
}

//
// select icon on poi type
//

function poi_icon(poi_type, active) {
    var icon_image_prefix = '';
    
    switch(poi_type) {
        case 'monument':
            icon_image_prefix = 'poi';
            break;
        case 'show':
            icon_image_prefix = 'show';
            break;         
        case 'ticket':
            icon_image_prefix = 'ticket';
            break;
        case 'churche':
            icon_image_prefix = 'icona_chiesa';
            break;
        case 'museum':
            icon_image_prefix = 'icona_musei';
            break;
        case 'shop':
            icon_image_prefix = 'icona_negozi';
            break;
        case 'restaurant':
            icon_image_prefix = 'icona_ristoranti';
            break;
        case 'curiositie':
            icon_image_prefix = 'icona_curiosita';
            break;
        case 'publicutilitie':
            icon_image_prefix = 'icona_pubblica';
            break;    
        default:
            icon_image_prefix = 'poi';
            break;
    }
    
    if(typeof active != 'undefined' && active) {
        icon_image_prefix += '_active';
    }
    
    return icon_image_prefix;
}


$(document).ready(function(){
    try {
        // reset links click
        $('.reset').each(function() {
            $(this).click(function(event) {
                eval($(this).attr('id')).call();
                event.stopPropagation();
            });
        });
        
        $('#time').bind('blur', timeBlur);
        $('#time').bind('focus', timeFocus);
        
        // remove blank list items inserted to make the page valid
        $('#monuments_container').html('');
        $('#shows_container').html('');
        $('#ticket_container').html('');
        
        $('#churches_container').html('');
        $('#museums_container').html('');
        $('#curiosities_container').html('');
        $('#publicutilities_container').html('');
        $('#shops_container').html('');
        $('#restaurants_container').html('');
        
        //
        // get stops (relation with places)
        //
        $.getJSON(project_path + 'map_browser/data/stops.json', function(data) {
            try {
                for(var i = 0; i < data.stops.length; i++) {
                    if(typeof data.stops[i] != 'undefined' && data.stops[i] != null) {
                        stops.addStop(data.stops[i].code, data.stops[i].description, data.stops[i].place_id);
                    }
                }
                
                //
                // get landings main informations
                //
                $.get(project_path + 'map_browser/php_proxy.php?path=jsp/it/ippunti/index.jsp', function(data) {
                    try {
                        converter = new Converter(data, stops);
                        var points = data.getElementsByTagName('point');
                        
                        debug_data = data;
                        
                        //alert("debug places info: "+points.length);
                        
                        for(var i = 0; i < points.length; i++) {
                            places.addPlace(
                                converter.findPlaceIdByPlaceCode(parseInt(get_text_content(points[i].getElementsByTagName('code')[0]))),
                                parseInt(get_text_content(points[i].getElementsByTagName('code')[0])),
                                get_text_content(points[i].getElementsByTagName('description')[0])
                            );
                            
                            //if (i == 0) {
                                //alert("debug places info 2:\n" + get_text_content(points[i].getElementsByTagName('code')[0]) + "\n" + parseInt(get_text_content(points[i].getElementsByTagName('code')[0])));
                                //alert("debug places info 3:\n" + converter.findPlaceIdByPlaceCode(parseInt(get_text_content(points[i].getElementsByTagName('code')[0]))) + "\n" + parseInt(get_text_content(points[i].getElementsByTagName('code')[0])) + "\n" + get_text_content(points[i].getElementsByTagName('description')[0]));
                            //}
                        }
                        
                        //
                        // get landings geolocation
                        //
                        $.getJSON(project_path + 'map_browser/get_geolocations.php', function(data) {
                            try {
                                for(var i = 0; i < places.places.length; i++) {
                                    if(typeof places.places[i] != 'undefined' && places.places[i] != null) {
                                        if(typeof data[places.places[i].id] != 'undefined') {
                                            places.places[i].lat = data[places.places[i].id].lat;
                                            places.places[i].lng = data[places.places[i].id].lng;
                                        }
                                    }
                                }
                                
                                if (GBrowserIsCompatible()) {
                                    // == Display the map, with some controls and set the initial location 
                                    document.map = new GMap2(document.getElementById("map"), {draggableCursor:"default"});
                                    document.map.addControl(new GSmallZoomControl3D());
                                    document.map.addControl(new GMapTypeControl());
                                    //document.map.addControl(new GOverviewMapControl());
                                    //document.map.enableGoogleBar();
                                    //document.map.enableContinuousZoom();
                                    document.map.enableDoubleClickZoom();
                                    document.map.setCenter(init_latlng, init_zoom_level);
                                    
                                    // initialize styles for map loading
                                    $('#map').css('background-image', 'url(map_browser/images/map_loader.gif)');
                                    $('#map').css('background-color', '#ffffff');
                                    $('#map').css('background-position', '50% 50%');
                                    $('#map').css('background-repeat', 'no-repeat');
                                    
                                    show_map_loading();
                                    
                                    GEvent.addListener(document.map, 'zoomend', function(oldlevel, newlevel) {
                                        zoomend_callback(oldlevel, newlevel);
                                    });
                                    
                                    //
                                    // get POIs informations
                                    //
                                    document.rpc = $.rpc
                                    (
                                        project_path + "xmlrpc.php" /* rpc server */
                                        , "xml" /* say that our server is xml */
                                        , function(server) { /* this is executed when the rpc server is prepared */
                                            if(typeof document.rpc.rpc != 'undefined' && document.rpc.rpc != null) {
                                                document.rpc.rpc.getNodes(function(data) {
                                                	/*
                                                	//zona debug
                                                	var strdebug = "";
                                                	for(var i = 0; i < data.result.length; i++) {
                                                		strdebug = strdebug + data.result[i].title + ", ";
                                                	}
                                                	alert(strdebug);
                                                	//fine zona debug
                                                	*/
                                                	
                                                    for(var i = 0; i < data.result.length; i++) {
                                                        pois_data[data.result[i].nid] = {
                                                            title: data.result[i].title,
                                                            image: (typeof data.result[i].attachments[0] != 'undefined' ? data.result[i].attachments[0].filepath : ''),
                                                            body: data.result[i].body,
                                                            type: data.result[i].field_poi_type_value,
                                                            zoom: data.result[i].field_zoom_value,
                                                            url_alias: ($('html').attr('lang') == 'en' ? 'en/' : '') + data.result[i].dst,
                                                            latitude: data.result[i].latitude,
                                                            longitude: data.result[i].longitude
                                                        };
                                                        
                                                        var icon_image_prefix = poi_icon(pois_data[data.result[i].nid].type);
                                                        var poi = createMarker(data.result[i].latitude, data.result[i].longitude, icon_image_prefix);
                                                        
                                                        var poi_menu_item = '<li id="poi_' + data.result[i].nid + '">'
                                                                          + '<a href="javascript:void(0)" onclick="show_poi_info_window(' + data.result[i].nid + ')">'
                                                                          + data.result[i].title
                                                                          + '</a>'
                                                                          + '</li>';
                                                                          
                                                        if(data.result[i].field_poi_type_value == 'ticket') {
                                                            $('#ticket_container').append(poi_menu_item);
                                                        }
                                                        else {
                                                            $('#' + data.result[i].field_poi_type_value + 's_container').append(poi_menu_item);
                                                        }
                                                        
                                                        var infobox_text = new Array();
                                                        if(data.result[i].field_poi_type_value == 'ticket') {
                                                            infobox_desc_tab = '<div class="poi">'
                                                                             + '<h2>' + data.result[i].title + '</h2>'
                                                                             + '<div class="text"><p>' + data.result[i].body + '</p></div>'
                                                                             + '</div>';
                                                                             
                                                            infobox_text.push(new GInfoWindowTab(dic.description, infobox_desc_tab));
                                                        }
                                                        else {
                                                            infobox_desc_tab = '<div class="poi">'
                                                                             + '<h2><a href="' + project_path + ($('html').attr('lang') == 'en' ? 'en/' : '') + data.result[i].dst + '">' + data.result[i].title + '</a></h2>'
                                                                             + '<div class="text"><p>' + data.result[i].body + '</p></div>'
                                                                             + '</div>';
                                                                             
                                                            infobox_text.push(new GInfoWindowTab(dic.description, infobox_desc_tab));
                                                                             
                                                            if(data.result[i].attachments.length > 0) {
                                                                infobox_photo_tab = '<div class="poi">'
                                                                                  + ((data.result[i].attachments.length > 0) ? '<div class="preview_image"><img width="280" src="' + data.result[i].attachments[0].filepath + '"/></div>' : '')
                                                                                  + '</div>';
                                                                                  
                                                                infobox_text.push(new GInfoWindowTab(dic.image, infobox_photo_tab));
                                                            }
                                                                         
                                                            if(data.result[i].events.length > 0) {
                                                                infobox_event_tab = '<div class="poi">'
                                                                                  + '<div class="events">'
                                                                                  + '<ul>';
                                                                             
                                                                for(var j = 0; j < data.result[i].events.length; j++) {
                                                                    infobox_event_tab += '<li><a href="' + project_path + data.result[i].events[j].dst + '">' + data.result[i].events[j].title + '</a></li>';
                                                                }
                                                                
                                                                infobox_event_tab += '</ul>'
                                                                                   + '</div>'
                                                                                   + '</div>';
                                                                                   
                                                                infobox_text.push(new GInfoWindowTab(dic.events, infobox_event_tab));
                                                            }
                                                        }
                                                                      
                                                        poi_info_window_htmls[data.result[i].nid] = infobox_text;
                                                                     
                                                        poi.bindInfoWindowHtml(poi_info_window_htmls[data.result[i].nid], {maxWidth: 300});
                                                        
                                                        if(pois_data[data.result[i].nid].zoom <= init_zoom_level) {
                                                            document.map.addOverlay(poi);
                                                        }
                                                        else {
                                                           // $('#poi_' + data.result[i].nid).hide();
                                                        }
                                                        
                                                        poi_markers[data.result[i].nid] = poi;
                                                    }
                                                    
                                                    // hide map loading
                                                    hide_map_loading();
                                                }, $('html').attr('lang'), 0);
                                                //originale
                                                //}, $('html').attr('lang'), 0);
                                            }
                                        }
                                    );
                                    
                                    //
                                    // show landing places
                                    //
                                    var values = new Array();
                                    var keys = new Array();
                                    for(var i = 0; i < places.places.length; i++) {
                                        if(typeof places.places[i] != 'undefined') {
                                            values.push(places.places[i].description);
                                            keys.push(places.places[i].id);
                                            
                                            // create landing place markers
                                            if(typeof places.places[i].lat != 'undefined' && typeof places.places[i].lng != 'undefined') {
                                                markers[places.places[i].id] = createMarker(places.places[i].lat, places.places[i].lng, 'landing');
                                                
                                                infobox_text = '<h2>' + places.places[i].description + '</h2>';
                                                infobox_text += '<p><a href="javascript:void(0)" onclick="selectStart(' + places.places[i].id + ')">' + dic.select_start + '</a> - ';
                                                infobox_text += '<a href="javascript:void(0)" onclick="selectEnd(' + places.places[i].id + ')">' + dic.select_end + '</a></p>';
                                                
                                                markers_info_window_htmls[places.places[i].id] = infobox_text;
                                                markers[places.places[i].id].bindInfoWindowHtml(markers_info_window_htmls[places.places[i].id]);
                                                
                                                document.map.addOverlay(markers[places.places[i].id]);
                                            }
                                        }
                                    }
                                    
                                    createOptions('start', dic.start_place, keys, values);
                                    //createOptions('end', dic.select_start_place, [], []);
                                    createOptions('end', dic.end_place, keys, values);
                                }
                                // display a warning if the browser was not compatible
                                else {
                                    alert(dic.gmap_not_supported);
                                }
                                
                                //alert("places geolocations loaded...\n" + places.places.length);
                            } catch(e) {
                                log("Exception: " + e);
                            }
                        });
                    } catch(e) {
                        log("Exception: " + e);
                    }
                    
                    //alert("places loaded...\n" + places.places.length);
                }, 'xml');
            } catch(e) {
                log("Exception: " + e);
            }
            
            //alert("stops loaded...\n" + stops.stops.length);
        });
    } catch(e) {
        log("Exception: " + e);
    }
    
    //
    // load routes
    //
    $.getJSON(project_path + 'map_browser/get_routes.php', function(data) {
        try {
            var values = new Array();
            var keys = new Array();
            
            $('#routes_container').append('<ul>');
            
            for(var i = 0; i < data.length; i++) {
                values.push('Route ' + data[i].name);
                keys.push(data[i].name);
                
                routes.addRoute(data[i].name, data[i].places, data[i].color, data[i].reverse);
                
                var route_menu_item = '<li>'
                                    + '<input id="route_' + data[i].name + '" onclick="show_route(\'' + data[i].name + '\')" type="checkbox" name="view_route" style="margin-right: 5px;"/>'
                                    + '<img align="top" width="20" src="' + project_path + 'map_browser/images/routes/' + data[i].name + '.gif" />'
                                    + dic.route + ' ' + data[i].name
                                    + '</li>';
                
                $('#routes_container').append(route_menu_item);
            }
            
            $('#routes_container').append('</ul>');

            //alert("routes loaded...\n" + routes.routes.length);
        } catch(e) {
            log("Exception: " + e);
        }
    });
    
    //
    // load land routes
    //
    $.getJSON(project_path + 'map_browser/get_land_routes.php', function(data) {
        try {
            $('#land_routes_container').append('<ul>');
            for(var i = 0; i < data.length; i++) {
                var route_menu_item = '<li title="' + data[i].tooltip + '">'
                                    + dic.route + ' ' + data[i].name
                                    + ' - <a href="' + data[i].timetable_fname + '" target="_blank" onClick="javascript:addAnalyticsJsTracking(\'land_route_timetable\', \'' + data[i].name + '\')">' + dic.timetable + '</a>'
                                    + ' - <a href="' + data[i].map_fname + '" target="_blank" onClick="javascript:addAnalyticsJsTracking(\'land_route_map\', \'' + data[i].name + '\')">' + dic.map + '</a>'
                                    + '</li>';
                
                $('#land_routes_container').append(route_menu_item);
            }
            
            $('#land_routes_container').append('</ul>');
            
            // create land routes tooltip
            $('#land_routes_container li').tooltip({fade: 250});
        } catch(e) {
            log("Exception: " + e);
        }
    });
    
    //
    // load routes polylines
    //
    $.getJSON(project_path + 'map_browser/get_polylines.php', function(data) {
        try {
            for(var i = 0; i < data.length; i++) {
                polylines.addRoutePolylines(data[i].name, data[i].polylines);
            }
            
            //alert("polylines loaded...\n" + polylines.polylines.length);
        } catch(e) {
            log("Exception: " + e);
        }
    });
    
    //
    // paths loading
    //
    $.getJSON(project_path + 'map_browser/get_paths.php?language=' + $('html').attr('lang'), function(data) {
        try {
            for(var i = 0; i < data.length; i++) {
                paths.addPath(data[i].name, data[i].points, '', data[i].category_id, i);
                
                if(data[i].polylines != 'undefined')
                	paths.paths[i].polylines = data[i].polylines;
            }
            
            //
            // path descriptions loading
            //
            $.getJSON(project_path + 'map_browser/get_path_descriptions.php?language=' + $('html').attr('lang'), function(data) {
                try {
                    for(var i in data) {
                        paths.paths[i].description = data[i];
                    }
                } catch(e) {
                    log("Exception: " + e);
                }
            });
            
            //
            // path categories loading
            //
            $.getJSON(project_path + 'map_browser/get_path_categories.php?language=' + $('html').attr('lang'), function(data) {
                try {
                    for(var i = 0; i < data.length; i++) {
                        var category_paths = new Array();
                        for(var j = 0; j < paths.paths.length; j++) {
                            if(paths.paths[j].category_id == i) {
                                category_paths.push({
                                    path: paths.paths[j],
                                    id: j
                                });
                            }
                        }
                        
                        path_categories[i] = {
                            name: data[i],
                            paths: category_paths
                        };
                    }
                    
                    var output = '';
                    for(var i = 0; i < path_categories.length; i++) {
                        if(path_categories[i].paths.length > 0) {
                            output += '<p' + (i == 0 ? ' class="first"' : '') + '>'
                                    + '<a href="javascript: void(0);" onclick="$(\'#path_cat_' + i + '\').slideToggle(); if(is_first_path_click) is_first_path_click = false; else update_map();">' + path_categories[i].name + '</a></p>'
                                    + '<div style="display: none;" id="path_cat_' + i + '"><ul>';
                                       
                            for(var j = 0; j < path_categories[i].paths.length; j++) {
                                var path_menu_item = '<li>'
                                                   + '<input name="selected_path" type="radio" id="path_' + path_categories[i].paths[j].id + '" onclick="show_path_object(' + path_categories[i].paths[j].id + ')"/>'
                                                   + path_categories[i].paths[j].path.name
                                                   + '</li>';
                                
                                output += path_menu_item;
                            }
                            
                            output += '</ul></div>';
                        }
                    }
                    
                    $('#paths_container').append(output);
                } catch(e) {
                    log_console("Exception: " + e);
                }
            });
        } catch(e) {
            log_console("Exception: " + e);
        }
    });
});

function update_map()
{
	try {
        //
        // get stops (relation with places)
        //
        $.getJSON(project_path + 'map_browser/data/stops.json', function(data) {
            try {
                for(var i = 0; i < data.stops.length; i++) {
                    if(typeof data.stops[i] != 'undefined' && data.stops[i] != null) {
                        stops.addStop(data.stops[i].code, data.stops[i].description, data.stops[i].place_id);
                    }
                }
                
                //
                // get landings main informations
                //
                $.get(project_path + 'map_browser/php_proxy.php?path=jsp/it/ippunti/index.jsp', function(data) {
                    try {
                        converter = new Converter(data, stops);
                        var points = data.getElementsByTagName('point');
                        
                        debug_data = data;
                        
                        //alert("debug places info: "+points.length);
                        
                        for(var i = 0; i < points.length; i++) {
                            places.addPlace(
                                converter.findPlaceIdByPlaceCode(parseInt(get_text_content(points[i].getElementsByTagName('code')[0]))),
                                parseInt(get_text_content(points[i].getElementsByTagName('code')[0])),
                                get_text_content(points[i].getElementsByTagName('description')[0])
                            );
                            
                            //if (i == 0) {
                                //alert("debug places info 2:\n" + get_text_content(points[i].getElementsByTagName('code')[0]) + "\n" + parseInt(get_text_content(points[i].getElementsByTagName('code')[0])));
                                //alert("debug places info 3:\n" + converter.findPlaceIdByPlaceCode(parseInt(get_text_content(points[i].getElementsByTagName('code')[0]))) + "\n" + parseInt(get_text_content(points[i].getElementsByTagName('code')[0])) + "\n" + get_text_content(points[i].getElementsByTagName('description')[0]));
                            //}
                        }
                        
                        //
                        // get landings geolocation
                        //
                        $.getJSON(project_path + 'map_browser/get_geolocations.php', function(data) {
                            try {
                                for(var i = 0; i < places.places.length; i++) {
                                    if(typeof places.places[i] != 'undefined' && places.places[i] != null) {
                                        if(typeof data[places.places[i].id] != 'undefined') {
                                            places.places[i].lat = data[places.places[i].id].lat;
                                            places.places[i].lng = data[places.places[i].id].lng;
                                        }
                                    }
                                }
                                
                                if (GBrowserIsCompatible()) {
                                    // == Display the map, with some controls and set the initial location 
                                    document.map = new GMap2(document.getElementById("map"), {draggableCursor:"default"});
                                    document.map.addControl(new GSmallZoomControl3D());
                                    document.map.addControl(new GMapTypeControl());
                                    //document.map.addControl(new GOverviewMapControl());
                                    //document.map.enableGoogleBar();
                                    //document.map.enableContinuousZoom();
                                    document.map.enableDoubleClickZoom();
                                    document.map.setCenter(init_latlng, init_zoom_level);
                                    
                                    // initialize styles for map loading
                                    $('#map').css('background-image', 'url(map_browser/images/map_loader.gif)');
                                    $('#map').css('background-color', '#ffffff');
                                    $('#map').css('background-position', '50% 50%');
                                    $('#map').css('background-repeat', 'no-repeat');
                                    
                                    show_map_loading();
                                    
                                    GEvent.addListener(document.map, 'zoomend', function(oldlevel, newlevel) {
                                        zoomend_callback(oldlevel, newlevel);
                                    });
                                    
                                    //
                                    // get POIs informations
                                    //
                                    document.rpc = $.rpc
                                    (
                                        project_path + "xmlrpc.php" /* rpc server */
                                        , "xml" /* say that our server is xml */
                                        , function(server) { /* this is executed when the rpc server is prepared */
                                            if(typeof document.rpc.rpc != 'undefined' && document.rpc.rpc != null) {
                                                document.rpc.rpc.getNodes(function(data) {
                                                	/*
                                                	//zona debug
                                                	var strdebug = "";
                                                	for(var i = 0; i < data.result.length; i++) {
                                                		strdebug = strdebug + data.result[i].title + ", ";
                                                	}
                                                	alert(strdebug);
                                                	//fine zona debug
                                                	*/
                                                    for(var i = 0; i < data.result.length; i++) {
                                                        pois_data[data.result[i].nid] = {
                                                            title: data.result[i].title,
                                                            image: (typeof data.result[i].attachments[0] != 'undefined' ? data.result[i].attachments[0].filepath : ''),
                                                            body: data.result[i].body,
                                                            type: data.result[i].field_poi_type_value,
                                                            zoom: data.result[i].field_zoom_value,
                                                            url_alias: ($('html').attr('lang') == 'en' ? 'en/' : '') + data.result[i].dst,
                                                            latitude: data.result[i].latitude,
                                                            longitude: data.result[i].longitude
                                                        };
                                                        
                                                        var icon_image_prefix = poi_icon(pois_data[data.result[i].nid].type);
                                                        var poi = createMarker(data.result[i].latitude, data.result[i].longitude, icon_image_prefix);
                                                        
                                                        var poi_menu_item = '<li id="poi_' + data.result[i].nid + '">'
                                                                          + '<a href="javascript:void(0)" onclick="show_poi_info_window(' + data.result[i].nid + ')">'
                                                                          + data.result[i].title
                                                                          + '</a>'
                                                                          + '</li>';
                                                                          
                                                        if(data.result[i].field_poi_type_value == 'ticket') {
                                                            $('#ticket_container').append(poi_menu_item);
                                                        }
                                                        else {
                                                            $('#' + data.result[i].field_poi_type_value + 's_container').append(poi_menu_item);
                                                        }
                                                        
                                                        var infobox_text = new Array();
                                                        if(data.result[i].field_poi_type_value == 'ticket') {
                                                            infobox_desc_tab = '<div class="poi">'
                                                                             + '<h2>' + data.result[i].title + '</h2>'
                                                                             + '<div class="text"><p>' + data.result[i].body + '</p></div>'
                                                                             + '</div>';
                                                                             
                                                            infobox_text.push(new GInfoWindowTab(dic.description, infobox_desc_tab));
                                                        }
                                                        else {
                                                            infobox_desc_tab = '<div class="poi">'
                                                                             + '<h2><a href="' + project_path + ($('html').attr('lang') == 'en' ? 'en/' : '') + data.result[i].dst + '">' + data.result[i].title + '</a></h2>'
                                                                             + '<div class="text"><p>' + data.result[i].body + '</p></div>'
                                                                             + '</div>';
                                                                             
                                                            infobox_text.push(new GInfoWindowTab(dic.description, infobox_desc_tab));
                                                                             
                                                            if(data.result[i].attachments.length > 0) {
                                                                infobox_photo_tab = '<div class="poi">'
                                                                                  + ((data.result[i].attachments.length > 0) ? '<div class="preview_image"><img width="280" src="' + data.result[i].attachments[0].filepath + '"/></div>' : '')
                                                                                  + '</div>';
                                                                                  
                                                                infobox_text.push(new GInfoWindowTab(dic.image, infobox_photo_tab));
                                                            }
                                                                         
                                                            if(data.result[i].events.length > 0) {
                                                                infobox_event_tab = '<div class="poi">'
                                                                                  + '<div class="events">'
                                                                                  + '<ul>';
                                                                             
                                                                for(var j = 0; j < data.result[i].events.length; j++) {
                                                                    infobox_event_tab += '<li><a href="' + project_path + data.result[i].events[j].dst + '">' + data.result[i].events[j].title + '</a></li>';
                                                                }
                                                                
                                                                infobox_event_tab += '</ul>'
                                                                                   + '</div>'
                                                                                   + '</div>';
                                                                                   
                                                                infobox_text.push(new GInfoWindowTab(dic.events, infobox_event_tab));
                                                            }
                                                        }
                                                                      
                                                        poi_info_window_htmls[data.result[i].nid] = infobox_text;
                                                                     
                                                        poi.bindInfoWindowHtml(poi_info_window_htmls[data.result[i].nid], {maxWidth: 300});
                                                        
                                                        if(pois_data[data.result[i].nid].zoom <= init_zoom_level) {
                                                            document.map.addOverlay(poi);
                                                        }
                                                        else {
                                                            $('#poi_' + data.result[i].nid).hide();
                                                        }
                                                        
                                                        poi_markers[data.result[i].nid] = poi;
                                                    }
                                                    
                                                    // hide map loading
                                                    hide_map_loading();
                                                }, $('html').attr('lang'), 0);
                                                //originale
                                                //}, $('html').attr('lang'), 0);
                                            }
                                        }
                                    );
                                    
                                    //
                                    // show landing places
                                    //
                                    var values = new Array();
                                    var keys = new Array();
                                    for(var i = 0; i < places.places.length; i++) {
                                        if(typeof places.places[i] != 'undefined') {
                                            values.push(places.places[i].description);
                                            keys.push(places.places[i].id);
                                            
                                            // create landing place markers
                                            if(typeof places.places[i].lat != 'undefined' && typeof places.places[i].lng != 'undefined') {
                                                markers[places.places[i].id] = createMarker(places.places[i].lat, places.places[i].lng, 'landing');
                                                
                                                infobox_text = '<h2>' + places.places[i].description + '</h2>';
                                                infobox_text += '<p><a href="javascript:void(0)" onclick="selectStart(' + places.places[i].id + ')">' + dic.select_start + '</a> - ';
                                                infobox_text += '<a href="javascript:void(0)" onclick="selectEnd(' + places.places[i].id + ')">' + dic.select_end + '</a></p>';
                                                
                                                markers_info_window_htmls[places.places[i].id] = infobox_text;
                                                markers[places.places[i].id].bindInfoWindowHtml(markers_info_window_htmls[places.places[i].id]);
                                                
                                                document.map.addOverlay(markers[places.places[i].id]);
                                            }
                                        }
                                    }
                                    
                                    createOptions('start', dic.start_place, keys, values);
                                    //createOptions('end', dic.select_start_place, [], []);
                                    createOptions('end', dic.end_place, keys, values);
                                }
                                // display a warning if the browser was not compatible
                                else {
                                    alert(dic.gmap_not_supported);
                                }
                                
                                //alert("places geolocations loaded...\n" + places.places.length);
                            } catch(e) {
                                log("Exception: " + e);
                            }
                        });
                    } catch(e) {
                        log("Exception: " + e);
                    }
                    
                    //alert("places loaded...\n" + places.places.length);
                }, 'xml');
            } catch(e) {
                log("Exception: " + e);
            }
            
            //alert("stops loaded...\n" + stops.stops.length);
        });
    } catch(e) {
        log("Exception: " + e);
    }
    
}
