﻿var results = null;
var sel_point = null;
var value = 0;
var gmarkers = [];
var map, progressbar;
var bounds = new GLatLngBounds();
var counter;
var baseIcon = new GIcon();
baseIcon.iconSize = new GSize(35, 35);
baseIcon.shadow = "images/shadow.png";
baseIcon.iconAnchor = new GPoint(20,30);
baseIcon.infoWindowAnchor = new GPoint(15,10);
baseIcon.shadowSize = new GSize(52, 35);
var greenIcon = new GIcon(baseIcon, "images/green_i.png", null, "");
var yellowIcon = new GIcon(baseIcon, "images/yellow_i.png", null, "");
function load() {
    map = new GMap2(document.getElementById("map"));
    map.setCenter(new GLatLng(44.406575827895104, 8.936519622802734), 13);
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    var progressbarOptions = { width: 150, loadstring: 'Caricamento parcheggi..' };
    progressbar = new ProgressbarControl(map, progressbarOptions);
}

function show(controlid) {
    var control = document.getElementById(controlid);
    if (control.style.display == 'none')
        control.style.display = 'block';
    else
        control.style.display = 'none';
}

function createMarker(point, name, html, deficon) {
    var marker = new GMarker(point, { icon: deficon, draggable: false, bouncy: true });
    var tooltip = new Tooltip(marker, name, 4);
    marker.tooltip = tooltip;
    map.addOverlay(marker);
    map.addOverlay(tooltip);
    GEvent.addListener(marker, "click", function() {
        map.savePosition();
        marker.openInfoWindowHtml(html);
    });
    GEvent.addListener(marker, "infowindowclose", function() {
        map.returnToSavedPosition();
    });
    GEvent.addListener(marker, "mouseover", function() {
        tooltip.show();
    });
    GEvent.addListener(marker, "mouseout", function() {
        tooltip.hide();
    });
    return marker;
}

function setCenter() {
    var center;
    switch (value) {
        case 0:
            center = new GLatLng(44.406575827895104, 8.936519622802734);
            break;
        case 1:
            center = new GLatLng(44.402384, 8.933463);
            break;
        case 2:
            center = new GLatLng(44.410471, 8.898041);
            break;
        case 3:
            center = new GLatLng(44.410918, 8.956098);
            break;
        case 4:
            center = new GLatLng(44.428163, 8.951254);
            break;
        case 5:
            center = new GLatLng(44.444665, 8.893048);
            break;
        case 6:
            center = new GLatLng(44.422544, 8.848156);
            break;
        case 7:
            center = new GLatLng(44.427419, 8.789637);
            break;
        case 8:
            center = new GLatLng(44.400832, 8.964243);
            break;
        case 9:
            center = new GLatLng(44.394276, 9.021416);
            break;
    }
    var zoom = 14;
    if (value == 0)
        zoom = 13;
    map.setCenter(center, zoom);
}

function refresh() {
    map.getInfoWindow().hide();
    map.clearOverlays();
	readPosition();
    return false;
}

function readPosition() {
    if (value != 0) {
		showLoad();
		progressbar.start();
        setCenter();
        ParkService.GetParcheggiByCirc(value, onSucceeded, onFailed);
    }
    else
        setCenter();
}

function doJob() {
    progressbar.updateLoader(1);
    var lat = parseFloat(gmarkers[counter].Lat);
    var lng = parseFloat(gmarkers[counter].Lon);
    var point = new GLatLng(lat, lng);
    var html = "<div class='info'><div class='infohead'>Parcheggio disabili<br/>Circoscrizione " + gmarkers[counter].DescrC + "</div>";
    html += "<div class='infoleft'><img src='./images/logo_d.jpg' align='absmiddle'/></div>";
    html += "<div class='inforight'><span style='font-size:12px;font-weight:bold;margin:auto'>" + gmarkers[counter].Via + "</span><br/>";
    html += "Capienza: " + gmarkers[counter].Cap + "<br />";
    html += "<a href='#' onclick='show(\"dett" + gmarkers[counter].Id + "\")' style='text-align:right'>Dettagli ubicazione</a>";
    html += "</div>"
    html += "<div class='infofoot'><div id='dett" + gmarkers[counter].Id + "' style='display:none;'>" + gmarkers[counter].Ubi + "</div></div></div>";
    var label = gmarkers[counter].Via;
    var icon = greenIcon;
    if (gmarkers[counter].Acc == 2)
        icon = yellowIcon;
    // create the marker
    var marker = createMarker(point, label, html, icon);
    map.addOverlay(marker);
    counter++;
    if (counter < gmarkers.length) {
        setTimeout('doJob()', 1);
    } else {
        progressbar.remove();
        hideLoad();
    }
}

