SlyOne
02-20-2009, 05:32 PM
Hi,
New to these forums so apologise if this is somewhere else, but I recently found this tutorial which matched pretty much what i needed on my website that i am developing for a uni project.
Anyway, I am now trying to adapt this script to a section of my site where a user is able to answer questions with checking a yes or no radio button
If the user checks a yes radio button then this toggles a slide animation which makes visible some content (another question and after that one a set of answers). Anyway, I am able to get this working for one question only.
The first question being:
Would you like a course of study involving works of art or antiques?
and user selects yes radio button and the hidden div content is shown. However if you click yes again its hides (which i do not want) and if you click no it doesnt do anything when i want it to hide the content while the yes radio button makes it visible.
So, was wondering if someone could take a look at my code and see if you can make any sense of why its not working as i hope it to (my javascript knowledge is incredibly limited and am learning at the moment).
Below is the html part:
<script type="text/javascript" src="jquery/SOTC-Inline_Sliding_Panels.js"></script>
<body>
<div>
<p>
<label>Would you like a course of study involving works of art or antiques?</label>
<div id="exampleHeader">
<label>Yes: </label> <input name="courseGroup" type="radio" class="radio" id="courseGroup" onclick="runAnimation(animationObject, this)">
</div>
<label>No: </label> <input name="courseGroup" type="radio" class="radio" id="courseGroup" onclick="runAnimation(animationObject, this)"/>
</p>
<div id="dropdownPanel"
style="position:relative;
width:550px;
height:1px;
top:-1px;
left:0px;
background:#ccc;
overflow:hidden;
z-index:0;">
<label>Would you consider a course in the histroy of art, architecture or design?</label>
<label>Yes: </label> <input name="courseGroup" type="radio" class="radio" id="courseGroup">
<label>No: </label> <input name="courseGroup" type="radio" class="radio" id="courseGroup"/></div>
<p>
<label>Are you interested in industrial product managment?</label>
<div id="exampleHeader">
<label>Yes: </label> <input name="courseGroup" type="radio" class="radio" id="courseGroup" onclick="runAnimation(animationObject, this)">
</div>
<label>No: </label> <input name="courseGroup" type="radio" class="radio" id="courseGroup"/>
</p>
<div id="dropdownPanel"
style="position:relative;
width:550px;
height:1px;
top:-1px;
left:0px;
background:#ccc;
overflow:hidden;
z-index:0;">
<label>Would you have a job in the financial section of an organisation?</label>
<label>Yes: </label> <input name="courseGroup" type="radio" class="radio" id="courseGroup" onclick="runAnimation(animationObject, this)">
<label>No: </label> <input name="courseGroup" type="radio" class="radio" id="courseGroup"/></div>
</div>
below is the javascript part which is in fact inside the html document at the moment:
<script type="text/javascript">
var animationObject = new AnimationObject('dropdownPanel');
animationObject.AddFrame(new AnimationFrame(0, -1, 550, 200, 500));
function runAnimation(animation, header)
{
if(header.expanded)
{
animation.RunBackward();
header.expanded = false;
}
else
{
animation.RunForward();
header.expanded = true;
}
}
</script>
and as i'm sure you've noticed there is a file that i import at the top of the html document called SOTC-Inline_Sliding_Panels.js ... this is apparently needed to make the script inside the html to work (downloaded it as part of the tutorial).
Its quite a bit of code, not sure if it is in fact needed but i will show it anyway.
function AnimationFrame(left, top, width, height, time)
{
this.Left = left;
this.Top = top;
this.Width = width;
this.Height = height;
this.Time = time;
this.Copy = function(frame)
{
this.Left = frame.Left;
this.Top = frame.Top;
this.Width = frame.Width;
this.Height = frame.Height;
this.Time = frame.Time;
}
this.Apply = function(element)
{
element.style.left = Math.round(this.Left) + 'px';
element.style.top = Math.round(this.Top) + 'px';
element.style.width = Math.round(this.Width) + 'px';
element.style.height = Math.round(this.Height) + 'px';
}
}
function AnimationObject(element)
{
if(typeof(element) == "string")
element = document.getElementById(element);
var frames = null;
var timeoutID = -1;
var running = 0;
var currentFI = 0;
var currentData = null;
var lastTick = -1;
var callback = null;
var prevDir = 0;
this.AddFrame = function(frame)
{
frames.push(frame);
}
this.SetCallback = function(cb)
{
callback = cb;
}
this.ClearFrames = function()
{
if(running != 0)
this.Stop();
frames = new Array();
frames.push(new AnimationFrame(0,0,0,0,0));
frames[0].Time = 0;
frames[0].Left = parseInt(element.style.left);
frames[0].Top = parseInt(element.style.top);
frames[0].Width = parseInt(element.style.width);
frames[0].Height = parseInt(element.style.height);
currentFI = 0;
prevDir = 0;
currentData = new AnimationFrame(0,0,0,0,0);
}
this.ResetToStart = function()
{
if(running != 0)
this.Stop();
currentFI = 0;
prevDir = 0;
currentData = new AnimationFrame(0,0,0,0,0);
frames[0].Apply(element);
}
this.ResetToEnd = function()
{
if(running != 0)
this.Stop();
currentFI = 0;
prevDir = 0;
currentData = new AnimationFrame(0,0,0,0,0);
frames[frames.length - 1].Apply(element);
}
this.Stop = function()
{
if(running == 0)
return;
if(timeoutID != -1)
clearTimeout(timeoutID);
prevDir = running;
running = 0;
}
this.RunForward = function()
{
if(running == 1)
return;
if(running == -1)
this.Stop();
if(frames.length == 1 || element == null)
return;
lastTick = new Date().getTime();
//Start from the begining
if(prevDir == 0)
{
currentFI = 1;
currentData.Time = 0;
currentData.Left = parseInt(element.style.left);
currentData.Top = parseInt(element.style.top);
currentData.Width = parseInt(element.style.width);
currentData.Height = parseInt(element.style.height);
frames[0].Copy(currentData);
}
else if(prevDir != 1)
{
currentFI++;
currentData.Time =
frames[currentFI].Time - currentData.Time;
}
running = 1;
animate();
}
this.RunBackward = function()
{
if(running == -1)
return;
if(running == 1)
this.Stop();
if(frames.length == 1 || element == null)
return;
lastTick = new Date().getTime();
//Start from the end
if(prevDir == 0)
{
currentFI = frames.length-2;
currentData.Left = parseInt(element.style.left);
currentData.Top = parseInt(element.style.top);
currentData.Width = parseInt(element.style.width);
currentData.Height = parseInt(element.style.height);
currentData.Time = frames[frames.length-1].Time;
frames[frames.length-1].Copy(currentData);
currentData.Time = 0;
}
else if(prevDir != -1)
{
currentData.Time =
frames[currentFI].Time - currentData.Time;
currentFI--;
}
running = -1;
animate();
}
function animate()
{
if(running == 0)
return;
var curTick = new Date().getTime();
var tickCount = curTick - lastTick;
lastTick = curTick;
var timeLeft =
frames[((running == -1) ? currentFI+1 : currentFI)].Time
- currentData.Time;
while(timeLeft <= tickCount)
{
currentData.Copy(frames[currentFI]);
currentData.Time = 0;
currentFI += running;
if(currentFI>= frames.length || currentFI <0)
{
currentData.Apply(element);
lastTick = -1;
running = 0;
prevDir = 0;
if(callback != null)
callback();
return;
}
tickCount = tickCount - timeLeft;
timeLeft =
frames[((running == -1) ? currentFI+1 : currentFI)].Time
- currentData.Time;
}
if(tickCount != 0)
{
currentData.Time += tickCount;
var ratio = currentData.Time/
frames[((running == -1) ? currentFI+1 : currentFI)].Time;
currentData.Left = frames[currentFI-running].Left +
(frames[currentFI].Left
- frames[currentFI-running].Left)
* ratio;
currentData.Top = frames[currentFI-running].Top +
(frames[currentFI].Top
- frames[currentFI-running].Top)
* ratio;
currentData.Width = frames[currentFI-running].Width +
(frames[currentFI].Width
- frames[currentFI-running].Width)
* ratio;
currentData.Height = frames[currentFI-running].Height +
(frames[currentFI].Height
- frames[currentFI-running].Height)
* ratio;
}
currentData.Apply(element);
timeoutID = setTimeout(animate, 33);
}
this.ClearFrames();
}
thanks for any help and apologies for the length of this topic
New to these forums so apologise if this is somewhere else, but I recently found this tutorial which matched pretty much what i needed on my website that i am developing for a uni project.
Anyway, I am now trying to adapt this script to a section of my site where a user is able to answer questions with checking a yes or no radio button
If the user checks a yes radio button then this toggles a slide animation which makes visible some content (another question and after that one a set of answers). Anyway, I am able to get this working for one question only.
The first question being:
Would you like a course of study involving works of art or antiques?
and user selects yes radio button and the hidden div content is shown. However if you click yes again its hides (which i do not want) and if you click no it doesnt do anything when i want it to hide the content while the yes radio button makes it visible.
So, was wondering if someone could take a look at my code and see if you can make any sense of why its not working as i hope it to (my javascript knowledge is incredibly limited and am learning at the moment).
Below is the html part:
<script type="text/javascript" src="jquery/SOTC-Inline_Sliding_Panels.js"></script>
<body>
<div>
<p>
<label>Would you like a course of study involving works of art or antiques?</label>
<div id="exampleHeader">
<label>Yes: </label> <input name="courseGroup" type="radio" class="radio" id="courseGroup" onclick="runAnimation(animationObject, this)">
</div>
<label>No: </label> <input name="courseGroup" type="radio" class="radio" id="courseGroup" onclick="runAnimation(animationObject, this)"/>
</p>
<div id="dropdownPanel"
style="position:relative;
width:550px;
height:1px;
top:-1px;
left:0px;
background:#ccc;
overflow:hidden;
z-index:0;">
<label>Would you consider a course in the histroy of art, architecture or design?</label>
<label>Yes: </label> <input name="courseGroup" type="radio" class="radio" id="courseGroup">
<label>No: </label> <input name="courseGroup" type="radio" class="radio" id="courseGroup"/></div>
<p>
<label>Are you interested in industrial product managment?</label>
<div id="exampleHeader">
<label>Yes: </label> <input name="courseGroup" type="radio" class="radio" id="courseGroup" onclick="runAnimation(animationObject, this)">
</div>
<label>No: </label> <input name="courseGroup" type="radio" class="radio" id="courseGroup"/>
</p>
<div id="dropdownPanel"
style="position:relative;
width:550px;
height:1px;
top:-1px;
left:0px;
background:#ccc;
overflow:hidden;
z-index:0;">
<label>Would you have a job in the financial section of an organisation?</label>
<label>Yes: </label> <input name="courseGroup" type="radio" class="radio" id="courseGroup" onclick="runAnimation(animationObject, this)">
<label>No: </label> <input name="courseGroup" type="radio" class="radio" id="courseGroup"/></div>
</div>
below is the javascript part which is in fact inside the html document at the moment:
<script type="text/javascript">
var animationObject = new AnimationObject('dropdownPanel');
animationObject.AddFrame(new AnimationFrame(0, -1, 550, 200, 500));
function runAnimation(animation, header)
{
if(header.expanded)
{
animation.RunBackward();
header.expanded = false;
}
else
{
animation.RunForward();
header.expanded = true;
}
}
</script>
and as i'm sure you've noticed there is a file that i import at the top of the html document called SOTC-Inline_Sliding_Panels.js ... this is apparently needed to make the script inside the html to work (downloaded it as part of the tutorial).
Its quite a bit of code, not sure if it is in fact needed but i will show it anyway.
function AnimationFrame(left, top, width, height, time)
{
this.Left = left;
this.Top = top;
this.Width = width;
this.Height = height;
this.Time = time;
this.Copy = function(frame)
{
this.Left = frame.Left;
this.Top = frame.Top;
this.Width = frame.Width;
this.Height = frame.Height;
this.Time = frame.Time;
}
this.Apply = function(element)
{
element.style.left = Math.round(this.Left) + 'px';
element.style.top = Math.round(this.Top) + 'px';
element.style.width = Math.round(this.Width) + 'px';
element.style.height = Math.round(this.Height) + 'px';
}
}
function AnimationObject(element)
{
if(typeof(element) == "string")
element = document.getElementById(element);
var frames = null;
var timeoutID = -1;
var running = 0;
var currentFI = 0;
var currentData = null;
var lastTick = -1;
var callback = null;
var prevDir = 0;
this.AddFrame = function(frame)
{
frames.push(frame);
}
this.SetCallback = function(cb)
{
callback = cb;
}
this.ClearFrames = function()
{
if(running != 0)
this.Stop();
frames = new Array();
frames.push(new AnimationFrame(0,0,0,0,0));
frames[0].Time = 0;
frames[0].Left = parseInt(element.style.left);
frames[0].Top = parseInt(element.style.top);
frames[0].Width = parseInt(element.style.width);
frames[0].Height = parseInt(element.style.height);
currentFI = 0;
prevDir = 0;
currentData = new AnimationFrame(0,0,0,0,0);
}
this.ResetToStart = function()
{
if(running != 0)
this.Stop();
currentFI = 0;
prevDir = 0;
currentData = new AnimationFrame(0,0,0,0,0);
frames[0].Apply(element);
}
this.ResetToEnd = function()
{
if(running != 0)
this.Stop();
currentFI = 0;
prevDir = 0;
currentData = new AnimationFrame(0,0,0,0,0);
frames[frames.length - 1].Apply(element);
}
this.Stop = function()
{
if(running == 0)
return;
if(timeoutID != -1)
clearTimeout(timeoutID);
prevDir = running;
running = 0;
}
this.RunForward = function()
{
if(running == 1)
return;
if(running == -1)
this.Stop();
if(frames.length == 1 || element == null)
return;
lastTick = new Date().getTime();
//Start from the begining
if(prevDir == 0)
{
currentFI = 1;
currentData.Time = 0;
currentData.Left = parseInt(element.style.left);
currentData.Top = parseInt(element.style.top);
currentData.Width = parseInt(element.style.width);
currentData.Height = parseInt(element.style.height);
frames[0].Copy(currentData);
}
else if(prevDir != 1)
{
currentFI++;
currentData.Time =
frames[currentFI].Time - currentData.Time;
}
running = 1;
animate();
}
this.RunBackward = function()
{
if(running == -1)
return;
if(running == 1)
this.Stop();
if(frames.length == 1 || element == null)
return;
lastTick = new Date().getTime();
//Start from the end
if(prevDir == 0)
{
currentFI = frames.length-2;
currentData.Left = parseInt(element.style.left);
currentData.Top = parseInt(element.style.top);
currentData.Width = parseInt(element.style.width);
currentData.Height = parseInt(element.style.height);
currentData.Time = frames[frames.length-1].Time;
frames[frames.length-1].Copy(currentData);
currentData.Time = 0;
}
else if(prevDir != -1)
{
currentData.Time =
frames[currentFI].Time - currentData.Time;
currentFI--;
}
running = -1;
animate();
}
function animate()
{
if(running == 0)
return;
var curTick = new Date().getTime();
var tickCount = curTick - lastTick;
lastTick = curTick;
var timeLeft =
frames[((running == -1) ? currentFI+1 : currentFI)].Time
- currentData.Time;
while(timeLeft <= tickCount)
{
currentData.Copy(frames[currentFI]);
currentData.Time = 0;
currentFI += running;
if(currentFI>= frames.length || currentFI <0)
{
currentData.Apply(element);
lastTick = -1;
running = 0;
prevDir = 0;
if(callback != null)
callback();
return;
}
tickCount = tickCount - timeLeft;
timeLeft =
frames[((running == -1) ? currentFI+1 : currentFI)].Time
- currentData.Time;
}
if(tickCount != 0)
{
currentData.Time += tickCount;
var ratio = currentData.Time/
frames[((running == -1) ? currentFI+1 : currentFI)].Time;
currentData.Left = frames[currentFI-running].Left +
(frames[currentFI].Left
- frames[currentFI-running].Left)
* ratio;
currentData.Top = frames[currentFI-running].Top +
(frames[currentFI].Top
- frames[currentFI-running].Top)
* ratio;
currentData.Width = frames[currentFI-running].Width +
(frames[currentFI].Width
- frames[currentFI-running].Width)
* ratio;
currentData.Height = frames[currentFI-running].Height +
(frames[currentFI].Height
- frames[currentFI-running].Height)
* ratio;
}
currentData.Apply(element);
timeoutID = setTimeout(animate, 33);
}
this.ClearFrames();
}
thanks for any help and apologies for the length of this topic