if(scriptographer.version < 2.9){
			script.coordinateSystem = 'bottom-up';
			script.angleUnits = 'radians';
}

sCase = [
			'Cardioid when k = 1\nNephroid when k = 2',
			'Limacon when R = r\nEpicycloid when d = r',
			'Deltoid when k = 3\nAstroid when k = 4',
			'Hypocycloid when d = r\nEllipse when R = 2r'
]

var components = {
			rTypeRuler:{
						type: 'ruler',
						label: 'Roulette Type',
			},
			rTypeList:{
						type: 'list',
						options: ['Epicycloid', 'Epitrochoid', 'Hypocycloid', 'Hypotrochoid'],
						onChange: function(value){
									switch(value){
												case 'Epicycloid':
															components.sCase.value = sCase[0]
															components.rotorOffset.enabled = false
															break
												case 'Epitrochoid':
															components.sCase.value = sCase[1]
															components.rotorOffset.enabled = true
															break
												case 'Hypocycloid':
															components.sCase.value = sCase[2]
															components.rotorOffset.enabled = false
															break
												case 'Hypotrochoid':
															components.sCase.value = sCase[3]
															components.rotorOffset.enabled = true
															break
									}
						}
			},
			sCase:{
						type: 'text',
						width: 120,
						value: sCase[0],
			},
			statRotRuler:{
						type: 'ruler',
						label: 'Stator/Rotor ratio (k)',
			},
			stator:{
						type: 'number',
						label: 'Stator (R)',
						steppers: true,
						width: 40,
						value: 3,
			},
			rotor:{
						type: 'number',
						label: 'Rotor (r)',
						steppers: true,
						width: 40,
						value: 1,
			},
			rotorOffset:{
						type: 'number',
						label: 'Rotor Offset (d)',
						steppers: true,
						enabled: false,
						width: 40,
						value: 1,
			},
			appearanceRuler:{
						type: 'ruler',
						label: 'Appearance',
			},
			sizeMult:{
						type: 'number',
						label: 'Size',
						steppers: true,
						min: 1,
						width: 40,
						value: 10,
			},
			plotAngle:{
						type: 'number',
						label: 'Plot every X angle',
						steppers: true,
						min: 1,
						width: 40,
			},
			btnRuler:{
						type: 'ruler',
			},
			btn:{
						type: 'button',
						value: 'Go!',
						onClick: function(){
									plotRoulette()
						}
			},
}

var palette = new Palette('Roulettes', components)

function plotRoulette() {
			var step = components.plotAngle.value.toRadians()
			var path = new Path() {position: document.size / 2}
			var theta = 0
		
			var R = components.stator.value * components.sizeMult.value
			var r = components.rotor.value * components.sizeMult.value
			var d = components.rotorOffset.value * components.sizeMult.value
		
			var i = 0

			while(i <= 360 / components.plotAngle.value * components.rotor.value){
						switch(components.rTypeList.value){
									case 'Epicycloid':
												path.lineTo(new Point((R + r) * Math.cos(theta) - r * Math.cos((R + r) / r * theta), (R + r) * Math.sin(theta) - r * Math.sin((R + r) / r * theta)))
												break
									case 'Epitrochoid':
												path.lineTo(new Point((R + r) * Math.cos(theta) - d * Math.cos((R + r) / r * theta), (R + r) * Math.sin(theta) - d * Math.sin((R + r) / r * theta)))
												break
									case 'Hypocycloid':
												path.lineTo(new Point((R - r) * Math.cos(theta) + r * Math.cos((R - r) / r * theta), (R - r) * Math.sin(theta) - r * Math.sin((R - r) / r * theta)))
												break
									case 'Hypotrochoid':
												path.lineTo(new Point((R - r) * Math.cos(theta) + d * Math.cos((R - r) / r * theta), (R - r) * Math.sin(theta) - d * Math.sin((R - r) / r * theta)))
												break
						}
						theta += step
						i++
			}

			path.closed = true
			path.position = document.size / 2
}