/* Common Functions */

export function copyArray(asArray)
{
	return asArray.slice(0); //trick to copy array
}

export function getElem(aoAnchor, asPath)
{
	return (typeof asPath == 'object' && asPath.length > 1)?getElem(aoAnchor[asPath.shift()], asPath):aoAnchor[(typeof asPath == 'object')?asPath.shift():asPath];
}

export function setElem(aoAnchor, asPath, oValue)
{
	var asTypes = {boolean:false, string:'', integer:0, int:0, array:[], object:{}};
	if(typeof asPath == 'object' && asPath.length > 1)
	{
		var nextlevel = asPath.shift();
		if(!(nextlevel in aoAnchor)) aoAnchor[nextlevel] = {}; //Creating a new level
		if(typeof aoAnchor[nextlevel] !== 'object') debug('Error - setElem() : Already existing path at level "'+nextlevel+'". Cancelling setElem() action');
		return setElem(aoAnchor[nextlevel], asPath, oValue);
	}
	else
	{
		var sKey = (typeof asPath == 'object')?asPath.shift():asPath;
		return aoAnchor[sKey] = (!(sKey in aoAnchor) && (oValue in asTypes))?asTypes[oValue]:oValue;
	}
}

export function getDragPosition(oEvent) {
	let bMouse = oEvent.type.includes('mouse');
	return {
		x: bMouse?oEvent.pageX:oEvent.touches[0].clientX, 
		y: bMouse?oEvent.pageY:oEvent.touches[0].clientY
	};
}

export function copyTextToClipboard(text) {
	if(!navigator.clipboard) {
		var textArea = document.createElement('textarea');
		textArea.value = text;

		// Avoid scrolling to bottom
		textArea.style.top = '0';
		textArea.style.left = '0';
		textArea.style.position = 'fixed';

		document.body.appendChild(textArea);
		textArea.focus();
		textArea.select();

		try {
			var successful = document.execCommand('copy');
			if(!successful) console.error('Fallback: Oops, unable to copy', text);
		} catch (err) {
			console.error('Fallback: Oops, unable to copy', err);
		}

		document.body.removeChild(textArea);
		return;
	}
	navigator.clipboard.writeText(text).then(
		function() {},
		function(err) {
			console.error('Async: Could not copy text: ', err);
		}
	);
}

export function getOuterWidth(element) {
	var style = getComputedStyle(element);
	var width = element.offsetWidth; // Width without padding and border
	width += parseInt(style.marginLeft) + parseInt(style.marginRight); // Add margins

	// Check if the box-sizing is border-box (includes padding and border in the width)
	if (style.boxSizing === 'border-box') {
		width += parseInt(style.paddingLeft) + parseInt(style.paddingRight); // Add padding
		width += parseInt(style.borderLeftWidth) + parseInt(style.borderRightWidth); // Add border
	}
  
	return width;
}