// Start position for the map (hardcoded here for simplicity)
var lat = 65.37371;
var lon = 24.49389;
var zoom = 6;

var map;
var reititKML;
var popup, select;
var highlightway, highlightpoi;
var bensisKML, laavuKML, kahvioKML, HighLightKML, HighLightPoi;
var layerMapnik, layerTilesAtHome, gphy, gmap;
var paskaIE = false;

//Initialise the 'map' object
function init() {
    //OpenLayers.ImgPath = "http://js.mapbox.com/theme/dark/";
    OpenLayers.ImgPath = "img/dark/";

    map = new OpenLayers.Map("map", {
        controls: [],
        maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34),
        maxResolution: 156543.0339,
        numZoomLevels: 16,
        units: 'm',
        projection: new OpenLayers.Projection("EPSG:900913"),
        displayProjection: new OpenLayers.Projection("EPSG:4326"),
        eventListeners: {
            "moveend": moveEnd
        }
    });


    /*
     * Map layers
     */

    // Mapnik
    layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik", {
        numZoomLevels: 18
    });
    map.addLayer(layerMapnik);

    // Osmarender
    layerTilesAtHome = new OpenLayers.Layer.OSM.Osmarender("Osmarender", {
        numZoomLevels: 18
    });
    map.addLayer(layerTilesAtHome);

    // Google Terrain
    // Does not have zoom levels larger than 15 
    gphy = new OpenLayers.Layer.Google("Google Terrain", {
        type: google.maps.MapTypeId.TERRAIN,
        visibility: false,
        numZoomLevels: 16
    });
    map.addLayer(gphy);

    // Google Street
    gmap = new OpenLayers.Layer.Google("Google Maps", {
        numZoomLevels: 18
    });
    map.addLayer(gmap);


    // Local KML
    reititKML = new OpenLayers.Layer.Vector("Kelkkareitit", {
        projection: map.displayProjection,
        strategies: [
            new OpenLayers.Strategy.BBOX()
        ],
        protocol: new OpenLayers.Protocol.HTTP({
            url: "kml.php",
            format: new OpenLayers.Format.KML({
                extractStyles: true,
                extractAttributes: true
            })
        })
    });
    map.addLayer(reititKML);

    // Bensa-asemat
    bensisKML = new OpenLayers.Layer.Vector("Bensa-asemat", {
        projection: map.displayProjection,
        strategies: [
            new OpenLayers.Strategy.BBOX()
        ],
        protocol: new OpenLayers.Protocol.HTTP({
            url: "kml_poi.php?poi=bensis",
            format: new OpenLayers.Format.KML({
                extractStyles: true,
                extractAttributes: true
            })
        }),
        visibility: false,
        displayInLayerSwitcher: true
    });
    map.addLayer(bensisKML);

    // Laavut, kodat jne..
    laavuKML = new OpenLayers.Layer.Vector("Laavut, kodat, tuvat", {
        projection: map.displayProjection,
        strategies: [
            new OpenLayers.Strategy.BBOX()
        ],
        protocol: new OpenLayers.Protocol.HTTP({
            url: "kml_poi.php?poi=laavu",
            format: new OpenLayers.Format.KML({
                extractStyles: true,
                extractAttributes: true
            })
        }),
        visibility: false,
        displayInLayerSwitcher: true
    });
    map.addLayer(laavuKML);

    // Kahviot, ravintolat
    kahvioKML = new OpenLayers.Layer.Vector("Kahviot, ravintolat, infot", {
        projection: map.displayProjection,
        strategies: [
            new OpenLayers.Strategy.BBOX()
        ],
        protocol: new OpenLayers.Protocol.HTTP({
            url: "kml_poi.php?poi=kahvio",
            format: new OpenLayers.Format.KML({
                extractStyles: true,
                extractAttributes: true
            })
        }),
        visibility: false,
        displayInLayerSwitcher: true
    });
    map.addLayer(kahvioKML);

    // Highlight KML
    HighLightKML = new OpenLayers.Layer.Vector("HighLightKML", {
        projection: map.displayProjection,
        strategies: [
            new OpenLayers.Strategy.BBOX()
        ],
        protocol: new OpenLayers.Protocol.HTTP({
            url: "highlight.php",
            format: new OpenLayers.Format.KML({
                extractStyles: true,
                extractAttributes: true
            })
        }),
        visibility: false,
        displayInLayerSwitcher: false
    });
    map.addLayer(HighLightKML);

    // Highlight POI
    HighLightPoi = new OpenLayers.Layer.Vector("HighLightPoi", {
        projection: map.displayProjection,
        strategies: [
            new OpenLayers.Strategy.BBOX()
        ],
        protocol: new OpenLayers.Protocol.HTTP({
            url: "highlight_poi.php",
            format: new OpenLayers.Format.KML({
                extractStyles: true,
                extractAttributes: true
            })
        }),
        visibility: false,
        displayInLayerSwitcher: false
    });
    map.addLayer(HighLightPoi);
    //HighLightPoi.setZIndex( 1000 );


    // Controls
    map.addControl(new OpenLayers.Control.Navigation());
    map.addControl(new OpenLayers.Control.PanZoomBar(), new OpenLayers.Pixel(2, 11));
    map.addControl(new OpenLayers.Control.Permalink());
    map.addControl(new OpenLayers.Control.ScaleLine({geodesic: true}));
    map.addControl(new OpenLayers.Control.MousePosition());
    map.addControl(new OpenLayers.Control.Attribution());

    // Layer Switcher
    var switcherControl = new OpenLayers.Control.LayerSwitcher();
    map.addControl(switcherControl);
    switcherControl.maximizeControl();

    // Make sure map center is set
    if (!map.getCenter()) {
        var lonLat = new OpenLayers.LonLat(lon, lat).transform(
            new OpenLayers.Projection("EPSG:4326"), 
            map.getProjectionObject());
        map.setCenter(lonLat, zoom);
    }

    // POPUP
    select = new OpenLayers.Control.SelectFeature(
        [reititKML,bensisKML,laavuKML,kahvioKML,HighLightPoi],
        {
            clickout: true,
            toggle: true,
            multiple: false,
            hover: false,
            toggleKey: "ctrlKey", // ctrl key removes from selection
            multipleKey: "shiftKey" // shift key adds to selection
        }
    );
    map.addControl(select);
    select.activate();

    reititKML.events.on({
        "featureselected": onFeatureSelect,
        "featureunselected": onFeatureUnselect
    });
    bensisKML.events.on({
        "featureselected": onPoiSelect,
        "featureunselected": onPoiUnselect
    });
    laavuKML.events.on({
        "featureselected": onPoiSelect,
        "featureunselected": onPoiUnselect
    });
    kahvioKML.events.on({
        "featureselected": onPoiSelect,
        "featureunselected": onPoiUnselect
    });


} //init()    


