function mapMobirisInit(config) {
	initVillo(config);	
	initParkings();
	initCameras(config.camera_url);	
	initAlerts();
	initLOS();
}

function initLOS() {
	var styleArcs = new OpenLayers.Style({strokeColor: 'white', strokeWidth: "2"});
	var levels_mapping = {
		"level1": "1",
		"level2": "2",
		"level3": "3"
	};

	// remap level as a feature property
	function read_levels(data) {
		var geojson_reader = new OpenLayers.Format.GeoJSON();
		var flat_data = { "type": "FeatureCollection", "features": []};
		for (level in data) {
			for (var i=0; i<data[level].features.length;++i) {
				data[level].features[i].properties.level = levels_mapping[level];
				flat_data.features.push(data[level].features[i]);
			}
		}
		return geojson_reader.read(flat_data);
	}

	var lookupArcs = {
		"VERT": {strokeColor: '#00FF00'},
		"ORANGE": {strokeColor: '#FF6E2B'},
		"ROUGE": {strokeColor: '#CC0921'},
		"NOIR": {strokeColor: '#EA1FDB'}
	};
	var level_scales = {
		1: { maxScaleDenominator: 10000, minScaleDenominator: 1000},
		2: { maxScaleDenominator: 175000, minScaleDenominator: 10000}
/*		3: { maxScaleDenominator: 175000, minScaleDenominator: 50000}*/
	}

	// combine level of service + resolution filters
	for (level_of_service in lookupArcs) {
		var los_filter = new OpenLayers.Filter.Comparison(
					{   type: OpenLayers.Filter.Comparison.EQUAL_TO,
						property: "level_of_service",
						value: level_of_service
					});
		for (level in level_scales) {
			var scale_filter = new OpenLayers.Filter.Comparison(
					{ type: OpenLayers.Filter.Comparison.EQUAL_TO,
						property: "level",
						value: level
					});
			var compound_filter = new OpenLayers.Filter.Logical(
				{   type: OpenLayers.Filter.Logical.AND,
					filters: [scale_filter, los_filter]
				}
			);
			var compound_rule = new OpenLayers.Rule(
				{   filter: compound_filter,
					symbolizer: lookupArcs[level_of_service],
					minScaleDenominator: level_scales[level].minScaleDenominator,
					maxScaleDenominator: level_scales[level].maxScaleDenominator
				}
			);
			styleArcs.addRules(compound_rule);
		}
	}

	var los = makeLayer("levels_of_service",
		{ style_mark: styleArcs/*, reader: read_levels */},
		null, // no legend
		{
            category: "traffic",
            switchs:[false, false, false],
            titles: {fr: ["Fluide","Dense","Embouteillage"], nl: ["Vlot","Druk","File"]},
            icons:{all: [media_url + "bruxelles_mobilite_media/img/normal_map.gif", 
                         media_url + "bruxelles_mobilite_media/img/dense_map.gif", 
                         media_url + "bruxelles_mobilite_media/img/embouteillage_map.gif"]}
        }, 
		{ url: media_url + "mobiris_files/" + lang + "/levels_of_service.json", interval: 120000, maxage: 15*60*1000 /* 15 minutes */ }
	);
	map.setLayerIndex(los, 0);
	
}

function initAlerts() {
	var alert_types = ["EVENTS","WORKS"];
	var alert_img = ["evenement","chantier"];
	var alert_style = new OpenLayers.Style({
		graphicOpacity: 1,
		graphicWidth: 18,
		graphicHeight: 24,
		graphicXOffset: -9,
		graphicYOffset: -24,
		cursor: "default"
	});

	for (var i=0; i<alert_types.length;++i) {
		var rule = new OpenLayers.Rule(
			{ filter: new OpenLayers.Filter.Comparison(
					{ type: OpenLayers.Filter.Comparison.EQUAL_TO,
						property: "category",
						value: alert_types[i]
					}),
				symbolizer: {
					externalGraphic: media_url + "bruxelles_mobilite_media/img/" + alert_img[i] + "_map.gif"
				}
			}
		);
	
		alert_style.addRules(rule);
	}

	var alerts = makeLayer("alerts",
        { style_mark: alert_style, 
          print_filter: function() {
                var cql_filter = "category='' or ";
                for (r in this.style_mark.rules) {
                    if (this.style_mark.rules[r].symbolizer.display != "none") 
                        cql_filter = cql_filter + "category='" + alert_types[r] + "' or " ;
                }
                cql_filter = cql_filter.substr(0, cql_filter.length - 4);
                return cql_filter;
          }
         },
		{ format: function (data) {
				var content = "<b>{street_name}</b>" ;
				if (data.cause) content += "<br /> <i>{cause}</i>";
				if (data.consequence) content += "<br /> <i>{consequence}</i>" ;
				return content;
			}
		},
		{ 
            switchs: [true, true],
            titles: {fr: ["Evénements","Chantiers"], nl: ["Evenementen","Werken"]},
            icons: {all: [media_url + "bruxelles_mobilite_media/img/evenement_map.gif", media_url + "bruxelles_mobilite_media/img/chantier_map.gif"]},
			setVisibility: function (visible, n) {
				alert_style.rules[n].symbolizer.display = visible ? "" : "none";
				this.redraw();
			} 
		},
		{ url: media_url + "mobiris_files/" + lang + "/alerts.json", interval: 120000 }
	);
	$("#switch_alerts1").trigger("legend_item_deactivate");	// hide works by default
	map.setLayerIndex(alerts, 10);
}

