var maxPages = 0;
var page = 1;
var flag = true;
var markers = new Array(); // Markers des events
var $resultsContainer;
var $resultsWrapper;
var $sort;
var map;
var events; // Events
var selected; // Evenènement sélectionné dans la colonne de droite
var region; // Région concernée par la recherche
var bounds; // limites de la map
var $pane1; // Panneau de recherche simple

var directionDisplay; // Sert pour le parcours
var directionsService; // Sert pour le parcours
var waypoints = new Array(); // Sert pour le parcours
var waypointsOrder = new Array(); // Sert pour le parcours

var drawRoute = false; // Si true => on trace la route entre les points /!\
// Limite technique de l'API: 10 points max
var startLocation; // Si route : Point de départ
var endLocation; // Si route : Point d'arrivée
var $formSort; // Formulaire de tri des events
var $currentForm; // Formulaire courant (soit le formulaire normal ou le
// formulaire avancé)
var $selected = null;
var triggers;
var titles = new Array('Les événements', 'Nos coups de coeur', 'Le circuit');
var countResults = false; // Flag pour dire si on veut compter les résultats
// ou les récuperer
var nbResults = 1; // Nombre de résultats
var computeResults = true; // Calculer le nombre de résultat à l'ouverture et
// à// la fermeture de la popup de recherche avancée
// ?
var triggerDistance;
var hasLayer;
var planCoordinates = new Array();
var googleRoute = true;
var tourId = 0;
var colors = new Array('#40C47E', '#359E66', '#27754B', '#16432B', '#5D8FEA', '#527ECE', '#2F5AAA', '#1D3C74');

