client-js.js 3.4 KB
"use strict";

(function (window, document, bs, undefined) {

    var socket = bs.socket;

    var uiOptions = {
        bs: {}
    };

    socket.on("ui:connection", function (options) {

        uiOptions = options;

        bs.socket.emit("ui:history:connected", {
            href: window.location.href
        });
    });

    socket.on("ui:element:remove", function (data) {
        if (data.id) {
            var elem = document.getElementById(data.id);
            if (elem) {
                removeElement(elem);
            }
        }
    });

    socket.on("highlight", function () {
        var id = "__browser-sync-highlight__";
        var elem = document.getElementById(id);
        if (elem) {
            return removeElement(elem);
        }
        (function (e) {
            e.style.position = "fixed";
            e.style.zIndex = "1000";
            e.style.width = "100%";
            e.style.height = "100%";
            e.style.borderWidth = "5px";
            e.style.borderColor = "red";
            e.style.borderStyle = "solid";
            e.style.top = "0";
            e.style.left = "0";
            e.setAttribute("id", id);
            document.getElementsByTagName("body")[0].appendChild(e);
        })(document.createElement("div"));
    });

    socket.on("ui:element:add", function (data) {

        var elem = document.getElementById(data.id);

        if (!elem) {
            if (data.type === "css") {
                return addCss(data);
            }
            if (data.type === "js") {
                return addJs(data);
            }
            if (data.type === "dom") {
                return addDomNode(data);
            }
        }
    });

    bs.addDomNode = addDomNode;
    bs.addJs      = addJs;
    bs.addCss     = addJs;

    function addJs(data) {
        (function (e) {
            e.setAttribute("src", getAbsoluteUrl(data.src));
            e.setAttribute("id", data.id);
            document.getElementsByTagName("body")[0].appendChild(e);
        })(document.createElement("script"));
    }

    function addCss(data) {
        (function (e) {
            e.setAttribute("rel",  "stylesheet");
            e.setAttribute("type", "text/css");
            e.setAttribute("id",   data.id);
            e.setAttribute("media", "all");
            e.setAttribute("href", getAbsoluteUrl(data.src));
            document.getElementsByTagName("head")[0].appendChild(e);
        })(document.createElement("link"));
    }

    function addDomNode(data) {
        var elem = document.createElement(data.tagName);
        for (var attr in data.attrs) {
            elem.setAttribute(attr,  data.attrs[attr]);
        }
        if (data.placement) {
            document.getElementsByTagName(data.placement)[0].appendChild(elem);
        } else {
            document.getElementsByTagName("body")[0].appendChild(elem);
        }
        return elem;
    }

    function removeElement(element) {
        if (element && element.parentNode) {
            element.parentNode.removeChild(element);
        }
    }

    function getAbsoluteUrl(path) {
        if (path.match(/^h/)) {
            return path;
        }
        return [window.location.protocol, "//", getHost(), path].join("");
    }

    function getHost () {
        return uiOptions.bs.mode === "snippet" ? window.location.hostname + ":" + uiOptions.bs.port : window.location.host;
    }

})(window, document, ___browserSync___);