var map;
var markerManager;

function toggleJourneyFilterTo(transport, show)
{
    var imageTransportURI = "images/transport/";
    var transportImage = document.getElementById(transport+"Image");
    for (var i=0; i<journeyOverlays.length; i++)
    {
        if (journeyOverlays[i].transport == transport)
        {
            if (show)
                showLine(journeyOverlays[i].line);
            else
                hideLine(journeyOverlays[i].line);
        }
    }
    if(show)
        transportImage.src = imageTransportURI + transport + ".png";
    else
        transportImage.src = imageTransportURI + transport + "-disabled.png";
}

function toggleJourneyFilter(transport)
{
    var imageTransportURI = "images/transport/";
    var transportImage = document.getElementById(transport+"Image");
    if(transportImage.src.indexOf('-') == -1)
        toggleJourneyFilterTo(transport, false);
    else
        toggleJourneyFilterTo(transport, true);
}

function toggleAllFilters(show)
{
    for (var i=0; i<transportObjs.length; i++)
    {
        toggleJourneyFilterTo(transportObjs[i].name, show);
    }
    toggleJourneyFilterTo("default", show);
    if (show != imagesToggle)
        toggle("images");
    if (show != videosToggle)
        toggle("videos");
    if (show != journalsToggle)
        toggle("journals");
    if (show != notesToggle)
        toggle("notes");
}

function disablePlaneFilter()
{
    toggleJourneyFilterTo("plane", false);
}

function switchColors()
{
    setColorAnchorText();

    if (colorToUse == "userColor")
        colorToUse = "transportColor";
    else if (colorToUse == "transportColor")
        colorToUse = "userColor";

    for (var count=0; count<journeyOverlays.length; count++)
    {
        var polyLineColor = (useTransportColor()?journeyOverlays[count].transportColor:journeyOverlays[count].userColor);
        journeyOverlays[count].line.setStrokeStyle({color:polyLineColor});
    }
}

function setColorAnchorText()
{
    var anchorText = "<a class='transportHeader' href='javascript:switchColors();'>";
    var switchColorsText = document.getElementById("switchColorsText");
    if (colorToUse == "userColor")
        switchColorsText.innerHTML = anchorText + "colour by journey" + "</a>";
    else if (colorToUse == "transportColor")
        switchColorsText.innerHTML = anchorText + "colour by transport" + "</a>";
}

function toggle(type)
{
    var imageMarkersURI = "images/markers/";
    if (type == "images")
    {
        var imageImage = document.getElementById("imageImage");

        if(imagesToggle == true)
            for (var i = 0; i < imageOverlays.length; i++)
                markerManager.removeMarker(imageOverlays[i]);
        else
        {
            markerManager.addMarkers(imageOverlays, getIconVisibleZoomLevel());
            markerManager.refresh();
        }
        if(imagesToggle == true)
            imageImage.src = imageMarkersURI + "camera-disabled.png";
        else
            imageImage.src = imageMarkersURI + "camera.png";

        imagesToggle = !imagesToggle;
    }
    if (type == "videos")
    {
        var videoImage = document.getElementById("videoImage");

        if(videosToggle == true)
            for (var i = 0; i < videoOverlays.length; i++)
                markerManager.removeMarker(videoOverlays[i]);
        else
        {
            markerManager.addMarkers(videoOverlays, getIconVisibleZoomLevel());
            markerManager.refresh();
        }
        if(videosToggle == true)
            videoImage.src = imageMarkersURI + "video-disabled.png";
        else
            videoImage.src = imageMarkersURI + "video.png";

        videosToggle = !videosToggle;
    }
    if (type == "journals")
    {
        var journalImage = document.getElementById("journalImage");

        if(journalsToggle == true)
            for (var i = 0; i < journalOverlays.length; i++)
                markerManager.removeMarker(journalOverlays[i]);
        else
        {
            markerManager.addMarkers(journalOverlays, getIconVisibleZoomLevel());
            markerManager.refresh();
        }
        if(journalsToggle == true)
            journalImage.src = imageMarkersURI + "journal-disabled.png";
        else
            journalImage.src = imageMarkersURI + "journal.png";

        journalsToggle = !journalsToggle;
    }
    if (type == "notes")
    {
        var noteImage = document.getElementById("noteImage");

        if(notesToggle == true)
            for (var i = 0; i < noteOverlays.length; i++)
                markerManager.removeMarker(noteOverlays[i]);
        else
        {
            markerManager.addMarkers(noteOverlays, getIconVisibleZoomLevel());
            markerManager.refresh();
        }
        if(notesToggle == true)
            noteImage.src = imageMarkersURI + "note-disabled.png";
        else
            noteImage.src = imageMarkersURI + "note.png";

        notesToggle = !notesToggle;
    }
    if (type == "journeys")
    {
        var journeyImage = document.getElementById("journeyImage");
        for (var i = 0; i < journeyOverlays.length; i++)
        {
            if(journeysToggle == true)
                hideLine(journeyOverlays[i].line);
            else
                showLine(journeyOverlays[i].line);
        }
        if(journeysToggle == true)
            journeyImage.src = imageMarkersURI + "journey-disabled.png";
        else
            journeyImage.src = imageMarkersURI + "journey.png";

        journeysToggle = !journeysToggle;
    }
}



