/*
		dw_core.js
		version date: July 2002
				
		This code is from Dynamic Web Coding 
    at http://www.dyn-web.com/
    Copyright 2002 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 constructor
//		arguments: id (required): id of positioned div.
//		left,top,width,height optional arguments.
/////////////////////////////////////////////////////////////////////
function dynObj(id,x,y,w,h) {
	this.el = (document.getElementById)? document.getElementById(id): (document.all)? document.all[id]: (document.layers)? getLyrRef(id,document): null;
	if (!this.el) return null;
	this.doc = (document.layers)? this.el.document: this.el;
	this.css = (this.el.style)? this.el.style: this.el;
	var px = (document.layers||window.opera)? "": "px";
	this.x = x || 0;	if (x) this.css.left = this.x+px;
	this.y = y || 0;	if (y) this.css.top = this.y+px;
	this.width = w? w: (this.el.offsetWidth)? this.el.offsetWidth: (this.css.clip.width)? this.css.clip.width: 0;
	this.height = h? h: (this.el.offsetHeight)? this.el.offsetHeight: (this.css.clip.height)? this.css.clip.height: 0;
	// if w/h passed, set style width/height
	if (w){ (document.layers)? this.css.clip.width=w+px: this.css.width=w+px;}
	if (h){ (document.layers)? this.css.clip.height=h+px: this.css.height=h+px;}
	this.obj = id + "dynObj"; 	eval(this.obj + "=this");
}

function dw_show() { this.css.visibility = "visible"; }
function dw_hide() { this.css.visibility = "hidden"; }

function dw_shiftTo(x,y) {
	if (x!=null) this.x=x; if (y!=null) this.y=y;	
	// rounded below (this.x/y can hold decimals)
	if (this.css.moveTo) { 
		this.css.moveTo(Math.round(this.x),Math.round(this.y)); 
	} else { 
		this.css.left=Math.round(this.x)+"px"; 
		this.css.top=Math.round(this.y)+"px"; 
	}
}

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

function dw_writeLyr(cntnt) {
	if (typeof this.doc.innerHTML!="undefined") {
      this.doc.innerHTML = cntnt;
  } else if (document.layers) {
			this.doc.write(cntnt);
			this.doc.close();
  }
}

function dw_setBgClr(bg) {
	if (document.layers) this.doc.bgColor=bg;
	else this.css.backgroundColor=bg;
}

// assign methods 
dynObj.prototype.show = dw_show;
dynObj.prototype.hide = dw_hide;
dynObj.prototype.shiftTo = dw_shiftTo;
dynObj.prototype.shiftBy = dw_shiftBy;
dynObj.prototype.writeLyr = dw_writeLyr;
dynObj.prototype.setBgClr=dw_setBgClr;


// get reference to nested layer for ns4
// from dhtmllib.js by Mike Hall of www.brainjar.com
function getLyrRef(lyr,doc) {
	if (document.layers) {
		var theLyr;
		for (var i=0; i<doc.layers.length; i++) {
	  	theLyr = doc.layers[i];
			if (theLyr.name == lyr) return theLyr;
			else if (theLyr.document.layers.length > 0) 
	    	if ((theLyr = getLyrRef(lyr,theLyr.document)) != null)
					return theLyr;
	  }
		return null;
  }
}

/*
		dw_util.js
		utility functions (and 1 method for dynObj)
		version date: August 2002
		
		functions for getting window dimensions and scroll amount
		from http://13thparallel.com/?issue=2002.06&title=viewport
				
		This code is from Dynamic Web Coding 
    www.dyn-web.com 
    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.		
*/

// center in container (window or outer layer)
// NOTE: uses this.width/height properties of dynObj
// so make sure those have been obtained/set appropriately
// for type of content!!!!
dynObj.prototype.centerIn = function(outer) {
	var outWd, outHt, inWd, inHt, x, y;
	if (eval(outer)==window) {
		outWd=getWinWidth();
		outHt=getWinHeight();
	} else {
		outWd=outer.width;
		outHt=outer.height;
	}
	inWd=this.width;
	inHt=this.height;
	x=Math.round((outWd-inWd)/2);
	y=Math.round((outHt-inHt)/2);
	this.shiftTo(x,y);
}

