//marker enablers
var activeCreateBusFrom = false;
var activeCreateBusTo = false;
//marker containers
var busFromMarker = null;
var busToMarker = null;

var busStopsShown = false;
var busLayerOverlay = new GTileLayerOverlay(
            new GTileLayer(null, 14, 17, {
                tileUrlTemplate: 'http://www.hubi.fi/stops/{X}_{Y}_{Z}.png',
                isPng:true,
                opacity:1.0
            }));
var showTransit = false;
var transitUpdate;

var routePolylines = new Array();

var stopPolling = false;

function activeBusFrom(toggle) {
    if (toggle && activeCreateBusTo) {
        // when setting from true, set to to false or else both will change
        activeBusTo(false);
    }
    activeCreateBusFrom = toggle;
}

function activeBusTo(toggle) {
    if (toggle && activeCreateBusFrom) {
        // when setting to true, set from to false or else both will change
        activeBusFrom(false);
    }
    activeCreateBusTo = toggle;
}

function createBusFromMarker(latlng) {
    if (busFromMarker != null) {
        // there is already a marker
        busFromMarker.setLatLng(latlng);
    } else {
        // place a draggable marker in the center of the screen
        var label = "Mistä";
        var icon = new GIcon();
        icon.image = "images/from_marker.png";
        icon.iconSize = new GSize(20, 34);
        icon.iconAnchor = new GPoint(10, 33);
        icon.infoWindowAnchor = new GPoint(10, 17);
        busFromMarker = new GMarker(latlng, {
            icon: icon,
            title: label,
            draggable: true
        });
        GEvent.addListener(busFromMarker, "dragend", function(){
            reverseLookupFrom(busFromMarker.getLatLng().lat(), busFromMarker.getLatLng().lng());
        });
        map.addOverlay(busFromMarker);
    }
}

function createBusToMarker(latlng) {
    if (busToMarker != null) {
        // there is already a marker
        busToMarker.setLatLng(latlng);
    } else {
        // place a draggable marker in the center of the screen
        var label = "Minne";
        var icon = new GIcon();
        icon.image = "images/to_marker.png";
        icon.iconSize = new GSize(20, 34);
        icon.iconAnchor = new GPoint(10, 33);
        icon.infoWindowAnchor = new GPoint(10, 17);
        busToMarker = new GMarker(latlng, {
            icon: icon,
            title: label,
            draggable: true
        });
        GEvent.addListener(busToMarker, "dragend", function(){
            reverseLookupTo(busToMarker.getLatLng().lat(), busToMarker.getLatLng().lng());
        });
        map.addOverlay(busToMarker);
    }
}

function getStops(latlng, n) {
    if(!n) {
        n = "";
    }
    var response = GXmlHttp.create();
    startProgress();
    response.open("GET",mashupUrls[2] + '&latlng=' + latlng + '&z=' + map.getZoom() + '&k=1&n=' + n, true);
    response.onreadystatechange = function() {
        if(response.readyState == 4 && response.status == "200") {
            var xmlDoc = response.responseText;
            if(xmlDoc) {
                map.openInfoWindowHtml(latlng, xmlDoc);
                response = GXmlHttp.create();
                response.open("GET",mashupUrls[2] + '&latlng=' + latlng + '&z=' + map.getZoom() + '&k=2&n=' + n, true);
                response.onreadystatechange = function () {
                    if(response.readyState == 4 && response.status == "200") {
                        var xmlDoc = response.responseText;
                        if(xmlDoc) {
                            var info = map.getInfoWindow();
                            if(!info.isHidden() && latlng.equals(info.getPoint())) {
                                map.updateInfoWindow(new Array(new GInfoWindowTab("", xmlDoc)));
                            }
                        }
                        stopProgress();
                    }
                };
                response.send(null);
            }
            else {
                stopProgress();
            }
        }
    };
    response.send(null);
}

