/* 
 * © 2005 Miradigm Corporation, http://miradigm.com
 * All rights reserved.
 * Please, contact Miradigm mailto:support@miradigm.com before copying 
 * or using this on another web site or page for reasonable terms of usage and support.
 * 
 * Naming convention:
 * ip = polymotion set integer index to objects that move together on a single event
 * it = polymotion object index within a set
 * pt = point index
 * l = left point coordinate
 * t = top point coordinate
 */
var poly = new Array();
var sobj = new Array();
var posi = new Array();
var polybase = new Array();
var ixpoly = new Array();

function polyIndex() {return ixpoly[arguments[0]];}

function moveDone(ip,it) {
	var pt = posi[ip][it]['pt'];
	var l  = poly[ip][it][pt]['l'];
	var t  = poly[ip][it][pt]['t'];
	var dl = poly[ip][it][pt]['dl'];
	var dt = poly[ip][it][pt]['dt'];
	var nl = posi[ip][it]['l'];
	var nt = posi[ip][it]['t'];
	if ((((dl>0)&&(nl < l))||((dl<0)&&(nl > l)))||
			(((dt>0)&&(nt < t))||((dt<0)&&(nt > t)))) {
		return false;
	} else {
		return true;
	}
}

function doneNext(ip,it,ax) {
	var dx = 'd'+ax;
	var pt = posi[ip][it]['pt'];
	var m = poly[ip][it][pt][ax];
	var d = poly[ip][it][pt][dx];
	var n = posi[ip][it][ax]+d;
	if (((d>0)&&(n < m))||((d<0)&&(n > m))) {
		return false;
	} else {
		return true;
	}
}

function reset(ip,it) {
	sobj[ip][it].left = poly[ip][it][0]['l'];
	sobj[ip][it].top  = poly[ip][it][0]['t'];
	posi[ip][it]['pt'] = 0;
	posi[ip][it]['l'] = poly[ip][it][0]['l'];
	posi[ip][it]['t'] = poly[ip][it][0]['t'];
	posi[ip][it]['invl'] = 0;
}

function moveNextPt(ip,it) {
	var pt = posi[ip][it]['pt']+1;
	if (pt < poly[ip][it].length) {
		posi[ip][it]['pt']++;
		var wait = poly[ip][it][pt]['wait'];
		if (wait > 0) {
			var func = "move("+ip+","+it+")";
			posi[ip][it]['inmo'] = true;
			posi[ip][it]['invl'] = setInterval(func,wait);
		} else {
			move(ip,it);
		}
	}
}

function move(ip,it) {
	if (posi[ip][it]['pt'] == 0) {
		posi[ip][it]['l'] = poly[ip][it][0]['l'];
		posi[ip][it]['t'] = poly[ip][it][0]['t'];
		moveNextPt(ip,it);
		return;
	}
	var pt = posi[ip][it]['pt'];
	if (pt < poly[ip][it].length) {
		var wait = poly[ip][it][pt]['wait'];
		if (wait == 0) {
			sobj[ip][it].left = poly[ip][it][pt]['l'];
			sobj[ip][it].top  = poly[ip][it][pt]['t'];
			posi[ip][it]['l'] = poly[ip][it][pt]['l'];
			posi[ip][it]['t'] = poly[ip][it][pt]['t'];
			moveNextPt(ip,it);
		} else {
			if (moveDone(ip,it)) {
				clearInterval(posi[ip][it]['invl']);
				posi[ip][it]['inmo'] = false;
				moveNextPt(ip,it);
			} else {
				var dl = poly[ip][it][pt]['dl'];
				var dt = poly[ip][it][pt]['dt'];
				var nl = (doneNext(ip,it,'l')) ? poly[ip][it][pt]['l'] : posi[ip][it]['l']+dl;
				var nt = (doneNext(ip,it,'t')) ? poly[ip][it][pt]['t'] : posi[ip][it]['t']+dt;
				sobj[ip][it].left = nl;
				sobj[ip][it].top  = nt;
				posi[ip][it]['l'] = nl;
				posi[ip][it]['t'] = nt;
			}
		}
	}
}

function inMotion(ip,it) {return posi[ip][it]['inmo']}

function setVisible(ip,it) { sobj[ip][it].visibility = 'visible';}
function setHidden(ip,it) { sobj[ip][it].visibility = 'hidden';}

/*
 * Initialize a set container for related divs that move on the same event or region
 * ip = set index
 * nm = set basename
 * divnm = div id basename, convention = 'div'+nm
 */
function initPolySet(ip,nm,divnm) {
	ixpoly[nm] = ip;
	poly[ip] = new Array();
	sobj[ip] = new Array();
	posi[ip] = new Array();
	polybase[ip] = new Array();
	polybase[ip]['nm'] = nm;
	polybase[ip]['divnm'] = divnm;
}

/*
 * Initialize a polyline or path container
 * ip = set index
 * it = item index
 * divsuffix = div id suffix, convention = 'div'+nm+'_'+divsuffix
 */
function initPolyLine(ip,it,divsuffix) {
	var divnm = polybase[ip]['divnm']+'_'+divsuffix;
	poly[ip][it] = new Array();
	sobj[ip][it] = document.getElementById(divnm).style;
	posi[ip][it] = new Array();
	posi[ip][it]['pt'] = 0;
	posi[ip][it]['l'] = 0;
	posi[ip][it]['t'] = 0;
	posi[ip][it]['invl'] = 0;
	posi[ip][it]['inmo'] = false;
}

/*
 * Initialize polyline points
 * ip = set index
 * it = item index
 * pt = point index
 * l = left coordinate in pixels
 * t = top coordinate in pixels
 * time = travel time to this point from previous point
 * inx = number of stop increments along the line to this point that give the appearance of smooth motion
 * divsuffix = div id suffix, convention = 'div'+nm+'_'+divsuffix
 */
function initPolyPoint(ip,it,pt,l,t,time,inx) {
	poly[ip][it][pt] = new Array();
	poly[ip][it][pt]['l'] = l;
	poly[ip][it][pt]['t'] = t;
	if (pt > 0) {
		var prev = pt - 1;
		if (inx > 1) {
			poly[ip][it][pt]['dl'] = parseInt((poly[ip][it][pt]['l']-poly[ip][it][prev]['l'])/inx);
			poly[ip][it][pt]['dt'] = parseInt((poly[ip][it][pt]['t']-poly[ip][it][prev]['t'])/inx);
			poly[ip][it][pt]['wait'] = parseInt(time/inx);
		} else {
			poly[ip][it][pt]['dl'] = poly[ip][it][pt]['l']-poly[ip][it][prev]['l'];
			poly[ip][it][pt]['dt'] = poly[ip][it][pt]['t']-poly[ip][it][prev]['t'];
			poly[ip][it][pt]['wait'] = 0;
		}
	}
}