// gets rendered height/width 
// for ns4, pass reference to layer. 
// for others, pass reference to layer or
// id of html element containing content (depends...)
function getWidth(obj,id) {
	var wd=0;
	if (document.getElementById||document.all) {
		var elem;
		if (id)	elem = (document.getElementById)? document.getElementById(id): document.all[id];
		else elem = obj;
		if (elem.offsetWidth) wd = elem.offsetWidth;
  } else if (obj.document) wd = obj.document.width;	// ns4
	return wd;
}

function getHeight(obj,id) {
	var ht=0;
	if (document.getElementById||document.all) {
    var elem;
		if (id)	elem = (document.getElementById)? document.getElementById(id): document.all[id];
		else elem = obj;
		if (elem.offsetHeight) ht = elem.offsetHeight;
  } else if (obj.document) ht = obj.document.height;	// ns4
	return ht;
}

// credit to http://www.13thparallel.com for the following 4 functions
// see http://13thparallel.com/?issue=2002.06&title=viewport
// returns width of window
function getWinWidth() {
	var winWd = 0;
	if (document.documentElement && document.documentElement.clientWidth) 
		winWd = document.documentElement.clientWidth;
	else if (document.body && document.body.clientWidth) 
		winWd = document.body.clientWidth;
	else if (document.body && document.body.offsetWidth) 
		winWd = document.body.offsetWidth; // ns6
	else if (window.innerWidth) winWd = window.innerWidth-18;
	return winWd;
}

// returns height of window
function getWinHeight() {
	var winHt = 0;
	if (window.innerHeight) winHt = window.innerHeight-18;
	else if (document.documentElement && document.documentElement.clientHeight) 
		winHt = document.documentElement.clientHeight;
	else if (document.body && document.body.clientHeight) 
		winHt = document.body.clientHeight;
	return winHt;
}	

// returns amount of vertical scroll
function getScrollY() {
	var scroll_y = 0;
	if (document.documentElement && document.documentElement.scrollTop)
		scroll_y = document.documentElement.scrollTop;
	else if (document.body && document.body.scrollTop) 
		scroll_y = document.body.scrollTop; 
	else if (window.pageYOffset)
		scroll_y = window.pageYOffset;
	else if (window.scrollY)
		scroll_y = window.scrollY;
	return scroll_y;
}

// returns amount of horizontal scroll
function getScrollX() {
	var scroll_x = 0;
	if (document.documentElement && document.documentElement.scrollLeft)
		scroll_x = document.documentElement.scrollLeft;
	else if (document.body && document.body.scrollLeft) 
		scroll_x = document.body.scrollLeft; 
	else if (window.pageXOffset)
		scroll_x = window.pageXOffset;
	else if (window.scrollX)
		scroll_x = window.scrollX;
	return scroll_x;
}

/*
		dw_clip.js - clip methods for use with dw_core.js
		developed from study of code from dynduo, brainjar and bratta
		i.e., http://www.dansteinman.com/dynduo/
		http://www.brainjar.com/ and http://www.dhtmlcentral.com/
		
		This code is from Dynamic Web Coding 
    at http://www.dyn-web.com/
    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.prototype.getClipValues = function() {
  if (typeof this.css.clip != "undefined") {
    var clipVal = new Array();
    if (typeof this.css.clip.top != "undefined") {
  		clipVal[0] = this.css.clip.top;
  		clipVal[1] = this.css.clip.right;
  		clipVal[2] = this.css.clip.bottom;
  		clipVal[3] = this.css.clip.left;
  	} else {
  		clipVal = this.css.clip.slice(5,-1).split(' ');
  			for (var i=0; i<4; i++) {
  				clipVal[i] = parseInt(clipVal[i]);
  			}
    } 
    return clipVal;
  } 
  else return false;
}

dynObj.prototype.clipBy = function(top,rt,btm,lft) {
	if (typeof this.css.clip != "undefined") {
    if (typeof this.css.clip.top != "undefined") {
    	this.css.clip.top += top;
  		this.css.clip.right += rt;
  		this.css.clip.bottom += btm;
  		this.css.clip.left += lft;
    } else {
      var clipVal = this.getClipValues();
    	this.css.clip = "rect(" + Number(clipVal[0]+top) + "px, " + Number(clipVal[1]+rt)  + "px, " + Number(clipVal[2]+btm) + "px, " + Number(clipVal[3]+lft) + "px)";
    } 
  }
}

dynObj.prototype.clipTo = function(top,rt,btm,lft) {
	 if (typeof this.css.clip != "undefined") {
    if (typeof this.css.clip.top != "undefined") {
    	this.css.clip.top = top;
  		this.css.clip.right = rt;
  		this.css.clip.bottom = btm;
  		this.css.clip.left = lft;
    } else {
      this.css.clip = "rect("+top+"px, "+rt+"px, "+btm+"px, "+lft+"px)";
    }
  }
}


/* 
		dw_wipes.js		wipe methods for dynObj 
		(requires dw_core.js, dw_clip.js, and dw_util.js)
		version date: October 2002 (this.wiping prop added)
		
		This code is from Dynamic Web Coding  
		at http://www.dyn-web.com/
    Copyright 2002 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.
		
		Idea and math for time-based animation from:
		Aaron Boodman at www.youngpup.net 
		and Mike Foster at www.cross-browser.com
*/

