// stroke_itrans.jp
// Sunabe kazumichi 2009
// http://dp48069596.lolipop.jp/

function ungroupRecoursiveAndCtp(groupObj) {
	var countOfGroupObjects = null; 
	var obj = groupObj.getChildren(); 
	countOfGroupObjects = obj.length; 
		var reGroup = new Group(); 
	
	for (var n = 0; n < countOfGroupObjects; n++){
		if(obj[n].hasChildren()) {
				groupObjs.push(obj[n]); 
				ungroupRecoursiveAndCtp(obj[n]); 
		}
		else {
			gPaths.push(obj[n]); 
			reGroup.appendChild(ctp(obj[n]));
		}
	}
}

function ctp(shape){
	var dist=pdistField.text;
	var density=pdensityField.text;
	var offset=poffsetField.text;

	shape.curvesToPoints(dist,10000);
	var count = shape.curves.size();
	for(var k=0;k<count;k++){
		for(var n=0;n<density;n++){
			switch(n%2){
			case 1: // half the dots with positive random values
				var x = randomBetweenFloat(0,offset);
				var y = randomBetweenFloat(0,offset);
				break;
			default: // half the dots with negative random values
				var x = -1 * randomBetweenFloat(0,offset);
				var y = -1 * randomBetweenFloat(0,offset);
			}
			var point = shape.curves[k].getPoint1();
			var randomizedPoint = point.add(x,y); // add the offset to the point
			dotPoints.push(randomizedPoint);
		}
	}
	return shape;
}

function targetDot(){
	dot = null;	
	var selectedItems = document.selectedItems;	
	if(selectedItems.length == 0)	{
		dbug('no objects selected -> nothing will happen...');
		return;
	}	
	if (selectedItems.length >= 1){
		dot = selectedItems;
		if (selectedItems.length == 1){
		}else{
			dbug(selectedItems.length + ' objects selected');
		}
	}
}

function targetStroke() {
shapes = null;
	var selectedItems = document.selectedItems;
	if(selectedItems.length == 0){
		return;
	}else{
		shapes = selectedItems;
	}	
}

function randomBetweenFloat(min,max){
	min = parseFloat(min);
	max = parseFloat(max);
	return Math.random() * (max - min) + min;
}

function randomBetween(min,max){
	min = parseFloat(min);
	max = parseFloat(max);
	return Math.round(Math.random() * (max - min) + min);
}

function dbug(msg){if (true)
		print('::debug: '+msg);
}

// ------------------------  Dialog stuff  ------------------------ 

var dialog = new FloatingDialog(FloatingDialog.OPTION_TABBED);
	dialog.setTitle("Stroke translation");

	

var estep = new Static(dialog){
	text:"step:",
	position:new Point(146, 14)
};
	estep.setSize(estep.bestSize);

var estepField = new TextEdit(dialog){
	bounds: [180,12, 25, 20],
	text:"20"
};

var erotate = new Static(dialog){
	text:"rotate:",
	position: new Point(136, 38)
};
	erotate.setSize(erotate.bestSize);

var erotateField = new TextEdit(dialog){
	bounds:[180, 36, 25, 20],
	text:"0"
}

var escale = new Static(dialog){
	text:"scale:",
	position: new Point(142, 58)
};
	escale.setSize(escale.bestSize);

var escaleField = new TextEdit(dialog){
	bounds:[180, 56, 25, 20],
	text:"100"
}
var emvx = new Static(dialog){
	text:"movex:",
	position:new Point(136, 78)
};
	emvx.setSize(emvx.bestSize);

var emvxField = new TextEdit(dialog){
	bounds: [180, 76, 25, 20],
	text:"1"
};

var emvy = new Static(dialog){
	text:"movey:",
	position:new Point(136, 98)
};
	emvy.setSize(emvy.bestSize);

var emvyField = new TextEdit(dialog){
	bounds: [180,96, 25, 20],
	text:"1"
};

var bcColor = new Static(dialog){
	text:"C:",
	position:new Point(15, 22)
};
	bcColor.setSize(bcColor.bestSize);

var bcColorField = new TextEdit(dialog){
	bounds: [30, 20, 25, 20],
	text:"100"
};

var bmColor = new Static(dialog){
	text:"M:",
	position: new Point(15, 42)
};
	bmColor.setSize(bmColor.bestSize);

var bmColorField = new TextEdit(dialog){
	bounds:[30, 40, 25, 20],
	text:"0"
}

var byColor = new Static(dialog){
	text:"Y:",
	position:new Point(15, 62)
};
	byColor.setSize(byColor.bestSize);

var byColorField = new TextEdit(dialog){
	bounds: [30, 60, 25, 20],
	text:"10"
};

var bkColor = new Static(dialog){
	text:"K:",
	position: new Point(15, 82)
};
	bkColor.setSize(bkColor.bestSize);

var bkColorField = new TextEdit(dialog){
	bounds:[30, 80, 25, 20],
	text:"0"
}

