var stops = new LandingStops();
var places = new LandingPlaces();
var routes = new Routes();
var polylines = new Polylines();
var paths = new Paths();
var path_categories = [];
var converter;
var poi_markers = [];
var poi_info_window_htmls = [];
var pois_data = [];
var path_polylines = [];
var search_polylines = [];
var route_polylines = new Object();
var walk_polylines = [];
var markers_info_window_htmls = [];
var path_high_landings = [];
var path_high_landings_html = [];
var path_old_landing_ids = [];
var path_high_pois = [];
var path_high_pois_html = [];
var path_old_poi_ids = [];
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 = [];
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;

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);*/
}

function log_console(message) {
    if (typeof console !== 'undefined' && DEBUG) {
        console.log(message);
    }
}

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();
}

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');
}

function timeFocus() {
    if ($('#time').val() == time_default_value) {
        $('#time').val('');
    }
}

function timeBlur() {
    if ($('#time').val() == '') {
        $('#time').val(time_default_value);
    }
}

function hideAllMarkers() {
    for (var i in markers) {
        markers[i].hide();
    }
}

function showAllMarkers() {
    for (var i in markers) {
        markers[i].show();
    }
}

function showMarkers(show_markers) {
    hideAllMarkers();
    for (var i in show_markers) {
        if (typeof markers[show_markers[i]] != 'undefined') {
            markers[show_markers[i]].show();
        }
    }
}

function remove_all_polylines() {
    try {
        for (var route_name in route_polylines) {
            log_console(route_name);
            log_console(route_polylines);
            remove_route_polyline(route_name);
            reset_route_checkbox(route_name);
        }
        remove_path_polylines();
        remove_walk_polylines();
        remove_search_polylines();
    }
    catch( e ) {
        log_consoel( e );
    }
}

function remove_search_polylines() {
    for (var i = 0; i < search_polylines.length; i++) {
        document.map.removeOverlay(search_polylines[i]);
    }
    search_polylines = [];
}

function remove_path_polylines() {
    for (var i = 0; i < path_polylines.length; i++) {
        document.map.removeOverlay(path_polylines[i]);
    }
    path_polylines = [];
}

function remove_walk_polylines() {
    for (var i = 0; i < walk_polylines.length; i++) {
        document.map.removeOverlay(walk_polylines[i]);
    }
    walk_polylines = [];
}

function remove_route_polyline(route_name) {
    try {
        log_console(route_name);
        log_console(route_polylines);
        if ( typeof route_polylines[route_name] !== "undefined" ) {
            for (var i = 0; i < route_polylines[route_name].length; i++) {
                document.map.removeOverlay(route_polylines[route_name][i]);
            }
        }
    }
    catch( e ) {
        log_console( e );
    }
    route_polylines[route_name] = [];
}

function reset_routes() {
    for (var route_name in route_polylines) {
        remove_route_polyline(route_name);
        reset_route_checkbox(route_name);
    }
}

function reset_route_checkbox(route_name) {
    $('#route_' + route_name).attr('checked', false);
}

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();
}

function reset_search() {
    reset_search_form();
    $('#search_results').slideUp();
    $('#time').val('hh:mm');
    update_map();
}

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;
    }
}

function filterEnd(start_place_id) {
    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 = [];
        var keys = [];
        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();
    });
}

function show_route(route_name) {
    var checkbox = document.getElementById('route_' + route_name);
    if ($(checkbox).is(':checked')) {
        var route = routes.findRouteByRouteName(route_name);
        log_console(route);
        addAnalyticsJsTracking('show_route', route_name);
        show_path(route.places[0], route.places[route.places.length - 1], route_name, 'route');
    } else {
        remove_route_polyline(route_name);
    }
}

function show_path(start_place_id, end_place_id, route_name, type) {
    var points = [];
    var between;
    var route = routes.findRouteByRouteName(route_name);
    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 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]);
    }
    points.push(end_place_id);
    var start_place_occurrence = [];
    for (var i in points)
    start_place_occurrence[points[i]] = 0;
    route_polylines[route_name] = [];
    for (var i = 0; i < points.length - 1; i++) {
        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.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 != 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 {}
        }
        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;
            }
        }
    }
}

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);
    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]));
        }
        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);
}

function search(start_place_id, end_place_id, arrival_time, first_search, change) {
    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);
        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';
    $('#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;
        var sorted_data = sort_search_result(data, change);
        $('#search_results').html(search_output(sorted_data, first_search, change));
        $('#search_results').slideDown();
        $('#loading').hide();
    });
}

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');
    }
}

function sort_search_result(data, change) {
    return data;
}

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'));
        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 {}
                    }
                    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://88.36.199.79/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) {}
                }
                if (j == 0) {
                    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;
}

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 = [];
    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 = [];
}