// wipe called can be prevented
var wipe_halt = false;	

// args: which wipe, delay, wipeTime, what next (fn)
dynObj.prototype.wipe=function(which,delay,wipeTime,fn) {
	if (wipe_halt||this.wiping) return;
	this.wipeTime=wipeTime||1000; this.delay=delay||100; this.fn=fn;
	switch (which) {
		// wipe into view by expanding to the right
		case "in right" :
			this.clipTo(0,0,this.height,0);
			this.show();
      setTimeout(this.obj+".wipe_in_rt()",this.delay);
  	break;
		
		// wipe into view by expanding from the center out
		case "in center" :
			this.vCenter = Math.ceil(this.height/2);
			this.hCenter = Math.ceil(this.width/2);
			this.clipTo(this.vCenter,this.hCenter,this.vCenter,this.hCenter);
			this.show();
			setTimeout(this.obj+".wipe_in_center()",this.delay);
		break;
		
		// wipe into view from upper left corner to lower right
		case "in corner" :
			this.clipTo(0,0,0,0);
			this.show();
			setTimeout(this.obj+".wipe_in_corner()",this.delay);
		break;
		
		// wipe into view from top to bottom
		case "in top" :
			this.clipTo(0,0,0,0);
			this.show();
			setTimeout(this.obj+".wipe_in_top()",this.delay);
		break;
		
		// wipe out of view by contracting to the center
		case "out center" :
			this.vCenter = Math.ceil(this.height/2);
			this.hCenter = Math.ceil(this.width/2);
			setTimeout(this.obj+".wipe_out_center()",this.delay);
		break;
		
		// wipe out of view by contracting to the left
		case "out left" :
			setTimeout(this.obj+".wipe_out_left()",this.delay);
		break;
		
		// wipe out of view by contracting to the right
		case "out right" :
			setTimeout(this.obj+".wipe_out_right()",this.delay);
  	break;
		
		// wipe out of view by contracting from left and right
  	case "out middle" :
			this.dest=Math.ceil(this.width/2);
      setTimeout(this.obj+".wipe_out_mid()",this.delay);
		break;
		
		// wipe out of view from the upper left to lower right
		case "out corner" :
			setTimeout(this.obj+".wipe_out_corner()",this.delay);
		break;
		
		// wipe out of view from bottom to top
		case "out top" :
			setTimeout(this.obj+".wipe_out_top()",this.delay);
		break;
		
		// wipe out of view from top to bottom
		case "out bottom" :
			setTimeout(this.obj+".wipe_out_bottom()",this.delay);
		break;
		
		// wipe out of view from lower right to upper left
		case "out top left" :
			setTimeout(this.obj+".wipe_out_top_left()",this.delay);
		break;
		
  	default:
			alert("Oops! Check choices again.");
	}
	this.wipeStart = new Date().getTime()+this.delay;
	this.per = Math.PI/(2*this.wipeTime);
}

