var utils = {};

utils.groupBy = function (xs, key) {
	return xs.reduce(function (rv, x) {
		(rv[x[key]] = rv[x[key]] || []).push(x);
		return rv;
	}, {});
}

// Copies a string to the clipboard. Must be called from within an
// event handler such as click. May return false if it failed, but
// this is not always possible. Browser support for Chrome 43+,
// Firefox 42+, Safari 10+, Edge and Internet Explorer 10+.
// Internet Explorer: The clipboard feature may be disabled by
// an administrator. By default a prompt is shown the first
// time the clipboard is used (per session).
// https://stackoverflow.com/a/33928558/6419007
utils.copyToClipboard = function (text, log) {
	if (window.clipboardData && window.clipboardData.setData) {
		// Internet Explorer-specific code path to prevent textarea being shown while dialog is visible.
		return window.clipboardData.setData("Text", text);
	}
	else if (document.queryCommandSupported && document.queryCommandSupported("copy")) {
		var textarea = document.createElement("textarea");
		textarea.textContent = text;
		textarea.style.position = "fixed";  // Prevent scrolling to bottom of page in Microsoft Edge.
		document.body.appendChild(textarea);
		textarea.select();
		try {
			document.execCommand("copy");  // Security exception may be thrown by some browsers.
			log.append("<h2 class='ok'>Coordinates copied to clipboard!</h2><br/>\n");
			return;
		}
		catch (ex) {
			console.warn("Copy to clipboard failed.", ex);
			return prompt("Copy to clipboard: Ctrl+C, Enter", text);
		}
		finally {
			document.body.removeChild(textarea);
		}
	}
}

utils.read_kml = function (url) {
	return new ol.source.KML({
		projection: ol.proj.get('EPSG:3857'),
		url: url,
		extractAttributes: false,
		extractStyles: false
	});
}

utils.is_polygon = function (geom) {
	return ('getType' in geom) && (geom.getType() === 'Polygon');
}

utils.polygon_style = function (color, alpha) {
	return new ol.style.Style({
		fill: new ol.style.Fill({
			color: 'rgba(255, 255, 255,' + alpha + ')'
		}),
		stroke: new ol.style.Stroke({
			color: color,
			width: 2,
			lineDash: [5, 10]
		}),
	});
}

utils.human_readable_area = function (area) {
	if (area > 1_000_000) {
		return (area / 1_000_000).toFixed(1) + " km²";
	}
	if (area > 10_000) {
		return (area / 10_000).toFixed(1) + " ha";
	}
	return area.toFixed(1) + " m²";
}