function remove_search_highlights() {
    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();
    }
}

function reset_search_form() {
    $('#start').val('');
    $('#end').val('');
}

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);
                    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 {
                        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>';
                    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();
        }
    }
}

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;
}

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;
}

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);
}

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
        });
    }
}

function show_map_loading() {
    $($('#map > div').get(0)).css('width', 0);
}

function hide_map_loading() {
    $($('#map > div').get(0)).css('width', '100%');
}

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);
    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();
            }
        } 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]);
                }
            }
        }
    }
    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]);
    }
    if (current_zoom != zoom_level) {
        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();
                }
            }
        }
        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]);
        }
        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);
        }
        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);
        }
        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;
}

function poi_icon(poi_type, active) {
    var icon_image_prefix = ''; /*if(typeof console!="undefined"){console.log(poi_type);}*/
    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 'church':
        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').each(function () {
            $(this).click(function (event) {
                eval($(this).attr('id')).call();
                event.stopPropagation();
            });
        });
        $('#time').bind('blur', timeBlur);
        $('#time').bind('focus', timeFocus);
        $('#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('');
        $.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(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;
                        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]));
                        }
                        $.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()) {
                                    document.map = new GMap2(document.getElementById("map"), {
                                        draggableCursor: "default"
                                    });
                                    document.map.addControl(new GSmallZoomControl3D());
                                    document.map.addControl(new GMapTypeControl());
                                    document.map.enableDoubleClickZoom();
                                    document.map.setCenter(init_latlng, init_zoom_level);
                                    $('#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);
                                    });
                                    document.rpc = $.rpc(project_path + "xmlrpc.php", "xml", function (server) {
                                        if (typeof document.rpc.rpc != 'undefined' && document.rpc.rpc != null) {
                                            document.rpc.rpc.getNodes(function (data) {
                                                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 {
                                                        if (data.result[i].field_poi_type_value == 'church') data.result[i].field_poi_type_value = 'churche';
                                                        $('#' + data.result[i].field_poi_type_value + 's_container').append(poi_menu_item);
                                                    }
                                                    var infobox_text = [];
                                                    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_markers[data.result[i].nid] = poi;
                                                }
                                                hide_map_loading();
                                            }, $('html').attr('lang'), 0);
                                        }
                                    });
                                    var values = [];
                                    var keys = [];
                                    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);
                                            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.end_place, keys, values);
                                } else {
                                    alert(dic.gmap_not_supported);
                                }
                            } catch (e) {
                                log("Exception: " + e);
                            }
                        });
                    } catch (e) {
                        log("Exception: " + e);
                    }
                }, 'xml');
            } catch (e) {
                log("Exception: " + e);
            }
        });
    } catch (e) {
        log("Exception: " + e);
    }
    $.getJSON(project_path + 'map_browser/get_routes.php', function (data) {
        try {
            var values = [];
            var keys = [];
            $('#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>');
        } catch (e) {
            log("Exception: " + e);
        }
    });
    $.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>');
            $('#land_routes_container li').tooltip({
                fade: 250
            });
        } catch (e) {
            log("Exception: " + e);
        }
    });
    $.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);
            }
        } catch (e) {
            log("Exception: " + e);
        }
    });
    $.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;
            }
            $.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);
                }
            });
            $.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 = [];
                        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 {
        $.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(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;
                        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]));
                        }
                        $.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()) {
                                    document.map = new GMap2(document.getElementById("map"), {
                                        draggableCursor: "default"
                                    });
                                    document.map.addControl(new GSmallZoomControl3D());
                                    document.map.addControl(new GMapTypeControl());
                                    document.map.enableDoubleClickZoom();
                                    document.map.setCenter(init_latlng, init_zoom_level);
                                    $('#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);
                                    });
                                    document.rpc = $.rpc(project_path + "xmlrpc.php", "xml", function (server) {
                                        if (typeof document.rpc.rpc != 'undefined' && document.rpc.rpc != null) {
                                            document.rpc.rpc.getNodes(function (data) {
                                                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 = [];
                                                    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();
                                            }, $('html').attr('lang'), 0);
                                        }
                                    });
                                    var values = [];
                                    var keys = [];
                                    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);
                                            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.end_place, keys, values);
                                } else {
                                    alert(dic.gmap_not_supported);
                                }
                            } catch (e) {
                                log("Exception: " + e);
                            }
                        });
                    } catch (e) {
                        log("Exception: " + e);
                    }
                }, 'xml');
            } catch (e) {
                log("Exception: " + e);
            }
        });
    } catch (e) {
        log("Exception: " + e);
    }
}

