var _resultList = false;
var _body = $('body');
var _storeMap = $('.js-store-map');
var _storeListContainer = $('#storelist-container');
var _filter = false;
var _resizeMap = false;

var _gmapKey = _storeMap.data('gkey');

createCookie = function (name, value, days) {
    var expires = "";
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        expires = "; expires=" + date.toGMTString();
    }
    document.cookie = encodeURI(name) + "=" + encodeURI(value) + expires + "; path=/";
};

eraseCookie = function (name) {
    createCookie(name, "", -1);
};

readCookie = function (name) {
    var nameEQ = encodeURI(name) + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0) return decodeURI(c.substring(nameEQ.length, c.length));
    }
    return null;
};

function initMaps() {
    _body.append($('<script src="/typo3conf/ext/bm_frontend/Resources/Public/Scripts/custom_infobubble.js"></script>'));
    _storeMap.storemap({
        markerIcon: {
            url: '/typo3conf/ext/bm_frontend/Resources/Public/Assets/Images/Maps/m1-logo.png',
            size: new google.maps.Size(53, 52)
        },
        clusterConfiguration: {
            styles: [
                {
                    'url': '/typo3conf/ext/bm_frontend/Resources/Public/Assets/Images/Maps/m1.png',
                    'textColor': 'white',
                    'width': '53',
                    'height': '52'
                },
                {
                    'url': '/typo3conf/ext/bm_frontend/Resources/Public/Assets/Images/Maps/m2.png',
                    'textColor': 'white',
                    'width': '56',
                    'height': '55'
                },
                {
                    'url': '/typo3conf/ext/bm_frontend/Resources/Public/Assets/Images/Maps/m3.png',
                    'textColor': 'white',
                    'width': '66',
                    'height': '65'
                },
                {
                    'url': '/typo3conf/ext/bm_frontend/Resources/Public/Assets/Images/Maps/m4.png',
                    'textColor': 'white',
                    'width': '78',
                    'height': '77'
                },
                {
                    'url': '/typo3conf/ext/bm_frontend/Resources/Public/Assets/Images/Maps/m5.png',
                    'textColor': 'white',
                    'width': '90',
                    'height': '89'
                }
            ]
        },
        infoBoxConfiguration: {
            borderRadius: 0,
            borderWidth: 0,
            padding: 0,
            shadowStyle: 0,
            arrowSize: 0
        },
        autocompleteConfiguration: {
            use: true,
            field: 'nor_location',
            options: {
                types: ['geocode']
            }
        }
    });

    console.log('add listener', _storeMap.storemap('getAutocompleteService'));
    /*
    _storeMap.storemap('getAutocompleteService').addListener('place_changed', function() {
        console.log('test:', _storeMap.storemap('getAutocompleteService').getPlace());
    })
    */
}

function getParameterByName(name, url) {
    if (!url) url = window.location.href;
    name = name.replace(/[\[\]]/g, "\\$&");
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, " "));
}

function createStoreList(stores) {
    var storeListItems = _storeListContainer.find('.storeListItem');

    if (storeListItems.length > 0) {
        $(storeListItems).remove();
    }

    _storeListContainer.removeClass('hide');
    if (stores !== false && _storeListContainer.length > 0) {
        _storeListContainer.removeClass('empty');
        _storeListContainer.addClass('active');
        $.each(stores, function (i) {
            _storeListContainer.append(stores[i].listItem)
        });
        $(window).trigger('content.changed');
    } else {
        if (!_storeListContainer.hasClass('empty')) {
            _storeListContainer.addClass('empty');
            _storeListContainer.removeClass('active');
        }
    }
}

function filterResultList() {
    if (_filter.length > 0 && _resultList.length > 0) {
        var filteredResults = $.map(_resultList, function (store, i) {
            if (_filter.some(
                function (v) {
                    var _services = store.services.split(',');
                    return _services.indexOf(v) >= 0;
                })) {
                return store;
            }
        });
        if (filteredResults.length > 0) {
            _storeMap.storemap('updateStoreListCluster', filteredResults);
            createStoreList(filteredResults);
        } else {
            _storeMap.storemap('clearAllMarkers');
            createStoreList(false);
        }
    }
    if (!_filter && _resultList.length > 0) {
        _storeMap.storemap('updateStoreListCluster', _resultList);
        createStoreList(_resultList);
    }
}

function ajaxUpdateStores(data) {

    var url = '';
    if (baseUrl) {
        url = baseUrl + url;
    }
    $.ajax({
        type: 'POST',
        url: url,
        data: data,
        success: function (response) {
            if (response.stores.length > 0) {
                _resultList = response.stores;
                _storeMap.trigger('filter.bm.storemap');
            } else {
                _resultList = false;
                _storeMap.storemap('clearMap', response.geoData);
                createStoreList(false)
            }
            if (response.geoData) {
                var lastSearch = response.geoData.lat + ',' + response.geoData.lng + ',' + response.geoData.location;
                createCookie('lastSearch', lastSearch, 1);
            }
        },
        dataType: 'json'
    });
}

