// KARIAN FOEHR | DIEGO THONNEY | JAN ABELLAN

script.coordinateSystem = 'bottom-up';
script.angleUnits = 'radians';

//tool.distanceThreshold = 10;

// PALETTE ITEMS
var values = {
	jumper: 12,
	lengther: 12,
	widther: 12,
	liner: 2,
	speedWidth: true,
	slideTime: 1
};

var min = 0;
var max = 2;

var items = {
		
		speedWidth:  {
			type: 'checkbox',
			label: 'Width by Speed',
			value: true
		},
		widther:  {
			type:  'number',  label: 'Width',
			value: 12, range: [0, 100],
			steppers: true
		},
		lengther:  {
			type:  'number',  label: 'Length',
			value: 12, range: [0, 400],
			steppers: true
		},
		liner:  {
			type:  'number',  label: 'Line Number',
			value: 2, range: [0, 50],
			steppers: true
		},
		flashBack: {
			type: 'button', 
			label: 'Back',
			value:'<',
			onClick: function() {
				backForward = false;
				timeTravel();
			}
		},
		flashForward: {
			type: 'button', 
			label: 'Forward',
			value:'>',
			onClick: function() {
				backForward = true;
				timeTravel();
			}
		},
		jumper:  {
			type:  'number',  label: 'Travel Steps',
			value: 12, range: [0, 100],
			steppers: true
		},
		magicStep: {
			type: 'button', 
			label: 'Flashback',
			value:'«',
			onClick: function() {
				magicStep();
			}
		},
		slideTime: {
			type: 'slider', label: 'SlideTime',
			value: 0,
			range: [min, max],
			onChange: function() {
				slideTime();
			}
		},
		player: {
			type: 'button', 
			label: 'Animation',
			value:'Play',
			onClick: function() {
				playAnim();
			}
		},
				showLayers: {
			type: 'button', 
			label: 'All Layers',
			value:'Show/Hide',
			onClick: function() {
				isVisible = !isVisible;
				showHide();
			}
		},
		reseter: {
			type: 'button', 
			label: 'Reset',
			value:'Reset',
			onClick: function() {
				resetDocument();
			}
		},	
		help: {
			type: 'button',
			value: 'Instructions',
			onClick: function() {
				if(this.value == 'Instructions') {
					this.value = 'Close Instructions';
					items.instructions.value = '\n- Click and drag to draw\n' +
													'- Drawing is much faster in outline mode (cmd+y)\n'+
													'- Possibility to lock the first layer (to put markers or reference images)\n'+
													'|\n' +
													'- Update Bandit width by drag speed\n' +
													'- Change the Bandit width\n' +
													'- Change the Bandit length\n' + 
													'- Change the number of lines\n' +
													'- Back/Forward (you can change the number of steps)\n'+
													'- Flashback button brings you back at the beginning of the previous Bandit\n'+
													'- SlideTime change the frame\n'+
													'- Play the animation (press space to stop)\n'+
													'- Show/Hide all layers\n'+
													'- Reset the animation (locked layer will not be erased)';
													
					items.instructions.height = null;
				} else {
					this.value = 'Instructions';
					items.instructions.value = '';
					items.instructions.height = 0;
				}
			}
		},

		instructions: {
			type: 'text',
			multiline: true,
			fullSize: true,
			value: '',
			height: 0
		},
		
		framing: {
			type: 'text', fullSize: true,
			value: 'YOU ARE ON FRAME 1',
		}
		
};

// PALETTE 
var palette = new Palette('TIME BANDIT', items, values);
palette.position = (0, 0);

// VARIABLES
var layer;
var points;
var paths = [];

var lineNumber;
var angle = (90).toRadians();

var items;

var onLayer;
var newLayer;

var numNewLayer;
var numLayerString;
var numLayerInt;
var nextLayer;

var oldLayer;

var backForward;
var isVisible = false;

///////////////////////////////////////////////////////////////////////////MOUSE_DOWN

function onMouseDown (event){	
	for(var i = 0; i < lineNumber; i++) {
	//BEGIN PATH
		path = new Path();
		path.add(event.point);
		//path.closed = true;
		path.smooth();
		paths.push(path);
	}
	
	// INITIALIZE ARRAY
	points = [];
	lineNumber = values.liner;
	
	// SAVE MAGIC STEP
	oldLayer = document.activeLayer;
}