// Update KML layer everytime map is moved
function moveEnd(event) {
    if (paskaIE === false){                  // if IE7 or IE8, don't update layers when moved
        if (reititKML.getVisibility()){     // check if layer is visible, before updating
            UpdateKmlLayer(reititKML);
        }
        if (HighLightKML.getVisibility()){     // check if layer is visible, before updating
            UpdateHighlight(HighLightKML);
        }
    }
}

// Update KML layer
function UpdateKmlLayer(layer) {
    layer.loaded = false;                   // setting loaded to false unloads the layer
    layer.setVisibility(true);              // setting visibility to true forces a reload of the layer
    layer.refresh({ force: true, params: {  // force new KML data
        'zoom': map.getZoom()
    } });
}

// Update Highlight layer
function UpdateHighlight(layer) {
    layer.loaded = false;           // setting loaded to false unloads the layer
    layer.setVisibility(true);      // setting visibility to true forces a reload of the layer
    layer.refresh({ 
        force: true, params: { 
            'way': highlightway,
            'zoom': map.getZoom()
        } 
    });   // force new KML data
}
// Update Highlight layer POI
function UpdateHighlightPoi(layer) {
    layer.loaded = false;           // setting loaded to false unloads the layer
    layer.setVisibility(true);      // setting visibility to true forces a reload of the layer
    layer.refresh({
        force: true, params: {
            'poi': highlightpoi
        }
    });   // force new KML data
}

// Remove Highlight layer
function RemoveHighlight(layer) {
    highlightway = 0;               // Set empty way
    UpdateHighlight(HighLightKML);  // Refresh highlight layer
    layer.setVisibility(false);     // Disable layer from LayerSwitcher

}
// Remove Highlight layer POI
function RemoveHighlightPoi(layer) {
    highlightpoi = 0;               // Set empty way
    UpdateHighlightPoi(HighLightPoi);  // Refresh highlight layer
    layer.setVisibility(false);     // Disable layer from LayerSwitcher

}

// POPUP
function onFeatureSelect(event) {
    var feature = event.feature;
    //console.log(feature.attributes.name);

    $("#infobox").show();
    //$("#infobox").css("border","3px solid #3d3d3d");
    $("#infocontent").load("infobox.php?way="+feature.attributes.name);

    // Highlight selected way
    highlightway = feature.attributes.name;
    UpdateHighlight(HighLightKML);

}
function onFeatureUnselect(event) {
    $("#infobox").hide();
    RemoveHighlight(HighLightKML);
}

function onPoiSelect(event) {
    var feature = event.feature;
    //console.log("onPoiSelect: "+feature.attributes.name);
    $("#infobox").show();
    $("#infocontent").load("infobox.php?poi="+feature.attributes.name);

    // Highlight selected poi
    highlightpoi = feature.attributes.name;
    UpdateHighlightPoi(HighLightPoi);

    // Make sure that way highlight is disabled, otherwise
    // way highlight stays activated when zoomed and then selected poi
    RemoveHighlight(HighLightKML);
}
function onPoiUnselect(event) {
    //console.log("onPoiUnselect");
    $("#infobox").hide();
    RemoveHighlightPoi(HighLightPoi);
}

/*
 * jQuery scriptit
 */


// Close infobox
$("#infoboxhide").click(function() {
    $("#infobox").hide();
    RemoveHighlight(HighLightKML);
    RemoveHighlightPoi(HighLightPoi);
    return false; // important! prevent # show in addressbar when clicking link
});

// Highlight Operator Ways
$("#infobox").delegate("#operator_ways","click",function() {
    highlightway = $(this).data("ways"); //get data from #data-ways attribute
    UpdateHighlight(HighLightKML);
    $("#infocontent").load("infobox.php?operator_ways="+highlightway);
    return false; // important! prevent # show in addressbar when clicking link
});

$(".ajax").colorbox({
    top: "50px",
    maxWidth: "90%",
    maxHeight: "90%",
    scrolling: true,
    opacity: 0.666,
    returnFocus: false
});

