function getStyle(obj, style){
   if(!document.getElementById) return;
     //window.status = "getting style "+style+" for object "+obj.toString();
     var value = obj.style[style];
  	 if(!value)
         if(document.defaultView)
  	         value = document.defaultView.getComputedStyle(obj, "").getPropertyValue(style);
         else if(obj.currentStyle)
  	         value = obj.currentStyle[style];
     return value;
}

function getcolor(input_color) {

  var color = input_color.toString();
  var thecolor;
  
  var rgb_regex = /(\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})/;
  var hex_regex = /#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})\b/;
  //var rgb_regex /\brgb\(\s*([\d]{1,3})(%)?\s*\,\s*([\d]{1,3})(%)?\s*\,\s*([\d]{1,3})(%)?\s*\)/i;

  //alert("here's the color (inside getcolor): " + color);
  if (color.match(hex_regex))
  {
    thecolor = new Array(parseInt(color.match(hex_regex)[1],16),parseInt(color.match(hex_regex)[2],16),parseInt(color.match(hex_regex)[3],16));
  }
  else if (color.match(rgb_regex))
  {
    thecolor = new Array(parseInt(color.match(rgb_regex)[1]),parseInt(color.match(rgb_regex)[2]),parseInt(color.match(rgb_regex)[3]));
  }
  else
  {
    //alert("holy error Batman!  color \""+ color +"\" didn't match rgb or hex regex")
    thecolor = new Array("0","0","0");
  }
  
  return thecolor;
}

function get_a_background_color(element)
{
  //recursively go through parents until one of them has a background color!
  
  var bgcolor = getStyle(element, "backgroundColor");
  
  if (bgcolor == "" || bgcolor == "undefined" || bgcolor == "transparent")
  {
    // if there is no parent (we're at the outer element of the DOM and there's no background color?!)
    if (!element.parentNode)
    {
      //alert("went up the entire document tree in search of a background color.  None found.  Can you believe it?!");
      return "rgb(255,255,255)";   // return white
    }
    var parent = element.parentNode;
    bgcolor=get_a_background_color(parent)
  }
  return bgcolor
}

function fade_out(target_name, endcolor, steps, step_delay) {
  if (!steps) steps=25;
  if (!step_delay) step_delay=100;
  
  var target = document.getElementById(target_name);
  
  if (!endcolor)
  {
    var parent = target.parentNode;
    endcolor = getStyle(parent, "backgroundColor");
  }
  
  // recursively fade childNodes
  if(target.childNodes)
    for (l1=0;l1<target.childNodes.length;l1++)
      if (target.childNodes[l1].id)
        fade_out(target.childNodes[l1].id,endcolor,steps,step_delay)
  
  var startcolor = new Array();
  startcolor = getcolor(getStyle(target, "color"));
  var start_r = startcolor[0];
  var start_g = startcolor[1];
  var start_b = startcolor[2];
  
  endcolor = getcolor(endcolor);
  var end_r = endcolor[0];
  var end_g = endcolor[1];
  var end_b = endcolor[2];

  var rstep = Math.ceil((end_r - start_r)/steps);
  var gstep = Math.ceil((end_g - start_g)/steps);
  var bstep = Math.ceil((end_b - start_b)/steps);

  setTimeout("move_step(\""+target_name+"\","+rstep+","+gstep+","+bstep+","+steps+","+step_delay+")",step_delay);
  
  var new_color = "rgb("+start_r+", "+start_g+", "+start_b+")";
  target.style.color = new_color;
}


function fade_in(target_name, startcolor, steps, step_delay) {
  //alert("fade in: "+target_name)

  var l1;
  if (!steps) steps=25;
  if (!step_delay) step_delay=100;
  var target = document.getElementById(target_name);
  target.style.visibility = "visible";
  
  //if (!startcolor || startcolor == "")
  //  return;
  
  //alert("startcolor: " + startcolor + "(from function argument)");
  
  if (!startcolor || startcolor == "")
    startcolor = get_a_background_color(target);
    
  var endcolor = new Array();
  
  var temp = getStyle(target, "color");
  //alert("here's the endcolor: " + temp);
  
  endcolor = getcolor(getStyle(target, "color"));
  var end_r = endcolor[0];
  var end_g = endcolor[1];
  var end_b = endcolor[2];
  
  startcolor = getcolor(startcolor);
  var start_r = startcolor[0];
  var start_g = startcolor[1];
  var start_b = startcolor[2];
  
  var new_color = "rgb("+start_r+", "+start_g+", "+start_b+")";
  target.style.color = new_color;
  
  var rstep = Math.ceil((end_r - start_r)/steps);
  var gstep = Math.ceil((end_g - start_g)/steps);
  var bstep = Math.ceil((end_b - start_b)/steps);
  
  // fade any text in the target
  setTimeout("move_step(\""+target_name+"\","+rstep+","+gstep+","+bstep+","+steps+","+step_delay+")",step_delay);
  
  // recursively fade childNodes of the target
  if(target.childNodes)
    for (l1=0;l1<target.childNodes.length;l1++)
    {
      //alert(target_name +" checking: "+ target.childNodes[l1].id+"\n(child node"+l1+"/"+target.childNodes.length+")")
      
      // ignore anything without an explicitly declared id.  I know this is clumsy.
      if (target.childNodes[l1].id)  
      //if (target.childNodes[l1].style || target.childNodes[l1].currentStyle)  
      {
        //alert(target_name +" fading: "+ target.childNodes[l1].id+"\n(child node"+l1+"/"+target.childNodes.length+")")
        fade_in(target.childNodes[l1].id,'',steps,step_delay)
      }
      //else
        //alert("skipping: "+ target.childNodes[l1].id +"(child has no id)")
     
    }
    //alert(" done checking child nodes (l1= "+ l1 + ")")
}

function move_step (target_name, rstep, gstep, bstep, steps, step_delay) {
  
  var target = document.getElementById(target_name);
  var color = getcolor(getStyle(target, "color"));
  
  var new_r = color[0] + rstep;
  var new_g = color[1] + gstep;
  var new_b = color[2] + bstep;
  
  var new_color = "rgb("+new_r+", "+new_g+", "+new_b+")";
  target.style.color = new_color;
  steps=steps-1;
  
  if (steps > 0)
    setTimeout("move_step(\""+target_name+"\","+rstep+","+gstep+","+bstep+","+steps+","+step_delay+")",step_delay);
}

function fade_thru_array (text_array, target_name, startcolor, endcolor, steps, step_delay) {

  var target = document.getElementById(target_name);

  text_array[0]++;
  
  if (text_array[0] > text_array.length-1)
  {text_array[0]=0;}
  
  // show a blank line when rotating back thru 0
  if (text_array[0] ==0)
  {
    return;
  }
  else
    {target.innerHTML = text_array[text_array[0]];}
  
  target.style.color = startcolor;
  fade_in(target_name,endcolor);
}
