HEX
Server: Apache
System: Linux WWW 6.1.0-40-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.153-1 (2025-09-20) x86_64
User: web11 (1011)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: /var/www/apklausos/assets/scripts/map.js
/*
 * @license This file is part of LimeSurvey
 * See COPYRIGHT.php for copyright notices and details.
 *
 */

var gmaps = gmaps || new Object;
var osmaps = osmaps || new Object;
var zoom = zoom || [];

$(document).on('ready pjax:scriptcomplete',function()
{
    $(".ls-answers .location").each(function(index,element){
        var question = $(element).attr('name');
        var coordinates = $(element).val();
        var latLng = coordinates.split(" ");
        var question_id = question.substr(0,question.length-2);
        if ($("#mapservice_"+question_id).val()==1){
            // Google Maps
            if (gmaps[''+question] == undefined) {
                GMapsInitialize(question,latLng[0],latLng[1]);
            }
        }
        else if ($("#mapservice_"+question_id).val()==100){
            //  Maps
            if (osmaps[''+question] == undefined) {
                osmaps[''+question] = OSGeoInitialize(question,latLng);
            }
        }
    });

});


function isvalidCoord(val,type){
    if(type=='lat'){
        var min=-90;
        var max=90
    }else{
        var min=-180;
        var max=180
    }
    if (!isNaN(parseFloat(val)) && (val>min && val<=max)) {
        return true;
    } else {
        return false;
    }
}


