// Adopts the Mapbox opacity control into a Leaflet plugin !function(global) { 'use strict'; L.Control.LayerOpacity = L.Control.extend({ initialize: function(layerGroup) { var options = { position: 'topleft', layer: layerGroup.getLayers()[0] }; L.Util.setOptions(this, options); }, onAdd: function(map) { var container = L.DomUtil.create('div', 'opacity-control unselectable'), controlArea = L.DomUtil.create('div', 'opacity-area', container), handle = L.DomUtil.create('div', 'opacity-handle', container), handleArrowUp = L.DomUtil.create('div', 'opacity-arrow-up', handle), handleText = L.DomUtil.create('div', 'opacity-text', handle), handleArrowDown = L.DomUtil.create('div', 'opacity-arrow-down', handle), bottom = L.DomUtil.create('div', 'opacity-bottom', container); L.DomEvent.disableClickPropagation(container); this.setListeners(handle, bottom, handleText); handle.style.top = handle.offsetTop - 13 + 50 + 'px'; handleText.innerHTML = parseInt(this.options.layer.options.opacity * 100) + '%'; return container; }, setListeners: function(handle, bottom, handleText) { var _this = this, start = false, startTop; L.DomEvent.addListener(document, 'mousemove', function(e) { if (!start) return; var percentInverse = Math.max(0, Math.min(200, startTop + parseInt(e.clientY, 10) - start)) / 2; handle.style.top = ((percentInverse * 2) - 13) + 'px'; handleText.innerHTML = Math.round((1 - (percentInverse / 100)) * 100) + '%'; bottom.style.height = Math.max(0, (((100 - percentInverse) * 2) - 13)) + 'px'; bottom.style.top = Math.min(200, (percentInverse * 2) + 13) + 'px'; _this.options.layer.setOpacity(1 - (percentInverse / 100)); }); L.DomEvent.addListener(handle, 'mousedown', function(e) { L.DomEvent.disableClickPropagation(e); start = parseInt(e.clientY, 10); startTop = handle.offsetTop - 12; return false; }); L.DomEvent.addListener(document, 'mouseup', function(e) { L.DomEvent.stopPropagation(e); L.DomEvent.disableClickPropagation(e); start = null; }); } }); }(this);