$(document).ready(function()
{
    $('#registration_filters_region_id').val(regionId);
    $resultsContainer = $('#scroll_container');
    $resultsWrapper = $('#scroll_content');
    $sort = $('#sort');
    var $tabs = $('#tabs');
    $pane1 = $('#pane1');
    $pane3 = $('#pane3');
    $formSort = $('#form-sort');
    $currentForm = $form;
    setAddress($.cookie('address'), $.cookie('latitude'), $.cookie('longitude'));

    // Popup saisie adresse pour tri par distance
    triggerDistance = $("#distance-sort").overlay(
    {
        mask :
        {
            color : '#ebecff',
            loadSpeed : 200,
            opacity : 0.9
        },
        closeOnClick : true,
        onClose : function()
        {
            $('error-geocode').html('');
            if ($('#longitude').val() != '')
            {
                if (tab == 0)
                {
                    sendForm();
                } else
                {
                    initPage(1);
                }
            }
        },
        onLoad : function()
        {
            if ($('#longitude').val() == '')
            {
                $('#valid-geocode-address').hide();
            } else
            {
                $('#valid-geocode-address').show();
                geoCodeAddress();
            }
        }
    });

    // calcul dynamique du nombre de résultat
    $('select', $form).change(function()
    {
        countResults = true;
        sendForm();
    });
    $('select', $advancedForm).change(function()
    {
        countResults = true;
        sendForm();
    });
    $('input', $form).click(function()
    {
        countResults = true;
        sendForm();
    });
    $('input', $advancedForm).click(function()
    {
        countResults = true;
        sendForm();
    });

    // Parcours
    $('input', $('#tour-form')).live('click', function()
    {
        getTours();
    });

    // Clic sur bloc de description
    $('.event').live('click', function()
    {
        var id = this.id.replace('event', '');
        // Si l'event n'a pas de position de définie => le marker n'existe
        // pas
        if (markers[id])
        {
            map.setCenter(markers[id].getPosition());
            markers[id].setAnimation(google.maps.Animation.BOUNCE);
            setTimeout(function()
            {
                markers[id].setAnimation(null);
            }, 2000);
        }
    });

    // Supression de la premiere option du select region
    $("#registration_filters_region_id option[value='']").remove();
    $("#adv_registration_filters_region_id option[value='']").remove();

    // Envoie du formualaire au chargement de la page
    $('.menu_map .tab_' + (parseInt(tab) + 1)).trigger('click');
    // Initialisation du bon onglet en fonction de l'url (parametre "tab")
    initPage(1);

    // "change" event on Sort select
    $('#sort').change(function()
    {
        countResults = false;
        if (this.value == 'distance')
        {
            $('#distance-sort').show();
            $('#distance-sort').trigger('click');
        } else
        {
            $('#distance-sort').hide();
            if (tab == 0)
            {
                sendForm();
            } else
            {
                initPage(1);
            }
        }
    });

    // Envoi du formulaire normal
    $form.submit(function()
    {
        $('#registration_filters_region_latitude').val('');
        $('#registration_filters_region_longtude').val('');
        countResults = false;
        if (nbResults)
        {
            initTab1(1);
        }
        return false;
    });

    // Envoi du formulaire avancé
    $advancedForm.submit(function()
    {
        countResults = false;
        closeAdvancedSearchPopup();
        sendForm();
        return false;
    });

    // Result bloc
    $("div.item_A", $resultsWrapper).live('mouseover', function()
    {
        $(this).addClass("itemOver_A");
    });
    $("div.item_A", $resultsWrapper).live('mouseout', function()
    {
        $(this).removeClass("itemOver_A");
    });
    $("div.item_M", $resultsWrapper).live('mouseover', function()
    {
        $(this).addClass("itemOver_M");
    });
    $("div.item_M", $resultsWrapper).live('mouseout', function()
    {
        $(this).removeClass("itemOver_M");
    });
    $("div.item_C", $resultsWrapper).live('mouseover', function()
    {
        $(this).addClass("itemOver_C");
    });
    $("div.item_C", $resultsWrapper).live('mouseout', function()
    {
        $(this).removeClass("itemOver_C");
    });

    // Tabs initialisation
    $(".tabs").tabs(".panes .pane_1",
    {
        initialIndex : tab
    });

    $('.tab_1').click(function()
    {
        initTab1(0);
    });
    $('.tab_2').click(function()
    {
        initTab2(1);
    });
    $('.tab_3').click(function()
    {
        initTab3(1);
    });

    // Scroll sur les résultats
    $resultsContainer.scroll(function()
    {
        var last = $('.event', $resultsWrapper).last();
        // Si dernier element est affiché et on est pas à la dernière page =>
        // requete pour charger le reste
        if (isScrolledIntoView(last) && flag == true && page < maxPages)
        {
            page++;
            flag = false; // Eviter de lancer plusieurs requetes ajax en même
            // temps, car l'évènement est déclenché un grand
            // nombre de fois à chaque scroll
            var url = urlIndexGmap + '?' + '&page=' + page;
            if ($sort.val() == 'distance')
                url = url + '&registration_filters[latitude]=' + $('#latitude').val() + '&registration_filters[longitude]=' + $('#longitude').val();
            $.getJSON(url, function(data)
            {
                $resultsWrapper.append(data.results);
                flag = true;
                addNewMarkers(jQuery.parseJSON(data.resultsJson));
            });
        }
    });

    // Bouton rechercher du geocodage de l'adresse
    $('#geocode-address').click(function()
    {
        $('#map_geocode').html(ajaxLoaderTag);
        $('#valid-geocode-address').hide();
        $("#longitude").val('');
        $("#latitude").val('');
        geoCodeAddress();
    });

    // Bouton valider du geocodage de l'adresse
    $('#valid-geocode-address').click(function()
    {
        triggerDistance.eq(0).overlay().close();
    });
});

/** ******************************************************************************************************************************************************** */
/*****************************************************************   FONCTIONS INITIALISATION TAB **********************************************************/
/** ******************************************************************************************************************************************************** */

function initPage(load)
{
    eval('initTab' + (tab * 1 + 1) + '(' + load + ')');
}