// OSMap functions
function OSGeoInitialize(question,latLng){
        var tileServerURL = {
            OSM : "//{s}.tile.openstreetmap.org/{z}/{x}/{y}",
            HUM : "//{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}",
            CYC : "//{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}",
            TRA : "//{s}.tile.thunderforest.com/transport/{z}/{x}/{y}"
        };
        var name = question.substr(0,question.length - 2);
        // tiles layers def
        // If not latLng is set the Map will center to Hamburg
        var MapOption=LSmaps[name];
        if(isNaN(MapOption.latitude) || MapOption.latitude==""){
            MapOption.latitude=53.582665;
        }
        if(isNaN(MapOption.longitude) || MapOption.longitude==""){
            MapOption.longitude=10.018924;
        }
        var mapOSM = L.tileLayer(tileServerURL.OSM+".png", {
            maxZoom: 19,
            subdomains: ["a", "b", "c"],
            attribution: 'Map data © <a href="//www.openstreetmap.org/" target="_blank">OpenStreetMap</a> contributors, CC-BY-SA.'
        });
        var mapCYC = L.tileLayer(tileServerURL.CYC+".png", {
            maxZoom: 19,
            subdomains: ["a", "b", "c"],
            attribution: 'Map data © <a href="//www.openstreetmap.org/" target="_blank">OpenStreetMap</a> contributors, CC-BY-SA.'
        });
        var mapHOT = L.layerGroup([L.tileLayer(tileServerURL.HUM+".png", {
            maxZoom: 20,
            subdomains: ["a", "b", "c"],
        }), L.tileLayer(tileServerURL+".png", {
            maxZoom: 19,
            subdomains: ["a", "b", "c"],
            attribution: 'Map data © <a href="//www.openstreetmap.org/" target="_blank">OpenStreetMap</a> contributors, CC-BY-SA.'
        })]);
        var mapTRA = L.layerGroup([L.tileLayer(tileServerURL.TRA+".png", {
            maxZoom: 19,
            subdomains: ["a", "b", "c"],
        }), L.tileLayer(tileServerURL+".png", {
            maxZoom: 19,
            subdomains: ["a", "b", "c"],
            attribution: 'Map data © <a href="//www.openstreetmap.org/" target="_blank">OpenStreetMap</a> contributors, CC-BY-SA.'
        })]);

        var baseLayers = {
            "Street Map": mapOSM,
            "Humanitarian": mapHOT,
            "Cyclemap": mapCYC,
            "Traffic Map" : mapTRA
        };
        var overlays = {
        };
        var map = L.map("map_"+name, {
            zoom:MapOption.zoomLevel,
            minZoom:1,
            center: [MapOption.latitude, MapOption.longitude] ,
            maxBounds: ([[-90, -180],[90, 180]]),
            layers: [mapOSM]
        });

        //function zoomExtent(){ // todo: restrict to rect ?
        //    map.setView([15, 15],1);
        //}

        var pt1 = latLng[0].split("@");
        var pt2 = latLng[1].split("@");

        if ((pt1.length == 2) && (pt2.length == 2)) { // is Rect
            var isRect = true;
            lat = "";
            lng = "";
            minLat = pt1[0];
            minLng = pt1[1];
            maxLat = pt2[0];
            maxLng = pt2[1];
            map.fitBounds([[minLat, minLng],[maxLat, maxLng]]);
            map.setMaxBounds([[minLat, minLng],[maxLat, maxLng]]);
            UI_update("","");
        } else { // is default marker position
            var isRect = false;
            lat = latLng[0];
            lng = latLng[1];
        }

        if (isNaN(parseFloat(lat)) || isNaN(parseFloat(lng))) {
            lat=-9999; lng=-9999;
        }

        var marker = new L.marker([lat,lng], {title:'Current Location',id:1,draggable:'true'});
        map.addLayer(marker);

        var layerControl = L.control.layers(baseLayers, overlays, {
          collapsed: true
        }).addTo(map);

        map.on('click',
            function(e) {
                var coords = L.latLng(e.latlng.lat,e.latlng.lng);
                if(isvalidCoord(coords.lat,'lat') && isvalidCoord(coords.lng,'lng')){
                    marker.setLatLng(coords);
                    UI_update(e.latlng.lat,e.latlng.lng);
                }
            }
        )

        marker.on('dragend', function(e){
                var marker = e.target;
                var position = marker.getLatLng();
                UI_update(position.lat,position.lng)
        });

        function UI_update(lat,lng){
            if (isvalidCoord(lat,'lat') && isvalidCoord(lng,'lng')) {
                $("#answer"+name).val(Math.round(lat*100000)/100000 + ";" + Math.round(lng*100000)/100000);
                $("#answer_lat"+question).val(Math.round(lat*100000)/100000).removeClass("text-danger").data('prevvalue',Math.round(lat*100000)/100000);
                $("#answer_lng"+question).val(Math.round(lng*100000)/100000).removeClass("text-danger").data('prevvalue',Math.round(lat*100000)/100000);
            } else {
                $("#answer"+name).val("");
                $("#answer_lat"+question).val("").data('prevvalue','');
                $("#answer_lng"+question).val("").data('prevvalue','');
            }
            checkconditions($("#answer"+name).val(), name, 'text', 'keyup');
        }


        $('.coords[name^='+name+']').each(function(){
            $(this).data('prevvalue',$(this).val());
        });
        $('.coords[name^='+name+']').on('blur',function(){
            if ($(this).data('prevvalue') != $(this).val()) {
                var newLat = $("#answer_lat"+question).val();
                if(newLat!=="" && !isvalidCoord(newLat,'lat')){
                    $("#answer_lat"+question).addClass("text-danger");
                }else{
                    $("#answer_lat"+question).removeClass("text-danger");
                }
                var newLng = $("#answer_lng"+question).val();
                if(newLng!="" && !isvalidCoord(newLng)){
                    $("#answer_lng"+question).addClass("text-danger");
                }else{
                    $("#answer_lng"+question).removeClass("text-danger");
                }
                if (isvalidCoord(newLat,'lat') && isvalidCoord(newLng,'lng')) {
                    $("#answer"+name).val(newLat + ";" + newLng);
                    map.setView([newLat, newLng]);
                    marker.setLatLng(L.latLng(newLat,newLng));
                    checkconditions($("#answer"+name).val(), name, 'text', 'keyup');
                }
            }
            $(this).data('prevvalue',$(this).val());
        });
        var geonamesApiUrl = "api.geonames.org";
        if(window.location.protocol=='https:'){
            /* Checked : work on 2019-03 , see #13873 */
            geonamesApiUrl = "secure.geonames.org";
        }
        $("#searchbox_"+name).autocomplete({
            serviceUrl : "//"+geonamesApiUrl+"/searchJSON",
            dataType: "json",
            paramName: 'name_startsWith',
            deferRequestBy: 500,
            params:{
                username : LSmap.geonameUser,
                featureClass : 'P',
                orderby : 'population',
                maxRows : 10,
                lang : LSmap.geonameLang
            },
            ajaxSettings:{
                beforeSend : function(jqXHR, settings) {
                    if($("#restrictToExtent_"+name).prop('checked')){
                        settings.url += "&east=" + map.getBounds().getEast() + "&west=" + map.getBounds().getWest() + "&north=" + map.getBounds().getNorth() + "&south=" + map.getBounds().getSouth();
                    }
                }
            },
            orientation: 'auto',
            minChars: 3,
            autoSelectFirst:true,
            transformResult: function(response) {
                return {
                    suggestions: $.map(response.geonames, function(geoname) {
                        return { value: geoname.name + " - " + geoname.countryName, data: { src:'geoname',lat:geoname.lat,lng:geoname.lng } };
                    })
                };
            },
            onSearchStart: function(query) {
                $( this ).prop("readonly",true);
            },
            onSearchComplete : function(query, suggestions) {
                $( this ).prop("readonly",false);
            },
            onSelect : function(suggestion) {
                if(suggestion.data.src=='geoname'){
                    map.setView([suggestion.data.lat, suggestion.data.lng], MapOption.zoomLevel);
                    marker.setLatLng([suggestion.data.lat, suggestion.data.lng]);
                    UI_update(suggestion.data.lat, suggestion.data.lng);
                }
            }
        });
        var mapQuestion = $('#question'+name.split('X')[2]);

        function resetMapTiles(mapQuestion) {

            //window.setTimeout(function(){

                if($(mapQuestion).css('display') == 'none' && $.support.leadingWhitespace) { // IE7-8 excluded (they work as-is)
                    $(mapQuestion).css({
                        'position': 'relative',
                        'left': '-9999em'
                    }).show();
                    map.invalidateSize();
                    $(mapQuestion).css({
                        'position': 'relative',
                        'left': 'auto'
                    }).hide();
                }

            //},50);
        }

        resetMapTiles(mapQuestion);

        jQuery(window).resize(function() {
            window.setTimeout(function(){
                resetMapTiles(mapQuestion);
            },5);
        });

    /* Remove the cache from search when click on restrictToExtent */
    $("#restrictToExtent_"+name).on("change",function(){
        $("#searchbox_"+name).autocomplete('clearCache');
    });
    /* if restrictToExtent is checked : remove the search cache when bound updated */
    $("#searchbox_"+name).on("viewreset",function(){ /* moveend,zoomend */
        if($("#restrictToExtent_"+name).is(":checked")){
            $("#searchbox_"+name).autocomplete('clearCache');
        }
    });
    /* reset search on focus */
    $("#searchbox_"+name).on("focusin",function(){
        $(this).val("");
    });
    return map;



}


