﻿var map;
var mapInitiative;
var mapLocalSociety;
var mapStory;
var geocoder;
var infowindow = new google.maps.InfoWindow();
var initialLocation;
var addMarkerAddress = 0;
var marker = null;
var infoWindow = null;
var initiative = false;
var stylesBlue = [[
          { url: '/Templates/Images/ClusterPin.png', height: 35, width: 28, anchor: [1, 0], textColor: '#ffffff' }
      ]];

function getParameterByName(name) {
    name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
    var regexS = "[\\?&]" + name + "=([^&#]*)";
    var regex = new RegExp(regexS);
    var results = regex.exec(window.location.href);
    if (results == null)
        return "";
    else
        return decodeURIComponent(results[1].replace(/\+/g, " "));
}

function initializeBenefitSearch(id, addAddress, zoomLevel, isMiniMap, what, where) {
    addMarkerAddress = addAddress + ", Sverige";
    geocoder = new google.maps.Geocoder();
    var myOptions = {
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var markersClustered = null;
    var areas = null;
    map = new google.maps.Map(document.getElementById("map_canvas_benefit"), myOptions);
    $.getJSON("/Extensions/Handlers/GoogleMapsMarkers.ashx", { benefitsearch: true, what: what, where: where }, function(data) {
        markersClustered = parseMarkerJson(data, "benefitSearch", isMiniMap);
        areas = data.areas;
    });
    var mcOptions = { gridSize: 25, maxZoom: 15, styles: stylesBlue[0] };
    geocoder.geocode({ 'address': 'Sweden' }, function(results, status) {
        google.maps.event.addListener(map, 'tilesloaded', function() {
            var mc = new MarkerClusterer(map, markersClustered, mcOptions);
        });
        map.setCenter(results[0].geometry.location);
        map.setZoom(4);
    });
    var query = getParameterByName("query");
    if (query.length != 0) {
        google.maps.event.addListenerOnce(map, 'tilesloaded', function() {
            showCurrentAddress(query, true, 'all', 12);
        });
    }
    google.maps.event.addListener(map, 'bounds_changed', function () {
        $("#showbenefitswithoutstorenumber").html(calculateAreas(areas, map.getBounds()));
    });
}

function calculateAreas(areas, bounds) {
    var count = 0;
    for (var area in areas)
        if (areaIsInside(bounds, area))
            count++;
    return count;
}

function areaIsInside(bounds, area) {
    for (var point in area)
        if (pointIsInside(point, bounds))
            return true;
    return false;
}

function pointIsInside(point, bounds) {
    return bounds.contains(new GLatLng(point.x, point.y));
}

function initialize(id, addAddress, zoomLevel, isMiniMap) {
    addMarkerAddress = addAddress + ", Sverige";
    geocoder = new google.maps.Geocoder();
    var myOptions = {
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var markersClustered = [];
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    $.getJSON("/Extensions/Handlers/GoogleMapsMarkers.ashx", { parentId: id }, function(data) {
        markersClustered = parseMarkerJson(data, "benefit", isMiniMap);
    });
    var mcOptions = { gridSize: 25, maxZoom: 15, styles: stylesBlue[0] };
    geocoder.geocode({ 'address': addMarkerAddress, 'region': 'se' }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            google.maps.event.addListener(map, 'tilesloaded', function() {
                var mc = new MarkerClusterer(map, markersClustered, mcOptions);
            });
            //var mc = new MarkerClusterer(map, markersClustered, mcOptions);
            map.setCenter(results[0].geometry.location);
            map.setZoom(zoomLevel);
        } else {

            var geocoder2 = new google.maps.Geocoder();
            geocoder2.geocode({ 'address': 'Östersund, Sweden' }, function(results, status) {
                google.maps.event.addListener(map, 'tilesloaded', function() {
                    var mc = new MarkerClusterer(map, markersClustered, mcOptions);
                });
                //var mc = new MarkerClusterer(map, markersClustered, mcOptions);
                map.setCenter(results[0].geometry.location);
                map.setZoom(4);
            });
        }
    });
    var query = getParameterByName("query");
    if (query.length != 0) {
        google.maps.event.addListenerOnce(map, 'tilesloaded', function() {
            showCurrentAddress(query, true, 'all', 12);
        });
    }
}