function initTab1(load)
{
    tab = 0;
    $pane3.hide();
    $pane1.show();

    $formSort.show();
    $resultsContainer.attr('style', '');

    if (load)
        sendForm();
}

function initTab2(load)
{
    tab = 1;
    $pane1.hide();
    $pane3.hide();
    $formSort.show();
    $resultsContainer.attr('style', '');

    drawRoute = false;
    getResults(urlFilter + '?favorites_map=1&sort=' + $sort.val() + '&registration_filters[region_id]=' + $('#registration_filters_region_id').val());
}

function initTab3(load)
{
    tab = 2;
    $pane1.hide();
    $pane3.show();
    $formSort.hide();

    $resultsContainer.attr('style', 'height:' + ($resultsContainer.height() + $formSort.height()) + 'px');

    drawRoute = true;
    getTours();
}

// Fonction initialisation Map - Tab 1 (recherche)
function initialize()
{
    var position = new google.maps.LatLng(region.latitude, region.longitude);

    var myOptions =
    {
        mapTypeId : google.maps.MapTypeId.TERRAIN
    };
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    bounds = new google.maps.LatLngBounds();

    if (hasLayer)
    {
        var georssLayer = new google.maps.KmlLayer(kmlUrl + region.id + '.kml');
        georssLayer.setMap(map);
    }

    /*
     * google.maps.event.addListener(map, 'bounds_changed', function() { if
     * (!map.getBounds().intersects(bounds)) { map.panToBounds(bounds); } });
     */
}

/*
 * Ajouter les markers sur la map
 */
function addNewMarkers(events)
{
    $.each(events, function(i, event)
    {
        var latitude = '';
        var longitude = '';

        if (event.host_latitude && event.host_longitude)
        {
            latitude = event.host_latitude.replace(',', '.');
            longitude = event.host_longitude.replace(',', '.');
        } else if (event.access_latitude && event.access_longitude)
        {
            latitude = event.access_latitude.replace(',', '.');
            longitude = event.access_longitude.replace(',', '.');
        }

        if (isFloat(latitude) && isFloat(longitude))
        {
            var id = event.id.replace('event', '');
            var position = new google.maps.LatLng(latitude, longitude);

            bounds.extend(position);

            if (drawRoute && googleRoute)
            {
                var index = waypoints[tourId].length;
                waypoints[tourId][index] =
                {
                    location : position,
                    stopover : true
                };
                waypointsOrder[tourId][index] =
                {
                    'id' : id,
                    'icon' : getIcon(event.is_favorite, event.type),
                    'title' : event.name
                };
            } else
            {
                if (drawRoute)
                {
                    planCoordinates[tourId].push(position);
                }
                var marker = new google.maps.Marker(
                {
                    position : position,
                    map : map,
                    icon : getIcon(event.is_favorite, event.type),
                    title : event.name
                });
                marker.setAnimation(google.maps.Animation.DROP);

                markers[id] = marker;

                // Clic sur marker
                google.maps.event.addListener(markers[id], 'click', function()
                {
                    goToByScroll('event' + id);
                });
            }
        }
    });
    // Si pas en france => pas de kml faut fixer les limites
    if (!hasLayer)
    {
        map.fitBounds(bounds);
    }
}

/** ******************************************************************************************************************************************************** */
/*****************************************************************   ONGLETS RECHERCHE / COUPS DE COEUR ****************************************************/
/** ******************************************************************************************************************************************************** */
/*
 * Récuperer les résultats et initialiser la map
 */
