/*
Funkcja pobierająca z /WW/panorama.json informacje o wybranej panoramie (pano)
*/
function customPanoProvider(pano) {
        var message;
        $.ajax({
            async: false,
            type: "GET",
            url: "/WW/panorama.json?request=getPano&pano=" + pano,
            dataType: "json",
            success: function (msg) {
                message = msg;
            },
            error: function (msg,er) {
                alert(er);
            }
            });
        $.ajax({
            async: true,
            type: "GET",
            url: "/WWUpload/heading.html",
            dataType: "html",
            success: function (msg) {
                if ($("#heading").length == 0) {
                    $(document.body).append(msg);
                                    $("#headingplus").click(function() {
                    $("#heading").get(0).value = $("#heading").get(0).value * 1 + 1;
                });
                $("#headingminus").click(function() {
                    $("#heading").get(0).value = $("#heading").get(0).value * 1 - 1;
                });
                }
                $("#zapiszHeading").unbind("click");
                $("#zapiszHeading").click(function() {
                   $.ajax({
                        async: true,
                        type: "GET",
                        url: "/WWUpload/heading.html?pano=" + message.id + "&heading=" + $("#heading").get(0).value,
                        dataType: "html",
                        success: function (msg) {
                            var divPar = $("#heading").get(0).parentNode;
                            $(divPar).append(msg);
                            }
                        });
                });
                $("#heading").get(0).value = message.heading;
            }
            });
      return {
        location: {
          pano: message.id,
          description: message.name,
          latLng: new google.maps.LatLng(Number(message.lat),Number(message.lng))
        },
        links: message.links,
        tiles: {
          tileSize: new google.maps.Size(Number(message.tileWidth), Number(message.tileHeight)),
          worldSize: new google.maps.Size(Number(message.width), Number(message.height)),
          centerHeading: message.heading,
          getTileUrl: getPanoTileURL
        }
  	};

}

/* Funkcja pobierająca zadany kafelek dla zadanej panoramy poprzez servlet proxy /WW/images/*.jpg */
function getPanoTileURL(pano,zoom,tileX,tileY) {
	return '/WW/images/' + pano + '-' + zoom + '-' + tileX + '-' + tileY + '.jpg';
}

/* Funkcja tworząca funkcję przechowującą opcje dla danej panoramy (id) */
function setPanoramaOptions(id,panoOptions,panorama) {
    return function() {
        panoOptions.pano = id;
        panorama.setOptions(panoOptions);
    };
}

/* Funkcja tworząca funkcję przybliżającą do widoku dla danej grupy panoram */
function setZoomToArea(map,minlat, minlng, maxlat, maxlng) {
return function() {
    var bounds = new google.maps.LatLngBounds(
                                    new google.maps.LatLng(minlat,minlng),
                                    new google.maps.LatLng(maxlat,maxlng)
                                );
                            map.fitBounds(bounds);
    };
}

/* Funkcja tworząca pojedynczy wpis w legendzie */
function addItemToLegend(div, legendInfo, markers, map) {
    var input = document.createElement('input');
    var tekst = document.createTextNode(legendInfo);
    var br = document.createElement('br');
    input.setAttribute('type','checkbox');
    input.setAttribute('checked','checked');
    input.onclick = function() {
        if (this.checked == true) {
            for (var i = 0; i < markers.length; i++)
                markers[i].setMap(map);
        } else {
            for (var i = 0; i < markers.length; i++)
                markers[i].setMap(null);
        } 
    };
    div.appendChild(input);
    div.appendChild(tekst);
    div.appendChild(br);
    return input;
}

/* Funkcja tworząca legendę */
function createLegend(title) {
    var div = document.createElement('div');
    div.style.height = 'auto';
    div.style.overflow = 'hidden';
    
    var h4 = document.createElement('h4');
    try {
    var a = contractExpand
    h4.innerHTML = '<input type="image" src="scripts/images/minus_button.png" onclick="contractExpand(this);" />&nbsp;'
	    + title;
    } catch (err) {
        h4.innerHTML = title;
    }
    div.id = title;
    div.appendChild(h4);
    return div;
}

/* Główna funkcja - ładuje panoramy na zadaną mapę i legendę do obiektu o zadanym ID */
function insertPanorama(map, legendID) {
    var markers = [];
    var panorama = map.getStreetView();
	
    var panoOptions = {
            visible: true,
            zoomControl: false,
            addressControlOptions: {position: google.maps.ControlPosition.RIGHT_TOP},
            panoProvider: customPanoProvider
	};

    var panoramioLayer = new google.maps.panoramio.PanoramioLayer();
    panoramioLayer.setMap(map);
	/* ID użytkownika panoramio, którego zdjęcia mają być wyświetlone na mapie */
    panoramioLayer.setUserId('6443737');
	/* Tytuł w legendzie */
    var div = createLegend('Wirtualne Wycieczki');
	/* Tytuł wpisu dotyczącego panoram w stylu StreetView */
    var inputPano =  addItemToLegend(div, 'Panoramy', markers, map);
	/* Tytuł wpisu dotyczącego zdjęć z Panoramio */
    var inputPhoto =  addItemToLegend(div, 'Zdjęcia', [panoramioLayer], map);
    document.getElementById(legendID).appendChild(div);

        google.maps.event.addListener(map, 'idle', function() {
            var bounds = map.getBounds();
            $.ajax({
            async: true,
            type: "GET",
            url: "/WW/panorama.json?request=getAll&minLat=" + bounds.getSouthWest().lat() +
            "&maxLat=" + bounds.getNorthEast().lat() +
            "&minLng=" + bounds.getSouthWest().lng() +
            "&maxLng=" + bounds.getNorthEast().lng(),
            dataType: "json",
            success: function (message) {
                if (inputPano.checked == true) {
                    /*
                    To naiwne czyszczenie i wstawianie do tablicy na nowo
                    należałoby zastąpić sprawdzaniem 
                    */
                    for (var i = 0; i < markers.length; i++) {
                        markers[i].setMap(null);
                    }
                    for (var i = 0; message.groups != null && i < message.groups.length; i++) {
						var marker = new google.maps.Marker({
							map:map,
							draggable:false,
							position: new google.maps.LatLng(message.groups[i].lat,message.groups[i].lng),
							icon: '/WW/camera-icon.png',
							title: message.groups[i].desc
						});
                        markers[i] = marker;
						google.maps.event.addListener(marker, 'click', setZoomToArea(
							map,
							message.groups[i].minlat,
							message.groups[i].minlng,
							message.groups[i].maxlat,
							message.groups[i].maxlng
						));
                    }
                    for (var i = 0; message.pano != null && i < message.pano.length; i++) {
						var marker = new google.maps.Marker({
							map:map,
							draggable:false,
							position: new google.maps.LatLng(message.pano[i].lat,message.pano[i].lng),
							icon: '/WW/camera-icon.png',
							title: message.pano[i].name
						});
                        markers[i] = marker;
						google.maps.event.addListener(marker, 'click', setPanoramaOptions(
							message.pano[i].id,panoOptions,
							panorama
						));
                    }
                }
            },
            error: function (msg,er) {
                alert(er);
            }
            });
        });

}