// wipe into view by expanding to the right
dynObj.prototype.wipe_in_rt=function() {
	this.wiping = true;
	var clipVal = this.getClipValues();
	var elapsed = (new Date().getTime())-this.wipeStart;
	if (elapsed<this.wipeTime) {
//	wipes could potentially be steady, accelerate, or decelerate
//	idea and math from Mike Foster at www.cross-browser.com
//	var inc = this.width*Math.sin(this.per*elapsed);	// decelerate
//	var inc = -this.width*Math.cos(this.per*elapsed)+this.width;	// accel
	var inc = this.width*((1/this.wipeTime)*elapsed);	// steady
	this.clipTo(0,inc,this.height,0);
	setTimeout(this.obj+".wipe_in_rt()",35);
	} else {
		this.clipTo(0,this.width,this.height,0);
		this.wiping = false;
		if (this.fn) eval(this.fn);
	}
}

// wipe into view by expanding from the center out
dynObj.prototype.wipe_in_center=function() {
	this.wiping = true;
	var clipVal = this.getClipValues();
	var elapsed = (new Date().getTime())-this.wipeStart;
	if (elapsed<this.wipeTime) {
	var vinc = this.vCenter*((1/this.wipeTime)*elapsed);
	var hinc = this.hCenter*((1/this.wipeTime)*elapsed);
	this.clipTo(this.vCenter-vinc,this.hCenter+hinc,this.vCenter+vinc,this.hCenter-hinc);
	setTimeout(this.obj+".wipe_in_center()",35);
	} else {
		this.clipTo(0,this.width,this.height,0);
		this.wiping = false;
		if (this.fn) eval(this.fn);
	}
}

// wipe into view from upper left corner to lower right
dynObj.prototype.wipe_in_corner=function() {
	this.wiping = true;
	var clipVal = this.getClipValues();
	var elapsed = (new Date().getTime())-this.wipeStart;
	if (elapsed<this.wipeTime) {
	var vinc = this.height*((1/this.wipeTime)*elapsed);
	var hinc = this.width*((1/this.wipeTime)*elapsed);
	this.clipTo(0,hinc,vinc,0);
	setTimeout(this.obj+".wipe_in_corner()",35);
	} else {
		this.clipTo(0,this.width,this.height,0);
		this.wiping = false;
		if (this.fn) eval(this.fn);
	}
}

// wipe into view from top to bottom
dynObj.prototype.wipe_in_top=function() {
	this.wiping = true;
	var clipVal = this.getClipValues();
	var elapsed = (new Date().getTime())-this.wipeStart;
	if (elapsed<this.wipeTime) {
	var inc = this.height*((1/this.wipeTime)*elapsed);
	this.clipTo(0,this.width,inc,0);
	setTimeout(this.obj+".wipe_in_top()",35);
	} else {
		this.clipTo(0,this.width,this.height,0);
		this.wiping = false;
		if (this.fn) eval(this.fn);
	}
}

// wipe out of view by contracting to the center
dynObj.prototype.wipe_out_center=function() {
	this.wiping = true;
	var clipVal = this.getClipValues();
	var elapsed = (new Date().getTime())-this.wipeStart;
	if (elapsed<this.wipeTime) {
	var vinc = this.vCenter*((1/this.wipeTime)*elapsed);
	var hinc = this.hCenter*((1/this.wipeTime)*elapsed);
	this.clipTo(vinc,this.width-hinc,this.height-vinc,hinc);
		setTimeout(this.obj+".wipe_out_center()",35);
	} else {
		this.clipTo(this.vCenter,this.hCenter,this.vCenter,this.hCenter);
		this.wiping = false;
		if (this.fn) eval(this.fn);
	}
}

// wipe out of view by contracting to the left
dynObj.prototype.wipe_out_left=function() {
	this.wiping = true;
	var clipVal = this.getClipValues();
	var elapsed = (new Date().getTime())-this.wipeStart;
	if (elapsed<this.wipeTime) {
		var inc = this.width*((1/this.wipeTime)*elapsed);
		this.clipTo(0,this.width-inc,this.height,0);
		setTimeout(this.obj+".wipe_out_left()",35);
	} else {
		this.clipTo(0,0,this.height,0);
		this.wiping = false;
		if (this.fn) eval(this.fn);
	}
}