function onSucceeded(markers) {
    // empty the arrays
    gmarkers = markers;
    htmls = [];
    ii = 0;
    counter = 0;
    progressbar.remove();
    if (markers.length > 0) {
        progressbar.start(gmarkers.length);
        doJob();
    }
    else {
        hideLoad();
        window.alert("Nessun parcheggio trovato, ampliare il raggio di ricerca o inserire un altro indirizzo");
    }
}

function onFailed(error) {
    progressbar.remove();
    hideLoad();
    window.alert("Problemi nel servizio, riprovare più tardi");
    setCenter();
}

var immagini = new Array();
function preload() {
    for (cont = 0; cont < preload.arguments.length; cont++) {
        immagini[cont] = new Image()
        immagini[cont].src = preload.arguments[cont]
    }
}

function SelectZone() {
    value = parseInt(document.getElementById('zone').value);
    refresh();
}

function showLoad() {
    $get('zone').disabled = true;
    $get('radius').disabled = true;
    $get('via').readOnly = true;
    $get('searchBtn').disabled = true;
    $get('text').style.display = "none";
    $get('textl').style.display = "block";
    var loadDiv = $get('load');
    var mapDiv = $get('map');
    mapDiv.style.height = "600px";
    var mapDivBounds = Sys.UI.DomElement.getBounds(mapDiv);
    loadDiv.style.height = mapDiv.style.height;
    loadDiv.style.top = (mapDivBounds.y) + "px";
    loadDiv.style.left = (mapDivBounds.x) + "px";
    loadDiv.style.width = (mapDivBounds.width - 1) + "px";
    loadDiv.style.visibility = "visible";
}

/*
function geocode_old() {
    map.getInfoWindow().hide();
    map.clearOverlays();
    progressbar.start();
    var address = document.getElementById("via").value + ", Genova";
    var geocoder = new GClientGeocoder();
    var lat, lng;
    if (geocoder) {
        geocoder.getLocations(address, function(result) {
            if (result.Status.code == G_GEO_SUCCESS) {
                lat = result.Placemark[0].Point.coordinates[1];
                lng = result.Placemark[0].Point.coordinates[0];
                var point = new GLatLng(lat, lng);
                map.setCenter(new GLatLng(lat, lng));
                draw(point);
                map.panTo(point);
                ParkService.GetParcheggiByLatLng(lat, lng, parseInt(document.getElementById('radius').value), onSucceeded, onFailed);
            }
            else {
                progressbar.remove();
                hideLoad();
                window.alert("Luogo geografico non identificato");
            }
        });
    }
}
*/

function geocode_old() {
    map.getInfoWindow().hide();
    map.clearOverlays();
    progressbar.start();
    var address = document.getElementById("via").value + ", Genova";
    var geocoder = new GClientGeocoder();
    var lat, lng;
    if (sel_point != null) {
        lat = sel_point.lat();
        lng = sel_point.lng();
        map.setCenter(sel_point);
        draw(sel_point);
        map.panTo(sel_point);
        ParkService.GetParcheggiByLatLng(lat, lng, parseInt(document.getElementById('radius').value), onSucceeded, onFailed);
    }
    else {
        progressbar.remove();
        hideLoad();
        window.alert("Luogo geografico non identificato");
    }
}