function hideLine(poly)
{
    if (poly.supportsHide())
        poly.hide();
    else
        map.removeOverlay(poly);
}

function showLine(poly)
{
    if (poly.supportsHide())
        poly.show();
    else
        map.addOverlay(poly);
}

function getColorForTransport(name)
{
    for (var i=0; i<transportObjs.length; i++)
    {
        if (name == transportObjs[i].name)
            return transportObjs[i].color;
    }
    return "#000000";
}

var journeyOverlays = [];
var imageOverlays = [];
var videoOverlays = [];
var journalOverlays = [];
var noteOverlays = [];
var transportObjs = [];

var journeysToggle = false;
var imagesToggle = false;
var videosToggle = false;
var journalsToggle = false;
var notesToggle = false;

var lineWidth = 4;
var lineOpacity = 0.9;

function drawMap()
{
    if(!shouldDrawMap())
        return;

    var mapElement = document.getElementById("map");
    if (mapElement == null)
        return;

    map = new GMap2(mapElement);
    setCenter(map);
    markerManager = new MarkerManager(map);
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());

    if (showJourneys())
    {
        GDownloadUrl(getJourneysXmlUrl(), function(data)
        {
            var count = 0;
            var xml = GXml.parse(data);
            var journeys = xml.documentElement.getElementsByTagName("journey");
            for (var i = 0; i < journeys.length; i++)
            {
                var transports = journeys[i].getElementsByTagName("transport");
                for (var j = 0; j < transports.length; j++)
                {
                    var waypoints = transports[j].getElementsByTagName("waypoint");
                    var points = [];
                    for (var k = 0; k < waypoints.length; k++)
                    {
                        points[k] = new GLatLng(parseFloat(waypoints[k].getAttribute("lat")),
                                parseFloat(waypoints[k].getAttribute("lng")));

                    }

                    journeyOverlays[count] = new Object();
                    journeyOverlays[count].transport = transports[j].getAttribute("name");
                    journeyOverlays[count].userColor = journeys[i].getAttribute("colour");
                    journeyOverlays[count].transportColor = getColorForTransport(transports[j].getAttribute("name"));
                    var polyLineColor = (useTransportColorInitially()?journeyOverlays[count].transportColor:journeyOverlays[count].userColor);
                    var geodesic = (journeyOverlays[count].transport == "plane");
                    journeyOverlays[count].line = new GPolyline(points, polyLineColor, lineWidth , lineOpacity, {clickable: 'false', geodesic: geodesic});
                    map.addOverlay(journeyOverlays[count].line);
                    count ++;
                }
            }
            if(typeof afterMapDrawn == 'function')
                afterMapDrawn();
        });
        journeysToggle = false;
        colorToUse = useTransportColorInitially()?"transportColor":"userColor";
    }
    // note - following logic is opposite to the setColorAnchorText() function
    if (typeof colorToUse == "string" && colorToUse != null)
    {
        var anchorText = "<a class='transportHeader' href='javascript:switchColors();'>";
        var switchColorsText = document.getElementById("switchColorsText");
        if (useTransportColorInitially())
        {
            switchColorsText.innerHTML = anchorText + "colour by journey" + "</a>";
        }
        else
        {
            switchColorsText.innerHTML = anchorText + "colour by transport" + "</a>";
        }
    }

    GDownloadUrl(getJournalsXmlUrl(), function(data)
    {
        var xml = GXml.parse(data);
        var journals = xml.documentElement.getElementsByTagName("journal");
        for (var i = 0; i < journals.length; i++)
        {
            journalOverlays[i] = getJournalMarker(journals[i]);
        }
        markerManager.addMarkers(journalOverlays, getIconVisibleZoomLevel());
        if (isCustom() && (getUrlParameter("journals") == "n"))
        {
            toggle("journals");
        }
        markerManager.refresh();
    });
    journalsToggle = true;

    // not used by directories
    if (typeof getNotesXmlUrl == "function")
    {
        GDownloadUrl(getNotesXmlUrl(), function(data)
        {
            var xml = GXml.parse(data);
            var notes = xml.documentElement.getElementsByTagName("note");
            for (var i = 0; i < notes.length; i++)
            {
                noteOverlays[i] = getNoteMarker(notes[i]);
            }
            markerManager.addMarkers(noteOverlays, getIconVisibleZoomLevel());
            if (isCustom() && (getUrlParameter("notes") == "n"))
            {
                toggle("notes");
            }
            markerManager.refresh();
        });
        notesToggle = true;
    }

    GDownloadUrl(getImagesXmlUrl(), function(data)
    {
        var xml = GXml.parse(data);
        var images = xml.documentElement.getElementsByTagName("image");
        for (var i = 0; i < images.length; i++)
        {
            imageOverlays[i] = getImageMarker(images[i]);
        }
        markerManager.addMarkers(imageOverlays, getIconVisibleZoomLevel());
        if (isCustom() && (getUrlParameter("images") == "n"))
        {
            toggle("images");
        }
        markerManager.refresh();
    });
    imagesToggle = true;

    GDownloadUrl(getVideosXmlUrl(), function(data)
    {
        var xml = GXml.parse(data);
        var videos = xml.documentElement.getElementsByTagName("video");
        for (var i = 0; i < videos.length; i++)
        {
            videoOverlays[i] = getVideoMarker(videos[i]);
        }
        markerManager.addMarkers(videoOverlays, getIconVisibleZoomLevel());
        if (isCustom() && (getUrlParameter("videos") == "n"))
        {
            toggle("videos");
        }
        markerManager.refresh();
    });
    videosToggle = true;

    if (administerMap() && typeof configureMapForAdministration == 'function')
        configureMapForAdministration();
}

