﻿var map;
var allowedBounds;
var infowindow;
var cityImageMarkerLarge = null;
var cityImageMarkerSmall = null;
var inactiveCompanyImageMarker = null;
var activeCompanyImageMarker = null;
var signImageMarker = null;
var cityMarkerSize = -1; //-1 = oinitierad, 0 = small, 1 = large
var zoomChangedListener;

function MapMarker() { }

function UpdateMapLocation() {

    //google.maps.event.removeListener(zoomChangedListener);

    var myLatlng = new google.maps.LatLng(lat, lng);
    var myOptions = {
        zoom: zoom,
        center: myLatlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    }

    map.setOptions(myOptions);

    //Lägger till lyssnare för kartförändringsevent.
    //zoomChangedListener = google.maps.event.addListener(map, 'zoom_changed', function () { ZoomChangedEventHandler(); });
}

function PanToMapCenter(newlat, newlng) {
    lng = newlng;
    lat = newlat;
    map.panTo(new google.maps.LatLng(newlat, newlng));
    DragEndEventHandler();
}

function CheckBounds() {
    if (allowedBounds.contains(map.getCenter())) {
        return;
    }

    var c = map.getCenter();
    var x = c.lng();
    var y = c.lat();
    var maxX = allowedBounds.getNorthEast().lng();
    var maxY = allowedBounds.getNorthEast().lat();
    var minX = allowedBounds.getSouthWest().lng();
    var minY = allowedBounds.getSouthWest().lat();

    if (x < minX) { x = minX; }
    if (x > maxX) { x = maxX; }
    if (y < minY) { y = minY; }
    if (y > maxY) { y = maxY; }

    map.setCenter(new google.maps.LatLng(y, x));
}

