/////////CREATED BY ANDREA PINCHI . IT
/////////PALETTE
var values = { 
    minDistance: 20,
	maxDistance: 200,
	size:'velocity',
	fixedSize: 50,
	opacity: 90,
	blend:'normal',
	fill:'gradient',
	appearance:'triangle'
};

var components = {
    minDistance: {
        type: 'number', label: 'min size', steppers: true, units: 'pixel'
    },
	maxDistance: {
        type: 'number', label: 'max size', steppers: true, units: 'pixel'
    },

	ruler1: {
        type: 'ruler'   
	},
	
	size: { 
        type: 'list', label: 'size variance', 
        value:'velocity',
        options: ['velocity', 'fixed', 'pressure', 'random']
    },

	fixedSize: {
        type: 'number', label: 'fixed size', steppers: true, units: 'pixel'
    },

	ruler2: {
        type: 'ruler'   
	},

	opacity: {
        type: 'number', label: 'opacity', steppers: true
    },

	blend: {
        type: 'list', label: 'blend Mode',
        options: ['normal', 'multiply', 'screen']
    },
	
	appearance: {
        type: 'list', label: 'appearance',
        value:'triangle',
        options: ['triangle', 'quadrilateral']
    },

	ruler3: {
        type: 'ruler'   
	},
	
	fill: {
        type: 'list', label: 'fill',
        options: ['gradient', 'solid']
    }

};

var palette = new Palette('theBoxesFlow', components, values);


/////////VARS
var raster;
var oldPoint;
var oldHalfVector;
var path1;
var path2;
var path3;
var path4;


/////////STYLES+COLORS
var noStroke = {
    strokeWidth: 0
};

////////ONMOUSEDOWN
function onMouseDown(event) {
	tool.minDistance = values.minDistance;
	tool.maxDistance = values.maxDistance;
	oldPoint = event.point;
	oldHalfVector = undefined;
	
	if(!tool.hasPressure() && values.size == "pressure"){
		values.size == "velocity";
		Dialog.alert('You need a tool with pressure');	
	}
	
	var rasters = document.getItems({
        type: Raster,
        selected: true
    });

	if(rasters.length > 0) {
		//consider only the first raster selected
        raster = rasters[0];
    } else {
        raster = null;
    }
}


////////DRAG
function onMouseDrag(event) {
	if(values.appearance == "triangle"){
		path1 = new Path();
		path2 = new Path();
		path3 = new Path();
		path4 = new Path();
		
		if(values.size == "velocity"){
			var vector = event.delta;
		}else if(values.size == "fixed"){
			var vector = event.delta;
			vector.length = values.fixedSize;
		}else if(values.size == "pressure"){
			var vector = event.delta;
			vector = vector * event.pressure;
		}else if(values.size == "random"){
			var vector = event.delta;
			vector.length = Math.random() * values.fixedSize;
		}
		
		halfVector = vector/2;
		halfVector.angle += 90;
		
		path1.add(event.point + halfVector, event.point - halfVector, event.middlePoint);
		colorPath(path1);
		
		if(oldHalfVector != undefined){
			path2.add(oldPoint + oldHalfVector, oldPoint - oldHalfVector, event.middlePoint);
			path3.add(oldPoint - oldHalfVector, event.point - halfVector, event.middlePoint);
			path4.add(event.point + halfVector, oldPoint + oldHalfVector, event.middlePoint);
	        colorPath(path2);
			colorPath(path3);
			colorPath(path4);
		}
		
		oldPoint = event.point;
		oldHalfVector = halfVector;
	}else if(values.appearance == "quadrilateral"){
		path1 = new Path();
		
		if(values.size == "velocity"){
			var vector = event.delta;
		}else if(values.size == "fixed"){
			var vector = event.delta;
			vector.length = values.fixedSize;
		}else if(values.size == "pressure"){
			var vector = event.delta;
			vector = vector * event.pressure;
		}else if(values.size == "random"){
			var vector = event.delta;
			vector.length = Math.random() * values.fixedSize;
		}
		
		halfVector = vector/2;
		halfVector.angle += 90;
		
				
		if(oldHalfVector != undefined){
			path1.add(event.point + halfVector, event.point - halfVector, oldPoint - oldHalfVector, oldPoint + oldHalfVector);
			colorPath(path1);
		}
		
		oldPoint = event.point;
		oldHalfVector = halfVector;
	}
}

function colorPath(thePath){
	thePath.closed = true;
	thePath.opacity = values.opacity/100;
	thePath.blendMode = values.blend;
	if(values.appearance == "smooth")
		thePath.smooth();

	
	if(raster != null){
		if(values.fill == "solid"){
			if(raster) {
				thePath.style = noStroke;
				thePath.fillColor = raster.getAverageColor(thePath);
				if(thePath.fillColor == null){
					thePath.remove();
				}
			}
		}else if(values.fill == "gradient"){
			var cPath1 = new Path.Circle(thePath.segments[0].point, thePath.bounds.width/2);
			var cPath2 = new Path.Circle(thePath.segments[1].point, thePath.bounds.width/2);
		
			var clr1 = raster.getAverageColor(cPath1);
			var clr2 = raster.getAverageColor(cPath2);
		
			if(clr1 != null && clr2 != null){
				var gradient = new Gradient() {
				    type: 'linear',
				    stops: [
				        new GradientStop(clr1, 0),
				        new GradientStop(clr2, 1)
					]
				};
				var origin = thePath.segments[0].point;
				var destination =  thePath.segments[1].point;
				thePath.fillColor = new GradientColor(gradient, origin, destination);
			}else{
				thePath.remove();	
			}
			cPath1.remove();
			cPath2.remove();
		}
	}
}