﻿var map_working_mode = "default";
var map = null;
var geocoder = null;
var selectedMarker = null;
var arrPhotos = [];
var currentPhoto = 0;
var PHOTOS_ON_PAGE = 3;
var infoWindowMove = false;
var currLat;
var currLng;
var bReloadPanels = false;
var arrMarkers = new Array(); // array of markers currnetly placed on map
var iCurrentMarkedId = null;
var iCurrentPhotoId = null;
var ICON_URL = "http://tamteczasy.pl/_pic/gmap-icons/gif/";
var enPlaceType = { PLACES: 'all', EVENTS: 'events', RANDOM: 'random' };
var ptPlaceType = enPlaceType.PLACES;
var enIconType = {
    DEFAULT: "default-brown.gif",
    CITY: "city-brown.gif",
    STREET: "place-brown.gif",
    HOUSE: "default-brown.gif",
    HOME: "home-brown.gif",
    PLACE_PHOTO: "map-icon-place-picture.gif",
    PLACE_THREAD: "map-icon-place-thread.gif"

}
var arrIconSize =  Array();
arrIconSize[enIconType.DEFAULT]= { X: 19, Y: 39 };
arrIconSize[enIconType.CITY]= { X: 54, Y: 72 } ;
arrIconSize[enIconType.STREET]= { X: 34, Y: 45 } ;
arrIconSize[enIconType.HOUSE]= { X: 15, Y: 31 } ;
arrIconSize[enIconType.HOME]= { X: 54, Y: 72 } ;
function setupMap(bShowMapTypes,lt, ln, zoom) {
    currLat = lt;
    currLng = ln;
    var gmap = $("[class$=gmap]")[0];
    if (map == null && gmap != null) {
        map = new GMap2(gmap);

        if (map_working_mode != "disabled") {
            GEvent.addListener(map, "moveend", onMoveHandler);
            GEvent.addListener(map, "click", onClickHandler);
        }
        if (zoom == null)
            zoom = 6;
        if (lt != null && ln != null)
            map.setCenter(new GLatLng(lt, ln), zoom);
        else
            map.setCenter(new GLatLng(52.4, 19.29), zoom);
        map.addControl(new GLargeMapControl());
        if (bShowMapTypes)
            map.addControl(new GMapTypeControl());


        if (geocoder == null){
            geocoder = new GClientGeocoder();
        }
        return true;
    }
    return false;
}