function initializeStory(id, addAddress, zoomLevel, isMiniMap) {
    addMarkerAddress = addAddress + ",Sverige";
    geocoder = new google.maps.Geocoder();
    var myOptions = {
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var markersClustered = [];
    mapStory = new google.maps.Map(document.getElementById("map_canvas_story"), myOptions);
    $.getJSON("/Extensions/Handlers/GoogleMapsMarkers.ashx", { story: true }, function (data) {
        markersClustered = parseMarkerJson(data, "story", isMiniMap);
    });
    var mcOptions = { gridSize: 25, maxZoom: 15, styles: stylesBlue[0] };
    geocoder.geocode({ 'address': 'Östersund, Sweden' }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            google.maps.event.addListener(mapStory, 'tilesloaded', function () {
                var mc = new MarkerClusterer(mapStory, markersClustered, mcOptions);
            });
            mapStory.setCenter(results[0].geometry.location);
            mapStory.setZoom(zoomLevel);
        };
    });
    var query = getParameterByName("query");
    if (query.length != 0) {
        google.maps.event.addListenerOnce(mapStory, 'tilesloaded', function () {
            showCurrentAddress(query, true, 'all', 12);
        });
    }
}

function initializeInitiative(id, addAddress, zoomLevel, isMiniMap) {
    addMarkerAddress = addAddress + ", Sverige";
    geocoder = new google.maps.Geocoder();
    var myOptions = {
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var markersClustered = [];
    mapInitiative = new google.maps.Map(document.getElementById("map_canvas_initiative"), myOptions);
    $.getJSON("/Extensions/Handlers/GoogleMapsMarkers.ashx", { initiative: true }, function (data) {
        markersClustered = parseMarkerJson(data, "initiative", isMiniMap);
    });
    var mcOptions = { gridSize: 25, maxZoom: 15, styles: stylesBlue[0] };
    geocoder.geocode({ 'address': addMarkerAddress, 'region': 'se' }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            google.maps.event.addListener(mapInitiative, 'tilesloaded', function () {
                var mc = new MarkerClusterer(mapInitiative, markersClustered, mcOptions);
            });
            //var mc = new MarkerClusterer(mapInitiative, markersClustered, mcOptions);
            mapInitiative.setCenter(results[0].geometry.location);
            mapInitiative.setZoom(zoomLevel);
        } else {
            var geocoder2 = new google.maps.Geocoder();
            geocoder2.geocode({ 'address': 'Östersund, Sweden' }, function (results, status) {
                google.maps.event.addListener(mapInitiative, 'tilesloaded', function () {
                    var mc = new MarkerClusterer(mapInitiative, markersClustered, mcOptions);
                });
                //var mc = new MarkerClusterer(mapInitiative, markersClustered, mcOptions);
                mapInitiative.setCenter(results[0].geometry.location);
                mapInitiative.setZoom(4);
            });
        }
    });
    var query = getParameterByName("query");
    if (query.length != 0) {
        google.maps.event.addListenerOnce(mapInitiative, 'tilesloaded', function () {
            showCurrentAddress(query, true, 'all', 12);
        });
    }

}

function initializeLocalSociety(id, addAddress, zoomLevel, isMiniMap) {
    addMarkerAddress = addAddress + ",Sverige";
    geocoder = new google.maps.Geocoder();
    var myOptions = {
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var markersClustered = [];
    mapLocalSociety = new google.maps.Map(document.getElementById("map_canvas_local"), myOptions);
    $.getJSON("/Extensions/Handlers/GoogleMapsMarkers.ashx", { localsociety: true }, function (data) {
        markersClustered = parseMarkerJson(data, "localSociety", isMiniMap);
    });
    var mcOptions = { gridSize: 25, maxZoom: 15, styles: stylesBlue[0] };
    geocoder.geocode({ 'address': addMarkerAddress, 'region': 'se' }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            google.maps.event.addListener(mapLocalSociety, 'tilesloaded', function () {
                var mc = new MarkerClusterer(mapLocalSociety, markersClustered, mcOptions);
            });
            //var mc = new MarkerClusterer(mapLocalSociety, markersClustered, mcOptions);
            mapLocalSociety.setCenter(results[0].geometry.location);
            mapLocalSociety.setZoom(zoomLevel);
        } else {
            var geocoder2 = new google.maps.Geocoder();
            geocoder2.geocode({ 'address': 'Östersund, Sweden' }, function (results, status) {
                google.maps.event.addListener(mapLocalSociety, 'tilesloaded', function () {
                    var mc = new MarkerClusterer(mapLocalSociety, markersClustered, mcOptions);
                });
                //var mc = new MarkerClusterer(mapLocalSociety, markersClustered, mcOptions);
                mapLocalSociety.setCenter(results[0].geometry.location);
                mapLocalSociety.setZoom(4);
            });
        }
    });
    var query = getParameterByName("query");
    if (query.length != 0) {
        google.maps.event.addListenerOnce(mapLocalSociety, 'tilesloaded', function () {
            showCurrentAddress(query, true, 'all', 12);
        });
    }
}