function go(i, tbAdd, tf) {
    var place = results.Placemark[i];
    sel_point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
    var t = document.getElementById(tbAdd);
    t.value = place.address;
    var g = document.getElementById(tf + "Geo");
    var gl = document.getElementById(tf + "List");
    gl.innerHTML = "";
    g.style.display = "none";
    var gImg = document.getElementById(tf + "imgLoad");
    gImg.style.display = "block";
}

function geocode(tbAdd) {
    var address = tbAdd.value + ", Genova";
    result = null;
    var geocoder = new GClientGeocoder();
    var tf = "f";
    if (geocoder) {
        var g = document.getElementById(tf + "Geo");
        var gl = document.getElementById(tf + "List");
        var gImg = document.getElementById(tf + "imgLoad");
        gImg.style.display = "block";
        g.style.display = "block";
        geocoder.getLocations(address, function(result) {
            // show status code
            // document.getElementById("message").innerHTML = status[result.Status.code]+"<br>";
            results = result;
            if (result.Status.code == G_GEO_SUCCESS) {
                var html = "<ul>";
                for (var i = 0; i < result.Placemark.length; i++) {
                    html += "<li><a href='#' onclick='go(" + i + ",\"" + tbAdd.id + "\",\"" + tf + "\")'>" + result.Placemark[i].address + "</a></li>";
                }
                html += "</ul>";
                gImg.style.display = "none";
                gl.innerHTML = html;
            }
            else {
                g.style.display = "none";
                gImg.style.display = "none";
                progressbar.remove();
                hideLoad();
                sel_point = null;
                window.alert("Luogo geografico non identificato");
            }
        });
    }
}

//////////ESA PART

function fit() {
    map.panTo(bounds.getCenter());
    map.setZoom(map.getBoundsZoomLevel(bounds));
}

function esasZoomOut() {
    var paragraphs = map.getContainer().getElementsByTagName('p').length;
    //GLog.write(paragraphs);
    if (paragraphs > 6) {
        map.zoomOut();
    } 
}
var interval = setInterval("esasZoomOut()", 500);

//calling circle drawing function
function draw(pnt) {
    //map.clearOverlays();
    bounds = new GLatLngBounds();
    var givenRad = (document.getElementById("radius").value * 1) / 1000;
    var givenQuality = 100;
    var centre = pnt || map.getCenter()
    drawCircle(centre, givenRad, givenQuality);
    fit();
}

////////////////////////// circle///////////////////////////////

function drawCircle(center, radius, nodes, liColor, liWidth, liOpa, fillColor, fillOpa) {
    // Esa 2006
    //calculating km/degree
    var latConv = center.distanceFrom(new GLatLng(center.lat() + 0.1, center.lng())) / 100;
    var lngConv = center.distanceFrom(new GLatLng(center.lat(), center.lng() + 0.1)) / 100;

    //Loop 
    var points = [];
    var step = parseInt(360 / nodes) || 10;
    for (var i = 0; i <= 360; i += step) {
        var pint = new GLatLng(center.lat() + (radius / latConv * Math.cos(i * Math.PI / 180)), center.lng() +
	(radius / lngConv * Math.sin(i * Math.PI / 180)));
        points.push(pint);
        bounds.extend(pint); //this is for fit function
    }
    points.push(points[0]); // Closes the circle, thanks Martin
    fillColor = fillColor || liColor || "#0055ff";
    liWidth = liWidth || 2;
    var poly = new GPolygon(points, liColor, liWidth, liOpa, fillColor, fillOpa);
    map.addOverlay(poly);
}

///////// END ESA PART

function search() {
    showLoad();
    geocode_old();
}

function showtext() {
    $get('text').style.display = "block";
    $get('textl').style.display = "none";
    //$get('map').style.height = "450px";
}

function hideLoad() {
    var loadDiv = $get('load');
    loadDiv.style.visibility = "hidden";
    $get('zone').disabled = false;
    $get('radius').disabled = false;
    $get('via').readOnly = false;
    $get('searchBtn').disabled = false;
}

preload("./style/loader.gif", "images/green_i.png", "images/yellow_i.png", "images/shadow.png");