function getResults(url)
{
    page = 1;
    // Si on veut récupérer les résultats
    if (countResults == false)
    {
        if (!nbResults)
            return false;
        // recharge le bloc edito si la region a changée
        if ($('#registration_filters_region_id').val() != regionId)
            $('#pdf_links').html(ajaxLoaderTag);

        // image chargement à la place de la map
        $("#map_canvas").html(ajaxLoaderTag);
        $resultsWrapper.html(ajaxLoaderTag);
    } else
    // On veut compter les résultats
    {
        url = url + '&countResults=1';
    }

    if (tab == 0)
    {
        nbResults = 0;
    }

    $.getJSON(url, function(data)
    {
        if (tab == 0)
        {
            nbResults = data.nbResults;
        }

        if (data.maxPages >= 0)
        {
            callBackGetResults(data);
        } else
        {
            callBackGetNbResults(data.nbResults);
        }
    });
}

function callBackGetNbResults(nb)
{
    if (tab == 0)
    {
        if (nb != 0)
            $('button', $currentForm).html('Afficher les ' + nb + ' événements');
        else
            $('button', $currentForm).html('Aucun événement');
    }
}

function callBackGetResults(data)
{
    hasLayer = data.hasLayer;
    $('#fieldset_3').html(data.tours);
    // recharge le bloc edito si la region a changée
    if (data.pdfLinksEdito)
    {
        $('#pdf_links').html(data.pdfLinksEdito);
        regionId = $('#registration_filters_region_id').val();
    }
    if (data.nbResults != 0)
    {
        maxPages = data.maxPages;
        // Ajout des events dans la liste scrollable
        $resultsWrapper.html(data.results);
        // scroll vers le haut
        $resultsContainer.animate(
        {
            scrollTop : 0
        }, 'slow');

        // ajout des markers
        events = jQuery.parseJSON(data.resultsJson);
        region = data.region;

        // initialisation de la map
        initialize();
        addNewMarkers(events);

        $('#nbResults').html(data.nbResults + ' événements');
    } else
    {
        $resultsWrapper.html('');
        $('#nbResults').html('Aucun événement');
        $("#map_canvas").html('<div id="results-gmap-text">...Aucun événement...</div>');
    }

    setMetas();

    // Valable qu'au premier chargement de la page => on affiche le bloc central
    // après la requete ajax et on cache le loader
    $('#hidden-content').show();
    $('#ajax-loader').hide();
    data = null;
}

/*
 * Envoi du formulaire de recherche / recherche avancée
 */
function sendForm()
{
    drawRoute = false;
    var url = urlFilter + '?' + $currentForm.serialize() + '&sort=' + $sort.val();
    if ($sort.val() == 'distance')
        url = url + '&registration_filters[latitude]=' + $('#latitude').val() + '&registration_filters[longitude]=' + $('#longitude').val();
    getResults(url);
}

/** ******************************************************************************************************************************************************** */
/*****************************************************************   ONGLET PARCOURS ***********************************************************************/
/** ******************************************************************************************************************************************************** */

function getTours()
{
    page = 1;
    maxPages = 1;
    
    if ($('#tour-form').serialize() != '')
    {
        tourId = 0;
        $resultsWrapper.html(ajaxLoaderTag);
        $('#tour-form .legende').attr('style', 'background-color: white');
        $.getJSON(urlTour + '?' + $('#tour-form').serialize(), function(data)
        {
            $resultsContainer.animate(
            {
                scrollTop : 0
            }, 'slow');

            waypoints = new Array();
            waypointsOrder = new Array();
            $resultsWrapper.html(data.html);

            initialize();

            var cpt = 0;
            $.each(data.tours, function(i, tour)
            {
                tourId++;
                googleRoute = (tour.Registrations.length < 10);
                cpt += tour.Registrations.length;
                events = tour.Registrations;

                waypoints[tourId] = new Array();
                waypointsOrder[tourId] = new Array();
                planCoordinates[tourId] = new Array();

                addNewMarkers(events);
                if (googleRoute)
                {
                    calcRoute(tourId);
                } else
                {
                    var routePath = new google.maps.Polyline(
                    {
                        path : planCoordinates[tourId],
                        strokeColor : colors[tourId % colors.length],
                        strokeOpacity : 1.0,
                        strokeWeight : 4
                    });
                    routePath.setMap(map);
                }
                $('#legende' + tour.id).attr('style', 'background-color:' + colors[tourId % colors.length]);
            });
            setMetas();
            $('#nbResults').html(cpt + ' événements');
        });
    } else
    {
        $resultsWrapper.html('');
        $('#nbResults').html('Aucun évènement');
        $("#map_canvas").html('<div id="results-gmap-text">...Aucun évènement...</div>');
    }
}

