﻿$(document).ready(function() {
    loadMaps();
    initUpdatePanelCallback();
});

//globale vars voor de Google Maps Api
var map = null;
var geocoder = null;

//standaardwaardes voor de "hoeken"
$('#ltlMaxLat').attr('value', 0);
$('#ltlMinLat').attr('value', 0);
$('#ltlMaxLon').attr('value', 0);
$('#ltlMinLon').attr('value', 0);

//functie die al het nodige initialiseert
function loadMaps() {
    var intMapCanvasLength = $('#map_canvas').length;
    var intAddressesLength = $('#ctl00_cphRight_ctlDealers_hdnAddresses').length;

    if ((intMapCanvasLength > 0) && (intAddressesLength > 0)) {        
        var strAddresses = $('#ctl00_cphRight_ctlDealers_hdnAddresses').attr('value');
                
        if (strAddresses != '') {
            $('#map_canvas').show();
            initializeGoogleMaps();
            loadAddresses(strAddresses);
        }
        else {
            $('#map_canvas').hide();
        }
    }
}

//functie die google maps initialiseert
function initializeGoogleMaps() {
    try {
        if (GBrowserIsCompatible()) {
            map = new GMap2(document.getElementById('map_canvas'));
            map.setCenter(new GLatLng(51.197229, 2.842599), 12); //dit is de geocodering van het adres van Carin zelf
            geocoder = new GClientGeocoder();
            map.addControl(new GSmallMapControl());
            //map.addControl(new GMapTypeControl());
            map.enableDoubleClickZoom();
        }
    }
    catch (e) {
        //alert('initialize: ' + e);
    }
}

//functie om adressenstring te splitsen en de adressen één voor één op de kaart te plaatsen
function loadAddresses(strAddresses) {
    //de adressenstring bestaat uit de aparte adresgegevens (in base64 formaat per adres), met een "#" als delimiter
    var arrAddresses = strAddresses.split('#');
    
    for (var i = 0, len = arrAddresses.length; i < len; ++i) {
        try {
            addAddress(arrAddresses[i], true, 0);
        }
        catch (e) {
            //alert('loadAddresses: ' + e);
        }
    }
}

function addAddress(strAddressData, boolLastAddress, intRetryCounter) {
    //de adresgegevens zijn base64 encoded en gebruiken een "|" als delimiter tussen de 3 onderdelen (opzoekadres, labeltekst, popuptekst)
    var arrAddressData = ($.base64Decode(strAddressData)).split('|');

    if (geocoder) {
        //geocoding gebeurt asynchroon
        geocoder.getLatLng( 
            arrAddressData[0],
            function(point) {
                if (!point) {                    
                    //indien er te snel geocodering opgevraagd wordt, zal Google sommige adressen weigeren, met een "not found" error als gevolg
                    //als dit gebeurt, proberen we na 100 millisecondes opnieuw een geocoding op te vragen, en we doen dit maximaal 50 keer (totale duur is 5 secondes dus)
                    if (intRetryCounter < 50) {
                        var strRunThis = 'addAddress("' + strAddressData + '", ' + boolLastAddress + ', ' + (intRetryCounter + 1) + ');';
                        setTimeout(strRunThis, 100);
                    }
                    else {
                        //alert(arrAddressData[0] + ' not found');
                    }
                }
                else {
                    var marker = new GMarker(point, { title: arrAddressData[1] });
                    map.addOverlay(marker);
                    GEvent.addListener(
                        marker,
                        'click',
                        function() {
                            marker.openInfoWindowHtml(arrAddressData[2]);
                        }
                    );

                    SetMinMaxValues(point.x, point.y); //x = longitude, y = latitude
                    if (boolLastAddress) {
                        CenterAndZoom(); //moet hier telkens aangezien toevoegen asynchroon is en we niet weten wanneer alle toevoegingen zullen klaar zijn
                    }
                }
            }
        );
    }
}

