var margin = {top: 15, right: 30, bottom: 20, left: 0},
width = 575 - margin.left - margin.right,
height = 400 - margin.top - margin.bottom;
var parseDate = d3.time.format("%m-%d-%Y").parse;
var x = d3.time.scale()
.range([0, width]);
var y = d3.scale.linear()
.range([0, height]);
var xAxis = d3.svg.axis()
.scale(x)
.tickFormat(d3.time.format("%y"))
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("right")
.tickSize(width);
var slideValue;
var marker;
d3.csv("data.csv", function(error, data) {
data.forEach(function(d) {
d.date = parseDate(d.date);
d.rate = +d.rate;
d.idnumber = +d.idnumber;
});
var startData = data.filter(function(d) { return d.idnumber < 20140712; });
var staticDataOne = data.filter(function(d) { return d.idnumber < 20070101; });
var staticDataTwo = data.filter(function(d) { return d.idnumber < 20080804; });
var staticDataThree = data.filter(function(d) { return d.idnumber < 20081206; });
var staticDataFour = data.filter(function(d) { return d.idnumber < 20101028; });
var staticDataFive = data.filter(function(d) { return d.idnumber < 20110727; });
var staticDataSix = data.filter(function(d) { return d.idnumber < 20120524; });
var staticDataSeven = data.filter(function(d) { return d.idnumber < 20130823; });
var staticDataEight = data.filter(function(d) { return d.idnumber < 20131017; });
var animatedDataOne = data.filter(function(d) { return d.idnumber < 20080804; });
var animatedDataTwo = data.filter(function(d) { return d.idnumber > 20080802 && d.idnumber < 20081206; });
var animatedDataThree = data.filter(function(d) { return d.idnumber > 20081204 && d.idnumber < 20101028; });
var animatedDataFour = data.filter(function(d) { return d.idnumber > 20101026 && d.idnumber < 20110727; });
var animatedDataFive = data.filter(function(d) { return d.idnumber > 20110725 && d.idnumber < 20120524; });
var animatedDataSix = data.filter(function(d) { return d.idnumber > 20120522 && d.idnumber < 20130823; });
var animatedDataSeven = data.filter(function(d) { return d.idnumber > 20130821 && d.idnumber < 20131017; });
var animatedDataEight = data.filter(function(d) { return d.idnumber > 20131015 && d.idnumber < 20140712; });
var line = d3.svg.line()
.y(function(d) { return y(d.rate); })
.x(function(d) { return x(d.date); });
var svg = d3.select("#chart").append("svg")
.datum(startData)
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
svg.append("text")
.attr("class", "right label")
.text("real/$")
.attr("x", width-11)
.attr("y", -5);
x.domain([parseDate("1-1-2007"),parseDate("4-30-2015")]);
y.domain([d3.min(data,function (d) { return 0.95*d.rate}),d3.max(data,function (d) { return 1.05*d.rate})]);
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
d3.selectAll(".x.axis text")
.attr("dx", 34);
d3.select(".x.axis text")
.text("2007");
d3.selectAll(".x.axis").selectAll("text")
.attr("id", function(d,i) {return "xlabel" + i});
d3.select("#xlabel8")
.style("display", "none")
.style("opacity", 0);
svg.append("g")
.attr("class", "y axis")
.call(yAxis);
var startPath = svg.append("path")
.datum(startData)
.style("stroke", "#00a1ce")
.attr("d", line)
.attr("id", "startPath");
var staticPath = svg.append("path")
.attr("class", "static");
var animatedPath = svg.append("path")
.attr("class", "animated");
var group = svg.selectAll(".group")
.data(data)
.enter().append("g")
.attr("class", "group")
.attr("id", function(d) { return "group" + [d.idnumber]; });
var circles = group.append("circle")
.attr("class", "circle")
.attr("transform", function(d) { return "translate(" + x(d.date) + "," + y(d.rate) + ")"; } )
.attr("r", 3)
.attr("id", function(d) { return "circle" + [d.idnumber]; });
var slides = group.append("text")
.attr("x", function(d) { return x(d.date) + 10; })
.attr("y", function(d) { return y(d.rate) + 5; })
.attr("id", function(d) { return "slide" + [d.idnumber]; });
d3.select("#slide20080801").text("The run-up to")
.attr("x", function(d) { return x(d.date) - 100; })
.attr("y", function(d) { return y(d.rate) + 2; });
d3.select("#group20080801").append("text").text("the crisis")
.attr("x", function(d) { return x(d.date) - 100; })
.attr("y", function(d) { return y(d.rate) + 22; });
d3.select("#slide20081205").text("The effect of the")
.attr("x", function(d) { return x(d.date) + 10; })
.attr("y", function(d) { return y(d.rate) + 0; });
d3.select("#group20081205").append("text").text("financial crisis")
.attr("x", function(d) { return x(d.date) + 10; })
.attr("y", function(d) { return y(d.rate) + 20; });
d3.select("#slide20101027").text('The "currency war"')
.attr("x", function(d) { return x(d.date) - 97; })
.attr("y", function(d) { return y(d.rate) - 27; });
d3.select("#slide20110726").text("A 12-year high")
.attr("x", function(d) { return x(d.date) + 15; })
.attr("y", function(d) { return y(d.rate) + 5; });
d3.select("#group20110726").append("text").text("for the real")
.attr("x", function(d) { return x(d.date) + 15; })
.attr("y", function(d) { return y(d.rate) + 25; });
d3.select("#slide20120523").text("A period of")
.attr("x", function(d) { return x(d.date) - 85; })
.attr("y", function(d) { return y(d.rate) + 5; });
d3.select("#group20120523").append("text").text("depreciation")
.attr("x", function(d) { return x(d.date) - 85; })
.attr("y", function(d) { return y(d.rate) + 25; });
d3.select("#slide20130822").text("The dawn of tapering")
.attr("x", function(d) { return x(d.date) - 65; })
.attr("y", function(d) { return y(d.rate) + 25; });
d3.select("#slide20131016").text("A different")
.attr("x", function(d) { return x(d.date) - 20; })
.attr("y", function(d) { return y(d.rate) - 35; });
d3.select("#group20131016").append("text").text("currency war")
.attr("x", function(d) { return x(d.date) - 20; })
.attr("y", function(d) { return y(d.rate) - 15; });
d3.select("#slide20140711").text("Gyrations")
.attr("x", function(d) { return x(d.date) - 10; })
.attr("y", function(d) { return y(d.rate) + 35; });
d3.select("#group20140711").append("text").text("continue")
.attr("x", function(d) { return x(d.date) - 10; })
.attr("y", function(d) { return y(d.rate) + 55; });
d3.selectAll(".group text")
.style("opacity", 0);
function highlight(marker) {
d3.select(marker)
.style("opacity", 1)
.transition()
.duration(250)
.attr("r", 5.5)
.style("stroke-width",4.5)
.transition()
.duration(250)
.attr("r", 4)
.style("stroke-width",3);
}
d3.select("#next").on("click", function(){
slideValue = d3.select("#next").attr("value");
if (slideValue=="start") {
d3.select("#startPath")
.transition()
.duration(500)
.style("opacity", 0);
d3.select(".static")
.style("opacity", 1);
d3.select(".animated")
.style("opacity", 1);
d3.selectAll(".group text")
.style("opacity", 0);
d3.selectAll(".group circle")
.style("opacity", 0);
d3.selectAll("#slides div")
.transition()
.duration(500)
.style("opacity", 0);
document.getElementById("next").setAttribute("value", "one");
document.getElementById("back").setAttribute("value", "one");
staticPath.datum(staticDataOne)
.attr("d", line);
animatedPath.datum(animatedDataOne)
.attr("d", line)
.call(transition);
} else if (slideValue=="one") {
d3.selectAll("#group20080801 text")
.transition()
.duration(500)
.style("opacity", 0.5);
d3.selectAll("#slides div")
.transition()
.duration(500)
.style("opacity", 0);
document.getElementById("next").setAttribute("value", "two");
document.getElementById("back").setAttribute("value", "two");
staticPath.datum(staticDataTwo)
.attr("d", line);
animatedPath.datum(animatedDataTwo)
.attr("d", line)
.call(transition);
} else if (slideValue=="two") {
d3.selectAll("#group20081205 text")
.transition()
.duration(500)
.style("opacity", 0.5);
d3.selectAll("#slides div")
.transition()
.duration(500)
.style("opacity", 0);
document.getElementById("next").setAttribute("value", "three");
document.getElementById("back").setAttribute("value", "three");
staticPath.datum(staticDataThree)
.attr("d", line);
animatedPath.datum(animatedDataThree)
.attr("d", line)
.call(transition);
} else if (slideValue=="three") {
d3.selectAll("#group20101027 text")
.transition()
.duration(500)
.style("opacity", 0.5);
d3.selectAll("#slides div")
.transition()
.duration(500)
.style("opacity", 0);
document.getElementById("next").setAttribute("value", "four");
document.getElementById("back").setAttribute("value", "four");
staticPath.datum(staticDataFour)
.attr("d", line);
animatedPath.datum(animatedDataFour)
.attr("d", line)
.call(transition);
} else if (slideValue=="four") {
d3.selectAll("#group20110726 text")
.transition()
.duration(500)
.style("opacity", 0.5);
d3.selectAll("#slides div")
.transition()
.duration(500)
.style("opacity", 0);
document.getElementById("next").setAttribute("value", "five");
document.getElementById("back").setAttribute("value", "five");
staticPath.datum(staticDataFive)
.attr("d", line);
animatedPath.datum(animatedDataFive)
.attr("d", line)
.call(transition);
} else if (slideValue=="five") {
d3.selectAll("#group20120523 text")
.transition()
.duration(500)
.style("opacity", 0.5);
d3.selectAll("#slides div")
.transition()
.duration(500)
.style("opacity", 0);
document.getElementById("next").setAttribute("value", "six");
document.getElementById("back").setAttribute("value", "six");
staticPath.datum(staticDataSix)
.attr("d", line);
animatedPath.datum(animatedDataSix)
.attr("d", line)
.call(transition);
} else if (slideValue=="six") {
d3.selectAll("#group20130822 text")
.transition()
.duration(500)
.style("opacity", 0.5);
d3.selectAll("#slides div")
.transition()
.duration(500)
.style("opacity", 0);
document.getElementById("next").setAttribute("value", "seven");
document.getElementById("back").setAttribute("value", "seven");
staticPath.datum(staticDataSeven)
.attr("d", line);
animatedPath.datum(animatedDataSeven)
.attr("d", line)
.call(transition);
} else if (slideValue=="seven") {
d3.selectAll("#group20131016 text")
.transition()
.duration(500)
.style("opacity", 0.5);
d3.selectAll("#slides div")
.transition()
.duration(500)
.style("opacity", 0);
document.getElementById("next").setAttribute("value", "end");
document.getElementById("back").setAttribute("value", "end");
staticPath.datum(staticDataEight)
.attr("d", line);
animatedPath.datum(animatedDataEight)
.attr("d", line)
.call(transition);
} else if (slideValue=="end") {
d3.select(".static")
.style("opacity", 0);
d3.select("#startPath")
.style("opacity", 1);
d3.select(".animated")
.transition()
.duration(500)
.style("opacity", 0);
d3.selectAll(".group text")
.transition()
.duration(500)
.style("opacity", 0);
d3.selectAll(".group circle")
.transition()
.duration(500)
.style("opacity", 0);
d3.selectAll("#slides div")
.transition()
.duration(500)
.style("opacity", 0)
.transition()
.delay(500)
.duration(750)
.style("opacity", 1);
d3.selectAll(".slideeight")
.transition()
.delay(500)
.style("display", "none");
d3.selectAll(".slideintro")
.transition()
.delay(500)
.duration(750)
.style("display", "block")
.style("opacity", 1);
document.getElementById("next").setAttribute("value", "start");
document.getElementById("back").setAttribute("value", "start");
setTimeout(function() {
d3.select("#buttons #next")
.html("Start");
d3.select("#buttons #back")
.style("display", "none");
}, 500);
}
});
d3.select("#back").on("click", function(){
slideValue = d3.select("#back").attr("value");
if (slideValue=="one") {
d3.selectAll("#group20080801 text")
.style("opacity", 0);
d3.select("#circle20080801")
.style("opacity", 0);
d3.select(".static")
.transition()
.duration(500)
.style("opacity", 0);
d3.select(".animated")
.transition()
.duration(500)
.style("opacity", 0);
d3.select("#startPath")
.transition()
.delay(500)
.duration(500)
.style("opacity", 1);
d3.select("#buttons #back")
.style("display", "none");
document.getElementById("next").setAttribute("value", "start");
document.getElementById("back").setAttribute("value", "start");
d3.selectAll(".slideone")
.style("display", "none");
d3.selectAll(".slideintro")
.style("display", "block")
.style("opacity", 1);
} else if (slideValue=="two") {
d3.selectAll("#group20081205 text")
.style("opacity", 0);
d3.select("#circle20081205")
.style("opacity", 0);
d3.selectAll("#group20080801 text")
.transition()
.duration(750)
.style("opacity", 1);
marker = "#circle20080801";
highlight(marker);
document.getElementById("next").setAttribute("value", "one");
document.getElementById("back").setAttribute("value", "one");
staticPath.datum(staticDataTwo)
.attr("d", line);
animatedPath.datum(staticDataOne)
.attr("d", line);
d3.selectAll(".slidetwo")
.style("display", "none");
d3.selectAll(".slideone")
.style("display", "block")
.style("opacity", 1);
} else if (slideValue=="three") {
d3.selectAll("#group20101027 text")
.style("opacity", 0);
d3.select("#circle20101027")
.style("opacity", 0);
d3.selectAll("#group20081205 text")
.transition()
.duration(750)
.style("opacity", 1);
marker = "#circle20081205";
highlight(marker);
document.getElementById("next").setAttribute("value", "two");
document.getElementById("back").setAttribute("value", "two");
staticPath.datum(staticDataThree)
.attr("d", line);
animatedPath.datum(staticDataOne)
.attr("d", line);
d3.selectAll(".slidethree")
.style("display", "none");
d3.selectAll(".slidetwo")
.style("display", "block")
.style("opacity", 1);
} else if (slideValue=="four") {
d3.selectAll("#group20110726 text")
.style("opacity", 0);
d3.select("#circle20110726")
.style("opacity", 0);
d3.selectAll("#group20101027 text")
.transition()
.duration(750)
.style("opacity", 1);
marker = "#circle20101027";
highlight(marker);
document.getElementById("next").setAttribute("value", "three");
document.getElementById("back").setAttribute("value", "three");
staticPath.datum(staticDataFour)
.attr("d", line);
animatedPath.datum(staticDataOne)
.attr("d", line);
d3.selectAll(".slidefour")
.style("display", "none");
d3.selectAll(".slidethree")
.style("display", "block")
.style("opacity", 1);
} else if (slideValue=="five") {
d3.selectAll("#group20120523 text")
.style("opacity", 0);
d3.select("#circle20120523")
.style("opacity", 0);
d3.selectAll("#group20110726 text")
.transition()
.duration(750)
.style("opacity", 1);
marker = "#circle20110726";
highlight(marker);
document.getElementById("next").setAttribute("value", "four");
document.getElementById("back").setAttribute("value", "four");
staticPath.datum(staticDataFive)
.attr("d", line);
animatedPath.datum(staticDataOne)
.attr("d", line);
d3.selectAll(".slidefive")
.style("display", "none");
d3.selectAll(".slidefour")
.style("display", "block")
.style("opacity", 1);
} else if (slideValue=="six") {
d3.selectAll("#group20130822 text")
.style("opacity", 0);
d3.select("#circle20130822")
.style("opacity", 0);
d3.selectAll("#group20120523 text")
.transition()
.duration(750)
.style("opacity", 1);
marker = "#circle20120523";
highlight(marker);
document.getElementById("next").setAttribute("value", "five");
document.getElementById("back").setAttribute("value", "five");
staticPath.datum(staticDataSix)
.attr("d", line);
animatedPath.datum(staticDataOne)
.attr("d", line);
d3.selectAll(".slidesix")
.style("display", "none");
d3.selectAll(".slidefive")
.style("display", "block")
.style("opacity", 1);
} else if (slideValue=="seven") {
d3.selectAll("#group20131016 text")
.style("opacity", 0);
d3.select("#circle20131016")
.style("opacity", 0);
d3.selectAll("#group20130822 text")
.transition()
.duration(750)
.style("opacity", 1);
marker = "#circle20130822";
highlight(marker);
document.getElementById("next").setAttribute("value", "six");
document.getElementById("back").setAttribute("value", "six");
staticPath.datum(staticDataSeven)
.attr("d", line);
animatedPath.datum(staticDataOne)
.attr("d", line);
d3.selectAll(".slideseven")
.style("display", "none");
d3.selectAll(".slidesix")
.style("display", "block")
.style("opacity", 1);
} else if (slideValue=="end") {
d3.select("#buttons #next").text("Next");
d3.selectAll("#group20140711 text")
.style("opacity", 0);
d3.select("#circle20140711")
.style("opacity", 0);
d3.selectAll("#group20131016 text")
.transition()
.duration(750)
.style("opacity", 1);
marker = "#circle20131016";
highlight(marker);
document.getElementById("next").setAttribute("value", "seven");
document.getElementById("back").setAttribute("value", "seven");
staticPath.datum(staticDataEight)
.attr("d", line);
animatedPath.datum(staticDataOne)
.attr("d", line);
d3.selectAll(".slideeight")
.style("display", "none");
d3.selectAll(".slideseven")
.style("display", "block")
.style("opacity", 1);
}
});
function animateLine() {
var l = this.getTotalLength();
i = d3.interpolateString("0," + l, l + "," + l);
return function(t) { return i(t); };
}
function transition() {
d3.select(".animated")
.transition()
.duration(2500)
.ease("cubic-in-out")
.attrTween("stroke-dasharray", animateLine)
.each("end", function() {
if (slideValue=="start") {
d3.select("#buttons #next").html("Next");
d3.select("#buttons #back").style("display", "inline-block");
marker = "#circle20080801";
highlight(marker);
d3.selectAll("#group20080801 text")
.transition()
.duration(750)
.style("opacity", 1);
d3.selectAll(".slideintro")
.style("display", "none");
d3.selectAll("#slides div")
.transition()
.duration(750)
.style("opacity", 1);
d3.selectAll(".slideone")
.transition()
.duration(750)
.style("display", "block")
.style("opacity", 1);
} else if (slideValue=="one") {
marker = "#circle20081205";
highlight(marker);
d3.selectAll("#group20081205 text")
.transition()
.duration(750)
.style("opacity", 1);
d3.selectAll(".slideone")
.style("display", "none");
d3.selectAll("#slides div")
.transition()
.duration(750)
.style("opacity", 1);
d3.selectAll(".slidetwo")
.transition()
.duration(750)
.style("display", "block")
.style("opacity", 1);
} else if (slideValue=="two") {
marker = "#circle20101027";
highlight(marker);
d3.selectAll("#group20101027 text")
.transition()
.duration(750)
.style("opacity", 1);
d3.selectAll(".slidetwo")
.style("display", "none");
d3.selectAll("#slides div")
.transition()
.duration(750)
.style("opacity", 1);
d3.selectAll(".slidethree")
.transition()
.duration(750)
.style("display", "block")
.style("opacity", 1);
} else if (slideValue=="three") {
marker = "#circle20110726";
highlight(marker);
d3.selectAll("#group20110726 text")
.transition()
.duration(750)
.style("opacity", 1);
d3.selectAll(".slidethree")
.style("display", "none");
d3.selectAll("#slides div")
.transition()
.duration(750)
.style("opacity", 1);
d3.selectAll(".slidefour")
.transition()
.duration(750)
.style("display", "block")
.style("opacity", 1);
} else if (slideValue=="four") {
marker = "#circle20120523";
highlight(marker);
d3.selectAll("#group20120523 text")
.transition()
.duration(750)
.style("opacity", 1);
d3.selectAll(".slidefour")
.style("display", "none");
d3.selectAll("#slides div")
.transition()
.duration(750)
.style("opacity", 1);
d3.selectAll(".slidefive")
.transition()
.duration(750)
.style("display", "block")
.style("opacity", 1);
} else if (slideValue=="five") {
marker = "#circle20130822";
highlight(marker);
d3.selectAll("#group20130822 text")
.transition()
.duration(750)
.style("opacity", 1);
d3.selectAll(".slidefive")
.style("display", "none");
d3.selectAll("#slides div")
.transition()
.duration(750)
.style("opacity", 1);
d3.selectAll(".slidesix")
.transition()
.duration(750)
.style("display", "block")
.style("opacity", 1);
} else if (slideValue=="six") {
marker = "#circle20131016";
highlight(marker);
d3.selectAll("#group20131016 text")
.transition()
.duration(750)
.style("opacity", 1);
d3.selectAll(".slidesix")
.style("display", "none");
d3.selectAll("#slides div")
.transition()
.duration(750)
.style("opacity", 1);
d3.selectAll(".slideseven")
.transition()
.duration(750)
.style("display", "block")
.style("opacity", 1);
} else if (slideValue=="seven") {
marker = "#circle20140711";
highlight(marker);
d3.select("#buttons #next").html("Again");
d3.selectAll("#group20140711 text")
.transition()
.duration(750)
.style("opacity", 1);
d3.selectAll(".slideseven")
.style("display", "none");
d3.selectAll("#slides div")
.transition()
.duration(750)
.style("opacity", 1);
d3.selectAll(".slideeight")
.transition()
.duration(750)
.style("display", "block")
.style("opacity", 1);
}
});
d3.timer.flush();
}
d3.select("#slides")
.style("display","inline");
});
d3.select(self.frameElement).style("height", "770px");