///////////////////////////////////////////////////////////////////////////MOUSE_DRAG

function onMouseDrag (event){
	
	// SAVE POINTS
	points.push(event.middlePoint);
	drawBandit(values.lengther);
}

///////////////////////////////////////////////////////////////////////////MOUSE_UP

function onMouseUp(event) {

	script.showProgress = false;
	
	// END TIME BANDIT
	while (points.length > 0) {
		drawBandit();
		points.shift();
		document.redraw();
	}
	points = [];
}

	// DRAW TIME BANDIT
function drawBandit() {

	// ANIMATION LAYERS
	newLayer = document.activeLayer;
	
	// JURG IS THE TIME BANDIT
	newLayer.visible = false;
	var index = findLayerIndex(newLayer);
	//print(index);
	if(index == 0) {
		layer = new Layer();
		max += 1;
		items.slideTime.range = [min, max]; 
	} else {
		layer = document.layers[index - 1];
		layer.visible = true;
		layer.activate();
		document.redraw();
	}
	
	// PRINT LAYER DEPTH
	numLayerString = newLayer.name.substring(7, 13);
	numLayerInt = parseInt(numLayerString);
	//print("You are on frame " + layer);
	values.framing = "YOU ARE ON FRAME " + (numLayerInt + 1);
	
	// UPDATE SLIDE
	values.slideTime = numLayerInt + 1;

	for (var i = 0; i < lineNumber; i++) {
	
		path = new Path();
		paths.push[path];
	
	// PALETTE CONTROL LAYER
		onLayer = document.activeLayer;

	// DRAWING LOOP
		for (var loop = 1; loop < points.length; loop++) {
			var currentPoint = points[loop];
			var lastPoint = points[loop - 1];
			var angle = (90).toRadians();
			var step = currentPoint - lastPoint;
			
	// CONTROL BANDIT WIDTH
			if (values.speedWidth){
				step.length = step.length * i * (values.widther/100);
			} else {
				step.length = values.widther * i * (values.widther/100);
			}
			
			step.angle += angle;
			path.add(currentPoint + step);
			path.insert(0, currentPoint - step);
			path.closed = true;
		}
		path.smooth();
		
	// CORRUPT END HANDLES
	var segment = path.add(points[points.length]);
	segment.handleIn = null;
	segment.handleOut = null;
	
	}
	
	// SHIFT POINTS
	while (points.length > values.lengther) {
		points.shift();
	}

}

// TIME BACK FORWARD
function timeTravel(){
	if (!onLayer) {
		onLayer = document.activeLayer;
	}	
	onLayer.visible = false;

	if (!backForward){
		numNewLayer = findLayerIndex(onLayer) + values.jumper;
		
		// LOCKED LAYER CONDITION
		if (numNewLayer > document.layers.length - 1 && document.layers[document.layers.length - 1].locked == false) {
			numNewLayer = document.layers.length - 1;
		} else if (numNewLayer > document.layers.length - 1) {
			numNewLayer = document.layers.length - 2;
		}
		newLayer = document.layers[numNewLayer];
	} else {
		numNewLayer = findLayerIndex(onLayer) + values.jumper * -1;
		if (numNewLayer < 0) {
			numNewLayer = 0;
		}
		newLayer = document.layers[numNewLayer];
	}
		// PRINT LAYER DEPTH
		numLayerString = newLayer.name.substring(7, 13);
		numLayerInt = parseInt(numLayerString);
		//print("You are on frame " + numLayerInt);
		values.framing = "YOU ARE ON FRAME " + numLayerInt;
		
		//UPDATE SLIDE
		values.slideTime = numLayerInt;
		
		newLayer.visible = true;
		newLayer.activate();
		onLayer = newLayer;
}

// MAGIC_STEP
function magicStep(){
	if (!onLayer) {
		onLayer = document.activeLayer;
	}
	onLayer.visible = false;
	
	numNewLayer = findLayerIndex(oldLayer);
		
	// LOCKED LAYER CONDITION
	if (numNewLayer > document.layers.length - 1 && document.layers[document.layers.length - 1].locked == false) {
		numNewLayer = document.layers.length - 1;
	} else if (numNewLayer > document.layers.length - 1) {
		numNewLayer = document.layers.length - 2;
	}
	newLayer = document.layers[numNewLayer];
		
	// PRINT LAYER DEPTH
	numLayerString = newLayer.name.substring(7, 12);
	numLayerInt = parseInt(numLayerString);
	//print("You are on frame " + numLayerInt);
	values.framing = "YOU ARE ON FRAME " + numLayerInt;
		
	//UPDATE SLIDE
	values.slideTime = numLayerInt;

	newLayer.visible = true;
	newLayer.activate();
	onLayer = newLayer;
}