//functie om de uithoeken van rechthoek te bepalen waarin alle markers liggen
function SetMinMaxValues(newLon, newLat) {
    try {
        if (($('#ltlMinLon').attr('value') == 0) || ($('#ltlMinLon').attr('value') > newLon)) {
            $('#ltlMinLon').attr('value', newLon);
        }

        if (($('#ltlMaxLon').attr('value') == 0) || ($('#ltlMaxLon').attr('value') < newLon)) {
            $('#ltlMaxLon').attr('value', newLon);
        }

        if (($('#ltlMinLat').attr('value') == 0) || ($('#ltlMinLat').attr('value') > newLat)) {
            $('#ltlMinLat').attr('value', newLat);
        }

        if (($('#ltlMaxLat').attr('value') == 0) || ($('#ltlMaxLat').attr('value') < newLat)) {
            $('#ltlMaxLat').attr('value', newLat);
        }

        var minLon = parseFloat($('#ltlMinLon').attr('value'));
        var maxLon = parseFloat($('#ltlMaxLon').attr('value'));
        var minLat = parseFloat($('#ltlMinLat').attr('value'));
        var maxLat = parseFloat($('#ltlMaxLat').attr('value'));
    }
    catch (e) {
        //alert('SetMinMaxValues: ' + e);
    }
}

//functie om in- of uit te zoomen tot alle markers zichtbaar zijn
function CenterAndZoom() {
    try {
        var nePoint = new GLatLng($('#ltlMaxLat').attr('value'), $('#ltlMaxLon').attr('value'));
        var swPoint = new GLatLng($('#ltlMinLat').attr('value'), $('#ltlMinLon').attr('value'));

        var minLon = parseFloat($('#ltlMinLon').attr('value'));
        var maxLon = parseFloat($('#ltlMaxLon').attr('value'));
        var minLat = parseFloat($('#ltlMinLat').attr('value'));
        var maxLat = parseFloat($('#ltlMaxLat').attr('value'));

        var center = new GLatLng(((maxLat + minLat) / 2), ((maxLon + minLon) / 2));

        var minZoom = map.getBoundsZoomLevel(new GLatLngBounds(swPoint, nePoint));
        map.setCenter(center, minZoom);
    }
    catch (e) {
        //alert('CenterAndZoom: ' + e);
    }
}

/*  functies om een callback aan de refresh van een updatepanel te hangen
op deze manier kunnen we bijvoorbeeld lightboxes herinitialiseren bij een ververste gridview */
function EndRequestHandler(sender, args) {
    if (args.get_error() == undefined) {
        //hier de functies plaatsen die na updatepanel refresh uitgevoerd moeten worden
        loadMaps();
    }
    else {
        //alert("An error occured: " + args.get_error().message);
    }
}

function initUpdatePanelCallback() {
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
}


//$(document).ready(function() {
//    loadMaps();
//    initUpdatePanelCallback();
//});

//var map = null;
//var geocoder = null;

//$('#ltlMaxLat').attr('value', 0);
//$('#ltlMinLat').attr('value', 0);
//$('#ltlMaxLon').attr('value', 0);
//$('#ltlMinLon').attr('value', 0);

//function loadMaps() {
//    var intMapCanvasLength = $('#map_canvas').length;
//    var intAddressesLength = $('#ctl00_cphRight_ctlDealers_hdnAddresses').length;

//    if ((intMapCanvasLength > 0) && (intAddressesLength > 0)) {
//        var strAddresses = $('#ctl00_cphRight_ctlDealers_hdnAddresses').attr('value');
//        if (strAddresses != '') {
//            $('#map_canvas').show();
//            initializeGoogleMaps();
//            loadAddresses(strAddresses);
//        }
//        else {
//            $('#map_canvas').hide();
//        }
//    }
//}

//function initializeGoogleMaps() {
//    try {
//        if (GBrowserIsCompatible()) {
//            map = new GMap2(document.getElementById('map_canvas'));
//            map.setCenter(new GLatLng(51.197229, 2.842599), 12);
//            geocoder = new GClientGeocoder();
//            map.addControl(new GSmallMapControl());
//            //map.addControl(new GMapTypeControl());
//            map.enableDoubleClickZoom();
//        }
//    }
//    catch (e) {
//        alert('initialize: ' + e);
//    }
//}

//function loadAddresses(strAddresses) {
//    var arrAddresses = strAddresses.split('#');
//    for (var i = 3, len = arrAddresses.length; i < len; ++i) {
//        try {
//            addAddress(arrAddresses[i].split('|'), true, 0);
//        }
//        catch (e) {
//            alert('loadAddresses: ' + e);
//        }
//    }
//}