// calcule la route pour le parcours
function calcRoute(idtour)
{
    directionsService = new google.maps.DirectionsService();

    var selectedMode = 'WALKING';
    var origin = waypoints[idtour][0].location;
    var destination = waypoints[idtour][waypoints[idtour].length - 1].location;
    var last = waypoints[idtour].length - 1;

    // On retire le départ et l'arrivée => on obient les waypoints
    waypoints[idtour].splice(0, 1);
    waypoints[idtour].splice(last, 1);

    var request =
    {
        optimizeWaypoints : false,
        origin : origin,
        destination : destination,
        waypoints : waypoints[idtour],
        travelMode : google.maps.DirectionsTravelMode[selectedMode]
    };

    directionsService.route(request, function(response, status)
    {
        RenderCustomDirections(response, status, idtour)
    });
}

// Sert uniquement à pouvoir choisir les marqueurs des waypoints (parcours
// uniquement)
function RenderCustomDirections(response, status, idtour)
{
    if (status == google.maps.DirectionsStatus.OK)
    {
        // directionsDisplay.setDirections(response);
        waypts = [];
        var bounds = new google.maps.LatLngBounds();
        var route = response.routes[0];
        startLocation = new Object();
        endLocation = new Object();
        var polyline = new google.maps.Polyline(
        {
            path : [],
            strokeColor : colors[idtour % colors.length],
            strokeWeight : 4
        });

        var legs = response.routes[0].legs;
        var lastLeg = legs.length - 1;
        for ( var i = 0; i <= lastLeg; i++)
        {
            var id = waypointsOrder[idtour][i].id;
            var currentMarker = new google.maps.Marker(
            {
                id : id,
                position : legs[i].start_location,
                map : map,
                icon : waypointsOrder[idtour][i].icon,
                title : waypointsOrder[idtour][i].title
            });

            // set les icons
            if (i == 0)
            {
                startLocation.latlng = legs[i].start_location;
                startLocation.address = legs[i].start_address;
                startLocation.marker = currentMarker;
                markers[id] = startLocation.marker;
            } else if (i != lastLeg)
            {
                waypts[i] = new Object();
                waypts[i].latlng = legs[i].start_location;
                waypts[i].address = legs[i].start_address;
                waypts[i].marker = currentMarker;
                markers[id] = waypts[i].marker;
            } else
            {
                endLocation.latlng = legs[i].end_location;
                endLocation.address = legs[i].end_address;
                endLocation.marker = currentMarker;
                endLocation.marker.position = legs[i].end_location;
                markers[id] = endLocation.marker;
            }

            // Clic sur marker
            google.maps.event.addListener(markers[id], 'click', function(a)
            {
                goToByScroll('event' + this.id);
            });

            var steps = legs[i].steps;

            // Retrace la route
            for (j = 0; j < steps.length; j++)
            {
                var nextSegment = steps[j].path;
                for (k = 0; k < nextSegment.length; k++)
                {
                    polyline.getPath().push(nextSegment[k]);
                    bounds.extend(nextSegment[k]);
                }
            }
        }
        polyline.setMap(map);
        // Si pas en france => pas de kml faut fixer les limites
        if (!hasLayer)
        {
            map.fitBounds(bounds);
        }
    }
}

/** ******************************************************************************************************************************************************** */
/*****************************************************************   FONCTIONS GENERIQUES ****************************************************************/
/** ******************************************************************************************************************************************************** */
/*
 * Retourne true si l'élément est visible dans la liste avec scroll
 */