function initialToggleOfTransports()
{
    var toggleOn = getUrlParameter("toggleon");
    if (toggleOn != "")
    {
        for (var i=0; i<transportObjs.length; i++)
        {
            var visible = (toggleOn.indexOf(transportObjs[i].name) >= 0);
            //alert("visible: "+transportObjs[i].name+" "+visible);
            toggleJourneyFilterTo(transportObjs[i].name, visible);
        }
    }
    var toggleOff = getUrlParameter("toggleoff");
    if (toggleOff != "")
    {
        for (var i=0; i<transportObjs.length; i++)
        {
            var visible = !(toggleOff.indexOf(transportObjs[i].name) >= 0);
            toggleJourneyFilterTo(transportObjs[i].name, visible);
        }
    }
}

function getJournalMarker(journal)
{
    var location = journal.getElementsByTagName("location")[0];
    var point = new GLatLng(parseFloat(location.getAttribute("lat")),
            parseFloat(location.getAttribute("lng")));
    var type = journal.getElementsByTagName("type")[0].firstChild.nodeValue;
    var marker = null;
    marker = new GMarker(point, getJournalIcon(type));

    GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowHtml(
                "<a class='infoWindowJournalHeader' href='journal-entry.do?id="+journal.getAttribute('id')+"'>"+journal.getAttribute('subject')+"</a><br/>"+
                "<span class='journey'>(in "+journal.getElementsByTagName('directorypath')[0].firstChild.nodeValue+")</span>"
                ,
        {maxWidth:150}
                );
    });
    return marker;
}

