// ---- Global variables
// Carte
var map;
// Tableau contenant les marqueurs
var markers = [];
// URL où on ira chercher les images pour les marqueurs
var imgs_url = 'http://carte.dondusang.com/imgs/markers2/';
// URL pour la requête ajax
var ajax_url = 'gmap_regionchanged.php';
// URL pour la geolocalisation
var geoloc_url = 'gmap_geocoder.php';
// Image utilisée pour l'ombre des marqueurs
var markerIconShadow = new google.maps.MarkerImage(imgs_url + 'sha.png', null, null,
                                                   new google.maps.Point(0, 35));
// Contient la date actuelle : utilisé pour le slider
var currentTime;
// InfoWindow utilisée pour afficher les détails de la colecte
var infoWindow = new google.maps.InfoWindow();
// Etat dans lequel est l'aide
var helpState = false;
var wheel = false;

var eligibilite_sang;
var eligibilite_plaq;
var eligibilite_plas;
var facebook = 0;

var mois = ['jan.', 'fev.', 'mar.', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sep.', 'oct.', 'nov.', 'déc.'];

/**
 * Affiche le sablier d'attente
 */
function showWheel() {
    if (!wheel) {
        $('#map_info').html('<div id="wheel" style="text-align:center"><img src="http://carte.dondusang.com/imgs/ui-anim_basic_16x16.gif" alt="Chargement" /></div>' + $('#map_info').html());
        wheel = true;
    }
}

/**
 * Affiche l'aide à l'utilisateur
 */
function toggleHelp() {
    if (helpState) {
        tipsyCmd('hide');
    } else {
        $('#ville').attr('title', 'Entrez le nom d\'une ville<br />ou un code postal');
        tipsyCmd('show');
    }
    helpState = !helpState;
}

function closeHelp() {
    if (helpState) {
        helpState = false;
        tipsyCmd('hide');
    }
}

/**
 * Permet d'envoyer "show" ou "false" aux fenêtres d'aide
 */
function tipsyCmd(cmd) {
    $('#ville').tipsy(cmd);
    $('#slider').tipsy(cmd);
    $('#map_canvas').tipsy(cmd);
    $('#map_info').tipsy(cmd);
}

/**
 * Met à jour les dates qui sont à côté du sélecteur de date
 */
function updateSlider(ui) {
    if (ui.values[0] > 0) {
        var date1 = new Date(currentTime + 3600000*24*7*ui.values[0]);
        $('#date1').text(zfill(date1.getDate(), 2) + '/' + zfill(date1.getMonth()+1, 2) + '/' + date1.getFullYear());
    }
    else {
        $('#date1').text('Aujourd\'hui');
    }
    var date2 = new Date(currentTime + 3600000*24*7*ui.values[1]);
    $('#date2').text(zfill(date2.getDate(), 2) + '/' + zfill(date2.getMonth()+1, 2) + '/' + date2.getFullYear());
}

/**
 * Initilise le selecteur de date
 */
function initializeSlider(t1, t2) {
    currentTime = new Date().getTime();
    $('#slider').slider({
          range: true
        , min: 0
        , max: 12
        , values: [t1, t2]
        , stop: function(event, ui) {
            mkQuery();
        }
        , slide: function(event, ui) {
            updateSlider(ui);
        }
    });    
}

function zfill(str, width){
    var result = String(str);
    var num_zeros = width - result.length;
    for(var i=num_zeros; i > 0; i--){
        result = '0' + result;
    }
    return result;
}

/**
 * Effectue la requête ajax sur le serveur pour récupérer la liste des collectes
 * dans la zone actuellement visionnée
 */
function mkQuery() {
    showWheel();
    closeHelp();
    // URL de base avec les coordonnées géographiques
    var url = ajax_url + "?" + $.param({nelat : map.getBounds().getNorthEast().lat()
                                      , nelon : map.getBounds().getNorthEast().lng()
                                      , swlat : map.getBounds().getSouthWest().lat()
                                      , swlon : map.getBounds().getSouthWest().lng()
                                      , fb : facebook});

    // Récupération des paramètres du slider
    var v = $('#slider').slider('values');
    if (v) {
        url += '&t1=' + v[0] + '&t2=' + v[1];
    }

    $.getJSON(url,
        function(jsondata) {
            wheel = false;
            if ((jsondata) && (jsondata != 'no')) {
                renderJson(jsondata);
            } else {
                alert('Erreur');
            }
    });
}

/**
 * Prend la réponse de la requête ajax et affiche les marqueurs sur la carte
 */
function renderJson(json) {
    if (json.num_results == 0) {
        $('#map_info').html('<div id="sitefixe">Erreur</div><div>Il n\'y a aucun résultat pour la zone géographique recherchée</div>');
        return false;
    }

    $('#ville').css('background', '#FFFFFF');
    var div = [];

    // On rempli la colonne de droite
    var mapInfoHtml = '';
    if (json.num_sitefx > 0) {
        div.push('<div id="sitefixe">Sites fixes</div>');
        for (var i = 0; i < json.num_sitefx; i++) {
            div.push(json[i].div);
        }
    }

    var e_s = eligibilite_sang - 1;
    var e_ps = eligibilite_plas - 1;
    var e_pq = eligibilite_plaq - 1;
    if (json.num_results - json.num_sitefx > 0) {
        div.push('<div id="sitefixe">Collectes mobiles par date</div>');
        for (var i = json.num_sitefx; i < json.num_results; i++) {
            if ((e_s > 0) && (json[i].c_date > e_s))  {
                var e = new Date(eligibilite_sang * 1000);
                div.push('<div id="eligi_s">' + zfill(e.getDate(), 2) + ' ' + mois[e.getMonth()] + ' - Eligible sang</div>');
                e_s = 0;
            }

            if ((e_ps > 0) && (json[i].c_date > e_ps))  {
                var e = new Date(eligibilite_plas * 1000);
                div.push('<div id="eligi_ps">' + zfill(e.getDate(), 2) + ' ' + mois[e.getMonth()] + ' - Eligible plasma</div>');
                e_ps = 0;
            }

            if ((e_pq > 0) && (json[i].c_date > e_pq))  {
                var e = new Date(eligibilite_plaq * 1000);
                div.push('<div id="eligi_pq">' + zfill(e.getDate(), 2) + ' ' + mois[e.getMonth()] + ' - Eligible plaquettes</div>');
                e_pq = 0;
            }

            div.push(json[i].div);
        }
    }


    $('#map_info').html(div.join(''));

    // On nettoye les marqueurs précédents
    if (markers) {
        for (var i = 0; i < markers.length; i++) {
            markers[i].setMap(null);
        }
        markers = [];
    }

    // On détermine si la taille des icônes reçues
    if (json.icot == 1) {
        // On ajoute les nouveaux marqueurs sur la carte
        for (var i = 0; i < json.num_results; i++) {
            var markerIcon = new google.maps.MarkerImage(imgs_url + json[i].icon + '.png', null, null,
                                                        new google.maps.Point(0, 12));
            var markerOptions = { position : new google.maps.LatLng(json[i].lat, json[i].lon)
                                , map : map
                                , icon : markerIcon
                                };
            var marker = new google.maps.Marker(markerOptions);
            marker.text = json[i].text;
            marker.num = i;
            markers.push(marker);

            google.maps.event.addListener(marker, 'click', function() {
                seeBuble(this.num);
            });
        }
    } else {
        // On ajoute les nouveaux marqueurs sur la carte
        for (var i = 0; i < json.num_results; i++) {
            var markerIcon = new google.maps.MarkerImage(imgs_url + json[i].icon + '.png', null, null,
                                                        new google.maps.Point(0, 35));
            var markerOptions = { position : new google.maps.LatLng(json[i].lat, json[i].lon)
                                , map : map
                                , icon : markerIcon
                                , shadow : markerIconShadow};
            var marker = new google.maps.Marker(markerOptions);
            marker.text = json[i].text;
            marker.num = i;
            markers.push(marker);

            google.maps.event.addListener(marker, 'click', function() {
                seeBuble(this.num);
            });
        }
    }

}

/**
 * Affiche la bulle lorsque l'on clique sur une ville
 */
function seeBuble(i) {
    infoWindow.currentMarker = i;
    infoWindow.setContent(markers[i].text);
    infoWindow.open(map, markers[i]);
}

/**
 * Bascule pour la fenêtre d'itinéraire
 */
function iti() {
    infoWindow.setContent("<div class='gmapsdirections'>"
    + "<form action='http://maps.google.fr/maps' method='get' target='_blank'>"
    + "<b>Itinéraire vers ce lieu</b><br />"
    + "<label for='saddr'>Adresse de départ :</label><br />"
    + "<input name='saddr' id='saddr' size='20' type='text'/><input value='Envoyer' type='submit' />"
    + "<input name='daddr' value='" + markers[infoWindow.currentMarker].getPosition().toUrlValue() + "' type='hidden'/>"
    + "<input name='hl' value='fr' type='hidden'/><address>Exemple : 123 rue principale, Gertwiller</address>"
    + "</form></div>");
}

/**
 * Fait une géolocalisation de la ville passée en argument
 */
function searchTown(town) {
    $.getJSON(geoloc_url + '?' + $.param({ville : town}),
        function(jsondata) {
            if (jsondata) {
                if (jsondata.error == 'nocoord') {
                    // Dans ce cas, la geolocalisation n'a rien donné
                    $('#ville').attr('title', 'Ville non trouvée ou non française');
                    $('#ville').tipsy('show');
                    $('#ville').css('background', '#FFAAAA');
                } else if (jsondata.error == null) {
                    // Réponse bien reçue
                    $('#ville').css('background', '#FFFFFF');
                    var coord = new google.maps.LatLng(jsondata.lat, jsondata.lon);
                    map.setCenter(coord);
                    map.setZoom(11);
                }
            } else {
                // Erreur dans le chargement du script
            }
    });
    return false;
}

/**
 * Gestion du bouton d'événement en AJAX
 */
function createAjaxEvent(id)
{
    $.ajax({
        type: "POST",
        url: "http://fb.dondusang.com/ajax/ajax_createevent_gmap.php",
        data: "c_id=" + id,

        beforeSend: function(){
            $('#link' + id).html('En cours de création...');
        },

        success: function(msg){
            if (msg == 'perm')
            {
                $('#link' + id).html('<a href="http://www.facebook.com/authorize.php?api_key=3e0763397161b788cbcf4453cb2b2a40&v=1.0&ext_perm=create_event&next=http://apps.facebook.com/dondusang/" target="_top">Autoriser Don du Sang à créer des événements</a>');
                $('#link' + id).css('border', '2px solid #333333');
                $('#link' + id).css('background-color', '#DDDDDD');
            }
            else if ((msg.match(/^\d+$/)) && (msg != 0))
            {
                $('#link' + id).html('<a href="http://www.facebook.com/event.php?eid=' + msg + '" target="_top">Evénement créé</a>');
                $('#link' + id).css('border', '2px solid #33FF33');
                $('#link' + id).css('background-color', '#CCFFCC');
            }
            else
            {
                alert(msg);
                $('#link' + id).html('Erreur lors de la création<div>' + msg + '</div>');
                $('#link' + id).css('border', '2px solid #FF3333');
                $('#link' + id).css('background-color', '#FFCCCC');
            }
            return false;
        }
    });
}

