Insert a responsive javascript animation

Hey Community -

I’m trying to insert an animation that follows the mouse, written in javascript, to my WIX site.

I’m new to javascript and WIX code, any ideas?

Thanks!

PS:
Here’s the code:

(function() {

var width, height, largeHeader, canvas, ctx, points, target, animateHeader = true; 

// Main 
initHeader(); 
initAnimation(); 
addListeners(); 

function initHeader() { 
    width = window.innerWidth; 
    height = window.innerHeight; 
    target = {x: width/4, y: height/4}; 

    largeHeader = document.getElementById('large-header'); 
    largeHeader.style.height = height+'px'; 

    canvas = document.getElementById('demo-canvas'); 
    canvas.width = width; 
    canvas.height = height; 
    ctx = canvas.getContext('2d'); 

    // create points 
    points = []; 
    for(var x = 0; x < width; x = x + width/30) { 
        for(var y = 0; y < height; y = y + height/30) { 
            var px = x + Math.random()*width/30; 
            var py = y + Math.random()*height/30; 
            var p = {x: px, originX: px, y: py, originY: py }; 
            points.push(p); 
        } 
    } 

    // for each point find the 5 closest points 
    for(var i = 0; i < points.length; i++) { 
        var closest = []; 
        var p1 = points[i]; 
        for(var j = 0; j < points.length; j++) { 
            var p2 = points[j] 
            if(!(p1 == p2)) { 
                var placed = false; 
                for(var k = 0; k < 5; k++) { 
                    if(!placed) { 
                        if(closest[k] == undefined) { 
                            closest[k] = p2; 
                            placed = true; 
                        } 
                    } 
                } 

                for(var k = 0; k < 5; k++) { 
                    if(!placed) { 
                        if(getDistance(p1, p2) < getDistance(p1, closest[k])) { 
                            closest[k] = p2; 
                            placed = true; 
                        } 
                    } 
                } 
            } 
        } 
        p1.closest = closest; 
    } 

    // assign a circle to each point 
    for(var i in points) { 
        var c = new Circle(points[i], 2+Math.random()*2, 'rgba(255,255,255)'); 
        points[i].circle = c; 
    } 
} 

// Event handling 
function addListeners() { 
    if(!('ontouchstart' in window)) { 
        window.addEventListener('mousemove', mouseMove); 
    } 
    window.addEventListener('scroll', scrollCheck); 
    window.addEventListener('resize', resize); 
} 

function mouseMove(e) { 
    var posx = posy = 0; 
    if (e.pageX || e.pageY) { 
        posx = e.pageX; 
        posy = e.pageY; 
    } 
    else if (e.clientX || e.clientY)    { 
        posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; 
        posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; 
    } 
    target.x = posx; 
    target.y = posy; 
} 

function scrollCheck() { 
    if(document.body.scrollTop > height) animateHeader = false; 
    else animateHeader = true; 
} 

function resize() { 
    width = window.innerWidth; 
    height = window.innerHeight; 
    largeHeader.style.height = height+'px'; 
    canvas.width = width; 
    canvas.height = height; 
} 

// animation 
function initAnimation() { 
    animate(); 
    for(var i in points) { 
        shiftPoint(points[i]); 
    } 
} 

function animate() { 
    if(animateHeader) { 
        ctx.clearRect(0,0,width,height); 
        for(var i in points) { 
            // detect points in range 
            if(Math.abs(getDistance(target, points[i])) < 10000) { 
                points[i].active = 0.6; 
                points[i].circle.active = 1; 
            } else if(Math.abs(getDistance(target, points[i])) < 50000) { 
                points[i].active = 0.2; 
                points[i].circle.active = 0.6; 
            } else if(Math.abs(getDistance(target, points[i])) < 100000) { 
                points[i].active = 0.04; 
                points[i].circle.active = 0.2; 
            } else { 
                points[i].active = 0; 
                points[i].circle.active = 0; 
            } 

            drawLines(points[i]); 
            points[i].circle.draw(); 
        } 
    } 
    requestAnimationFrame(animate); 
} 

function shiftPoint(p) { 
    TweenLite.to(p, 1+1*Math.random(), {x:p.originX-50+Math.random()*100, 
        y: p.originY-50+Math.random()*100, ease:Circ.easeInOut, 
        onComplete: function() { 
            shiftPoint(p); 
        }}); 
} 

// Canvas manipulation 
function drawLines(p) { 
    if(!p.active) return; 
    for(var i in p.closest) { 
        ctx.beginPath(); 
        ctx.moveTo(p.x, p.y); 
        ctx.lineTo(p.closest[i].x, p.closest[i].y); 
        ctx.strokeStyle = 'rgba(135, 249, 226,'+ p.active+')'; 
        ctx.stroke(); 
    } 
} 

function Circle(pos,rad,color) { 
    var _this = this; 

    // constructor 
    (function() { 
        _this.pos = pos || null; 
        _this.radius = rad || null; 
        _this.color = color || null; 
    })(); 

    this.draw = function() { 
        if(!_this.active) return; 
        ctx.beginPath(); 
        ctx.arc(_this.pos.x, _this.pos.y, _this.radius, 0, 8 * Math.PI, false); 
        ctx.fillStyle = 'rgba(37, 57, 103,'+ _this.active+')'; 
        ctx.fill(); 
    }; 
} 

// Util 
function getDistance(p1, p2) { 
    return Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2); 
} 

})();

Hey Steve,

Welcome to WixCode. Glad to see you’re ready to get down and dirty, however…

WixCode understands all of Javascript, except for anything that accesses the DOM.

This keeps the user from inadvertently “breaking” something. I myself tried to hack things from the code, from an iFrame, and in my dreams, but WixCode wasn’t having any of it.

Accessing document elements such as div, span, button, etc is off-limits. The way to access elements on the page is only through $w.

One small exception is the $w.HtmlComponent (which is based on an iFrame). This element was designed to contain vanilla HTML and it works just fine. You just can’t try to trick it by using parent, window, top, etc.

Yisrael