//Flux.js
var browser = null;
var context = null;
var listenersSetup = false;


// Call this from the onLoad in your HTML body tag
// Example: <BODY onload="initFlux('mycoolworld.x3d')">
function initFlux(filename)
{
	browser = null;
	context = null;
	listenersSetup = false;

	//PauseMilliseconds(200); // prevents load-timing errors in Flux

    browser = document.FLUX.getBrowser();
    if (browser != null)
    {
	    listener = new Object();
	    listener.browserChanged = browserChanged;
	    browser.addBrowserListener(listener);
		var dir = location.href.substring(0,location.href.lastIndexOf('/')+1);
		if (dir.indexOf("file:///") == 0) // if it's there...
			dir = dir.substring(8,dir.length);
		var pathparam = dir + filename;
		browser.loadUrlS (pathparam);
		PauseMilliseconds(200); // prevents load-timing errors in Flux
    }
}

function browserChanged(evt)
{
	if (evt == 0)
	{
	    setupListeners();
	}
}

function PauseMilliseconds(Amount)
{
	d = new Date(); //today's date
	while (1)
	{
		mill = new Date(); // Date Now
		diff = mill - d; //difference in milliseconds
		if (diff > Amount)
		{
			break;
		}
	}
}

function SetDOMValue (name, value)
{
	var i;
	var node;
	var names = name.split('.');
	node = context.getNode(names[0]); // shape
	if (node)
	{
		for (i = 1; i < names.length; i++)
		{
			child = node.getField(names[i]);
			if (child)
			{
				node = child.getValue();
			}
		}
		if (child)
		{
			child.setValue(value);
		}
	}
}

function GetDOMValue (name)
{
	var i;
	var node;
	var names = name.split('.');
	node = context.getNode(names[0]); // shape
	if (node)
	{
		for (i = 1; i < names.length; i++)
		{
			child = node.getField(names[i]);
			if (child)
			{
				node = child.getValue();
			}
		}
		if (child)
		{
			return child.getValue(value);
		}
	}
	return (null);
}

function setNodeFieldValue (node, eventInName, value)
{
	var ev = node.getField(eventInName);
	if (ev != null)
	{
		ev.setValue(value);
	}
	else
		alert("Can't get event " + eventInName);
}

function setNodeEventIn(nodeName, eventInName, value)
{
	var node;
	if (context)
	{
		node = context.getNode(nodeName);

		if (node != null)
		{
			setNodeFieldValue (node, eventInName, value);
		}
		else
			alert("Can't get node " + nodeName);
	}
	else
		alert ('context is null! '+nodeName+" "+eventInName+" "+value);
}

function setNodeEventInXYZ(nodeName, eventInName, x,y,z)
{
	var	node = context.getNode(nodeName);
	if (node != null)
	{
		ev = node.getField(eventInName);
		if (ev != null)
		{
			ev.x = x;
			ev.y = y;
			ev.z = z;
		}
		else
			alert("Can't get event " + eventInName);

	}
	else
		alert("Can't get node " + nodeName);

	return null;
}

function setNodeEventInAngle(nodeName, eventInName, a)
{
	var node = context.getNode(nodeName);

	if (node != null)
	{
		ev = node.getField(eventInName);
		if (ev != null)
		{
			ev.angle = a;
		}
		else
			alert("Can't get event " + eventInName);

	}
	else
		alert("Can't get node " + nodeName);

	return null;
}

function Pos(x,y,z)
{
	this.x = x;
	this.y = y;
	this.z = z;
}

function Rot(x,y,z,a)
{
	this.x = x;
	this.y = y;
	this.z = z;
	this.a = a;
}

function setNodeEventInRot(nodeName, eventInName, x,y,z,a)
{
	var node = context.getNode(nodeName);

	if (node != null)
	{
		ev = node.getField(eventInName);
		if (ev != null)
		{
			setNodeEventInXYZ(nodeName, eventInName, x,y,z);
			ev.angle = a;
		}
		else
			alert("Can't get event " + eventInName);

	}
	else
		alert("Can't get node " + nodeName);
	return null;
}

function setNodeEventInRGB(nodeName, eventInName, r, g, b)
{
	var node = context.getNode(nodeName);

	if (node != null)
	{
		ev = node.getField(eventInName);
		if (ev != null)
		{
			ev.r = r;
			ev.g = g;
			ev.b = b;
		}
		else
			alert("Can't get event " + eventInName);

	}
	else
		alert("Can't get node " + nodeName);

	return null;
}