function isCustom()
{
    return getUrlParameter("custom") == "y";
}

function getUrlParameter( name )
{
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regexS = "[\\?&]"+name+"=([^&#]*)";
    var regex = new RegExp( regexS );
    var results = regex.exec( window.location.href );
    if( results == null )
        return "";
    else
        return results[1];
}


function getNoteMarker(note)
{
    var location = note.getElementsByTagName("location")[0];
    var point = new GLatLng(parseFloat(location.getAttribute("lat")),
            parseFloat(location.getAttribute("lng")));
    var marker = new GMarker(point, getNoteIcon());

    GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowHtml(
                "<div class='note'>"+
                "	<div class='noteHeader'>"+
                "		"+note.getAttribute('date')+": "+note.getAttribute('name')+
                "	</div>"+
                "	<p>"+
                "		"+note.getElementsByTagName('content')[0].firstChild.nodeValue+
                "	</p>"+
                "</div>",
        {maxWidth:150}
                );
    });
    return marker;
}

function getImageMarker(image)
{
    var location = image.getElementsByTagName("location")[0];
    var point = new GLatLng(parseFloat(location.getAttribute("lat")),
            parseFloat(location.getAttribute("lng")));
    var marker = new GMarker(point, getImageIcon());

    GEvent.addListener(marker, "click", function() {
        var imageId = image.getAttribute('id');
        var imageName = image.getAttribute('name');
        var imageDescription = image.getElementsByTagName('description')[0].firstChild.nodeValue;
        marker.openInfoWindowHtml(
                "<table border='0' padding='0' align='center' width='120px' height='100px'><tr><td rowspan='2'>"+
                "<img src='images/transparent.gif' border='0' width='1px' height='100px'/>"+
                "</td><td>"+
                "<a href='image-entry.do?id="+imageId+"'>"+
                "<img height='90px' border='0' src='thumb.do?id="+imageId+"'/></a>"+
                "</td></tr><tr><td align='center'><span class='journey'>"+
                imageName+
                "</span></td></tr></table>",
        {maxWidth:120}
                );
    });
    return marker;
}

function getVideoMarker(video)
{
    if (isExpandPage())
        return getVideoMarkerFull(video);
    else
        return getVideoMarkerThumb(video);
}

function getVideoMarkerFull(video)
{
    var location = video.getElementsByTagName("location")[0];
    var point = new GLatLng(parseFloat(location.getAttribute("lat")),
            parseFloat(location.getAttribute("lng")));
    var marker = new GMarker(point, getVideoIcon());

    GEvent.addListener(marker, "click", function() {
        var videoId = video.getAttribute('id');
        var videoName = video.getAttribute('name');
        var videoDescription = video.getElementsByTagName('description')[0].firstChild.nodeValue;
        var videoEmbed = video.getElementsByTagName('embed')[0].firstChild.nodeValue;
        marker.openInfoWindowHtml(
                videoEmbed+
                "<p><center>"+
                "<a class='journey' href='video-entry.do?id="+videoId+"'>"+
                videoName+
                "</a></center></p>"
                );
    });
    return marker;
}

function getVideoMarkerThumb(video)
{
    var location = video.getElementsByTagName("location")[0];
    var point = new GLatLng(parseFloat(location.getAttribute("lat")),
            parseFloat(location.getAttribute("lng")));
    var marker = new GMarker(point, getVideoIcon());

    GEvent.addListener(marker, "click", function() {
        var videoId = video.getAttribute('id');
        var videoName = video.getAttribute('name');
        var videoDescription = video.getElementsByTagName('description')[0].firstChild.nodeValue;
        var videoThumb = video.getElementsByTagName('thumb')[0].firstChild.nodeValue;
        marker.openInfoWindowHtml(
                "<table border='0' padding='0' align='center' width='120px' height='100px'><tr><td rowspan='2'>"+
                "<img src='images/transparent.gif' border='0' width='1px' height='100px'/>"+
                "</td><td>"+
                "<a href='video-entry.do?id="+videoId+"'>"+
                "<img height='90px' border='0' src='"+videoThumb+"'/></a>"+
                "</td></tr><tr><td align='center'><span class='journey'>"+
                videoName+
                " (video)</span></td></tr></table>",
        {maxWidth:120}
                );
    });
    return marker;
}

