OpenLayers.ImgPath = 'lib/img/';

var gadget = null;

/* TODO: Destroy gadget on page cleanup to avoid leaks */
function blessIcons(icons) {
    gadget = new Daedalus.Gadget($('map_container'));
    for (var i = 0; i < icons.length; i++) {
        var ii = icons[i];
        gadget.addIcon(new Daedalus.Icon($(ii.id), ii.type));
    }
}

function getLayerSwitcher(layer, ctl) {
    return function(evt) {
        layer.setVisibility(ctl.checked, true);
    }
}

function dynamicLayers(map, tile_url, layer_map) {
    // "6": {
    //     "id": "6",
    //     "name":"Views",
    //     "layer":"heritage-views",
    //     "show":true,
    //     "ctrl":"layer_switch_6",
    // },

    for (var l = layer_map.length-1; l >= 0; l--) {
        var layer_spec = layer_map[l];

        var layerOptions = {
            isBaseLayer:    false,
            visibility:     layer_spec.show
        };
        
        if (Prototype.Browser.IE && !window.XMLHttpRequest) {
            layerOptions.alpha = true;
        }

        var layer      = new OpenLayers.Layer.WMS(
            layer_spec.name, tile_url, { 
                layers:         layer_spec.layer, 
                format:         'image/png',
                transparent:    'true'
            },
            layerOptions
        );
        map.addLayers([ layer ]);

        // Wire up the control
        var ctl = $(layer_spec.ctrl);
        if (ctl) {
            ctl.onclick = getLayerSwitcher(layer, ctl);
        }
        else {
            alert("Control " + layer_spec.ctrl + " not found.");
            return;
        }
    }
}

function mapInit(icons_data, fld_name, layer_map) {
    
    var map_limit = new OpenLayers.Bounds(
        453375,  99000,             // SZ533990
        459375, 105000              // SU593050
    );
    
    var zoom        = 0;
    var url_prefix  = '';
    var tile_url    = url_prefix + 'layer/wms/tile.php';
    var flags_url   = url_prefix + 'layer/user/fetch.php?format=json';
    
    var map = new OpenLayers.Map(
        'map',
        {
            maxExtent: map_limit,
            maxResolution: 2000 / 200,
            units: 'meters',
            projection: 'OSGB',
            tileSize: new OpenLayers.Size(200, 200),
            numZoomLevels: 4,
            fallThrough: true,
            controls: []
        }                         
    );
    
    var nc = new OpenLayers.Control.Navigation();

    // Remove scroll wheel control
    nc.activate = function() {
        this.dragPan.activate();
        this.zoomBox.activate();
        return OpenLayers.Control.prototype.activate.apply(this, arguments);
    };
    
    map.addControl(nc);
    map.addControl(new OpenLayers.Control.PanZoomBar());
    map.addControl(new OpenLayers.Control.ArgParser());

    var base = new OpenLayers.Layer.WMS(
        "Daedalus", tile_url, { 
            layers:         'base', 
            format:         'image/png' 
        }
    );
    
    map.addLayers([ base ]);

    var icons = new Object();
    for (var i in icons_data) {
        var id = icons_data[i];
        icons[i] = {
            url:  id.url,
            size: new OpenLayers.Size( id.width, id.height )
        };
    }

    // var markers = new Daedalus.Flags(
    //     "Other's markers", {
    //         location: flags_url,
    //         icons:    icons
    //     }
    // );

    // map.addLayers([ markers ]);

    dynamicLayers(map, tile_url, layer_map);

    var flags = new Daedalus.Flags(
        "Your markers", {
            icons:    icons
        }
    );

    map.addLayers([ flags ]);

    map.setCenter(map_limit.getCenterLonLat(), zoom);
    // map.addControl(new OpenLayers.Control.LayerSwitcher());

    dragFlag = new Daedalus.DragFlag(flags);
    
    map.addControl(dragFlag);
    dragFlag.activate();
    
    gadget.setMap(map);
    gadget.setFlags(flags);

    // Create the comment editor
    var comment = new Daedalus.Comment(fld_name, gadget);

    // Bind some events
    gadget.connect('markerCreate',   comment, comment.markerCreated);
    //dragFlag.connect('dragEnd',      comment, comment.markerSelected);
    dragFlag.connect('dragStart',      comment, comment.markerSelected);
    // markers.connect('markerClick',   comment, comment.markerClicked);
}