function parseMarkerJson(jsonData, typeOfMarker, isMiniMap) {
    var markersTemp = [];
    for (var i = 0; i < jsonData.markers.length; i++) {
        var marker = createMarker(jsonData.markers[i], typeOfMarker, isMiniMap);
        if (marker)
            markersTemp.push(marker);
    }
    return markersTemp;
}

function createMarker(input, type, isMiniMap) {
    if (type == "initiative") {
         marker = new google.maps.Marker({
            position: new google.maps.LatLng(input.lat, input.lng),
            map: mapInitiative,
            icon: "/Templates/Images/googleMapsPin.png",
            title: input.t
        });

        google.maps.event.addListener(marker, 'click', function () {
            if (!isMiniMap) {
                if (infowindow) infowindow.close();
                $.getJSON("/Extensions/Handlers/GoogleMapsMarkers.ashx", { pageId: input.l, typeofmap: "initiative" }, function (data) {
                    infowindow = new google.maps.InfoWindow({ content: "<h2>" + data.markers[0].t + "</h2><a href=\"" + data.markers[0].l + "\" /a>" + data.markers[0].t + "</a>" });
                    infowindow.open(mapInitiative, marker);
                });
                
            }
            else {
                $.getJSON("/Extensions/Handlers/GoogleMapsMarkers.ashx", { pageId: input.l, typeofmap: "initiative" }, function (data) {
                    window.location = data.markers[0].l;
                });
            }
        });
        return marker;
    }
    if (type == "story") {
        if (input.lng != "" && input.lat != "") {
            var m = new google.maps.Marker({
                    position: new google.maps.LatLng(input.lat, input.lng),
                    map: mapStory,
                    icon: "/Templates/Images/googleMapsPin.png",
                    title: input.t
                });
            google.maps.event.addListener(m, 'mouseover', function() {
//                if (!isMiniMap) {
                    if (infowindow) infowindow.close();
                    $.getJSON("/Extensions/Handlers/GoogleMapsMarkers.ashx", { pageId: input.l, typeofmap: "stories" }, function(data) {
                        infowindow = new google.maps.InfoWindow({ content: "<a href=\"" + data.markers[0].l + "\" /a>" + data.markers[0].t + "</a><p>" + data.markers[0].s + "</p>" });
                        infowindow.open(mapStory, m);
                    });
//                }
//                else {
//                    $.getJSON("/Extensions/Handlers/GoogleMapsMarkers.ashx", { pageId: input.l, typeofmap: "stories" }, function(data) {
                    //                        window.location = data.markers[0].l;
//                    });
//                }
            });
            return m;
        }
        return null;
    }
    if(type == "localSociety") {
        marker = new google.maps.Marker({
            position: new google.maps.LatLng(input.lat, input.lng),
            map: mapLocalSociety,
            icon: "/Templates/Images/googleMapsPin.png",
            title: input.t
        });

        google.maps.event.addListener(marker, 'click', function () {
            if (!isMiniMap) {
                if (infowindow) infowindow.close();
                $.getJSON("/Extensions/Handlers/GoogleMapsMarkers.ashx", { pageId: input.l, typeofmap: "locals" }, function (data) {
                    infowindow = new google.maps.InfoWindow({ content: "<h2>" + data.markers[0].t + "</h2><a href=\"" + data.markers[0].l + "\" /a>" + data.markers[0].t + "</a>" });
                    infowindow.open(mapLocalSociety, marker);
                });
                
            }
            else {
                $.getJSON("/Extensions/Handlers/GoogleMapsMarkers.ashx", { pageId: input.l, typeofmap: "locals" }, function (data) {
                    window.location = data.markers[0].l;
                });
            }
        });
        return marker;
    }
    if(type == "benefit") {
        marker = new google.maps.Marker({
            position: new google.maps.LatLng(input.lat, input.lng),
            map: map,
            icon: "/Templates/Images/googleMapsPin.png",
            title: input.t
        });
        google.maps.event.addListener(marker, 'click', function () {
            if (!isMiniMap) {
                if (infowindow) infowindow.close();
                $.getJSON("/Extensions/Handlers/GoogleMapsMarkers.ashx", { parentId: input.l, typeofmap: "benefits" }, function (data) {
                    infowindow = new google.maps.InfoWindow({ content: "<h2>" + data.markers[0].t + "</h2><p>" + data.markers[0].c + "</p>" + $("<p/>").html(data.markers[0].a).text() + "<a href=\"" + data.markers[0].l + "\" /a>" + data.markers[0].t + "</a>" });
                    infowindow.open(map, marker);
                });
            }
            else {
                $.getJSON("/Extensions/Handlers/GoogleMapsMarkers.ashx", { pageId: input.l, typeofmap: "benefits" }, function (data) {
                    window.location = data.markers[0].l;
                });
            }
        });
        return marker;
    }
    if (type == "benefitSearch") {
        marker = new google.maps.Marker({
            position: new google.maps.LatLng(input.lat, input.lng),
            map: map,
            icon: "/Templates/Images/googleMapsPin.png",
            title: input.t
        });
        google.maps.event.addListener(marker, 'click', function () {
            if (!isMiniMap) {
                if (infowindow) infowindow.close();
                $.getJSON("/Extensions/Handlers/GoogleMapsMarkers.ashx", { pageId: input.s, parentId: input.l, typeofmap: "benefits" }, function (data) {
                    infowindow = new google.maps.InfoWindow({ content: "<h2>" + data.markers[0].t + "</h2><p>" + data.markers[0].c + "</p>" + $("<p/>").html(data.markers[0].a).text() + "<a href=\"" + data.markers[0].l + "\" /a>" + data.markers[0].t + "</a>" });
                    infowindow.open(map, marker);
                });
            }
            else {
                $.getJSON("/Extensions/Handlers/GoogleMapsMarkers.ashx", { pageId: input.l, typeofmap: "benefits" }, function (data) {
                    window.location = data.markers[0].l;
                });
            }
        });
        return marker;
    }
    return null;
}

