//
//  utils.js
//
//  Created by David Back on 19 Nov 2018
//  Copyright 2016 High Fidelity, Inc.
//
//  Distributed under the Apache License, Version 2.0.
//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//

function disableDragDrop() {
    document.addEventListener("drop", function(event) {
        event.preventDefault();
    });
    
    document.addEventListener("dragover", function(event) {
        event.dataTransfer.effectAllowed = "none";
        event.dataTransfer.dropEffect = "none";
        event.preventDefault();
    });
    
    document.addEventListener("dragenter", function(event) {
        event.dataTransfer.effectAllowed = "none";
        event.dataTransfer.dropEffect = "none";
        event.preventDefault();
    }, false);
}

// mergeDeep function from https://stackoverflow.com/a/34749873
/**
 * Simple object check.
 * @param item
 * @returns {boolean}
 */
function mergeDeepIsObject(item) {
    return (item && typeof item === 'object' && !Array.isArray(item));
}

/**
 * Deep merge two objects.
 * @param target
 * @param sources
 */
function mergeDeep(target, ...sources) {
    if (!sources.length) {
        return target;
    }
    const source = sources.shift();

    if (mergeDeepIsObject(target) && mergeDeepIsObject(source)) {
        for (const key in source) {
            if (!source.hasOwnProperty(key)) {
                continue;
            }
            if (mergeDeepIsObject(source[key])) {
                if (!target[key]) {
                    Object.assign(target, { [key]: {} });
                }
                mergeDeep(target[key], source[key]);
            } else {
                Object.assign(target, { [key]: source[key] });
            }
        }
    }

    return mergeDeep(target, ...sources);
}

function deepEqual(a, b) {
    if (a === b) {
        return true;
    }

    if (typeof(a) !== "object" || typeof(b) !== "object") {
        return false;
    }

    if (Object.keys(a).length !== Object.keys(b).length) {
        return false;
    }

    for (let property in a) {
        if (!a.hasOwnProperty(property)) {
            continue;
        }
        if (!b.hasOwnProperty(property)) {
            return false;
        }
        if (!deepEqual(a[property], b[property])) {
            return false;
        }
    }
    return true;
}