/*************************************************************************
  dw_lib.js - used with dw_glide.js, dw_glider.js, ...
  document.getElementById and document.all compatible (not ns4)
  version date September 2003
  
  This code is from Dynamic Web Coding 
  at http://www.dyn-web.com/
  Copyright 2003 by Sharon Paine 
  See Terms of Use at http://www.dyn-web.com/bus/terms.html
  Permission granted to use this code 
  as long as this entire notice is included.
*************************************************************************/

dynObj.holder = {}; 

// constructor

function dynObj(id, x, y, w, h) 
{
  this.el = dynObj.getElemRef(id);
  if(!this.el) 
	{
		return;  
	}
  this.id = id; 
  dynObj.holder[this.id] = this; 
  this.animString = "dynObj.holder." + this.id;
  
  var px = window.opera? 0: "px";
	
	this.x = x || 0;	
	if(x) 
	{
		this.el.style.left = this.x + px;
	}
	
	this.y = y || 0;	
	if(y) 
	{
		this.el.style.top = this.y + px;
	}
	
	// if w/h passed, set style width/height
	this.w = w || this.el.offsetWidth || 0;	
	if(w) 
	{
		this.el.style.width = w + px; 
	}

	this.h = h || this.el.offsetHeight || 0;
	if(h) 
	{
		this.el.style.height = h + px;
	}
  
  // methods (ref's)
  this.shiftTo = dw_shiftTo;  
  this.shiftBy = dw_shiftBy;
  this.show = dw_show;  
  this.hide = dw_hide;  
}

// ref can be discarded (with other prop's retained) and re-obtained using getInstance
dynObj.getElemRef = function(id) 
{ 
  var el = document.getElementById? document.getElementById(id): document.all? document.all[id]: null;
  return el;
} 

dynObj.getInstance = function(id) 
{
  var obj = dynObj.holder[id];
  if (!obj) 
  {
  	obj = new dynObj(id);
  }
  else if (!obj.el)
  { 
  	obj.el = dynObj.getElemRef(id);
  }
  return obj;
}

function dw_shiftTo(x, y) 
{
  if (x != null) 
  {
  	this.x = x;
  	this.el.style.left = this.x + "px";
  }
  
  if (y != null) 
  {
  	this.y = y;
  	this.el.style.top = this.y + "px";
  }
}

function dw_shiftBy(x, y) 
{ 
	this.shiftTo(this.x + x, this.y + y); 
}

function dw_show() 
{ 
	this.el.style.visibility = "visible"; 
}

function dw_hide() 
{ 
	this.el.style.visibility = "hidden"; 
}  

// for time-based animations
// resources: www.13thparallel.org and www.youngpup.net (accelimation)
var dw_Bezier = {
  B1: function(t) 
  { 
  	return t*t*t 
  },
  B2: function(t) 
  { 
  	return 3*t*t*(1-t) 
  },
  B3: function(t)
  { 
  	return 3*t*(1-t)*(1-t) 
  },
  B4: function(t) 
  { 
  	return (1-t)*(1-t)*(1-t) 
  },
  // returns current value based on percentage of time passed
  getValue: function (percent,startVal,endVal,c1,c2) 
  {
    return endVal * this.B1(percent) + c2 * this.B2(percent) + c1 * this.B3(percent) + startVal * this.B4(percent);
  }
}

// adapted from accelimation.js by Aaron Boodman of www.youngpup.net
dw_Animation = 
{
  instances: [],
  add: function(fp) 
  {
    this.instances[this.instances.length] = fp;
  	if (this.instances.length == 1) this.timerID = window.setInterval("dw_Animation.control()", 20);
  },
  
  remove: function(fp) 
  {
    for (var i = 0; i < this.instances.length; i++) 
    {
  		if (fp == this.instances[i]) 
  		{
  			this.instances = this.instances.slice(0,i).concat( this.instances.slice(i+1) );
  			break;
  		}
  	}
  	if (this.instances.length == 0) 
  	{
  		window.clearInterval(this.timerID);	this.timerID = null;
  	}
  },
  
  control: function() 
  {
    for (var i = 0; i < this.instances.length; i++) 
    {
  		if (typeof this.instances[i] == "function" ) 
  		{	
  			this.instances[i]();
  		}
      else 
      {
      	eval(this.instances[i]);
      }
    }
  }
}
