console.log("Polymorph core loaded");

function core() {
    var core = {};

    core.controlsList = [];
    core.controls     = {};

    core.addControl = function(name, control) {
        core.controlsList.push(control);
        core.controls[name] = control;

        if(control["onAdd"]){
            control["onAdd"](core);
        }

        if(control["onWindowResize"]){
            window.addEventListener("resize", function(event) { control["onWindowResize"](event, core)});
        }

        return core;
    }

    return core;
}

console.log("Polymorph util loaded");

function util() {
    console.log("util() called");
}

function e(name, parent){
    let el = document.createElement(name);
    if(parent){
        parent.appendChild(el);
    }
    return el;
}

function ei(eid){
    return document.getElementById(eid);
}

function eq(eqry){
    return document.querySelector(eqry);
}

function w(e){
    var ew = {e:e};

    ew.html = function(htmlString){
        ew.e.innerHTML = htmlString;
        return ew;
    };
    ew.addClass = function(className){
        ew.e.classList.add(className);
        return ew;
    };
    ew.removeClass = function(className){
        ew.e.classList.remove(className);
        return ew;
    };
    ew.replaceClass = function(className){
        ew.e.classList.replace(className);
        return ew;
    };
    ew.toggleClass = function(className){
        ew.e.classList.toggle(className);
        return  ew;
    };
    ew.setStyle = function(styleName, styleValue){
        ew.e.style[styleName] = styleValue;
        return ew;
    }
    ew.removeStyle = function(styleName){
        ew.e.style[styleName] = "";
    }

    ew.on = function(eventName, cb){
        ew.e.addEventListener(eventName, cb);
        return ew;
    }
    ew.ontoggle = function(cb){
        ew.toggleListener = cb;
        return ew;
    }
    ew.toggle = function(){
        if(ew.toggled) { ew.toggled = false; }
        else { ew.toggled = true; }
        if(ew.toggleListener){
            ew.toggleListener(ew);
        }
        return ew;
    }
    ew.onclick = function(cb){
        ew.e.addEventListener("click", cb);
        return ew;
    };
    ew.click = function() {
        ew.e.click();
        return ew;
    }


    ew.createChild = function(name, htmlParentw){
        let ne = document.createElement(name);
        if(htmlParentw){
            htmlParentw.e.appendChild(ne);
        } else {
            ew.e.appendChild(ne);
        }
        return w(ne);
    };

    return ew;
}


function service(url, httpHeaders, mode) {
    const service = {};

    service.url = url;
    service.httpHeaders = {
        "Content-Type": "application/json",
        // 'Content-Type': 'application/x-www-form-urlencoded',
    }
    if(httpHeaders){
        for(header in httpHeaders){
            service.httpHeaders[header] = httpHeaders[header];
        }
    }
    service.mode = "same-origin";
    if(mode){ service.mode = mode; }

    service.get = async function(){
        return await fetch(service.url);
    }

    service.post = async function(req) {

        const responseObj =  await fetch(service.url,
        {
                method: "POST",
                mode: service.mode, // no-cors, *cors, same-origin
                cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached
                credentials: "same-origin", // include, *same-origin, omit
                headers: {
                    "Content-Type": "application/json",
                    // 'Content-Type': 'application/x-www-form-urlencoded',
                },
                redirect: "follow", // manual, *follow, error
                referrerPolicy: "no-referrer", // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url
                body: JSON.stringify(req), // body data type must match "Content-Type" header
            }
        );

        console.log(responseObj);

        return responseObj.json();
    }

    return service;

}


function timer(delay) {
    const timer = {}

    timer.delay = delay;

    timer.set = function() {
        setTimeout(function(e){ timer.callback(e, timer); }, timer.delay);
    }

    timer.loop = function() {
        setTimeout(function(e){ timer.callback(e, timer); timer.loop(); }, timer.delay);
    }

    timer.callback = function(e, timer) {}

    return timer;

}