function isScrolledIntoView(element)
{
    return ($resultsContainer.offset().top + 5 * element.height() >= element.offset().top);
}

/*
 * Fonction pour scroller automatiquement sur l'element id
 */
function goToByScroll(id)
{
    if($selected != null)
    {
        $selected.trigger('mouseout');
    }
    $selected = $('#' + id);
    $selected.trigger('mouseover');

    $resultsContainer.animate(
    {
        scrollTop : document.getElementById(id).offsetTop - document.getElementById('scroll_container').offsetTop
    }, 'slow');
}

/*
 * Mets à jour le titre de la page, le nombre de résultats, le drapeau
 */
function setMetas()
{
    // Titre de la page
    title = titles[tab] + ' en ' + region.name;
    $('#mapTitle').html(title);
    window.document.title = title + ' - ' + windowTitlePrefix;

    // Drapeau du pays
    $('#country').replaceWith('<strong id="country" class="flag ' + region.Country.code + '">' + region.Country.name + '</strong>');
}

/*
 * retourne l'url de l'icon en fonction du type de l'event et s'il est favori
 */
function getIcon(isFavorite, type)
{
    return icons[type + isFavorite];
}

/** ******************************************************************************************************************************************************** */
/*****************************************************************   POPUP TRI PAR DISTANCE ****************************************************************/
/** ******************************************************************************************************************************************************** */
function geoCodeAddress()
{
    // Récupération de l'adresse en cookie
    var address = $("#address").val();
    $.cookie('address', address,
    {
        path : '/'
    });

    geocoder = new google.maps.Geocoder();
    var latlng = new google.maps.LatLng(region.latitude, region.longitude);
    var myOptions =
    {
        zoom : 10,
        center : latlng,
        mapTypeId : google.maps.MapTypeId.ROADMAP
    };
    mapAdress = new google.maps.Map(document.getElementById("map_geocode"), myOptions);

    geocoder.geocode(
    {
        'address' : address
    }, function(results, status)
    {
        if (status == google.maps.GeocoderStatus.OK)
        {
            $('#error-geocode').hide();
            $('#help').show();
            mapAdress.setCenter(results[0].geometry.location);

            if (results.length == 1)
            {
                setAddress(results[0].formatted_address, results[0].geometry.location.lat(), results[0].geometry.location.lng());
                $('#valid-geocode-address').show();
                $('#help').hide();
            }

            $.each(results, function(id, result)
            {
                var marker = new google.maps.Marker(
                {
                    map : mapAdress,
                    position : result.geometry.location
                });
                google.maps.event.addListener(marker, 'click', function()
                {
                    $('#valid-geocode-address').show();
                    setAddress(result.formatted_address, result.geometry.location.lat(), result.geometry.location.lng());
                });
            });
            return;
        }
        $('#help').hide();
        $('#valid-geocode-address').hide();
        $('#map_geocode').html('');
        $('#error-geocode').show();
        if (google.maps.GeocoderStatus.ZERO_RESULTS)
        {
            $('#error-geocode').html('Adresse introuvable');

        } else if (google.maps.GeocoderStatus.INVALID_REQUEST)
        {
            $('#error-geocode').html('Addresse invalide, veuillez vérifier votre saisie');
        } else if (google.maps.GeocoderStatus.INVALID_REQUEST)
        {
            $('#error-geocode').html('Une erreur est survenue, veuillez réessayer');
        }
    });
}

function setAddress(adress, lat, long)
{
    if (typeof (adress) == 'object')
    {
        adress = '';
        long = '';
        lat = '';
    }

    $("#address").val(adress);
    $("#longitude").val(long);
    $("#latitude").val(lat);
    $.cookie('address', adress,
    {
        path : '/'
    });
    $.cookie('longitude', long,
    {
        path : '/'
    });
    $.cookie('latitude', lat,
    {
        path : '/'
    });
}