function LoadMarkers() {
    var urlName = window.location.pathname.replace(/\//gi, "");
    if (zoom <= setting.OverviewZoomThreshold) {
        CityService.GetOverviewMarkers(LoadOverviewMarkersCallBack, null, null);
    }
    else if (urlName !== "") {
        CityService.GetCityMarkers(urlName, LoadCityMarkersCallBack, null, null);
    }
}

function LoadOverviewMarkersCallBack(markers) {
    mapMarkers = [];
    for (var i = 0; i < markers.length; i++) {
        (function () {
            var myLatlng = new google.maps.LatLng(markers[i].Lat, markers[i].Lng);


            var markerImage
            if (setting.LargeMarkerZoomThreshold > zoom) {
                markerImage = CreateCityImageMarkerSmall();
                cityMarkerSize = 0;
            }
            else {
                markerImage = CreateCityImageMarkerLarge();
                cityMarkerSize = 1;
            }

            var marker = new google.maps.Marker({
                position: myLatlng,
                icon: markerImage,
                map: map,
                title: markers[i].CityName
            });

            google.maps.event.addListener(marker, 'click', function () {
                MarkerClickedEventHandler(marker);
            });

            var mm = new MapMarker();
            mm.ID = markers[i].ID;
            mm.URLName = markers[i].URLName;
            mm.Marker = marker;
            mm.Category = '-=City=-';
            mapMarkers[i] = mm;
        })();
    }
}

function LoadCityMarkersCallBack(markers) {
    mapMarkers = [];
    for (var i = 0; i < markers.length; i++) {
        (function () {
            var myLatlng = new google.maps.LatLng(markers[i].Lat, markers[i].Lng);

            var markerImage;
            if (markers[i].Category === '-=sign=-') {
                markerImage = CreateSignImageMarker();
            }
            else {
                markerImage = CreateInactiveCompanyImageMarker();
            }

            var marker = new google.maps.Marker({
                position: myLatlng,
                icon: markerImage,
                map: map,
                title: markers[i].Name
            });

            google.maps.event.addListener(marker, 'click', function () {
                MarkerClickedEventHandler(marker);
            });

            var mm = new MapMarker();

            mm.ID = markers[i].ID;
            mm.Name = markers[i].Name;
            mm.Address1 = markers[i].Address1;
            mm.Address2 = markers[i].Address2;
            mm.ZipCode = markers[i].ZipCode;
            mm.City = markers[i].City;
            mm.PhoneNo1 = markers[i].PhoneNo1;
            mm.PhoneNo2 = markers[i].PhoneNo2;
            mm.Email = markers[i].Email;
            mm.Webaddress = markers[i].Webaddress;
            mm.ExtInfo = markers[i].ExtInfo;
            mm.Lat = markers[i].Lat;
            mm.Lng = markers[i].Lng;
            mm.Category = markers[i].Category;
            mm.FileName = markers[i].FileName;
            mm.Marker = marker;

            mapMarkers[i] = mm;
        })();
    }
    CreateCompanyList();

    if (SearchedCompanyID !== '') {
        for (var i = 0; i < mapMarkers.length; i++) {
            var mapMarker = mapMarkers[i];
            if (mapMarker.Category !== '-=sign=-' && mapMarker.ID === SearchedCompanyID) {
                ActivateMapMarker(mapMarker);
                PanToMapCenter(mapMarker.Lat, mapMarker.Lng);
                MarkerClickedEventHandler(mapMarker.Marker);
                break;
            }
        }
        SearchedCompanyID = '';
    }
}

function CreateCityImageMarkerSmall() {
    if (cityImageMarkerSmall === null) {
        cityImageMarkerSmall = new google.maps.MarkerImage('http://' + setting.rootHost + 'images/markers/dot.png',
                new google.maps.Size(13, 13),
                google.maps.Point(0, 0),
                google.maps.Point(6, 6));
    }

    return cityImageMarkerSmall;
}

function CreateCityImageMarkerLarge() {
    if (cityImageMarkerLarge === null) {
        cityImageMarkerLarge = new google.maps.MarkerImage('http://' + setting.rootHost + 'images/markers/mark1.png',
                new google.maps.Size(24, 32),
                google.maps.Point(0, 0),
                google.maps.Point(9, 32));
    }

    return cityImageMarkerLarge;
}

function CreateInactiveCompanyImageMarker() {
    if (inactiveCompanyImageMarker === null) {
        inactiveCompanyImageMarker = new google.maps.MarkerImage('http://' + setting.rootHost + 'images/markers/mark2.png',
                new google.maps.Size(21, 25),
                google.maps.Point(0, 0),
                google.maps.Point(9, 25));
    }

    return inactiveCompanyImageMarker;
}

function CreateActiveCompanyImageMarker() {
    if (activeCompanyImageMarker === null) {
        activeCompanyImageMarker = new google.maps.MarkerImage('http://' + setting.rootHost + 'images/markers/mark1.png',
                new google.maps.Size(24, 32),
                google.maps.Point(0, 0),
                google.maps.Point(9, 32));
    }

    return activeCompanyImageMarker;
}

function CreateSignImageMarker() {
    if (signImageMarker === null) {
        signImageMarker = new google.maps.MarkerImage('http://' + setting.rootHost + 'images/markers/mapmarker_mark_sign.png',
                new google.maps.Size(36, 36),
                google.maps.Point(0, 0),
                google.maps.Point(15, 36));
    }

    return signImageMarker;
}

function CheckCityMarkerSize() {
    if (IsBaseURL()) {
        if (setting.LargeMarkerZoomThreshold <= zoom && cityMarkerSize !== 1) {
            for (var i = 0; i < mapMarkers.length; i++) {
                var mapMarker = mapMarkers[i];
                mapMarker.Marker.setIcon(CreateCityImageMarkerLarge());
            }
            cityMarkerSize = 1;
        }
        if (setting.LargeMarkerZoomThreshold > zoom && cityMarkerSize !== 0) {
            for (var i = 0; i < mapMarkers.length; i++) {
                var mapMarker = mapMarkers[i];
                mapMarker.Marker.setIcon(CreateCityImageMarkerSmall());
            }
            cityMarkerSize = 0;
        }
    }
    else {
        cityMarkerSize = -1;
    }
}

function ActivateMapMarker(mapMarker) {
    mapMarker.Marker.setIcon(CreateActiveCompanyImageMarker());
    mapMarker.Marker.setZIndex(1);
}

function DeactivateAllMapMarkers() {
    for (var i = 0; i < mapMarkers.length; i++) {
        var mapMarker = mapMarkers[i];
        if (mapMarker.Category !== '-=sign=-') {
            mapMarker.Marker.setIcon(CreateInactiveCompanyImageMarker());
            mapMarker.Marker.setZIndex(0);
        }
    }
}

function MarkerClickedEventHandler(marker) {
    CloseInfoWindow();

    var mapMarker;
    for (var i = 0; i < mapMarkers.length; i++) {
        if (mapMarkers[i].Marker === marker) {
            mapMarker = mapMarkers[i];
            break;
        }
    }

    var contentString;
    if (mapMarker.Category === '-=City=-') {
        contentString = CreateCityInfoDiv(mapMarker);
    }
    else if (mapMarker.Category === '-=sign=-') {
        //contentString = CreateSignInfoDiv(mapMarker);
    }
    else {
        contentString = CreateCompanyInfoDiv(mapMarker);
    }

    infowindow = new google.maps.InfoWindow({
        content: contentString
    });

    if (mapMarker.Category !== '-=sign=-') {
        infowindow.open(map, marker);
    }
}

function CloseInfoWindow() {
    if (infowindow) {
        infowindow.close();
    }
}

function CreateCityInfoDiv(mapMarker) {
    var marker = mapMarker.Marker;
    var tmpURL = setting.rootHost + mapMarker.URLName + "/";

    var htmlString = $('#div_googlemaps_infoview_city_template').html();
    htmlString = htmlString.replace(/%City%/g, marker.title);
    htmlString = htmlString.replace(/%RedirectURL%/g, tmpURL);

    return htmlString;
}

function CreateCompanyInfoDiv(mapMarker) {
    var marker = mapMarker.Marker;

    var htmlString = $('#div_googlemaps_infoview_company_template').html();
    htmlString = ArrangeCompanyInfoHTML(htmlString, mapMarker);

    return htmlString;
}

function ArrangeCompanyInfoHTML(htmlString, mapMarker) {
    htmlString = htmlString.replace(/%ID%/g, mapMarker.ID);


    htmlString = htmlString.replace(/%CompanyName%/g, mapMarker.Name);
    if (mapMarker.Address1 != null && mapMarker.Address1 !== "") {
        htmlString = htmlString.replace(/%Address1%/g, mapMarker.Address1);
    }
    else {
        htmlString = '<div>' + htmlString + '</div>';
        var domO = $(htmlString);
        domO.find('#span_infoview_company_address1').hide();
        htmlString = domO.html();
    }

    if (mapMarker.Address2 != null && mapMarker.Address2 !== "") {
        htmlString = htmlString.replace(/%Address2%/g, mapMarker.Address2);
    }
    else {
        htmlString = '<div>' + htmlString + '</div>';
        var domO = $(htmlString);
        domO.find('#span_infoview_company_address2').hide();
        htmlString = domO.html();
    }

    htmlString = htmlString.replace(/%CompanyName%/g, mapMarker.Name);
    if (mapMarker.ZipCode != null && mapMarker.ZipCode !== "" && mapMarker.City != null && mapMarker.City !== "") {
        htmlString = htmlString.replace(/%ZipCode%/g, mapMarker.ZipCode);
        htmlString = htmlString.replace(/%City%/g, mapMarker.City);
    }
    else {
        htmlString = '<div>' + htmlString + '</div>';
        var domO = $(htmlString);
        domO.find('#span_infoview_company_zip_city').hide();
        htmlString = domO.html();
    }

    if (mapMarker.PhoneNo1 != null && mapMarker.PhoneNo1 !== "") {
        htmlString = htmlString.replace(/%PhoneNo1%/g, mapMarker.PhoneNo1);
    }
    else {
        htmlString = '<div>' + htmlString + '</div>';
        var domO = $(htmlString);
        domO.find('#span_infoview_company_phoneno1').hide();
        htmlString = domO.html();
    }

    if (mapMarker.PhoneNo2 != null && mapMarker.PhoneNo2 !== "") {
        htmlString = htmlString.replace(/%PhoneNo2%/g, mapMarker.PhoneNo2);
    }
    else {
        htmlString = '<div>' + htmlString + '</div>';
        var domO = $(htmlString);
        domO.find('#span_infoview_company_phoneno2').hide();
        htmlString = domO.html();
    }

    if (mapMarker.Email != null && mapMarker.Email !== "") {
        htmlString = htmlString.replace(/%EMail%/g, mapMarker.Email);
    }
    else {
        htmlString = '<div>' + htmlString + '</div>';
        var domO = $(htmlString);
        domO.find('#span_infoview_company_email').hide();
        htmlString = domO.html();
    }

    if (mapMarker.Webaddress != null && mapMarker.Webaddress !== "") {
        htmlString = htmlString.replace(/%Webaddress%/g, mapMarker.Webaddress);
    }
    else {
        htmlString = '<div>' + htmlString + '</div>';
        var domO = $(htmlString);
        domO.find('#span_infoview_company_webaddress').hide();
        htmlString = domO.html();
    }

    if (mapMarker.ExtInfo != null && mapMarker.ExtInfo !== "") {
        htmlString = htmlString.replace(/%ExtInfo%/g, mapMarker.ExtInfo);
    }
    else {
        htmlString = '<div>' + htmlString + '</div>';
        var domO = $(htmlString);
        domO.find('#span_infoview_company_extinfo').hide();
        htmlString = domO.html();
    }

    return htmlString;
}

function CreateSignInfoDiv(mapMarker) {
    var marker = mapMarker.Marker;

    var htmlString = $('#div_googlemaps_infoview_sign_template').html();

    htmlString = htmlString.replace(/%SignName%/g, marker.title);

    if (mapMarker.Webaddress != null) {
        var imageURL = setting.signImageRoot + mapMarker.FileName;
        htmlString = htmlString.replace(/%imgSrc%/g, imageURL);
    }
    else {
        htmlString = '<div>' + htmlString + '</div>';
        var domO = $(htmlString);
        domO.find('#span_infoview_sign_image').hide();
        htmlString = domO.html();
    }

    return htmlString;
}

function LoadMapControl() {
    var urlName = window.location.pathname.replace(/\//gi, "");
    if (zoom > setting.OverviewZoomThreshold && urlName !== "") {
        CityService.GetProjects(urlName, LoadMapControlCallBack, null, null);
    }
}

function LoadMapControlCallBack(mapProjects) {
    if (mapProjects.length > 0) {
        var controlWrapper = $('<div class="mapcontrol_wrapper"></div>');

        var titleHTML = $('#div_map_control_title_template').html();
        titleHTML = ArrangeMapControlTitleHTML(titleHTML, mapProjects[0].City, mapProjects[0].MapName);
        controlWrapper.append($(titleHTML));

        //Lägg till kartorna här.
        for (var i = 0; i < mapProjects.length; i++) {
            var mapProject = mapProjects[i];

            var mapHTML = $('#div_map_control_map_template').html();
            mapHTML = ArrangeMapControlTitleHTML(mapHTML, mapProjects[i].City, mapProjects[i].MapName, mapProjects[i].ID);
            controlWrapper.append($(mapHTML));
        }

        controlWrapper.find('#divMapControlTitle').nextAll().wrapAll('<div class="mapwrapper" />');

        var domWrapper = controlWrapper[0];
        domWrapper.index = 1;
        map.controls[google.maps.ControlPosition.TOP_RIGHT].push(domWrapper);
    }
}

function ArrangeMapControlTitleHTML(htmlString, cityName, mapName, mapID) {
    htmlString = htmlString.replace(/%City%/g, cityName);
    if (mapName !== null) {
        htmlString = htmlString.replace(/%MapName%/g, mapName);
    }
    if (mapID !== null) {
        htmlString = htmlString.replace(/%ID%/g, mapID);
    }

    return htmlString;
}



