function reflection(n, k, direction_changed){
	a = document.getElementById("angle");
	a.value = parseFloat(a.value);
	if(isNaN(a.value))
		a.value = parseFloat($.cookie('angle'));
	if(isNaN(a.value) || a.value<0)
		a.value = 0;
	if(a.value>90)
		a.value = 90;
	angle = a.value;
	
	if( document.getElementById("out").checked || (!document.getElementById("in").checked && $.cookie("direction") == "out") )
		direction = "out";
	else
		direction = "in";
	document.getElementById(direction).checked = true;
	
	$.cookie("angle", angle);
	$.cookie("direction", direction);
	
	if(direction == "in"){
		n1 = Complex.one;
		n >= 0 ? n2 = new Complex(n, k) : n2 = new Complex(-1*n, k); // regular or metamaterials with n<0
	}
	else{
		n >= 0 ? n1 = new Complex(n, k) : n1 = new Complex(-1*n, k);;
		n2 = Complex.one;
	}

	sin1 = Complex.sin(new Complex(deg2rad(angle), 0));
	sin2 = Complex.mult(Complex.div(n1, n2), sin1); // sin2 = n1/n2*sin1
	cos1 = Complex.sqrt(Complex.sub(Complex.one, Complex.pow(sin1, 2)));
	cos2 = Complex.sqrt(Complex.sub(Complex.one, Complex.pow(sin2, 2)));
	Rs_complex = Complex.div( Complex.sub(Complex.mult(n1,cos1), Complex.mult(n2,cos2)), Complex.add(Complex.mult(n1,cos1), Complex.mult(n2,cos2)) );
	Rp_complex = Complex.div( Complex.sub(Complex.mult(n1,cos2), Complex.mult(n2,cos1)), Complex.add(Complex.mult(n1,cos2), Complex.mult(n2,cos1)) );
	Rs = Complex.abs2(Rs_complex);
	Rp = Complex.abs2(Rp_complex);

	document.getElementById("R").innerHTML = ((Rs+Rp)/2).toFixed(5);
	
	if(angle == 0){
		phi = rad2deg(Complex.car2pol(Rs_complex).im);
		document.getElementById("phi").innerHTML = phi.toFixed(3*(phi!=0&&phi!=180&&phi!=-180));
		document.getElementById("R_oblique1").style.display="none";
		document.getElementById("R_oblique2").style.display="none";
		document.getElementById("phi_normal").style.display="inline";
		document.getElementById("phi_oblique").style.display="none";
	}
	else{
		document.getElementById("Rs").innerHTML = Rs.toFixed(5);
		document.getElementById("Rp").innerHTML = Rp.toFixed(5);
		phi_s = rad2deg(Complex.car2pol(Rs_complex).im);
		phi_p = rad2deg(Complex.car2pol(Rp_complex).im);
		document.getElementById("phi_s").innerHTML = phi_s.toFixed(3*(phi_s!=0&&phi_s!=180&&phi_s!=-180));
		document.getElementById("phi_p").innerHTML = phi_p.toFixed(3*(phi_p!=0&&phi_p!=180&&phi_p!=-180));
		document.getElementById("R_oblique1").style.display="inline";
		document.getElementById("R_oblique2").style.display="inline";
		document.getElementById("phi_normal").style.display="none";
		document.getElementById("phi_oblique").style.display="inline";
	}
	
	if(direction_changed){
		n_abs = Math.sqrt(Math.pow(n,2)+Math.pow(k,2));
		
		// Brewster's angle
		if(direction == "in")
			θ_b = rad2deg(Math.atan(n_abs));
		else
			θ_b = rad2deg(Math.atan(1/n_abs));
		document.getElementById("θ_b").innerHTML = θ_b.toFixed(3);
		
		//Critical angle (only for escaping beam)
		if(direction == "out"){
			if(n_abs>=1)
				θ_c = rad2deg(Math.asin(1/n_abs)); // conventional materials
			else
				θ_c = rad2deg(Math.asin(n_abs)); // metamaterials with -1<n<1
			document.getElementById("θ_c").innerHTML = θ_c.toFixed(3);
			document.getElementById("CriticalAngle").style.display="inline";
		}
		else
			document.getElementById("CriticalAngle").style.display="none";
			
		// Plot
		Rs_array = new Array();
		Rp_array = new Array();
		R_array = new Array();
		i = 0;
		for(θ=0; θ<=90; θ+=0.1){
			sin1 = Complex.sin(new Complex(deg2rad(θ), 0));
			sin2 = Complex.mult(Complex.div(n1, n2), sin1); // sin2 = n1/n2*sin1
			cos1 = Complex.sqrt(Complex.sub(Complex.one, Complex.pow(sin1, 2)));
			cos2 = Complex.sqrt(Complex.sub(Complex.one, Complex.pow(sin2, 2)));
			Rs_complex = Complex.div( Complex.sub(Complex.mult(n1,cos1), Complex.mult(n2,cos2)), Complex.add(Complex.mult(n1,cos1), Complex.mult(n2,cos2)) );
			Rp_complex = Complex.div( Complex.sub(Complex.mult(n1,cos2), Complex.mult(n2,cos1)), Complex.add(Complex.mult(n1,cos2), Complex.mult(n2,cos1)) );
			Rs = Complex.abs2(Rs_complex);
			Rp = Complex.abs2(Rp_complex);
			Rs_array[i] = [θ, Rs];
			Rp_array[i] = [θ, Rp];
			R_array[i] = [θ, (Rs+Rp)/2];
			i++;
		}
		
		chart = new Highcharts.Chart({
			chart: {
				renderTo: 'reflection_plot_container',
				defaultSeriesType: 'line',
				zoomType: 'xy'
			},
			plotOptions: {
				line: {
					marker: {
						enabled: false
					}
				}
			},
			title: {
				text: 0
			},
			xAxis: {
				title: {
					enabled: true,
					text: 'Angle of incidence, deg.'
				},
				gridLineWidth: 1,
				min: 0,
				max: 90.01,
				tickInterval: 10
			},
			yAxis: {
				title: {
					text: 'Reflectance'
				},
				lineWidth: 1,
				min: 0,
				max: 1,
				tickInterval: 0.2
			},
			tooltip: {
				shared: true,
				crosshairs: true,
				formatter: function() {				
					var s = '<b>'+ this.x.toFixed(1) +'°</b>';
					$.each(this.points, function(i, point) {
						s += '<br/>'+ point.series.name +': '+ point.y.toFixed(5);
					});
					return s;
				 }
			},
			legend: {
				layout: 'vertical',
				align: 'left',
				verticalAlign: 'top',
				x: 60,
				y: 0,
				floating: true,
				borderWidth: 0
			},
			credits: {
				href: "http://refractiveindex.info",
				text: "RefractiveIndex.INFO",
				position: {
					align: 'right',
					x: -25,
					verticalAlign: 'top',
					y: 30
				},
				style: {
					fontFamily: 'cursive',
					fontStyle: 'italic',
					fontSize: '10'
				}
			},
			exporting: {
				filename: "reflectance",
			},
			navigation: {
				buttonOptions: {
					verticalAlign: 'bottom',
					y: 0
				}
			},
			series: [{
				name: 'S-polarized',
				color: '#AA4643',
				data: Rs_array
			}, {
				name: 'P-polarized',
				color: '#4572A7',
				data: Rp_array
			}, {
				name: 'non-polarized',
				color: '#89A54E',
				data: R_array
			}]
		});
	}
}