function getTransitLine(routeId, line) {
    geoXml['Transit'] = mashupUrls[1] + "&routeId=" + routeId + "&line=" + line;
    georss['Transit'].load(geoXml['Transit'], true, true);
    showTransit = true;
    georss['Transit'].show();
    if(transitUpdate) {
        clearInterval(transitUpdate);
    }
    transitUpdate = setInterval("updateTransit()", 10000);
}

function updateTransit() {
    if(showTransit) {
        georss['Transit'].load(geoXml['Transit'], true, true);
    }
    else {
        clearInterval(transitUpdate);
    }
}

function showBusStops() {
    busStopsShown = true;
    map.addOverlay(busLayerOverlay);
}

function hideBusStops() {
    busStopsShown = false;
    map.removeOverlay(busLayerOverlay);
}

function hideTransit() {
    showTransit = false;
    georss['Transit'].hide();
}

function getToTransit(vehicleId) {
    if(vehicleId) {
        inTransit = true;
        getToTransitServer(vehicleId);
        userMarker.disableDragging();
    }
    else {
        inTransit = false;
        getToTransitServer(null);
        userMarker.enableDragging();
    }
}

function enableStopPolling(box) {
    if(box.checked) {
        stopPolling = box;
    } else {
        stopPolling = false;
    }
}

function disableStopPolling() {
    if(stopPolling) {
        stopPolling.checked = false;
        stopPolling = false;
    }
}

function showBusRoute(toggle) {
    // assumes routePolylines is defined and loops through and
    // shows when toggle is true and hides when toggle is false
    for(var k = 0; k < routePolylines.length; k ++) {
        if (toggle) {
            routePolylines[k].show();
        } else {
            routePolylines[k].hide();
        }
    }
    if (busFromMarker != null) {
        if (toggle) {
            busFromMarker.show();
        } else {
            busFromMarker.hide();
        }
    } else {
        // create route from marker based on the user's location
        createBusFromMarker(userMarker.getLatLng());
        if(!toggle) {
            busFromMarker.hide();
        }
    }
    if (busToMarker != null) {
        if (toggle) {
            busToMarker.show();
        } else {
            busToMarker.hide();
        }
    }
}

function clearTraceRoute() {
    // clear traced route
    for(var k = 0; k < routePolylines.length; k ++) {
        map.removeOverlay(routePolylines[k]); // remove previous route
    }
    routePolylines = new Array();
}

function traceRoute(route) {
    for(var k = 0; k < routePolylines.length; k ++) {
        map.removeOverlay(routePolylines[k]); // remove previous route
    }
    routePolylines = new Array();
    if(route) {
        var prevLatLon = null;
        var colour = "#0000FF"; // Default blue color
        for(var i = 0; i < route.length; i++) {
            var points = new Array();
            for(var j = 0; j < route[i].length; j++) {
                var temp = route[i][j]; // read route legs in format [['Lat#Lon', 'Lat#Lon', '#colour']]
                var lat = temp.substring(0, temp.indexOf("#"));
                var lon = temp.substring(temp.indexOf("#") + 1);
                colour = temp;
                if (lat.length != 0) { // skip last leg that contains colour info
                    if (prevLatLon == null) {
                        // busFromMarker is created in function showBusRoute
                        // update from marker position using parsed LatLon
                        createBusFromMarker(new GLatLng(parseFloat(lat), parseFloat(lon)));
                    }
                    prevLatLon = new GLatLng(parseFloat(lat), parseFloat(lon));
                    points.push(prevLatLon);
                } else {
            }
            }
            // create and add polyline
            var polyline = new GPolyline(points, colour, 7, 0.5, {
                clickable: false,
                geodesic: false
            });
            map.addOverlay(polyline);
            // store polylines for show, hide, and remove
            routePolylines.push(polyline);
        }
        if (prevLatLon != null) { // place the update to marker
            // create marker and/or set location
            createBusToMarker(prevLatLon);
        } else {
            // route length is zero
            if (busToMarker != null) {
                // remove to marker
                map.removeOverlay(busToMarker);
                busToMarker = null;
            }
            // update from marker position
            createBusFromMarker(userMarker.getLatLng());
        }
    }
}

