// Sliding routines by Harry Maugans http://www.harrymaugans.com
var timerlen = 5;
var slideAniLen = 350;
var callback = null;

var timerID = new Array();
var startTime = new Array();
var obj = new Array();
var endHeight = new Array();
var moving = new Array();
var dir = new Array();

function toggleBasicSlide(objname){
  if(document.getElementById(objname).style.display == "none"){
    // div is hidden, so let's slide down
    basicslidedown(objname);
  }else{
    // div is visible, so slide up
    basicslideup(objname);
  }
}


function basicslidedown(objname, cb){
	//alert("From basicslidedown "+objname)
		callback = cb; // faux callback
        if(moving[objname])
                return;
		
        if(document.getElementById(objname).style.display != "none")
                return; // cannot slide down something that is already visible

        moving[objname] = true;
        dir[objname] = "down";
        basicstartslide(objname);
}

function basicslideup(objname){
        if(moving[objname])
                return;

        if(document.getElementById(objname).style.display == "none")
                return; // cannot slide up something that is already hidden

        moving[objname] = true;
        dir[objname] = "up";
        basicstartslide(objname);
}

function basicstartslide(objname){
		slideAniLen = 350; // reinitialise
        obj[objname] = document.getElementById(objname);

        endHeight[objname] = parseInt(obj[objname].style.height);
		//if(endHeight[objname] < 100) slideAniLen = slideAniLen *2; // double time for small heights to make it smoother
		
        startTime[objname] = (new Date()).getTime();

        if(dir[objname] == "down"){
                obj[objname].style.height = "1px";
        }

        obj[objname].style.display = "block";

        timerID[objname] = setInterval('basicslidetick(\'' + objname + '\');',timerlen);
}

function basicslidetick(objname){
        var elapsed = (new Date()).getTime() - startTime[objname];

        if (elapsed > slideAniLen)
                basicendSlide(objname)
        else {
                var d =Math.round(elapsed / slideAniLen * endHeight[objname]);
                if(dir[objname] == "up")
                        d = endHeight[objname] - d;

                obj[objname].style.height = d + "px";
        }

        return;
}

function basicendSlide(objname){
        clearInterval(timerID[objname]);

        if(dir[objname] == "up")
                obj[objname].style.display = "none";

        obj[objname].style.height = endHeight[objname] + "px";

        delete(moving[objname]);
        delete(timerID[objname]);
        delete(startTime[objname]);
        delete(endHeight[objname]);
        delete(obj[objname]);
        delete(dir[objname]);
		
        return;
}

///////////////////  Slide Obj - same as above but can be used as an object //////////////////////

function slideObj(){
var timerlen = 5;
var slideAniLen = 350;
var callback = null;
var timerID = new Array();
var startTime = new Array();
var obj = new Array();
var endHeight = new Array();
var moving = new Array();
var dir = new Array();

this.toggleSlide = function(objname){
  if(typeof objname != "string") return; // just in case...
  theDiv = objname; // make objname global as setInterval can't pass it later
  if(document.getElementById(objname).style.display == "none"){
    // div is hidden, so let's slide down
    slideObjslidedown(objname);
  }else{
    // div is visible, so slide up
    slideObjslideup(objname);
  }
}


this.slidedown = function slideObjslidedown(objname, cb){
		if(typeof objname != "string") return; // just in case...

theDiv = objname; // make objname global
		callback = cb; // faux callback
        if(moving[objname])
                return;
		
        if(document.getElementById(objname).style.display != "none")
                return; // cannot slide down something that is already visible

        moving[objname] = true;
        dir[objname] = "down";
        slideObjstartslide(objname);
}

this.slideup = function slideObjslideup(objname){
		if(typeof objname != "string") return; // just in case...
		
		theDiv = objname; // make objname global
        if(moving[objname])
                return;

        if(document.getElementById(objname).style.display == "none")
                return; // cannot slide up something that is already hidden

        moving[objname] = true;
        dir[objname] = "up";
        slideObjstartslide(objname);
}

function slideObjstartslide(objname){
		slideAniLen = 350; // reinitialise
        obj[objname] = document.getElementById(objname);

        endHeight[objname] = parseInt(obj[objname].style.height);
		//if(endHeight[objname] < 100) slideAniLen = slideAniLen *2; // double time for small heights to make it smoother
				
        startTime[objname] = (new Date()).getTime();
        if(dir[objname] == "down"){
                obj[objname].style.height = "1px";
        }

        obj[objname].style.display = "block";

        timerID[objname] = setInterval(slideObjTick,timerlen);
}

function slideObjTick(){
		try{
			
        var elapsed = (new Date()).getTime() - startTime[theDiv];
								

        if (elapsed > slideAniLen)
                slideObjendSlide(theDiv)

        else {
                var d =Math.round(elapsed / slideAniLen * endHeight[theDiv]);
                if(dir[theDiv] == "up")
                        d = endHeight[theDiv] - d;

                obj[theDiv].style.height = d + "px";
				

        }
			}catch(e){
				
			}
		
        return;
}

function slideObjendSlide(objname){
        clearInterval(timerID[objname]);

        if(dir[objname] == "up")
                obj[objname].style.display = "none";

        obj[objname].style.height = endHeight[objname] + "px";

        delete(moving[objname]);
        delete(timerID[objname]);
        delete(startTime[objname]);
        delete(endHeight[objname]);
        delete(obj[objname]);
        delete(dir[objname]);
		if(callback) {
		currentStoryBox.style.display = "none"; // hide one we want to replace
		currentStoryBox = document.getElementById(objname); // make newly slid obj the current one
		}
        return;
}	
}