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/karjerosdiena.lt/wp-content/plugins/wp-jobsearch/js/job-listing-leaflet.js
function jobsearch_listing_top_map(top_dataobj, is_ajax) {
    var map_id = top_dataobj.map_id,
        map_zoom = top_dataobj.map_zoom,
        this_map_style = top_dataobj.map_style,
        latitude = top_dataobj.latitude,
        longitude = top_dataobj.longitude,
        cluster_icon = top_dataobj.cluster_icon,
        map_cords_list = top_dataobj.cords_list,
        cordsActualLimit = 1000;

    var open_info_window;
    if (latitude != '' && longitude != '') {
        var marker;
        all_marker = [];
        reset_top_map_marker = [];
        var LatLngList = [];

        if (is_ajax != 'true') {
            map_zoom = parseInt(map_zoom);
            if (!jQuery.isNumeric(map_zoom)) {
                map_zoom = 9;
            }
            
            // Initialize Leaflet map
            jobsearch_listing_map = L.map('listings-map-' + map_id, {
                center: [latitude, longitude],
                zoom: map_zoom,
                zoomControl: false,
                scrollWheelZoom: false,
                dragging: true
            });

            // Add OSM tile layer
            L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
                attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
            }).addTo(jobsearch_listing_map);

            // Add custom zoom controls
            var zoomControl = L.control.zoom({
                position: 'topleft',
                zoomInText: '<i class="fa fa-plus"></i>',
                zoomOutText: '<i class="fa fa-minus"></i>'
            });
            zoomControl.addTo(jobsearch_listing_map);
        } else {
            jobsearch_listing_map.setView([latitude, longitude], map_zoom);
        }

        // Custom map styles would need to be converted to Leaflet equivalent
        // This would typically involve using a different tile provider or custom CSS

        if (typeof map_cords_list === 'object' && map_cords_list.length > 0) {
            var actual_length;
            if (map_cords_list.length > cordsActualLimit) {
                actual_length = cordsActualLimit;
            } else {
                actual_length = map_cords_list.length;
            }

            var def_cords_obj = [];
            var def_cords_creds = [];

            // variables for same lat lng merge
            var ohterLatLonObj = [];
            var sameLatLonObjMajor = [];
            var sameLatLonIndObj = [];

            var sameAddIndex = [];
            var allPostsMajorObj = [];

            jQuery.each(map_cords_list, function (index, element) {
                if (typeof element.lat !== 'undefined' && typeof element.lat != '' && typeof element.long !== 'undefined' && typeof element.long != '') {
                    var other_pos = true;
                    for (var oi = 0; oi < map_cords_list.length; oi++) {
                        if (
                            oi !== index &&
                            sameAddIndex.indexOf(oi) === -1 &&
                            map_cords_list[oi]['lat'] === element.lat &&
                            map_cords_list[oi]['long'] === element.long
                        ) {
                            sameAddIndex.push(oi);
                            other_pos = false;
                        }
                    }
                    if (other_pos === true && sameAddIndex.indexOf(index) === -1) {
                        var thisObj = {
                            obj_type: 'single',
                            lat: element.lat,
                            long: element.long,
                            id: element.id,
                            title: element.title,
                            link: element.link,
                            marker: element.marker,
                            logo_img_url: element.logo_img_url,
                            address: element.address,
                            employer: element.employer,
                            sector: element.sector,
                        };
                        ohterLatLonObj.push(thisObj);
                        allPostsMajorObj.push(thisObj);
                    } else {
                        var sameLatLonObj = [];
                        for (var oi = 0; oi < map_cords_list.length; oi++) {
                            if (map_cords_list[oi]['lat'] === element.lat && map_cords_list[oi]['long'] === element.long && sameLatLonIndObj.indexOf(oi) === -1) {
                                var thisObj = {
                                    lat: map_cords_list[oi]['lat'],
                                    long: map_cords_list[oi]['long'],
                                    id: map_cords_list[oi]['id'],
                                    title: map_cords_list[oi]['title'],
                                    link: map_cords_list[oi]['link'],
                                    marker: map_cords_list[oi]['marker'],
                                    logo_img_url: map_cords_list[oi]['logo_img_url'],
                                    address: map_cords_list[oi]['address'],
                                    employer: map_cords_list[oi]['employer'],
                                    sector: map_cords_list[oi]['sector'],
                                };
                                sameLatLonObj.push(thisObj);
                                sameLatLonIndObj.push(oi);
                            }
                        }
                        if (sameLatLonObj.length > 0) {
                            var thisObj = {
                                obj_type: 'multiple',
                                allObjs: sameLatLonObj,
                            };
                            sameLatLonObjMajor.push(thisObj);
                            allPostsMajorObj.push(thisObj);
                        }
                    }
                }
            });

            // Create a marker cluster group
            var markers = L.markerClusterGroup({
                iconCreateFunction: function(cluster) {
                    var childCount = cluster.getChildCount();
                    return L.divIcon({
                        html: '<div style="background-image: url(' + cluster_icon + '); width: 28px; height: 41px; background-size: cover; display: flex; align-items: center; justify-content: center;"><span style="color: #ffffff; font-size: 12px; margin-top: 5px;">' + childCount + '</span></div>',
                        className: 'marker-cluster',
                        iconSize: L.point(28, 41)
                    });
                }
            });

            jQuery.each(allPostsMajorObj, function (index, element) {
                if (element.obj_type == 'multiple') {
                    if (element.allObjs.length > 0) {
                        var post_lats = [];
                        var post_longs = [];
                        var post_ids = [];
                        var post_titles = [];
                        var post_links = [];
                        var post_markers = [];
                        var post_logo_img_urls = [];
                        var post_addresss = [];
                        var post_employers = [];
                        var post_sectors = [];

                        for (var oi = 0; oi < element.allObjs.length; oi++) {
                            var thisElem = element.allObjs[oi];

                            post_lats.push(thisElem.lat);
                            post_longs.push(thisElem.long);
                            post_ids.push(thisElem.id);
                            post_titles.push(thisElem.title);
                            post_links.push(thisElem.link);
                            post_markers.push(thisElem.marker);
                            post_logo_img_urls.push(thisElem.logo_img_url);
                            post_addresss.push(thisElem.address);
                            post_employers.push(thisElem.employer);
                            post_sectors.push(thisElem.sector);
                        }

                        var thisElemF = element.allObjs[0];

                        if (index === actual_length) {
                            return false;
                        }

                        var db_lat = parseFloat(thisElemF.lat);
                        var db_long = parseFloat(thisElemF.long);
                        var list_title = thisElemF.title;
                        var list_marker = thisElemF.marker;

                        var db_latLng = [db_lat, db_long];
                        LatLngList.push(db_latLng);

                        // Create custom cluster marker
                        var customIcon = L.divIcon({
                            html: '<div style="background-image: url(' + cluster_icon + '); width: 28px; height: 41px; background-size: cover; display: flex; align-items: center; justify-content: center;"><span style="color: #ffffff; font-size: 12px; margin-top: 5px;">' + element.allObjs.length + '</span></div>',
                            className: 'custom-marker',
                            iconSize: [28, 41]
                        });

                        marker = L.marker(db_latLng, {
                            icon: customIcon
                        });

                        // Store additional data
                        marker.post_lats = post_lats;
                        marker.post_longs = post_longs;
                        marker.post_ids = post_ids;
                        marker.post_titles = post_titles;
                        marker.post_links = post_links;
                        marker.post_markers = post_markers;
                        marker.post_logo_img_urls = post_logo_img_urls;
                        marker.post_addresss = post_addresss;
                        marker.post_employers = post_employers;
                        marker.post_sectors = post_sectors;

                        marker.on('click', function(e) {
                            var contentString = '';
                            for (var oi = 0; oi < this.post_ids.length; oi++) {
                                var infoElemObj = {
                                    lat: this.post_lats[oi],
                                    long: this.post_longs[oi],
                                    id: this.post_ids[oi],
                                    title: this.post_titles[oi],
                                    link: this.post_links[oi],
                                    marker: this.post_markers[oi],
                                    logo_img_url: this.post_logo_img_urls[oi],
                                    address: this.post_addresss[oi],
                                    employer: this.post_employers[oi],
                                    sector: this.post_sectors[oi],
                                };

                                contentString += infoContentString(infoElemObj);
                            }

                            if (open_info_window) {
                                jobsearch_listing_map.closePopup();
                            }

                            open_info_window = L.popup()
                                .setLatLng(e.latlng)
                                .setContent('<div class="jobsearch_map_info multi_listings">' + contentString + '</div>')
                                .openOn(jobsearch_listing_map);
                        });

                        markers.addLayer(marker);
                        all_marker.push(marker);
                        reset_top_map_marker.push(marker);
                    }
                } else {
                    if (index === actual_length) {
                        return false;
                    }
                    
                    var db_lat = parseFloat(element.lat);
                    var db_long = parseFloat(element.long);
                    var list_title = element.title;
                    var list_id = element.id;
                    var list_marker = element.marker;
                    var list_marker_hover = element.marker_hover;

                    var db_latLng = [db_lat, db_long];
                    LatLngList.push(db_latLng);

                    // Create custom icon
                    var customIcon = L.icon({
                        iconUrl: list_marker,
                        iconSize: [32, 32], // adjust based on your marker size
                        iconAnchor: [16, 32] // point of the icon which will correspond to marker's location
                    });

                    marker = L.marker(db_latLng, {
                        icon: customIcon,
                        title: list_title
                    });

                    // Store additional data
                    marker.id = list_id;
                    marker.icon_marker = list_marker;
                    marker.icon_marker_hover = list_marker_hover;

                    marker.on('click', function(e) {
                        var contentString = infoContentString(element);

                        if (open_info_window) {
                            jobsearch_listing_map.closePopup();
                        }

                        open_info_window = L.popup()
                            .setLatLng(e.latlng)
                            .setContent('<div class="jobsearch_map_info">' + contentString + '</div>')
                            .openOn(jobsearch_listing_map);
                    });

                    markers.addLayer(marker);
                    all_marker.push(marker);
                    reset_top_map_marker.push(marker);
                }
            });

            // Add markers to map
            jobsearch_listing_map.addLayer(markers);

            // Fit bounds to include all markers
            if (LatLngList.length > 0) {
                var bounds = new L.LatLngBounds(LatLngList);
                jobsearch_listing_map.fitBounds(bounds);
            }

            // Close popup when clicking on map
            jobsearch_listing_map.on('click', function() {
                if (open_info_window) {
                    jobsearch_listing_map.closePopup();
                    open_info_window = null;
                }
            });
        }

        function infoContentString(element) {
            var listing_id = element.id;
            var list_title = element.title;
            var list_link = element.link;
            var list_logo_img_url = element.logo_img_url;
            var list_address = element.address;
            var list_employer = element.employer;
            var list_sector = element.sector;

            var contentString = '\
            <div id="listing-info-' + listing_id + '" class="listing-info-inner">\
                <div class="info-main-container">\
                    ' + (list_logo_img_url != '' ? '<div class="img-con"><img src="' + list_logo_img_url + '" alt=""></div>' : '') + '\
                    <div class="info-txt-holder">\
                        <a class="info-title" href="' + list_link + '">' + list_title + '</a>\
                        <div class="post-secin">' + list_employer + list_sector + '</div>\
                        ' + list_address + '\
                    </div>\
                </div>\
            </div>';

            return contentString;
        }
    }
}