var map; //complex object of type OpenLayers.Map

function onHoverFinca(feature) {
    var text = '';
    for (var fid = 0; fid < feature.cluster.length; fid++) {
        var finca = feature.cluster[fid];
        if (fid > 0) { text += ', '; }
        text += finca.attributes.name;
    }
    $('fnames').innerHTML = text;
}
function onLeaveFinca(feature) {
    $('fnames').innerHTML = '&nbsp;';
}
function onSelectFinca(feature) {
    $('fovs').innerHTML = '';
    for (var fid = 0; fid < feature.cluster.length; fid++) {
        var finca = feature.cluster[fid];
        if (finca.attributes.summary_url) {
            new Ajax.Updater({success: 'fovs'}, finca.attributes.summary_url, {insertion: 'bottom'});
        } else {
            e = document.createElement('p');
            e.setAttribute('id', 'fov_' + finca.fid);
            var text = '<a href="' + encodeURI(finca.attributes.url) + '">';
            text += finca.attributes.name + '</a>';
            if (finca.attributes.num_apartments > 1) {
                text += ' mit ' + finca.attributes.num_apartments + ' Apartments';
            }
            e.innerHTML = text;
            $('fovs').appendChild(e);
        }
    }
}
function onUnselectFinca(feature) {
    $('fovs').innerHTML = '';
}
// Initialise the 'map' object
function render_ovmap(container) {
    var dproj = new OpenLayers.Projection("EPSG:4326");
    var mproj = new OpenLayers.Projection("EPSG:900913");
    var layerFincas;
    // Define the map layer
    var layerRoads = new OpenLayers.Layer.OSM("Straßenkarte",
      ["/tiles/${z}/${x}/${y}.png"], {
        maxResolution: 305.7481,
        numZoomLevels: 3,
        attribution: "Kartendaten von <a href='http://openstreetmap.org/'>OpenStreetMap</a> und Mitwirkende, CC-By-SA"
    });

    var rules = [ new OpenLayers.Rule({
            filter: new OpenLayers.Filter.Comparison({
                    type: OpenLayers.Filter.Comparison.GREATER_THAN,
                    property: 'count',
                    value: 1
                }),
            symbolizer: {
                externalGraphic: "/cms/images/houses.png", 
                graphicWidth: 17,
                graphicHeight: 15,
                graphicXOffset: -9,
                graphicYOffset: -8 
            }
        }),
        new OpenLayers.Rule({
            filter: new OpenLayers.Filter.Comparison({
                    type: OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO,
                    property: 'count',
                    value: 1
                }),
            symbolizer: {
                externalGraphic: "/cms/images/house.png",
                graphicWidth: 13,
                graphicHeight: 13,
                graphicXOffset: -7,
                graphicYOffset: -7
            }
        })
    ];
    var defstyle = new OpenLayers.Style(OpenLayers.Util.applyDefaults(
        {fillOpacity: 0.8, hoverFillOpacity: 1, cursor: "pointer"},
        OpenLayers.Feature.Vector.style["default"])
    );
    defstyle.addRules(rules);
    layerFincas = new OpenLayers.Layer.GML("Fincas", "/cms/fincapos/", {
        format: OpenLayers.Format.GeoJSON,
        projection: mproj,
        strategies: [
            new OpenLayers.Strategy.Cluster({ "distance": 15 })
        ],
        styleMap: new OpenLayers.StyleMap({
            "default": defstyle
        })
    });
    // first set hover to true for the control to register callbacks, then 
    // return to normal behaviour
    var controlFincaSelect = new OpenLayers.Control.SelectFeature(layerFincas, {
      hover: true,
      overFeature: onHoverFinca,
      outFeature: onLeaveFinca,
      onSelect: onSelectFinca,
      onUnselect: onUnselectFinca
    });
    controlFincaSelect.hover = false;

    map = new OpenLayers.Map (container, {
        controls:[
            new OpenLayers.Control.PanZoom(),
            new OpenLayers.Control.ScaleLine(),
            new OpenLayers.Control.Attribution(),
            controlFincaSelect,
            new OpenLayers.Control.Navigation()
        ],
        maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
        restrictedExtent: (new OpenLayers.Bounds(2.25, 39.25, 3.7, 40)).transform(dproj, mproj),
        maxResolution: 305.7481,
        numZoomLevels: 3,
        units: 'm',
        projection: mproj,
        displayProjection: dproj
    });
    map.addLayer(layerRoads);
    map.addLayer(layerFincas);
    controlFincaSelect.activate();
    map.zoomToMaxExtent();
}