var bwidth = new Static(dialog){
	text:"W:",
	position: new Point(12, 106)
};
	bwidth .setSize(bwidth .bestSize);

var bwidthField = new TextEdit(dialog){
	bounds:[30, 104, 25, 20],
	text:"8"
};
		
var fcColor = new Static(dialog){
	text:"C:",
	position:new Point(76, 22)
};
	fcColor.setSize(fcColor.bestSize);

var fcColorField = new TextEdit(dialog){
	bounds: [92, 20, 25, 20],
	text:"0"
};

var fmColor = new Static(dialog){
	text:"M:",
	position: new Point(76, 42)
};
	fmColor.setSize(fmColor.bestSize);

var fmColorField = new TextEdit(dialog){
	bounds:[92, 40, 25, 20],
	text:"0"
}

var fyColor = new Static(dialog){
	text:"Y:",
	position:new Point(76, 62)
};
	fyColor.setSize(fyColor.bestSize);

var fyColorField = new TextEdit(dialog){
	bounds: [92, 60, 25, 20],
	text:"0"
};

var fkColor = new Static(dialog){
	text:"K:",
	position: new Point(76, 82)
};
	fkColor.setSize(fkColor.bestSize);

var fkColorField = new TextEdit(dialog){
	bounds:[92, 80, 25, 20],
	text:"0"
}

var fwidth = new Static(dialog){
	text:"W:",
	position: new Point(72, 106)
};
	fwidth.setSize(fwidth.bestSize);

var fwidthField = new TextEdit(dialog){
	bounds:[92, 104, 25, 20],
	text:"0.2"
}
//------------------------------------
var protate = new Static(dialog){
	text:"rotate:",
	position: new Point(136, 162)
};
	protate.setSize(protate.bestSize);

var protateField = new TextEdit(dialog){
	bounds:[180, 160, 25, 20],
	text:"0"
}

var pscale = new Static(dialog){
	text:"scale:",
	position: new Point(142, 182)
};
	pscale.setSize(pscale.bestSize);

var pscaleField = new TextEdit(dialog){
	bounds:[180, 180, 25, 20],
	text:"100"
}
var poffset = new Static(dialog){
	text:"offset:",
	position:new Point(136, 202)
};
	poffset.setSize(poffset.bestSize);

var poffsetField = new TextEdit(dialog){
	bounds: [180, 200, 25, 20],
	text:"0"
};

var pdist = new Static(dialog){
	text:"dist:",
	position: new Point(52, 182)
};
	pdist.setSize(pdist.bestSize);

var pdistField = new TextEdit(dialog){
	bounds:[78, 180, 25, 20],
	text:"1.4"
}
var pdensity = new Static(dialog){
	text:"density:",
	position:new Point(31, 202)
};
	pdensity.setSize(pdensity.bestSize);

var pdensityField = new TextEdit(dialog){
	bounds: [78, 200, 25, 20],
	text:"3"
};
var transButton = new Button(dialog){
	text:"GO !!",
	position:new Point(145,124),
	onClick : function(){
	
var estep=estepField.text;
var erotate=erotateField.text;	
var escale=escaleField.text;	
var emvx=emvxField.text;	
var emvy=emvyField.text;

var bc=bcColorField.text;
var bm=bmColorField.text;
var by=byColorField.text;
var bk=bkColorField.text;
var bwidth=bwidthField.text;

var fc=fcColorField.text;
var fm=fmColorField.text;	
var fy=fyColorField.text;	
var fk=fkColorField.text;	
var fwidth=fwidthField.text;			

var stepi=0;

		var black,cyan,magenta,yellow,alpha
		var art = new Path();		
		var shapes =  activeDocument.getMatchingItems(Path, {selected: true});

   for (stepi=0; stepi<=estep; stepi++) { 
	
		for (var j = 0; j <shapes.length; j++) 			
	{			
	var art = shapes[j];
//
	var mvx=stepi*emvx/estep;
	var mvy=stepi*emvy/estep;
	var scale=(100-stepi*(100-escale)/estep)/100;
	var rotate=stepi*erotate*Math.PI /(180*estep);
	var cyan=bc-stepi*(bc-fc)/estep;
	var magenta=bm-stepi*(bm-fm)/estep;
	var yellow=by-stepi*(by-fy)/estep;
	var black=bk-stepi*(bk-fk)/estep ;
	var width=bwidth-stepi*(bwidth-fwidth) / estep;
		
	var sdColor=new CMYKColor(cyan/100,magenta/100,yellow/100,black/100,alpha/100);	
		
	art=art.clone();
	var targetPoint = art.bounds.center; 

	art.style.stroke.width=width;
	art.style.stroke.color=sdColor;
	
	art.translate(mvx, mvy);
	var targetPoint = art.bounds.center; 	

	art.scale(scale,scale);
	var scalePos = art.bounds.center;
	var move = targetPoint.subtract(scalePos);
	art.translate(move);
	var targetPoint = art.bounds.center; 

	art.rotate(rotate,targetPoint);
	var rotatePos = art.bounds.center;
	var move = targetPoint.subtract(rotatePos);
	art.translate(move);
//
		print('::stepi: '+stepi);
		}
	}	
	stepi=0;width=0;scale=0;rotate=0;
}
	
};
transButton.setSize(60,20);

