var uniquepageid				= window.location.href.replace("http://"+window.location.hostname, "").replace(/^\//, "")

function AnimatedCollapse(divId, animatetime, persistexpand, initstate)
{

if (document.getElementById(divId))
{
this.divId						= divId;
this.SlideSpan					= divId + "Text"
this.SlideText					= document.getElementById(this.SlideSpan);
this.divObj						= document.getElementById(divId);
this.divObj.style.overflow		= "hidden"
this.timelength					= animatetime;
this.initstate					= ((typeof initstate!= "undefined") && (initstate == "block" ))? "block" : "contract";
this.isExpanded					= AnimatedCollapse.getCookie(uniquepageid+"-"+divId);
this.contentheight				= parseInt(this.divObj.style.height);
var thisobj						= this;

if (isNaN(this.contentheight))
{
AnimatedCollapse.dotask(window, function()
{thisobj._getheight(persistexpand)}, "load")
if (!persistexpand && this.initstate == "contract" || persistexpand && this.isExpanded!= "yes" && this.isExpanded!= "") //Hide DIV (unless div should be expanded by default, OR persistence is enabled and this DIV should be expanded)
this.divObj.style.visibility		= "hidden" //hide content (versus collapse) until we can get its height
}

else if (!persistexpand && this.initstate == "contract" || persistexpand && this.isExpanded!= "yes" && this.isExpanded!= "") //Hide DIV (unless div should be expanded by default, OR persistence is enabled and this DIV should be expanded)
this.divObj.style.height		= 0 //just collapse content if CSS "height" attribute available
if (persistexpand)
AnimatedCollapse.dotask(window, function()
{AnimatedCollapse.setCookie(uniquepageid+"-"+thisobj.divId, thisobj.isExpanded)}, "unload")
}

}

AnimatedCollapse.prototype._getheight		= function(persistexpand)
{
this.contentheight		= this.divObj.offsetHeight
if (!persistexpand && this.initstate == "contract" || persistexpand && this.isExpanded!= "yes")
{ //Hide DIV (unless div should be expanded by default, OR persistence is enabled and this DIV should be expanded)
this.divObj.style.height		= 0 //collapse content
this.divObj.style.visibility		= "visible"
}

else //else if persistence is enabled AND this content should be expanded, define its CSS height value so slideup() has something to work with
this.divObj.style.height		= this.contentheight+"px"
}


AnimatedCollapse.prototype._slideengine		= function(direction)
{
var elapsed		= new Date().getTime()-this.startTime //get time animation has run
var thisobj		= this
if (elapsed<this.timelength)
{ //if time run is less than specified length
var distancepercent		= (direction == "down")? AnimatedCollapse.curveincrement(elapsed/this.timelength) : 1-AnimatedCollapse.curveincrement(elapsed/this.timelength)
this.divObj.style.height		= distancepercent * this.contentheight +"px"
this.runtimer		= setTimeout(function()
{thisobj._slideengine(direction)}, 10)
}

else{ //if animation finished
this.divObj.style.height		= (direction == "down")? this.contentheight+"px" : 0
this.isExpanded		= (direction == "down")? "yes" : "no" //remember whether content is expanded or not
this.runtimer		= null
}
}


AnimatedCollapse.prototype.slidedown		= function()
{
if (typeof this.runtimer == "undefined" || this.runtimer == null)
{ //if animation isn't already running or has stopped running
if (isNaN(this.contentheight)) //if content height not available yet (until window.onload)
alert("Please wait until document has fully loaded then click again")
else if (parseInt(this.divObj.style.height) == 0)
{
this.SlideText.innerHTML		= "minimise";
this.startTime		= new Date().getTime() //Set animation start time
this._slideengine("down")
}
}
}

AnimatedCollapse.prototype.slideup		= function()
{
if (typeof this.runtimer == "undefined" || this.runtimer == null)
{ //if animation isn't already running or has stopped running
if (isNaN(this.contentheight)) //if content height not available yet (until window.onload)
alert("Please wait until document has fully loaded then click again")
else if (parseInt(this.divObj.style.height) == this.contentheight)
{ //if content is expanded
this.SlideText.innerHTML		= "view more";
this.startTime		= new Date().getTime()
this._slideengine("up")
}
}
}

AnimatedCollapse.prototype.slideit		= function()
{
if (isNaN(this.contentheight)) //if content height not available yet (until window.onload)
alert("Please wait until document has fully loaded then click again")
else if (parseInt(this.divObj.style.height) == 0)
this.slidedown()
else if (parseInt(this.divObj.style.height) == this.contentheight)
this.slideup()
}

// -------------------------------------------------------------------
// A few utility functions below:
// -------------------------------------------------------------------

AnimatedCollapse.curveincrement		= function(percent)
{
return (1-Math.cos(percent*Math.PI)) / 2 //return cos curve based value from a percentage input
}


AnimatedCollapse.dotask		= function(target, functionref, tasktype)
{ //assign a function to execute to an event handler (ie: onunload)
var tasktype		= (window.addEventListener)? tasktype : "on"+tasktype
if (target.addEventListener)
target.addEventListener(tasktype, functionref, false)
else if (target.attachEvent)
target.attachEvent(tasktype, functionref)
}

AnimatedCollapse.getCookie		= function(Name)
{ 
var re		= new RegExp(Name+"		= [^;]+", "i"); //construct RE to search for target name/value pair
if (document.cookie.match(re)) //if cookie found
return document.cookie.match(re)[0].split("		= ")[1] //return its value
return ""
}

AnimatedCollapse.setCookie		= function(name, value)
{
document.cookie 		=  name+"		= "+value
}