function fadeOut(elem) {
 if (elem.id) {
 fadeElementSetup(elem.id, 100, 0, 10);
 }
}

function fadeIn(elem) {
 if (elem.id) {
 fadeElementSetup(elem.id, 0, 100, 10);
 }
}

// Fade: Initialize the fade function

var fadeActive = new Array();
var fadeQueue = new Array();
var fadeTimer = new Array();
var fadeClose = new Array();
var fadeMode = new Array();

function fadeElementSetup(theID, fdStart, fdEnd, fdSteps, fdClose, fdMode) {

 // alert("Fading: "+theID+" Steps: "+fdSteps+" Mode: "+fdMode);

 if (fadeActive[theID] == true) {
 // Already animating, queue up this command
 fadeQueue[theID] = new Array(theID, fdStart, fdEnd, fdSteps);
 } else {
 fadeSteps = fdSteps;
 fadeCurrent = 0;
 fadeAmount = (fdStart - fdEnd) / fadeSteps;
 fadeTimer[theID] = setInterval("fadeElement('"+theID+"', '"+fadeCurrent+"', '"+fadeAmount+"', '"+fadeSteps+"')", 15);
 fadeActive[theID] = true;
 fadeMode[theID] = fdMode;

 if (fdClose == 1) {
 fadeClose[theID] = true;
 } else {
 fadeClose[theID] = false;
 }
}
}

// Fade: Do the fade. This function will call itself, modifying the parameters, so
// many instances can run concurrently. Can fade using opacity, or fade using a box-shadow.

function fadeElement(theID, fadeCurrent, fadeAmount, fadeSteps) {

 if (fadeCurrent == fadeSteps) {

 // We're done, so clear.

 clearInterval(fadeTimer[theID]);
 fadeActive[theID] = false;
 fadeTimer[theID] = false;

 // Should we close it once the fade is complete?

 if (fadeClose[theID] == true) {
 document.getElementById(theID).style.visibility = "hidden";
 }

 // Hang on.. did a command queue while we were working? If so, make it happen now

 if (fadeQueue[theID] && fadeQueue[theID] != false) {
 fadeElementSetup(fadeQueue[theID][0], fadeQueue[theID][1], fadeQueue[theID][2], fadeQueue[theID][3]);
 fadeQueue[theID] = false;
}
 } else {

 fadeCurrent++;

 // Now actually do the fade adjustment.

 if (fadeMode[theID] == "shadow") {

 // Do a special fade on the webkit-box-shadow of the object

 if (fadeAmount < 0) {
 document.getElementById(theID).style.webkitBoxShadow = shadowSettings + (Math.abs(fadeCurrent * fadeAmount)) + ')';
 } else {
 document.getElementById(theID).style.webkitBoxShadow = shadowSettings + (100 - (fadeCurrent * fadeAmount)) + ')';
 }

 } else {

 // Set the opacity depending on if we're adding or subtracting (pos or neg)

 if (fadeAmount < 0) {
 setOpacity(Math.abs(fadeCurrent * fadeAmount), theID);
 } else {
 setOpacity(100 - (fadeCurrent * fadeAmount), theID);
 }
 }

 // Keep going, and send myself the updated variables
 clearInterval(fadeTimer[theID]);
 fadeTimer[theID] = setInterval("fadeElement('"+theID+"', '"+fadeCurrent+"', '"+fadeAmount+"', '"+fadeSteps+"')", 15);
 }
}