function markerWindow(marker, contentString) {
    return new google.maps.InfoWindow({
        content: contentString
    });
}

function searchAddress(address) {
    if (geocoder) {
        address = address + ", Sweden";
        geocoder.geocode({ 'address': address }, function (results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                map.setZoom(10);
                map.setCenter(results[0].geometry.location);
                var marker = new google.maps.Marker({
                    map: map,
                    position: results[0].geometry.location
                });
            } else {
                alert("Geocode was not successful for the following reason: " + status);
            }
        });
    }
}

function showAddress(response) {
    var place = response[0];
    var point = place.geometry.location;




//    var marker = new google.maps.Marker({
//        position: currentLatLng,
//        map: map,
//        title: "Title!"
//    }); 

    //openInfoWindow(place.formatted_address, point);
}

function addMarker(point) {

    marker = new google.maps.Marker({
        position: point,
        map: map
    });
    infoWindow = new google.maps.InfoWindow();
}
function openInfoWindow(address, point) {
	if (infoWindow == null) {
		infoWindow = new google.maps.InfoWindow();
	}

    if (infoWindow != null) {
        infoWindow.setContent(address);
        infoWindow.setPosition(point);
        infoWindow.open(map);
    }
}

//address, hide marker true/false. For search make this true, typeofmap normal/initiative/benefit etc.
//If it's search true/false then do append sweden to the searched address
function showCurrentAddress(addr, hideMarker, typeofmap, zoomLevel, mapid) {
    mapid = mapid == undefined ? "map_canvas" : mapid;
    var singleAddress;
    singleAddress = addr + ", Sverige";
    geocoder = new google.maps.Geocoder();
    var myOptions = {
        mapTypeId: google.maps.MapTypeId.ROADMAP,
        disableDefaultUI: false
    };

    if (hideMarker == false) {
        map = new google.maps.Map(document.getElementById(mapid), myOptions);
    }
    var sweden1 = new google.maps.LatLng(55.00598, 10.5798);
    var sweden2 = new google.maps.LatLng(69.060024, 24.17731);
    var bound = google.maps.LatLngBounds(sweden1, sweden2);
    geocoder.geocode({ 'address': singleAddress, 'region': 'SE', 'bounds': bound }, function (results, status) {
        var isSweden = false;
        var noHit = false;
        if (results[0] == null) {
            noHit = true;
        }

        if (!noHit) {
            var formatted_address = results[0].formatted_address;
            if (formatted_address.indexOf(", Sverige") != -1 || formatted_address.indexOf(", Sweden") != -1) {
                isSweden = true;
            }
        }

        if (status == google.maps.GeocoderStatus.OK && isSweden) {

            if (hideMarker == true) {
                if (typeofmap == "normal") {
                    map.setCenter(results[0].geometry.location);
                    map.setZoom(zoomLevel);
                }
                if (typeofmap == "story") {
                    mapStory.setCenter(results[0].geometry.location);
                    mapStory.setZoom(zoomLevel);
                }
                if (typeofmap == "initiative") {
                    mapInitiative.setCenter(results[0].geometry.location);
                    mapInitiative.setZoom(zoomLevel);
                }
                if (typeofmap == "local") {
                    mapLocalSociety.setCenter(results[0].geometry.location);
                    mapLocalSociety.setZoom(zoomLevel);
                }
                if (typeofmap == "all") {
                    map.setCenter(results[0].geometry.location);
                    map.setZoom(zoomLevel);
                    mapInitiative.setCenter(results[0].geometry.location);
                    mapInitiative.setZoom(zoomLevel);
                    mapLocalSociety.setCenter(results[0].geometry.location);
                    mapLocalSociety.setZoom(zoomLevel);
                    //                    google.maps.event.addListener(marker, 'click', function () {
                    //                        if (!isMiniMap) {
                    //                            if (infowindow) infowindow.close();
                    //                            $.getJSON("/Extensions/Handlers/GoogleMapsMarkers.ashx", { pageId: input.l, typeofmap: "benefits" }, function (data) {
                    //                                infowindow = new google.maps.InfoWindow({ content: "<h2>" + data.markers[0].t + "</h2><p>" + data.markers[0].c + "</p>" + $("<p/>").html(data.markers[0].a).text() + "<a href=\"" + data.markers[0].l + "\" /a>" + data.markers[0].t + "</a>" });
                    //                                infowindow.open(map, marker);
                    //                            });
                    //                        }
                    //                        else {
                    //                            $.getJSON("/Extensions/Handlers/GoogleMapsMarkers.ashx", { pageId: input.l, typeofmap: "benefits" }, function (data) {
                    //                                window.location = data.markers[0].l;
                    //                            });
                    //                        }
                    //                    });
                }
            }
            else {
                map.setCenter(results[0].geometry.location);
                map.setZoom(zoomLevel);
                var marker = new google.maps.Marker({
                    map: map,
                    icon: "/Templates/Images/googleMapsPin.png",
                    position: results[0].geometry.location
                });
            }
            $('#GoogleMapNoResult').hide();

        } else {
            var geocoder2 = new google.maps.Geocoder();
            $('#GoogleMapNoResult').empty();
            $('#GoogleMapNoResult').show().append('<p>Ingen träff på <strong>' + addr + '</strong></p>');
            geocoder2.geocode({ 'address': 'Östersund, Sweden' }, function (results, status) {
                var ne = results[0].geometry.viewport.getNorthEast();
                var sw = results[0].geometry.viewport.getSouthWest();

                map.fitBounds(results[0].geometry.viewport);

                var boundingBoxPoints = [
                    ne, new google.maps.LatLng(ne.lat(), sw.lng()),
                    sw, new google.maps.LatLng(sw.lat(), ne.lng()), ne
                ];

                var boundingBox = new google.maps.Polyline({
                    path: boundingBoxPoints,
                    strokeColor: '#FF0000',
                    strokeOpacity: 0.0,
                    strokeWeight: 1
                });

                boundingBox.setMap(map);
                map.setZoom(4);
            });
        }
    });
    return false;
}