function mailto(firstPart, secondPart)
{
    var mailto = "mailto:"+firstPart+"@"+secondPart;
    document.location.href=mailto;
}

function setFocusToForm()
{
    for (var i=0; i<document.forms.length; i++)
    {
        for (var j=0; j<document.forms[i].elements.length; j++)
        {
            if (document.forms[i].elements[j].type == "text" ||
                document.forms[i].elements[j].type.indexOf("select") != -1 ||
                document.forms[i].elements[j].type == "textarea")
            {
                if (document.forms[i].elements[j].disabled == false)
                {
                    document.forms[i].elements[j].focus();
                    return;
                }
            }
        }
    }
}

function toggleLayer(whichLayer)
{
    if (document.getElementById)
    {
        // this is the way the standards work
        var style2 = document.getElementById(whichLayer).style;
        style2.display = style2.display? "":"block";
    }
    else if (document.all)
    {
        // this is the way old msie versions work
        var style2 = document.all[whichLayer].style;
        style2.display = style2.display? "":"block";
    }
    else if (document.layers)
        {
            // this is the way nn4 works
            var style2 = document.layers[whichLayer].style;
            style2.display = style2.display? "":"block";
        }
}

function isExpandPage()
{
    var url = document.location.href;
    if (url.indexOf("view-map") > 0)
        return true;
    else
        return false;
}

function getJournalIcon(type)
{
    var icon = new GIcon();
    if (type == null || type == "" || type=="journal" || type=="normal")
    {
        icon.image = imagesdir+"markers/journal.png";
        icon.shadow = imagesdir+"markers/journal-shadow.png";
    }
    else
    {
        icon.image = imagesdir+"transport/"+type+".png";
        icon.shadow = imagesdir+"transport/"+type+"-shadow.png";
    }
    icon.iconSize = new GSize(19, 19);
    icon.shadowSize = new GSize(29, 19);
    icon.iconAnchor = new GPoint(4, 18);
    icon.infoWindowAnchor = new GPoint(11, 1);
    return icon;
}

function getBikeIcon()
{
    var icon = new GIcon();
    icon.image = imagesdir+"markers/bike.png";
    icon.shadow = imagesdir+"markers/bike-shadow.png";
    icon.iconSize = new GSize(22, 19);
    icon.shadowSize = new GSize(29, 19);
    icon.iconAnchor = new GPoint(11, 18);
    icon.infoWindowAnchor = new GPoint(13, 1);
    return icon;
}

function getImageIcon()
{
    var icon = new GIcon();
    icon.image = imagesdir+"markers/camera.png";
    icon.shadow = imagesdir+"markers/camera-shadow.png";
    icon.iconSize = new GSize(21, 19);
    icon.shadowSize = new GSize(29, 19);
    icon.iconAnchor = new GPoint(4, 16);
    icon.infoWindowAnchor = new GPoint(7, 1);
    return icon;
}

function getNoteIcon()
{
    var icon = new GIcon();
    icon.image = imagesdir+"markers/note.png";
    icon.shadow = imagesdir+"markers/note-shadow.png";
    icon.iconSize = new GSize(21, 19);
    icon.shadowSize = new GSize(29, 19);
    icon.iconAnchor = new GPoint(4, 16);
    icon.infoWindowAnchor = new GPoint(7, 1);
    return icon;
}

function getVideoIcon()
{
    var icon = new GIcon();
    icon.image = imagesdir+"markers/video.png";
    icon.shadow = imagesdir+"markers/video-shadow.png";
    icon.iconSize = new GSize(21, 19);
    icon.shadowSize = new GSize(29, 19);
    icon.iconAnchor = new GPoint(4, 16);
    icon.infoWindowAnchor = new GPoint(7, 1);
    return icon;
}