var scatterButton = new Button(dialog){
	text:"GO !!",
	position:new Point(145,225),
	onClick : function(){	
var rotate=protateField.text;
var scale=pscaleField.text;
var prandom=true; //prandam only true

	try{ 
		for(var i=0;i<dot.length;i++)
		{
			var working = dot[i].valid;
			if(working)
			{
				dbug('the dot-object is valid: '+dot[i]);
			}else{
				print('::error: one dot-object is not valid, is it still existent?');
				return;
			}
		}
	}catch(e){ 
		print('::error: there is no dot-object, did you assign a dot-object via dialog?');
		return;
	}
	
	try{
		var working = shapes[0].valid;
		if(working)
		{
			dbug('the shapes are valid: '+shapes);
		}else{
			print('::error: shape values are not valid, are they still existent?');
			return;
		}
	}catch(e){
		print('::error: there are no shapes, did you assign a shape via dialog?');
		return;
	}
	
	dbug('shapes are now: '+shapes);
	dbug('dot-objects are now: '+dot);
	
	for(var i=0;i<dot.length;i++)
	{
		var zeroPoint = new Point(0,0);
		var currentPos = dot[i].bounds.center;
		var move = zeroPoint.subtract(currentPos);
		dot[i].translate(move);		
	}	
	gPaths = new Array();
	groupObjs = new Array();
	dotPoints = new Array();
	for(var i=0;i<shapes.length;i++)
	{
		var shape = shapes[i];
		if (shape != null) 
		{
			if(shape.hasChildren()) 
			{
				ungroupRecoursiveAndCtp(shape); 
			}
			else 
			{
				ctp(shape);
			}
		}
	}
		
	var finalGroup = new Group();
	
	for(var m=0;m<dotPoints.length;m++)
	{
		var currentPoint = dotPoints[m];
		
		var x = currentPoint.x;
		var y = currentPoint.y;
		var rndDotNr = randomBetween(0, dot.length - 1);
		var dotClone = dot[rndDotNr].clone();
		dotClone.translate(x,y);		
//
if(prandom){
		// rotate  the obj
			var angle = (Math.random() * rotate) * Math.PI/180; 
			var dotCenterPoint = dotClone.bounds.center; 
			dotClone.rotate(angle,dotCenterPoint); 		
		//  scale the obj
			var maxScaleFactor = (scale / 100);
			if(maxScaleFactor>=1){
				var randomScaleFactor = randomBetweenFloat(1,maxScaleFactor);
			}
			else
				var randomScaleFactor = randomBetweenFloat(maxScaleFactor,1);
			var targetPos = dotClone.bounds.center;
			dotClone.scale(randomScaleFactor,randomScaleFactor);
			var currPos = dotClone.bounds.center;
			var move = targetPos.subtract(currPos);
			dotClone.translate(move);
	}
	else {
		// rotate  the obj	
			var angle =rotate* Math.PI/180; 
			var dotCenterPoint = dotClone.bounds.center; 
			dotClone.rotate(angle,dotCenterPoint); 
		//  scale the obj	
			var maxScaleFactor = (scale / 100);
			var targetPos = dotClone.bounds.center;
			dotClone.scale(maxScaleFactor,maxScaleFactor);
			var currPos = dotClone.bounds.center;
			var move = targetPos.subtract(currPos);
			dotClone.translate(move);
	}	
		finalGroup.appendChild(dotClone);
	}	
}
	
};
scatterButton.setSize(60,20);

//Stroke division selection
var strokeButton = new Button(dialog){
	text:"Stroke",
	position:new Point(10,225),
	onClick : function(){
	
	targetStroke();
	}
};
	strokeButton.setSize(60,20);

//Dot division selection
var dotButton = new Button(dialog){
	text:"Dot",
	position:new Point(78,225),
	onClick : function(){	
	targetDot();
	}
};
	dotButton.setSize(60,20);

var thewordFrame=new Frame(dialog){
	text:"back",
	size:[60,130],
	position: new Point(3,0)
};

var pathFrame=new Frame(dialog){
	text:"front",
	size:[60,130],
	position:new Point(65,0)
};

var pathFrame=new Frame(dialog){
	text:"",
	size:[84,143],
	position:new Point(128,6)
};

var selectionFrame=new Frame(dialog){
	text:"Stroke scatter",
	size:[210,104],
	position:new Point(3, 148)
};

dialog.setSize(216, 254);
dialog.setVisible(true);
dialog.onClose = function() {
        this.destroy();
};