// wipe out of view by contracting to the right
dynObj.prototype.wipe_out_right=function() {
	this.wiping = true;
	var clipVal = this.getClipValues();
	var elapsed = (new Date().getTime())-this.wipeStart;
	if (elapsed<this.wipeTime) {
		var inc = this.width*((1/this.wipeTime)*elapsed);
		this.clipTo(0,this.width,this.height,inc);
		setTimeout(this.obj+".wipe_out_right()",35);
	} else {
	this.clipTo(0,this.width,this.height,this.width);
		this.wiping = false;
		if (this.fn) eval(this.fn);
	}
}

// wipe out of view by contracting from left and right
dynObj.prototype.wipe_out_mid=function() {
	this.wiping = true;
	var clipVal = this.getClipValues();
	var elapsed = (new Date().getTime())-this.wipeStart;
	if (elapsed<this.wipeTime) {
//	var inc = this.dest*Math.sin(this.per*elapsed);
	// this one accelerates
	var inc = -this.dest*Math.cos(this.per*elapsed)+this.dest;
//	var inc = this.dest*((1/this.wipeTime)*elapsed);
		this.clipTo(0,this.width-inc,this.height,inc);
		setTimeout(this.obj+".wipe_out_mid()",35);
	} else {
		this.clipTo(0,this.dest,this.height,this.dest);
		this.wiping = false;
		if (this.fn) eval(this.fn);
	}
}

// wipe out of view from upper left to lower right
dynObj.prototype.wipe_out_corner=function () {
	this.wiping = true;
	var clipVal = this.getClipValues();
	var elapsed = (new Date().getTime())-this.wipeStart;
	if (elapsed<this.wipeTime) {
	// accelerates
	var vinc = -this.height*Math.cos(this.per*elapsed)+this.height;
	var hinc = -this.width*Math.cos(this.per*elapsed)+this.width;
		this.clipTo(vinc,this.width,this.height,hinc);
		setTimeout(this.obj+".wipe_out_corner()",35);
	} else {
		this.clipTo(this.height,this.width,this.height,this.width);
		this.wiping = false;
		if (this.fn) eval(this.fn);
	}
}

// wipe out of view from bottom to top
dynObj.prototype.wipe_out_top=function() {
	this.wiping = true;
	var clipVal = this.getClipValues();
	var elapsed = (new Date().getTime())-this.wipeStart;
	if (elapsed<this.wipeTime) {
		var inc = this.height*((1/this.wipeTime)*elapsed);
		this.clipTo(0,this.width,this.height-inc,0);
		setTimeout(this.obj+".wipe_out_top()",35);
	} else {
	this.clipTo(0,this.width,this.height,this.width);
		this.wiping = false;
		if (this.fn) eval(this.fn);
	}
}

// wipe out of view from top to bottom
dynObj.prototype.wipe_out_bottom=function() {
	this.wiping = true;
	var clipVal = this.getClipValues();
	var elapsed = (new Date().getTime())-this.wipeStart;
	if (elapsed<this.wipeTime) {
		var inc = this.height*((1/this.wipeTime)*elapsed);
		this.clipTo(inc,this.width,this.height,0);
		setTimeout(this.obj+".wipe_out_bottom()",35);
	} else {
	this.clipTo(0,this.width,this.height,this.width);
		this.wiping = false;
		if (this.fn) eval(this.fn);
	}
}

// wipe out of view from lower right to upper left
dynObj.prototype.wipe_out_top_left=function () {
	this.wiping = true;
	var clipVal = this.getClipValues();
	var elapsed = (new Date().getTime())-this.wipeStart;
	if (elapsed<this.wipeTime) {
	var vinc = -this.height*Math.cos(this.per*elapsed)+this.height;
	var hinc = -this.width*Math.cos(this.per*elapsed)+this.width;
		this.clipTo(0,this.width-hinc,this.height-vinc,0);
		setTimeout(this.obj+".wipe_out_top_left()",35);
	} else {
		this.clipTo(0,0,0,0);
		this.wiping = false;
		if (this.fn) eval(this.fn);
	}
}