function onMoveHandler() {
    if (!infoWindowMove){
        if (ptPlaceType == enMapPlace.Group){
            loadGroupPlaces();
        }
        else{
            loadPlaces();        
        }
    }
        
    if (bReloadPanels){
        var swBounds = map.getBounds().getSouthWest();
        var neBounds = map.getBounds().getNorthEast();
        __doPostBack("ctl00_Main_m_upPlaceMainPhotos", "Bounds;" + swBounds.lat() + ";" + swBounds.lng() + ";" + neBounds.lat() + ";" + neBounds.lng());
    }
    infoWindowMove = false;
}
function createGIcon(type, iconSize) {
    var ZOOM_CONSTANT = map.getZoom()/12;
    var gicon = new GIcon();
    gicon.image = ICON_URL + type;
    gicon.iconSize = new GSize(ZOOM_CONSTANT*iconSize.X, ZOOM_CONSTANT*iconSize.Y);
    gicon.infoWindowAnchor = new GPoint(10, 5);
    gicon.iconAnchor = new GPoint(ZOOM_CONSTANT*(iconSize.X-35), ZOOM_CONSTANT*iconSize.Y); //WAS 10,45


    return gicon;
}
function onClickHandler(marker) {
    if (marker != null && marker.isMarker) {
        if (map_working_mode == "upload") {
            var ltln = marker.getLatLng();
            
            createOwnMarker(ltln,marker.type);
            selectedMarker.locality = marker.name;
            selectedMarker.cityid = marker.cityid;
            selectedMarker.streetid = -1;
            selectedMarker.houseid = -1;
            var street = "";
            if (marker.street != null) {
                street = marker.street;
                selectedMarker.streetid = marker.streetid;
            }
            var house = "";
            if (marker.house != null) {
                selectedMarker.houseid = marker.houseid;
                house = marker.house;
            }
            

            if (marker.type != null) {
                selectedMarker.type = marker.type;
                selectPlace(marker.locality, street, house, ltln.lat(), ltln.lng(), true);
            }
        } else {
            infoWindowMove = true;
            if (marker.cityid != null) {
                marker.openInfoWindowHtml(getInfoWindowContent(marker), { maxWidth: 50 });
            }

            GEvent.addListener(marker, "infowindowopen", function() {
                loadPhotosForPlace(getPlaceId(marker),marker.type);
            });
        }
    }
}
function getInfoWindowContent(marker) {
    var latlng = marker.getLatLng();
    var desc = "<a href=\"" +path+"/" + marker.type +"/" + getPlaceId(marker) +"/" + tr(marker.locality,"ĘÓĄŚŁŻŹŃęóąśłżźćń","EOASLZZNeoaslzzcn") + "\" style=\"color:#009EB3;text-decoration:none; \" >";    
    desc += marker.locality.replace(" ","\u00a0");
    if (marker.street != null)
        desc += ",\u00a0" +marker.street.replace(" ","\u00a0");
    if (marker.house != null)
        desc += "\u00a0" + marker.house.replace(" ","\u00a0");;
    desc +="</a>";

    if (map_working_mode != "upload") {

        desc += "<hr style=\" height:1; color: #655440; margin: 3px;\" /><div id=\"place-gallery\" style=\"width: auto; height: 50px;\"></div>";
        desc += "<br/><a href=\"#\" onclick=\"return showPrevPhoto();\" id=\"prev-link\" style=\"display:none\">";
        desc += "&larr Poprzednie</a>&nbsp;";
        desc += "<a href=\"#\" onclick=\"return showNextPhoto();\" id=\"next-link\" style=\"display:none\">";
        desc += "Następne &rarr</a>";
        desc += "<br/><br/>";
        desc += "<a href=\"" +path+"/" + marker.type +"/" + getPlaceId(marker) +"/" + marker.locality + "\" >Zobacz to miejsce</a>";
    }

    return desc;
}
function getPlaceId(gmarker) {
    switch (gmarker.type) {
        case 'miasto':
            return gmarker.cityid;
        case 'ulica':
            return gmarker.streetid;
        case 'dom':
            return gmarker.houseid;
    }
}
function loadPlaces() {
    var bounds = map.getBounds();
    var sw = bounds.getSouthWest();
    var ne = bounds.getNorthEast();

    $.getJSON(encodeURI(path+"/Place/GetPlaces.aspx?t=" + ptPlaceType + "&swlat=" + sw.lat() + "&swlng=" +
    sw.lng() + "&nelat=" + ne.lat() + "&nelng=" + ne.lng())
    , createMarkers);

}
function loadGroupPlaces()
{
    $.getJSON(encodeURI(path+"/Place/GetPlaces.aspx?t=group&groupid="+$('[id$=m_hidID]').val())
    , createMarkers);
}
function loadUserPlace() {
    search_working_mode = "user_location";
    map_working_mode = "disabled";
    var lat = parseFloat($("[id$=m_hidMapLat]").val());
    var lng = parseFloat($("[id$=m_hidMapLng]").val());
    currLat = lat;
    currLng = lng;
    if (lat != null && lat != "" && !isNaN(lat) && lng != null && lng != "" && !isNaN(lng)) {
        map.setCenter(new GLatLng(lat, lng), 13);
        selectedMarker = createLocationMarker(lat, lng, false);
        arrMarkers.push(selectedMarker);
    }
    else {
        loadPlaces();
    }
}
function loadRandomPlace() {
   $.getJSON(encodeURI(path+"/Place/GetPlaces.aspx?t=" + enPlaceType.RANDOM)
        , centerToPlace);
}
function createGMarker(latlng, bEnableDrag, iconType) {
    var iconCorrectColor = iconType;
    if (latlng.lat() == currLat && latlng.lng() == currLng) {
        iconCorrectColor = iconType.replace('brown', 'orange');
    }
    var iZIndex = 1;
    if (bEnableDrag) {
        iZIndex = 2;// TODO: why return 2 ??
    }
    var gicon = createGIcon(iconCorrectColor, arrIconSize[iconType]);
    markerOptions = {
        icon: gicon,
        clickable: true,
        draggable: bEnableDrag,
        zIndexProcess: function(gmarker) { return iZIndex; } 
    };
    var gmarker = new GMarker(latlng, markerOptions);
    gmarker.isMarker = true;
    return gmarker;
}

