/**
 * --------------------------------------------------------------------------
 * Bootstrap (v5.1.3): dom/manipulator.js
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
 * --------------------------------------------------------------------------
 */

define([], function() {
    'use strict';

    function normalizeData(val) {
        if (val === 'true') {
            return true
        }

        if (val === 'false') {
            return false
        }

        if (val === Number(val).toString()) {
            return Number(val)
        }

        if (val === '' || val === 'null') {
            return null
        }

        return val
    }

    function normalizeDataKey(key) {
        return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)
    }

    return {
        setDataAttribute: function(element, key, value) {
            element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)
        },

        removeDataAttribute: function(element, key) {
            element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)
        },

        getDataAttributes: function(element) {
            if (!element) {
                return {}
            }

            const attributes = {};

            Object.keys(element.dataset)
                .filter(key => key.startsWith('bs'))
                .forEach(key => {
                    let pureKey = key.replace(/^bs/, '');
                    pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)
                    attributes[pureKey] = normalizeData(element.dataset[key])
                })

            return attributes
        },

        getDataAttribute: function(element, key) {
            return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))
        },

        offset: function(element) {
            const rect = element.getBoundingClientRect();

            return {
                top: rect.top + window.pageYOffset,
                left: rect.left + window.pageXOffset
            }
        },

        position: function(element) {
            return {
                top: element.offsetTop,
                left: element.offsetLeft
            }
        }
    }
});