function initCameras(camera_url) {
	makeLayer("cameras",
		{ style_mark: { 
			externalGraphic: media_url + "bruxelles_mobilite_media/img/camera_map.gif",
			graphicWidth: 18,
			graphicHeight: 24,
			graphicXOffset: -9,
			graphicYOffset: -24
			},
          print:false
		},
		{ format: function (data) {
			var $content= $('<div class="cameraTip"><b>' + data.code_cam + " - " + data.description.replace(/ - /g,"<br/>") + "&nbsp;</b><br/></div>");
			var me = this;
			var $img = $("<img/>");

			/* display popup only when image is available. If image is not found, reload */

			$img.error(function(evt) {
				me.reload();
			});
            $img.load(function () { 
				if (me.feature) me._display();
			});

			// postpone for chrome
			window.setTimeout(function () {
				$img.attr("src", data.src);
			}, 1);

			$content.append($img);
			if (data.last_update) {
				$content.append($('<div class="cameraUpdate">' + data.last_update + "&nbsp;</div>")) ;
			}
			return $content;
		  },
		  display: function () { /* do nothing, only displayed when img is available */ },
		  hide: function (feature) {
			this.feature = null;
		  }
		},
		{ 
            switchs: [true], 
            titles: {fr: ["Caméras"], nl: ["Camera's"]},
            icons: {all: [media_url + "bruxelles_mobilite_media/img/camera_map.gif"]}
        },
		{ url: camera_url, interval: 60000 }
	);
}

function initVillo(config) {
	// ### Villo ###
    villo = makeLayer(
        "villo", {
            style_mark: {
                "default": {
                    externalGraphic: clusterStyle("img/villo_map.gif", "cluster/villo/off/${count}.gif", media_url + "bruxelles_mobilite_media/"),
                    graphicHeight: clusterStyle(23,35),
                    graphicWidth: clusterStyle(19,32),
                    graphicXOffset: clusterStyle(-9.5, -16),
                    graphicYOffset: clusterStyle(-23,-35),
                    cursor: clusterStyle("default", "pointer")
                },
                "select": {
                    externalGraphic: clusterStyle("img/villo_map.gif", "cluster/villo/on/${count}.gif", media_url + "bruxelles_mobilite_media/")
                }
            },
            strategies: [new LimitedClusterStrategy({ distance: 25 })]
        },
        {
            format: function (data) { 
                var statemessage = "{free_places}: <span class='maptip-dynamic'>{FREEBS}</span> / {free_bikes}: <span class='maptip-dynamic'>{FREEBK}</span>"+ "<br/>";
                if (!data.FREEBS && !data.FREEBK) statemessage = "";
                if (data.STATE != "open") statemessage = "<span class='maptip-dynamic'>{" + data.STATE + "_msg}</span>"+ "<br/>";
                  
                return "<span class='villo-station-no'>{station_no}{ID}</span><i>{STREET}<br/></i>" + statemessage ;
            },
            fr: { 'station_no': 'Station n° ' , 'free_places': 'Emplacements libres', 'free_bikes': 'Vélos disponibles', "closed_msg": "Station fermée", "maintenance_msg": "Station en cours d'entretien", "construction_msg": "Station bientôt disponible" },
            nl: { 'station_no': 'Station nr ', 'free_bikes': 'Beschikbare fietsen', 'free_places': 'Beschikbare fietspalen', "closed_msg": "Station gesloten", "maintenance_msg": "Station in onderhoud", "construction_msg": "Station gaat binnenkort open" }
        },
		{ 
            switchs: [true],
            titles: {fr: ["Stations villo"], nl: ["Villo-stations"]},
            icons: {all: [media_url + "bruxelles_mobilite_media/img/villo_map.gif"]},
            visible: true
        },
        { url: config.villo_url, interval: 120000, dataType: config.villo_url.match(/^https?:\/\//) ? "jsonp" : "json" }
    );
}

function initParkings() {
	makeLayer("parkingT", 
        { style_mark: { externalGraphic: media_url + "bruxelles_mobilite_media/img/parking_map.gif" }},  
        { 
            format: function (data) {
	            if (data.free_places == "????") {
					places = '{capacity}: {total_places}' ;
	            } else {
					places = '{free_places_label}: <span class="maptip-dynamic">{free_places}</span>/<span id="total_places">{total_places}</span>' ;
				}
				return '<b>{nom}</b><br /><i>' + places + '</i><br /><i>{adresse}</i><br /><i>{code_postal} {ville}</i>';
			},
            fr: { "capacity": "Capacité", "free_places_label": "Places libres" },
            nl: { "capacity": "Aantal standplaatsen", "free_places_label": "Beschikbare plaatsen", "adres": "adresse", "stad": "ville", "naam": "nom" }
        },
		{ 
            switchs: [true],
            titles: {fr: ["Parkings publics"], nl: ["Openbare parkings"]},
            icons: {all: [media_url + "bruxelles_mobilite_media/img/parkingN_map.gif"]},
            visible: false
        },
        { url: media_url + "categories_files/parkings.json", interval: 120000 }
	);
}