function createOwnMarker(latlng, type) {
    if (selectedMarker != null)
        map.removeOverlay(selectedMarker);
    currLat = latlng.lat();
    currLng = latlng.lng();
    selectedMarker = createGMarker(latlng, false, getIconType(type));

    $("[id$=m_hidMapLat]").val(latlng.lat());
    $("[id$=m_hidMapLng]").val(latlng.lng());
    map.addOverlay(selectedMarker);
}

function createLocationMarker(a_sLat, a_sLng, bMarkerDraggable) {
    var LocMarker = createGMarker(new GLatLng(a_sLat, a_sLng), bMarkerDraggable, enIconType.HOME);
    map.addOverlay(LocMarker);
    return LocMarker;
}
function createMarkers(response) {
    map.clearOverlays();
    arrMarkers.length = 0;
    
    if (response.Houses != null) {
        $.each(response.Houses, function(i, item) {

            var gmarker = createGMarker(new GLatLng(item.lat, item.lng), false,enIconType.HOUSE);

            gmarker.locality = item.city;
            if (item.street != null) {
                gmarker.streetid = item.streetid;
                gmarker.street = item.street;
            }
            gmarker.cityid = item.cityid;
            gmarker.house = item.name;
            gmarker.houseid = item.houseid;
            gmarker.type = item.type;
            addMarkerToMap(gmarker);

        });
    }
    if (response.Streets != null) {
        $.each(response.Streets, function(i, item) {

            var gmarker = createGMarker(new GLatLng(item.lat, item.lng), false,enIconType.STREET);

            gmarker.locality = item.city;
            gmarker.street = item.name;
            gmarker.streetid = item.streetid;
            gmarker.cityid = item.cityid;
            gmarker.type = item.type;
            addMarkerToMap(gmarker);
        });
    }
    if (response.Cities != null) {
        $.each(response.Cities, function(i, item) {

            var gmarker = createGMarker(new GLatLng(item.lat, item.lng), false,enIconType.CITY);

            gmarker.locality = item.name;
            gmarker.cityid = item.cityid;
            gmarker.type = item.type;
            addMarkerToMap(gmarker);
        });
    }
    if (selectedMarker != null) {
        map.addOverlay(selectedMarker);
        arrMarkers.push(selectedMarker);
    }
    if (iCurrentMarkedId != null) {
        var marker = findMarker(iCurrentMarkedId);
        if (marker != null) {
            infoWindowMove = true;
            marker.openInfoWindowHtml(getInfoWindowContent(marker), { maxWidth: 300 });

            GEvent.addListener(marker, "infowindowopen", function() {
                loadPhotosForPlace(iCurrentMarkedId,marker.type);
            });

        }
    }
}
function addMarkerToMap(gmarker){
        if ((map_working_mode == "upload" && type == "place") 
        || (gmarker.getLatLng().lat() == currLat && gmarker.getLatLng().lng() == currLng && search_working_mode != "user_location")
        ){
            selectedMarker = gmarker;
        }
        else{
            map.addOverlay(gmarker);
            arrMarkers.push(gmarker);
        }
}
function getIconType(placeType)
{
    switch (placeType)
    {
        case "City":
        case "miasto":
            return enIconType.CITY;
            break;
        case "Street":
        case "ulica":
            return enIconType.STREET;
            break;
        case "House":    
        case "dom":
            return enIconType.HOUSE;
            break;
            
    }
}
function centerToPlace(response) {
    $.each(response.Cities, function(i, item) {
        map.setCenter(new GLatLng(parseFloat(item.lat), parseFloat(item.lng)), 13);
    });

}
function loadPhotosForPlace(id,type) {
    $.getJSON(path+"/Photo/GetPhotos.aspx?t=place&place=" + type + "&id=" + id, showPhotos);
    iCurrentMarkedId = null;
}
function showPhotos(response) {
    arrPhotos = [];
    currentPhoto = 0;

    if (response.Photos != null)
    {
        $.each(response.Photos, function(i, item) {
            arrPhotos[i] = item;
            if (iCurrentPhotoId != null && item.id == iCurrentPhotoId)
                currentPhoto = i;
        });
        showPhoto(currentPhoto - currentPhoto % PHOTOS_ON_PAGE);
    }
    else
        showPlaceInfo(response.ThreadsCount,response.UsersCount);
       
}
function showNextPhoto() {
    if (currentPhoto + PHOTOS_ON_PAGE < arrPhotos.length)
        showPhoto(currentPhoto + PHOTOS_ON_PAGE);
    return false;
}
function showPrevPhoto() {
    if (currentPhoto >= PHOTOS_ON_PAGE)
        showPhoto(currentPhoto - PHOTOS_ON_PAGE);
    return false;
}
function showPlaceInfo(iThreadsCount,iUsersCount) {
        var gallery = $("#place-gallery");
        gallery.empty();
        gallery.append("<br />");
        var spanPhotos = document.createElement('span');
        spanPhotos.appendChild(document.createTextNode("Brak zdjęć"));
        gallery.append(spanPhotos);
        gallery.append("<br />");
        var spanThreads = document.createElement('span');
        spanThreads.appendChild(document.createTextNode("Liczba dyskusji: "+iThreadsCount));
        gallery.append(spanThreads);
        gallery.append("<br />");
        var spanUsers = document.createElement('span');
        spanUsers.appendChild(document.createTextNode("Zapisani uzytkownicy: "+iUsersCount));
        gallery.append(spanUsers);
    return false;
}
function showPhoto(i) {
    if (i >= 0 && i < arrPhotos.length) {
        var gallery = $("#place-gallery");
        gallery.empty();
        for (var k = i; k < arrPhotos.length && k < i + PHOTOS_ON_PAGE; k++) {
            //Create the new <a>
            var aElem = document.createElement('a');
            aElem.href = path+ '/zdjecie/'+ arrPhotos[k].id +'/'+arrPhotos[k].type;

            var img = document.createElement("img");
            img.setAttribute("src", arrPhotos[k].path);
            img.setAttribute("alt", "Ładowanie...");
            img.style.margin = "1px";

            aElem.appendChild(img);
            gallery.append(aElem);
        }
        currentPhoto = i;
    }

    if (i == 0)
        $("#prev-link").hide();
    else
        $("#prev-link").show();

    if (i + PHOTOS_ON_PAGE >= arrPhotos.length)
        $("#next-link").hide();
    else
        $("#next-link").show();

    return false;
}
function openPlaceInfoWithPicture(lat, lng, placeId, photoId) {
    infoWindowMove = false;
    iCurrentMarkedId = placeId;
    iCurrentPhotoId = photoId;
    map.setCenter(new GLatLng(parseFloat(lat) + 0.01, parseFloat(lng)));
}
function findMarker(id) {
    for (var i = 0; i < arrMarkers.length; i++) {
        if (arrMarkers[i].id == id) {
            return arrMarkers[i];
        }
    }
    return null;
}
function getTypeFromGoogleSearch(city,street,house)
{
    if (house != "")
        return "House";
    else if ( street != "")
        return "Street";
    else if (city != "")
        return "City";
}
function tr(str, from, to) {
    for(var i = 0; i < from.length; i++) {
    str = str.replace(new RegExp(from.charAt(i),'g'), to.charAt(i));
    }

    return str;
}