function initNavigatorEvents() {
    _body.on('submit', '#nor_storeSearch', function (e) {
        e.preventDefault();
        if ($('#nor_location').prop('value') !== '') {
            var _location = $('#nor_location').prop('value');

            var _lat = $('#nor_location').data('lat')
            var _lng = $('#nor_location').data('lng')
            var _radius = $('#nor_searchRadius').prop('value');
            var _url = '/?type=2002&location=' + _location + '&radius=' + _radius;

            if (_lat && _lng){
                _location = _lat+','+_lng;
            }
            var data = {
                type:2002,
                location: _location,
                radius: _radius,
                lat:_lat,
                lng: _lng
            };
            ajaxUpdateStores(data);
        }
    });
    _body.on('change', '#nor_filterStores', function (e) {
        e.preventDefault();
        var dropdownValues = $('#nor_filterStores').dropdown('get value');
        if (dropdownValues.length > 0 && _resultList) {
            _filter = dropdownValues;
        } else {
            _filter = false;
        }
        _storeMap.trigger('filter.bm.storemap');
    });
    _body.on('submit', '#nor_storeNameSearch', function (e) {
        e.preventDefault();
        if ($('#nor_storeName').prop('value') !== '') {
            var _storeName = $('#nor_storeName').prop('value');

            var _url = '/?type=2002&storename=' + _storeName;

            var data = {
                type:2002,
                storename: _storeName
            }
            ajaxUpdateStores(data);
        }
    });
    _body.on('bm.store.infowindow.mobile',function (e, infoWindow) {
        var _contentContainer = $('#js-additional-infowindow-content');
        _contentContainer.empty();
        _contentContainer.append(infoWindow);
        $('.open-modal-mobile-infowindow').trigger('click');
        $(window).trigger('content.changed');
    });
    $('#tab-map').on('click', function () {
        if (_resizeMap) {
            _resizeMap = false;
            _storeMap.storemap('resize');
        }
    });
    $('#tab-storelist').on('click', function () {
        _resizeMap = true;
    });
    _body.on('click','#nor_userLocation_submit',function (e) {
        e.preventDefault();
        navigator.geolocation.getCurrentPosition(findStoresByUserPosition,userPositionBlocked);
    });

    _body.on('click', '.js-close--storeList', function (e) {
        e.preventDefault();
        _storeListContainer.addClass('hide');
    });
}

function initStores(response) {
    if (response.status) {
        eraseCookie('lastSearch');
        _resultList = response.stores;
        initNavigatorEvents();

        var queryParameter = getParameterByName('qService');
        if (queryParameter !== null) {
            $('#nor_filterStores').dropdown('set selected',queryParameter.split(','));
        } else {
            _storeMap.storemap('updateStoreListCluster', response.stores);
        }
    }
}

function findStoresByUserPosition(pos) {
    var _location = pos.coords.latitude + ',' + pos.coords.longitude;
    var _radius = $('#nor_searchRadius').prop('value');

    var _url = '/?type=2002&location=' + _location + '&radius=' + _radius;

    var data = {
        type:2002,
        location:_location,
        radius:_radius
    }
    ajaxUpdateStores(data);
}

function userPositionBlocked(data) {
    $('.use-user-location').remove();
}

_storeMap.on('init.bm.storemap', function () {
    var url = ''; //'/?type=2001';
    if (baseUrl) {
        url = baseUrl + url;
    }
    $.ajax({
        type: 'POST',
        url: url,
        data: {
            type:2001
        },
        success: initStores,
        dataType: 'json'
    });
});

_storeMap.on('filter.bm.storemap', filterResultList);

if (_storeMap.length > 0) {
    if (!$('#gmaps').length) {
        var _googleMapsSource = '<script id="gmaps" src="//maps.googleapis.com/maps/api/js?key=' + _gmapKey + '&libraries=places&callback=initMaps" async defer></script>';
        _body.append($(_googleMapsSource));
    }
}

$(document).ready(function () {
    var cookie = readCookie('lastSearch');
    if (cookie) {
        var geoCode = cookie.split(',');
        var saddr = '&saddr=' + geoCode[0] + ',' + geoCode[1];

        $('.js-gmap-routeLink').each(function () {
            var $this = $(this);
            $this.attr('href', $this.attr('href') + saddr);
        });

        var userPos = {
            lat: parseFloat(geoCode[0]),
            lng: parseFloat(geoCode[1])
        };

        var dataPos = $('.js-store-position');

        var storePos = {
            lat: parseFloat(dataPos.data('lat')),
            lng: parseFloat(dataPos.data('lng'))
        };

        var distance = getDistance(userPos,storePos);

        $('.js-store-distance').append(distance.toFixed(1).replace('.',',') + ' km ');
    }
});

function rad(x) {
    return x * Math.PI / 180;
}

function getDistance(p1, p2) {
    var R = 6378.137; // Earth’s mean radius in km
    var dLat = rad(p2.lat - p1.lat);
    var dLong = rad(p2.lng - p1.lng);
    var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
        Math.cos(rad(p1.lat)) * Math.cos(rad(p2.lat)) *
        Math.sin(dLong / 2) * Math.sin(dLong / 2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    var d = R * c;
    return d; // returns the distance in km
}