//// Google Maps Functions (for API V3) ////
// Initialize map
function GMapsInitialize(question,lat,lng) {


    var name = question.substr(0,question.length - 2);
    if(isNaN(lat) || lat==""){
        lat=53.582665;
    }
    if(isNaN(lng) || lng==""){
        lng=10.018924;
    }
    var latlng = new google.maps.LatLng(lat, lng);

    var mapOptions = {
        zoom: zoom[name],
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };

    var map = new google.maps.Map(document.getElementById("gmap_canvas_" + question), mapOptions);
    gmaps[''+question] = map;

    var marker = new google.maps.Marker({
        position: latlng,
        draggable:true,
        map: map,
        id: 'marker__'+question
    });
    gmaps['marker__'+question] = marker;

    google.maps.event.addListener(map, 'rightclick', function(event) {
        marker.setPosition(event.latLng);
        map.panTo(event.latLng);
        geocodeAddress(name, event.latLng);
        $("#answer"+question).val(Math.round(event.latLng.lat()*10000)/10000 + " " + Math.round(event.latLng.lng()*10000)/10000);
    });

    google.maps.event.addListener(marker, 'dragend', function(event) {
        //map.panTo(event.latLng);
        geocodeAddress(name, event.latLng);
        $("#answer"+question).val(Math.round(event.latLng.lat()*10000)/10000 + " " + Math.round(event.latLng.lng()*10000)/10000);
    });
}

// Reset map when shown by conditions
function resetMap(qID) {
    var question = $('#question'+qID+' input.location').attr('name');
    var name = question.substr(0,question.length - 2);
    var coordinates = $('#question'+qID+' input.location').attr('value');
    var xy = coordinates.split(" ");
    if(gmaps[question]) {
        var currentMap = gmaps[question];
        var marker = gmaps['marker__'+question];
        var markerLatLng = new google.maps.LatLng(xy[0],xy[1]);
        marker.setPosition(markerLatLng);
        google.maps.event.trigger(currentMap, 'resize')
        currentMap.setCenter(markerLatLng);
    }
}

// Reverse geocoder
function geocodeAddress(name, pos) {
    var geocoder = new google.maps.Geocoder();

    var city  = '';
    var state = '';
    var country = '';
    var postal = '';

    geocoder.geocode({
        latLng: pos
    }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK && results[0]) {
            $(results[0].address_components).each(function(i, val) {
                if($.inArray('locality', val.types) > -1) {
                    city = val.short_name;
                }
                else if($.inArray('administrative_area_level_1', val.types) > -1) {
                    state = val.short_name;
                }
                else if($.inArray('country', val.types) > -1) {
                    country = val.short_name;
                }
                else if($.inArray('postal_code', val.types) > -1) {
                    postal = val.short_name;
                }
            });

            var location = (results[0].geometry.location);
        }
        getInfoToStore(name, pos.lat(), pos.lng(), city, state, country, postal);
    });
}

// Store address info
function getInfoToStore(name, lat, lng, city, state, country, postal){

    var boycott = $("#boycott_"+name).val();
    // 2 - city; 3 - state; 4 - country; 5 - postal
    if (boycott.indexOf("2")===-1) 
        city = '';
    if (boycott.indexOf("3")===-1) 
        state = '';
    if (boycott.indexOf("4")===-1) 
        country = '';
    if (boycott.indexOf("5")===-1) 
        postal = '';

    $("#answer"+name).val(lat + ';' + lng + ';' + city + ';' + state + ';' + country + ';' + postal);
}



/* Placeholder hack for IE */
if (navigator.appName == "Microsoft Internet Explorer") {
  $("input").each(function () {
    if ($(this).val() === "" && $(this).attr("placeholder") !== "") {
      $(this).val($(this).attr("placeholder"));
      $(this).focus(function () {
        if ($(this).val() === $(this).attr("placeholder")) $(this).val("");
      });
      $(this).blur(function () {
        if ($(this).val() === "") $(this).val($(this).attr("placeholder"));
      });
    }
  });
}