﻿#include "../yScripts/y_JSExtensions.jsx";
function YBindBetween2()
{
    this.info =
    {
	name : "yBindBetween2",
	version : 0.13,
	stage : "development",
	description : "Constraints a layer between two others, position and rotation-wise",
	url : "yorchnet.com"
    };
    this.appearence =
    {
	buttonHeight : 30,
	buttonWidth : 126
    };
    this.resources = 
    {
	icon : new File('yNet.png'),
    };
    this.init = function init()
    {
        
	this.btnLauyout = 
	"button\
	 {\
	    preferredSize: ['" + this.appearence.buttonWidth + "','" + this.appearence.buttonHeight + "'],\
	    text:'" + this.info.name + "',\
	    helpTip:'" + this.info.description + "'\
	 }";
	
	this. res = 
	"window { \
	    type:'palette' ,\
	    text:'" + this.info.name + ' ' + this.info.version + "',\
	    margins:[10,10,10,10],\
	    spacing:[5,5,5,5]\
		\
		lst_layer: DropDownList\
		{\
		    title:'layer to constrain',\
		    preferredSize:[150,35],\
		    textSelection:'Escoge',\
		    helpTip:'Select the layer you wish to constrain'\
		}\
		lst_pa: DropDownList\
		{\
		    title:'parent a',\
		    preferredSize:[150,35],\
		    textSelection:'Escoge',\
		    helpTip:'Select the first parent'\
		}\
		lst_pb: DropDownList\
		{\
		    title:'parent b',\
		    preferredSize:[150,35],\
		    textSelection:'Escoge',\
		    helpTip:'Select the second parent'\
		}\
		exec_btn: Button\
		{\
		    text:'do It',\
		    preferredSize:[150,35],\
		    helpTip:'do it'\
		}\
		info: Group\
		{\
		    alignment:['center','bottom'], \
		    icon: Image\
		    {\
			preferredSize: [15, 18]\
		    },\
		    website: StaticText\
		    {\
			text:'" + this.info.url + "', alignment:['fill','center']\
		    },\
		}\
	    }";
    }
    this.createUI = function createUI()
    {
		
	this.window = new Window( this.res );
	this.refresh();
	this.window.exec_btn.onClick = this.run;
	this.window.layout.layout(true);
	this.window.center();
	this.window.show();
    }
    this.yMainFunction = function yMainFunction()
    {
        this.createUI();
    }
    this.activate = function activate()
    {
	this.yTool.yMainFunction();
    }
    this.run = function run()
    {
	app.beginUndoGroup('Bind Between Two');

	selectedLayerName=String(this.window.lst_layer.selection);
	parentALayerName=String(this.window.lst_pa.selection);
	parentBLayerName=String(this.window.lst_pb.selection);
	layerN = selectedLayerName.substr(0, selectedLayerName.indexOf('.'));
	paN = parentALayerName.substr(0, parentALayerName.indexOf('.'));
	pbN = parentBLayerName.substr(0, parentBLayerName.indexOf('.'));
	layer = app.project.activeItem.layers[layerN];
	pa = app.project.activeItem.layers[paN];
	pb = app.project.activeItem.layers[pbN];
	layer("Effects").addProperty("Layer Control");
	layer("Effects")("Layer Control").name = 'ctrl01';
	layer("Effects")("ctrl01")("Layer").setValue(pa.index);     
	layer("Effects").addProperty("Layer Control");
	layer("Effects")("Layer Control").name = 'ctrl02';
	layer("Effects")("ctrl02")("Layer").setValue(pb.index);
	layer("Effects").addProperty("Angle Control");
	layer("Effects")("Angle Control").name = 'offset';
	layer("Effects")("offset")("Angle").setValue(0);
	layer("Effects").addProperty("Slider Control");
	layer("Effects")("Slider Control").name = 'weight';
	layer("Effects")("weight")(1).setValue(50);
	layer("Effects").addProperty("Checkbox Control");
	layer("Effects")("Checkbox Control").name = 'stretch';
	posExp ='\
	    a = effect("ctrl01")("Layer");\
	    b = effect("ctrl02")("Layer");\
	    aPos = a.toComp(a.anchorPoint);\
	    bPos = b.toComp(b.anchorPoint);\
	    w= effect("weight")(1)/100;\
	    (aPos*(1-w)+bPos*(w))'
	rotExp ='\
	    a =effect("ctrl01")("Layer");\
	    b = effect("ctrl02")("Layer");\
	    aPos = a.toComp(a.anchorPoint);\
	    bPos = b.toComp(b.anchorPoint);\
	    rx =  lookAt(aPos,bPos)[0];\
	    ry = lookAt(aPos,bPos)[1];\
	    offset = effect("offset")("Angle");\
	    if (aPos[1] > bPos[1]){\
		(ry) -90 + offset\
	    }else{\
		90 - (ry) + offset\
	    }'
	scaleExp ='\
	    a = effect("ctrl01")("Layer");\
	    b = effect("ctrl02")("Layer");\
	    aPos = a.toComp(a.anchorPoint);\
	    bPos = b.toComp(b.anchorPoint);\
	    d = Math.sqrt(Math.pow((aPos[0]-bPos[0]),2)+Math.pow((aPos[1]-bPos[1]),2));\
	    x = transform.scale[0];\
	    y = transform.scale[1];\
	    sx = ((d*100)/this.width)/100;\
	    stretch = effect("stretch")("Checkbox");\
	    if(stretch==true){\
		[x*sx,y]\
	    }else{\
		[x,y]\
	    }'

	layer.transform.position.expression = posExp;
	layer.transform.rotation.expression= rotExp;
	layer.transform.scale.expression= scaleExp;

	app.endUndoGroup();
    }

    this.refresh = function refresh()
    {

	var lists = [ this.window.lst_pa , this.window.lst_layer , this.window.lst_pb ]//they should be in this order for the assignment of the selection index works right/

	for(i=0;i<lists.length;i++)
	{
	    lists[i].removeAll();
	}

	var sel = app.project.activeItem.selectedLayers;
	var compLayers = app.project.activeItem.layers;
	var selectableLayers = [];
	for ( var i = 1 ; i <= compLayers.length ; i++ )
	{
	    selectableLayers.push(compLayers[i]);
	}

	var lst_layer = this.window.lst_layer;
	var lst_pa = this.window.lst_pa;
	var lst_pb = this.window.lst_pb;

	for( var i = 0 ; i < lists.length ; i++ )
	{
	    for( j = 0 ; j < selectableLayers.length ; j++ )
	    {
		lists[i].add('item',selectableLayers[j].index+"."+selectableLayers[j].name);		
	    }
	}
	
	lst_layer.selection = 0;
	lst_pa.selection = 0;
	lst_pb.selection = 0;
    }

    this.init();
    return this;
}

//CHECKS that the toolbox exists, and if it doesn´t it runs the script on its own.
if (typeof(YTB)=='undefined')
{
    yBindBetween2 = new YBindBetween2();
    yBindBetween2.activate();
}
else
{
    YTB.addTool(new YBindBetween2());
}