//function addAddress(arrAdressData, boolLastAddress, intRetryCounter) {
//    if (geocoder) {
//        geocoder.getLatLng(
//            arrAdressData[0],
//            function(point) {
//                if (!point) {
//                    if (intRetryCounter < 50) {
//                        addAddress(arrAdressData, boolLastAddress, intRetryCounter + 1);
//                    }
//                    else {
//                        alert(arrAdressData[0] + ' not found');
//                    }
//                }
//                else {
//                    var marker = new GMarker(point, { title: arrAdressData[1] });
//                    map.addOverlay(marker);
//                    GEvent.addListener(
//                        marker,
//                        'click',
//                        function() {
//                            marker.openInfoWindowHtml(arrAdressData[2]);
//                        }
//                    );

//                    SetMinMaxValues(point.x, point.y); //x = longitude, y = latitude
//                    if (boolLastAddress) {
//                        CenterAndZoom(); //moet hier telkens aangezien toevoegen asynchroon is en we niet weten wanneer alle toevoegingen zullen klaar zijn
//                    }
//                }
//            }
//        );
//    }
//}

//function SetMinMaxValues(newLon, newLat) {
//    try {
//        if (($('#ltlMinLon').attr('value') == 0) || ($('#ltlMinLon').attr('value') > newLon)) {
//            $('#ltlMinLon').attr('value', newLon);
//        }

//        if (($('#ltlMaxLon').attr('value') == 0) || ($('#ltlMaxLon').attr('value') < newLon)) {
//            $('#ltlMaxLon').attr('value', newLon);
//        }

//        if (($('#ltlMinLat').attr('value') == 0) || ($('#ltlMinLat').attr('value') > newLat)) {
//            $('#ltlMinLat').attr('value', newLat);
//        }

//        if (($('#ltlMaxLat').attr('value') == 0) || ($('#ltlMaxLat').attr('value') < newLat)) {
//            $('#ltlMaxLat').attr('value', newLat);
//        }

//        var minLon = parseFloat($('#ltlMinLon').attr('value'));
//        var maxLon = parseFloat($('#ltlMaxLon').attr('value'));
//        var minLat = parseFloat($('#ltlMinLat').attr('value'));
//        var maxLat = parseFloat($('#ltlMaxLat').attr('value'));
//        //alert(minLon + ' - ' + maxLon + ' - ' + minLat + ' - ' + maxLat);
//    }
//    catch (e) {
//        alert('SetMinMaxValues: ' + e);
//    }
//}

//function CenterAndZoom() {
//    try {
//        var nePoint = new GLatLng($('#ltlMaxLat').attr('value'), $('#ltlMaxLon').attr('value'));
//        var swPoint = new GLatLng($('#ltlMinLat').attr('value'), $('#ltlMinLon').attr('value'));

//        var minLon = parseFloat($('#ltlMinLon').attr('value'));
//        var maxLon = parseFloat($('#ltlMaxLon').attr('value'));
//        var minLat = parseFloat($('#ltlMinLat').attr('value'));
//        var maxLat = parseFloat($('#ltlMaxLat').attr('value'));

//        //alert(minLon + ' - ' + maxLon + ' - ' + minLat + ' - ' + maxLat);

//        var center = new GLatLng(((maxLat + minLat) / 2), ((maxLon + minLon) / 2));

//        var minZoom = map.getBoundsZoomLevel(new GLatLngBounds(swPoint, nePoint));
//        map.setCenter(center, minZoom);

//        //alert(minZoom + ' - ' + center);
//    }
//    catch (e) {
//        alert('CenterAndZoom: ' + e);
//    }
//}

///*  functies om een callback aan de refresh van een updatepanel te hangen
//op deze manier kunnen we bijvoorbeeld lightboxes herinitialiseren bij een ververste gridview */
//function EndRequestHandler(sender, args) {
//    if (args.get_error() == undefined) {
//        //hier de functies plaatsen die na updatepanel refresh uitgevoerd moeten worden
//        loadMaps();
//    }
//    else {
//        //alert("An error occured: " + args.get_error().message);
//    }
//}

//function initUpdatePanelCallback() {
//    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
//}
