$.fn.ribbon = function(options) {
var opts = $.extend({}, $.fn.ribbon.defaults, options);
var cache = {},canvas,context,container,brush,painters,unpainters,timers,mouseX,mouseY;
return this.each(function() {
container = $(this).parent();
context = this.getContext('2d');
canvas.style.cursor = 'crosshair';
$(this).attr("width",opts.screenWidth).attr("height",opts.screenHeight)
brush = init(this.context);
canvas.addEventListener('mousemove', onWindowMouseMove, false);
window.addEventListener('resize', onWindowResize, false);
document.addEventListener('mouseout', onDocumentMouseOut, false);
canvas.addEventListener('mouseover', onCanvasMouseOver, false);
mouseX = opts.screenWidth / 2;
mouseY = opts.screenHeight / 2;
for(var i = 0; i < opts.strokes; i++) {
var ease = Math.random() * 0.05 + opts.easing;
dx : opts.screenWidth / 2,
dy : opts.screenHeight / 2,
this.interval = setInterval(update, opts.refreshRate);
context.lineWidth = opts.brushSize;
context.strokeStyle = "rgba(" + opts.color[0] + ", " + opts.color[1] + ", " + opts.color[2] + ", " + opts.brushPressure + ")";
for( i = 0; i < painters.length; i++) {
var dx1 = painters[i].ax = (painters[i].ax + (painters[i].dx - mouseX) * painters[i].div) * painters[i].ease;
var dx2 = painters[i].dx;
var dy1 = painters[i].ay = (painters[i].ay + (painters[i].dy - mouseY) * painters[i].div) * painters[i].ease;
var dy2 = painters[i].dy;
context.lineTo(dx2, dy2);
clearInterval(this.interval);
function strokestart(mouseX, mouseY) {
for(var i = 0; i < painters.length; i++) {
function stroke(mouseX, mouseY) {
function onWindowMouseMove(event) {
function onWindowResize() {
opts.screenWidth = window.innerWidth;
opts.screenHeight = window.innerHeight;
function onDocumentMouseOut(event) {
function onCanvasMouseOver(event) {
strokestart(event.clientX, event.clientY);
window.addEventListener('mousemove', onCanvasMouseMove, false);
window.addEventListener('mouseup', onCanvasMouseUp, false);
function onCanvasMouseMove(event) {
stroke(event.clientX, event.clientY);
function onCanvasMouseUp() {
screenWidth : $(window).width(),
screenHeight : $(window).height(),
backgroundColor : [255, 255, 255],