//SLIDETIME								
function slideTime(){
	if (!onLayer) {
		onLayer = document.activeLayer;
	}	
	onLayer.visible = false;

	numNewLayer =  document.layers.length - values.slideTime;

	// LOCKED LAYER CONDITION
	if (numNewLayer > document.layers.length - 1 && document.layers[document.layers.length - 1].locked == false) {
		numNewLayer = document.layers.length - 1;
	} else if (numNewLayer > document.layers.length - 1) {
		numNewLayer = document.layers.length - 2;
	}
	
	if (numNewLayer < 0) {
		numNewLayer = 0;
	}
	
	newLayer = document.layers[numNewLayer];
	newLayer.visible = true;
	newLayer.activate();
	onLayer = newLayer;
	
	// PRINT LAYER DEPTH
	numLayerString = newLayer.name.substring(7, 13);
	numLayerInt = parseInt(numLayerString);
	//print("You are on frame " + numLayerInt);
	values.framing = "YOU ARE ON FRAME " + numLayerInt;
	
	//UPDATE SLIDE
	values.slideTime = numLayerInt;
	items.slideTime.range = [min, max];
}

// LAYER INDEX
function findLayerIndex(findLayer) {
	var layers = document.layers;
	for (var i = 0; i < layers.length; i++) {
		if (layers[i] == findLayer) {
			return i;
		}
	}
	return -1;
}

var index = findLayerIndex(document.activeLayer);
//print(index);

// RESETER
function resetDocument(){
	layer = new Layer();
	
	// PRINT LAYER DEPTH
	numLayerString = layer.name.substring(0, 7);
	layer.name = numLayerString + "1";
	//print("You are on frame 1");
	values.framing = "YOU ARE ON FRAME  1";
	
	//UPDATE SLIDE
	values.slideTime = 1;
	
	layer.activate();
	
	var allLayers = document.layers;
	
	// LOCKED LAYER CONDITION
	var isLocked;
	if (document.layers[document.layers.length - 1].locked == false) {
		isLocked = 1;
	} else {
		isLocked = 2;
	}
	
	for (var i = allLayers.length - isLocked; i  >= 0; i--) {
		var layerToErase = allLayers[i];
		if (layerToErase != layer) {
			//print(layerToErase);
			layerToErase.remove();
		}
	}
}

// PLAYER
function playAnim() {
	script.showProgress = false;
	var curLayer = document.activeLayer;
	var  index = findLayerIndex(curLayer);
	while (curLayer && !Key.isDown('space')) {
		index --;
		nextLayer = document.layers[index];
		if (nextLayer) {
			curLayer.visible = false;
			nextLayer.visible = true;
			nextLayer.activate();
			onLayer = nextLayer;
		}
		curLayer = nextLayer;
		
		// PRINT LAYER DEPTH
		if(curLayer) {
			numLayerString = curLayer.name.substring(7, 13);
			numLayerInt = parseInt(numLayerString);
			//print("You are on frame " + numLayerInt);
			values.framing = "YOU ARE ON FRAME " + numLayerInt;
			
			//UPDATE SLIDE
			values.slideTime = numLayerInt;
		}

		document.redraw();
	}
}

// SHOW_HIDE LAYERS
function showHide(){
	
	if (!onLayer) {
		onLayer = document.activeLayer;
	}
	
	allLayers = document.layers;

	if (isVisible){
		for (var i = allLayers.length - 1; i  >= 0; i--) {
			var layersToShow = allLayers[i];
			if (layersToShow != layer) {
				layersToShow.visible = true;
			}
		}
	} else {
		for (var i = allLayers.length - 1; i  >= 0; i--) {
			var layersToHide = allLayers[i];
			if (layersToHide != layer) {
				layersToHide.visible = false;
			}
		}
		onLayer.visible = true;
	}
}
