﻿#include "../yScripts/y_JSExtensions.jsx";
function YCPOffset()
{
    this.info =
    {
	name : "YCornerPinOffset",
	version : 0.12,
	stage : "development",
	description : "Offsets each corner of a CornerPin Effect.",
	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.ver + ' ' + this.info.stage + "',\
	    info: Group \
	    {\
		alignment:['center','bottom'],\
		icon: Image \
		{\
		    icon:'" + this.resources.icon.path + '/' + this.resources.icon.name + "',\
		    preferredSize: [15, 18]\
		},\
		website: StaticText\
		{\
		    text:'" + this.info.url + "',\
		    alignment:['fill','center']\
		},\
	    }\
	}";
    }
    this.createUI = function createUI()
    {
	    res = 
	    "window {\
		resizeable : true\
		closeButton : true\
		text:'wtf'\
	    }"		    
		
	this.window = new Window( res );
	this.window.layout.layout(true);
	this.window.center();
	this.window.show();
    }
    this.yMainFunction = function yMainFunction()
    {
	//if called from the button as opposed as from the script.
	if ( String(this) == "[object Button]" )
	{
	    this.yTool.processCornerPins();
	}
	else
	{
	    this.processCornerPins();
	}
	
    }
    this.getSelectedCornerPins = function getSelectedCornerPins()
    {
	/* Function that returns a list of  effect objects 
	that match any of the names
	specified in validCornerPinNames. */
	validCornerPinNames = ["ADBE Corner Pin","CC Power Pin"];

	selectedLayers = app.project.activeItem.selectedLayers;
	cornerPins = [];
	for (layer=0;layer<selectedLayers.length;layer++)
	{
	    myLayer = selectedLayers[layer];
	    myEffects = myLayer.property("ADBE Effect Parade");
	    for(effect=1;effect<=myEffects.numProperties;effect++)
	    {
		for(validCornerPinName=0;validCornerPinName<validCornerPinNames.length;validCornerPinName++)
		{
		    if ( myEffects.property(effect).matchName == validCornerPinNames[validCornerPinName] )
		    {
			cornerPins.push(myEffects.property(effect));
		    }
		}
	    }
	}	
	return cornerPins;
    }
    this.getLayer = function getLayer(effect)
    {
	/* If given a layer's effect object
	this function returns the layer object */
	layer = effect.parentProperty.parentProperty;
	return layer;
    }
    this.addEffect = function addEffect(layer,effect_string,effect_name)
    {
	new_effect = layer.property("ADBE Effect Parade").addProperty(effect_string);
	new_effect.name = effect_name;
	return new_effect;
    }
    this.addPointControls = function addPointControls(effect)
    {
	/*calling the getLayer(effect) is resetting my effect object to null, and not allowing me to do everything in a single sitting. I think it has to do with variable scopes.*/
	local = {};
	local.effect = effect;    
	base_name = local.effect.name;
	names = ["Upper Left","Upper Right","Lower Left","Lower Right"];

	for (i=1;i<=4;i++)
	{
	    expression = '\
	    try\
	    {\
		effect("'+base_name+'")('+(i)+')+effect("'+base_name+'_'+names[i-1]+'_'+'Offset'+'")("Point")\
	    }\
	    catch(err)\
	    {\
		[0,0]\
	    }'
	local.effect.property(i).expression = expression;
	}
	layer = this.getLayer(effect);
	for(i=0;i<=3;i++)
	{
	    new_effect = this.addEffect(layer,"Point Control",base_name+"_"+names[i]+"_"+"Offset");
	    new_effect.property("Point").setValue([0,0]);
	}
    }
    this.processCornerPins = function processCornerPins(){
    
	app.beginUndoGroup('ySetProject');
	pins = this.getSelectedCornerPins();

	for(pin=0;pin<pins.length;pin++)
	{
	    this.addPointControls(pins[pin])
	}
	app.endUndoGroup();
    }
    
    this.activate = this.yMainFunction;
    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')
{
    yCPOffset = new YCPOffset();
    yCPOffset.activate();
}
else
{
    yCPOffset = YTB.addTool(new YCPOffset());
}
