<!DOCTYPE html>
<html>
<head>
<title>Fast Animation Script Demo</title>
<link type="text/css" rel="stylesheet" href="../stylesheet.css"/>
<style>
.demo {
height: 200px;
width: 300px;
margin-left: auto;
margin-right: auto;
background-color: #222222;
display: block;
overflow: hidden;
position: relative;
}
.demoPanel {
position: absolute;
background-color: rgba(0,0,0,0);
color: #EEEEEE;
font-size: 1.2em;
}
.animation_button {
margin-left: auto;
margin-right: auto;
display: block;
height: 35px;
width: 300px;
margin-top: 3px;
margin-bottom: 3px;
}
#animationSlider {
width: 300px;
margin-left: auto;
margin-right: auto;
margin-top: 6px;
margin-bottom: 6px;
display: block;
}
</style>
</head>
<body>
<div class="demo">
<div id="handle001" class="demoPanel"></div>
<div id="handle002" class="demoPanel"></div>
</div>
<input type="range" id="animationSlider" min="0" onchange="doSomeStuffSetStep(this.value)"/>
<button class="animation_button" onclick="rerunClick()" >Rerun the Animation</button>
<button class="animation_button" onclick="backwardsClick()" >Run the Animation Backwards</button>
<button class="animation_button" onclick="pauseClick()" >Pause the Animation</button>
<button class="animation_button" onclick="continueClick()" >Continue the Animation</button>
<p id="elapsedElement"></p>
<script>
//specify element
//specify initial properties
//specify final properties
//specify duration
//specify start time
//build list of commands that run for every animation call
var bcActivitiesList = new Array;
for (var i=0; i<1800; i++) { //>
bcActivitiesList[i] = new Array;
bcActivitiesList[i][0] = 0; //number of commands each animation step
} //30 seconds of activities
var bcFinalActivity = -1; //index of last animation activity
var bcInitializations = new Array;
for (var i=0; i<=1; i++) {
bcInitializations[i] = new Array;
bcInitializations[i][0] = 0;
}
function bcInitElement(pElement,pLeft,pTop,pColor,pBackgroundColor,pWidth,pOpacity,pDisplay,innerHTML) {
pElement.style.left = pLeft;
pElement.style.top = pTop;
pElement.style.color = pColor;
pElement.style.backgroundColor = pBackgroundColor;
pElement.style.width = pWidth;
pElement.style.opacity = pOpacity;
pElement.style.display = pDisplay;
pElement.innerHTML = innerHTML;
}
function bcDefineLeftTween(sElement,pStart,pEnd,tBegin,tDuration,mMethod) {
var s = sElement+".style.left='"+pStart+"px';"
bcInitializations[0][0] = bcInitializations[0].push(s);
var alpha = tBegin * 60.0;
var steps = tDuration * 60;
var omega = alpha + steps;
var increment = (pEnd - pStart) / steps;
var left = pStart;
if (alpha > 0) {
bcActivitiesList[alpha-1][0] = bcActivitiesList[alpha-1].push(s);
}
for (var i=alpha; i<=omega; i++) { //>
s = sElement+".style.left='"+Math.round(left)+"px';"
bcActivitiesList[i][0] = bcActivitiesList[i].push(s);
if (mMethod == "linear") {
left += increment;
}
}
bcInitializations[1][0] = bcInitializations[1].push(s);
if (omega > bcFinalActivity) {
bcFinalActivity = omega;
}
}
function bcDefineTopTween(sElement,pStart,pEnd,tBegin,tDuration,mMethod) {
var s = sElement+".style.top='"+pStart+"px';"
bcInitializations[0][0] = bcInitializations[0].push(s);
var alpha = tBegin * 60.0;
var steps = tDuration * 60;
var omega = alpha + steps;
var increment = (pEnd - pStart) / steps;
var top = pStart;
if (alpha > 0) {
bcActivitiesList[alpha-1][0] = bcActivitiesList[alpha-1].push(s);
}
for (var i=alpha; i<=omega; i++) { //>
s = sElement+".style.top='"+Math.round(top)+"px';"
bcActivitiesList[i][0] = bcActivitiesList[i].push(s);
if (mMethod == "linear") {
top += increment;
}
}
bcInitializations[1][0] = bcInitializations[1].push(s);
if (omega > bcFinalActivity) {
bcFinalActivity = omega;
}
}
function bcDefineOpacityTween(sElement,pStart,pEnd,tBegin,tDuration,mMethod) {
var s = sElement+".style.opacity='"+pStart+"';"
bcInitializations[0][0] = bcInitializations[0].push(s);
var alpha = tBegin * 60.0;
var steps = tDuration * 60;
var omega = alpha + steps;
var increment = (pEnd - pStart) / steps;
var opacity = pStart;
if (alpha > 0) {
bcActivitiesList[alpha-1][0] = bcActivitiesList[alpha-1].push(s);
}
for (var i=alpha; i<=omega; i++) { //>
s = sElement+".style.opacity='"+opacity+"';"
bcActivitiesList[i][0] = bcActivitiesList[i].push(s);
if (mMethod == "linear") {
opacity += increment;
}
}
bcInitializations[1][0] = bcInitializations[1].push(s);
if (omega > bcFinalActivity) {
bcFinalActivity = omega;
}
}
function bcInitializeElements(beginOrEnd) {
if (beginOrEnd == "begin") {
var index = 0;
} else if (beginOrEnd == "end") {
var index = 1;
}
var i = 1;
while (i <= bcInitializations[index][0]) { //>
eval(bcInitializations[index][i]);
i++;
}
}
var bcAnimationSlider = document.getElementById("animationSlider");
function bcUpdateSlider(value) {
bcAnimationSlider.value = value;
}
function bcInitializeSlider(value) {
bcAnimationSlider.max = bcFinalActivity;
bcAnimationSlider.value = value;
}
var elapsedHandle = document.getElementById("elapsedElement");
function doSomeStuff(step) {
var startTime = Date.now();
var i = 1;
while (i <= bcActivitiesList[step][0]) { //>
eval(bcActivitiesList[step][i]);
i++;
}
var endTime = Date.now();
var elapsed = endTime - startTime;
if (elapsed > 16) {
elapsedHandle.innerHTML = elapsed;
} else {
elapsedHandle.innerHTML = "";
}
}
var animationStep = 0;
function doSomeStuffSetStep(step) {
var numstep = Number(step);
animationStep = numstep;
doSomeStuff(numstep);
}
var handle001 = document.getElementById("handle001");
bcInitElement(handle001,"201px","50px","red","rgba(0,0,0,0)","260px",1,"block","This line slides in from the side");
bcDefineLeftTween("handle001",301,25,0.0,0.75,"linear");
bcDefineOpacityTween("handle001",0.0,1.0,0.0,0.75,"linear")
var handle002 = document.getElementById("handle002");
bcInitElement(handle002,"13px","-25px","blue","rgba(0,0,0,0)","280px",1,"block","This line drops down from the top");
bcDefineTopTween("handle002",-25,125,0.5,0.75,"linear");
bcDefineOpacityTween("handle002",0.0,1.0,0.5,0.75,"linear")
var maxAnimationSteps = bcFinalActivity;
bcInitializeElements("begin");
bcInitializeSlider(0);
var animateIncrement = 1;
var requestId;
function animateSomeStuff() {
if ((animationStep >= 0) && (animationStep <= maxAnimationSteps)) {
doSomeStuff(animationStep);
bcUpdateSlider(animationStep);
}
if ((animationStep < 0) || (animationStep > maxAnimationSteps)) {
cancelAnimationFrame(requestID);
} else {
animationStep += animateIncrement;
}
requestId = window.requestAnimationFrame(animateSomeStuff);
}
animateSomeStuff();
function rerunClick() {
animationStep = 0;
bcInitializeElements("begin");
bcUpdateSlider(animationStep);
animateIncrement = 1;
animateSomeStuff();
}
function backwardsClick() {
animationStep = bcFinalActivity;
bcInitializeElements("end");
bcUpdateSlider(animationStep);
animateIncrement = -1;
animateSomeStuff();
}
function pauseClick() {
cancelAnimationFrame(requestId);
}
function continueClick() {
animateSomeStuff();
}
</script>
</body>
</html>