/*

Jitter Version 1.0 | a Scriptographer 2.0 script
Randomly moves and randomly rotates selected objects.

Scriptographer is a plugin for Adobe Illustrator(TM)
created by Jürg Lehni
http://www.scriptographer.com/

This script was written by Russell Willes
loosely based on random_distribute by Eike Menijn 

*/

//finish the rotate part, pos and neg values, how to rotate something
//make labels better, esp. pos neg

//need to fix, only does clockwise wihtout any checkboxes checked


var values = { moveBool: true, distance: 75, movePercentAffected: 100, maxDistance: 100, onlyXBool: false, onlyYBool: false, onlyPositiveBool: false, onlyNegativeBool: false, rotateBool: false, maxRotateAngle: 180, rotatePercentAffected: 100, onlyClockwiseBool: false, onlyCounterClockwiseBool: false };

function getMoveBool(){ return this.values.moveBool; }

function getDistance(){
    var d = this.values.distance;
    var max = this.values.maxDistance;
    return d/100.0 * max;
}

function getMovePercentAffected(){
    var p = this.values.movePercentAffected;
    console.log("percent is "+p);
    return p;
}
/*
function getMaxDistance(){
    var d = this.values.maxDistance;
    return d;
}
*/
function getOnlyXBool(){ return this.values.onlyXBool; }
function getOnlyYBool(){ return this.values.onlyYBool; }
function getOnlyPositiveBool(){ return this.values.onlyPositiveBool; }
function getOnlyNegativeBool(){ return this.values.onlyNegativeBool; }


function getRotateBool(){
    var b = this.values.rotateBool;
    return b;
}

function getMaxRotateAngle(){
    var a = this.values.maxRotateAngle;
    return a;
}

function getRotatePercentAffected(){
    var p = this.values.rotatePercentAffected;
    return p;
}

function getOnlyClockwiseBool(){ return this.values.onlyClockwiseBool; }
function getOnlyCounterClockwiseBool(){ return this.values.onlyCounterClockwiseBool; }


console.log("hello"+ this.getDistance());

//move item, with delta vector
function move(item, delta){
    item.position = item.position + delta;
}

//rotate item from angle, positive = clockwise
//angle in degrees from normal position
function rotate(item, angle){
    item.rotate(angle);
}

//uses maxDistance -> already declared in values
function doAction(){
    var maxDistance = getDistance();
    var maxRotationAngle = getMaxRotateAngle();
    console.log("doing some logging: "  + maxDistance + " " + maxRotationAngle);

    var selectedItems = document.selectedItems;

    if(selectedItems) {
	for (var i = 0, l = selectedItems.length; i < l; i++) {
	    var item = selectedItems[i];
	    if( getMoveBool() && probability( getMovePercentAffected() ) ){
		var rDelta = filterDeltaForConstraints( randomDelta(maxDistance) );
		move(item, rDelta);
	    }
	    if( getRotateBool() && probability( getRotatePercentAffected() ) ){
		var rRotationAngle = filterAngleForConstraints( randomAngle(maxRotationAngle) );
		rotate(item, rRotationAngle);
	    }
	}
    }

}

//returns true or false given a certain stat
//if less than percent - true
//percent -> an integer between 0 and 100
function probability(percent){
    if( Math.random() < percent/100.0 )
	return true;
    return false;
}

//max is exclusive, from zero up to max
function randomValue(max){
    var t = Math.random()
    var num = (max) * t;
    //num = Math.floor( num);
    return num;
}

//returns a point with a random
function randomDelta(maxDistance){
    var d = randomValue(maxDistance);
    var degree = randomValue(360)-180;
    var vector = new Point(0,0);
    vector.length = d;
    vector.angle = degree;
    console.log("lenght, degree: " + vector.length + " " + vector.angle+" "+vector.x+" "+vector.y);

    return vector;
}


//gets randomAngle
function randomAngle(maxAngle){
    var a = randomValue(maxAngle+1); //+1 so if it is 180 it can be 180
    //apply random + or -
    console.log("random value angle is " + a);
    if( Math.random() < .5)
	a = -a;

    console.log("now the angle is " + a);

    console.log("random angle: " + a);
    return a;
}

//this function filters for only x and y, it opposites for only Positives and Negatives
function filterDeltaForConstraints( d ){
    if( getOnlyYBool() )
	d.x = 0;
    if( getOnlyXBool() )
	d.y = 0;
    if( getOnlyPositiveBool() ){
	if( d.x < 0)
	    d.x = -d.x
	if( d.y < 0)
	    d.y = -d.y
    }
    if( getOnlyNegativeBool() ){
	if( d.x >= 0)
	    d.x = -d.x
	if( d.y >= 0)
	    d.y = -d.y
    }

    return d;
}

function filterAngleForConstraints( a){
    if( getOnlyClockwiseBool() && getOnlyCounterClockwiseBool())
	a = 0;

    if( getOnlyClockwiseBool() )
	if( a < 0)
	    a = -a;

    if( getOnlyCounterClockwiseBool() )
	if( a >= 0)
	    a = -a;

    return a;
}

randomDelta(30);

function changeSlider(){
}
var components = {
    moveBool: { type: 'boolean', label: 'Move(checked = Yes)', defaultValue: true},

    maxDistance: { type: 'number', label: 'max distance(in points)', defaultValue: 100},

    distance: { type: 'slider', label: 'distance', defaultValue: 50, range: [0, 100], increment: 1},

    movePercentAffected: { type: 'slider', label: 'percent affected (0-100)', defaultValue: 100, range: [0, 100], increment: 1},

    onlyXBool: { type: 'boolean', label: 'Only X Axis(checked = Yes)', defaultValue: false},

    onlyYBool: { type: 'boolean', label: 'Only Y Axis(checked = Yes)', defaultValue: false},

    onlyPositiveBool: { type: 'boolean', label: 'Only Positive Values(checked = Yes)', defaultValue: false},

    onlyNegativeBool: { type: 'boolean', label: 'OnlyNegativeValues(checked = Yes)', defaultValue: false},

    rotateBool: { type: 'boolean', label: 'Rotate(checked = Yes)', defaultValue: false},

    maxRotateAngle: { type: 'slider', label: 'max angle of rotation(degrees, both positive and negative)', defaultValue: 180, range: [0,180], increment: 1},

    rotatePercentAffected: { type: 'slider', label: 'percent affected (0-100)', defaultValue: 100, range: [0, 100], increment: 1},

    onlyClockwiseBool: { type: 'boolean', label: 'Only Clockwise(checked = Yes)', defaultValue: false},

    onlyCounterClockwiseBool: { type: 'boolean', label: 'Only Counter-Clockwise(checked = Yes)', defaultValue: false},

    go: { type: 'button', value: 'go', onClick: doAction}
};



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