var freezeImg = new Image();
freezeImg.src = "img/freeze.gif";
var thawImg = new Image();
thawImg.src = "img/thaw.gif";
var lightonImg = new Image();
lightonImg.src = "img/lighton.gif";
var lightoffImg = new Image();
lightoffImg.src = "img/lightoff.gif";

var floodElev = 0;
var floodStep = 1;

function Point(valX, valY,valZ)
{
	this.X = new Number(valX);
	this.Y = new Number(valY);
	this.Z = new Number(valZ);
}
function Point.prototype.Add(pt)
{
	this.X += pt.X;
	this.Y += pt.Y;
	this.Z += pt.Z;
}
function Point.prototype.Sub(pt)
{
	this.X -= pt.X;
	this.Y -= pt.Y;
	this.Z -= pt.Z;
}

function Point.prototype.Scale(pt)
{
	this.X *= pt.X;
	this.Y *= pt.Y;
	this.Z *= pt.Z;
}

function Point.prototype.DeScale(pt)
{
	this.X /= pt.X;
	this.Y /= pt.Y;
	this.Z /= pt.Z;
}
var ptOffset = null;
var ptScale = null;

var curCamera = "StaticCamera_Target_View";
var curCamDiv = null;
function document.oncontextmenu()
{
	var s = event.srcElement.tagName;
	// For Selection Ranges, s will be UNDEFINED
	if (s && s != "INPUT" && s != "TEXTAREA" || event.srcElement.disabled || document.selection.createRange().text.length == 0)
	{
		event.returnValue = false;
	}
}
function document.onselectstart()
{
	var s = event.srcElement.tagName;
	if (s != "INPUT" && s != "TEXTAREA") event.returnValue = false;
}

var ie4 = (document.all && !document.getElementById);
var ie5 = (document.all && document.getElementById);
var ns6 = (!document.all && document.getElementById);

function element(id)
{
	if(ie5)			// Explorer 5+ 
		return document.getElementById(id);
	else if (ns6) 	// Netscape 6+ and Mozilla
	{	if (id == "TNTCtrl")
			id += "XP";
		return document.getElementById(id);
	}
	else if(ie4)	// Explorer 4
		return document.all[id];
	return null;
}

var deg2radians = Math.PI * 2 / 360;
function fnSetRotation(oObj, deg)
{    rad = deg * deg2radians ;
	costheta = Math.cos(rad);
	sintheta = Math.sin(rad);

	oObj.filters.item(0).M11 = costheta;
	oObj.filters.item(0).M12 = -sintheta;
	oObj.filters.item(0).M21 = sintheta;
	oObj.filters.item(0).M22 = costheta;
}
		
function getAttribute(node,attribName)
{
	var att = node.attributes.getNamedItem(attribName);
	if (att != null)
		return att.value;
	else
		return "";
}
function setAttribute(node,attribName,attribValue)
{
	var xmlDoc = node.ownerDocument;
	var att = xmlDoc.createAttribute(attribName);
	att.value = attribValue;
	node.attributes.setNamedItem(att);
}
var xmlDoc = null;
function loadskin()
{
	xmlDoc = new ActiveXObject("Msxml2.DOMDocument");
	xmlDoc.async = false;
	if (!xmlDoc.load("scene.xml"))
		return;
	var xslDoc = new ActiveXObject("Msxml2.DOMDocument");
	xslDoc.async = false;
	if (!xslDoc.load("skin.xsl"))
		return;			
		
	var root = xmlDoc.selectSingleNode("Root");
	var oTitle = element("oTitle");
	if (oTitle != null)	
	{
	    oTitle.innerText = getAttribute(root,"ProjectName");
	}
	document.title = getAttribute(root,"ProjectName");
	
	var cam = getAttribute(root,"StartupCamera");
	if (cam != "")
		curCamera = cam;
	ptOffset = new Point(getAttribute(root,"GlobalOffsetX"),getAttribute(root,"GlobalOffsetY"),getAttribute(root,"GlobalOffsetZ"));
	
	var gScale = root.selectSingleNode("Params/GlobalScale");
	ptScale = new Point(getAttribute(gScale,"X"),getAttribute(gScale,"Y"),getAttribute(gScale,"Z"));
	
	var flood = root.selectSingleNode("Params/Flood");
	floodElev = Number(getAttribute(flood,"Elevation"));
	floodStep = Number(getAttribute(flood,"Step"));
	
	var oLayers = element("oLayers");
	if (oLayers != null)
	{
	    var layers = xmlDoc.selectSingleNode("Root/Layers");
	    if (layers != null)
	    {
		    oLayers.insertAdjacentHTML("afterBegin",layers.transformNode(xslDoc));
   	    }
   	}
   	
   	var oLights = element("oLights");
   	if (oLights != null)
   	{
   	    var lights = xmlDoc.selectSingleNode("Root/Lights");
	    if (lights != null)
	    {
		    oLights.insertAdjacentHTML("afterBegin",lights.transformNode(xslDoc));
   	    }
   	}
   	var oCamSelect = element("oCamSelect");
   	if (oCamSelect != null)
   	{
   	    var cameras = xmlDoc.selectSingleNode("Root/Cameras");
   	    if (cameras != null)
	    {
		    var oNodeList = cameras.childNodes;
   		    for (var i=0; i< oNodeList.length; i++) 
   		    {
   			    var camera = oNodeList.item(i);
   			    var oOption = document.createElement("OPTION");
   			    oOption.text=getAttribute(camera,"Name");
			    oOption.value=camera.nodeName + "_" + getAttribute(camera,"Name");
   			    oCamSelect.add(oOption);
   		    }
   	    }
   	 }
   	if (element("oViewCtrl") != null)
		oViewCtrl.src = "scene.rdv";
}

function DoCommand(string)
{
	var control = element("oViewCtrl");
	if(control)
	{
		return control.TNTDoCommand(string);
	}
	return "";
}

function restartCamera(camName)
{
	DoCommand('CameraCtrl.SetCurrent("' + camName + '")');	
	DoCommand('Objects("AnimTarget_*").SetEnable(false)');
	DoCommand('SceneGraph.Physics.Reset()');
	curCamera = camName;			
	startAnim();
}

function setCamera(camName)
{
	DoCommand('Objects("*").ResetAnimation()');	
	stopAnim();
	if (camName.indexOf("StaticCamera") != -1)
	{
	    var oCamImg = element("oCamImg");
	    if (oCamImg != null) oCamImg.src = "img\\camera.gif";
		restartCamera(camName);
	}
	else
	{
		var oCamImg = element("oCamImg");
	    if (oCamImg != null) oCamImg.src ="img\\dyncamera.gif";		
		restartCamera(camName);
		var targName = camName.replace("AnimCamera_","AnimTarget_");
		DoCommand('Objects("' + targName +'").SetEnable(true)');
	}
	SetViewFocus();	
}
						
function switchLayer()
{
	var oDiv = event.srcElement;
	if (oDiv.tagName == "IMG")
		oDiv = oDiv.parentElement;
	var state;
	if (oDiv.state)
	{
		if (oDiv.state == "on")
			state = "off";
		else
			state = "on";
	}
	else
	{
		state = "off";
	}
	oDiv.state = state;

	var oImg = oDiv.children(0);
	var objName = oDiv.innerText;
	var cmd = "ObjectTree('Layer_" + objName + "*').SetEnable(";
	if (state == "on")
	{
		oImg.src = thawImg.src;
		cmd += "true)";
	}
	else
	{
		oImg.src = freezeImg.src;
		cmd += "false)";
	}
	DoCommand(cmd);
}

function switchLight()
{
	var oDiv = event.srcElement;
	if (oDiv.tagName == "IMG")
		oDiv = oDiv.parentElement;
	var state;
	if (oDiv.state)
	{
		if (oDiv.state == "on")
			state = "off";
		else
			state = "on";
	}
	else
	{
		state = "off";
	}
	oDiv.state = state;

	var oImg = oDiv.children(0);
	var objName = oDiv.innerText;
	var cmd = "SceneGraph.Objects('" + objName + "').SetEnable(";
	if (state == "on")
	{
		oImg.src = lightonImg.src;
		cmd += "true)";
	}
	else
	{
		oImg.src = lightoffImg.src;
		cmd += "false)";
	}
	DoCommand(cmd);
}

function SetViewFocus()
{
	var control = element("oViewCtrl");
	if(typeof(control)=="object")
		control.focus();
    var oMLineWidth = element("oMLineWidth");
    if (oMLineWidth != null) oMLineWidth.value = 5;
	updatePosition();
}

function OnReady()
{
	setCamera(curCamera);
	var oCamSelect = element("oCamSelect");
	if (oCamSelect != null)	oCamSelect.value = curCamera;
	if (xmlDoc != null)
	{
	    var root = xmlDoc.selectSingleNode("Root");
        var fogst = getAttribute(root,"FogStart");
        var fogend = getAttribute(root,"FogEnd");
        var fogclr = getAttribute(root,"FogColor");
        if (fogst != "" && fogend != "")
            DoCommand("Renderer.SetFog(" + fogclr + "," + fogst + "," + fogend + ")");
	}
	SetViewFocus();
}

function OnClick( obj )
{
}

function OnMouseEnter( obj )
{
}

function OnMouseExit( obj )
{
}

function OnZoneEnter( zone, physics )
{
}

function OnZoneExit( zone, physics )
{
}

function Restart()
{
}

function updatePosition()
{
	var cmdx;
	var cmdy;
	var cmdz;
	var cmdRot;
	var curCam = DoCommand('CameraCtrl.GetCurrent()');
	cmdx = "SceneGraph.Objects('"+curCam+"').GetPositionWorldX()";
	cmdy = "SceneGraph.Objects('"+curCam+"').GetPositionWorldY()";
	cmdz = "SceneGraph.Objects('"+curCam+"').GetPositionWorldZ()";
	var XPos = new Number(DoCommand(cmdx));
	var YPos = new Number(DoCommand(cmdy));
	var ZPos = new Number(DoCommand(cmdz));
	var camPt = new Point(XPos,YPos,ZPos);
	if (ptOffset != null)
	camPt.Add(ptOffset);
    if (ptScale != null)
    camPt.DeScale(ptScale);	
	
	var ospX = element("coordX");
	var ospY = element("coordY");
	var ospZ = element("coordZ");

	if (ospX != null && ospY != null && ospZ != null)
    {
	    ospX.innerText = camPt.X.toFixed(2);
	    ospY.innerText = camPt.Y.toFixed(2);
	    ospZ.innerText = camPt.Z.toFixed(2);
	}
	var oPos = element("ospos");
	if (oPos != null)
	{
	    oPos.innerText = camPt.X.toFixed(2) + "," + camPt.Y.toFixed(2) + "," + camPt.Z.toFixed(2);
	}
	
	cmdRot = "SceneGraph.Objects('"+curCam+"').GetRotationLocalZ()";
	var rot = new Number(DoCommand(cmdRot));
	if (curCam.indexOf("AnimCamera") != -1)
	{
		curCam = curCam.replace("AnimCamera_","Controller_");
		cmdRot = "SceneGraph.Objects('"+curCam+"').GetRotationLocalZ()";
		rot += new Number(DoCommand(cmdRot));
	}
	var oNorthArrow = element("oNorthArrow");
	if (oNorthArrow != null) fnSetRotation(oNorthArrow,rot);
	setTimeout("updatePosition()",100);
}

function camSlower()
{	
	var speed = new Number(DoCommand('CameraCtrl.GetMoveSpeed()'));
	speed *= 0.8;
	DoCommand('CameraCtrl.SetMoveSpeed(' + speed + ')');
	SetViewFocus();	
}

function camFaster()
{
	var speed = new Number(DoCommand('CameraCtrl.GetMoveSpeed()'));
	speed *= 1.2;
	DoCommand('CameraCtrl.SetMoveSpeed(' + speed + ')');
	SetViewFocus();
}

function stopAnim()
{
	DoCommand("SceneGraph.Objects('*').StopAnimation()");
}

function startAnim()
{
	DoCommand("SceneGraph.Objects('*').StartAnimation()");
}
var printCount = 0;
function print(resolution)
{
	printCount++;
	var filePath = window.location.pathname;
	if (window.location.protocol.search("http:") != -1)
	{
		filePath = "C:\\";
	}
	else
	{
		filePath = filePath.replace("index.htm","");
		filePath = filePath.replace("/","");
	}
	filePath += "screenShot" + new String(printCount) + ".bmp";	
	filePath = unescape(filePath);
	var cmd = "Renderer.SaveImage('" + filePath + "'," + new String(resolution) + ")";
	DoCommand(cmd);	
	alert("Screen shot saved at: " + filePath);
}

function MeasureMode(on)
{
	if (on == 1)
	{
		DoCommand('SceneGraph.Objects(*).SetOcclusion(1)');
		DoCommand('CameraCtrl.SetIgnoreInput(1)');	
		DoCommand('Measurement.SetMode(1)');	
		MeasureWidth(oMLineWidth.value);
	}
	else if(on == 2)
	{
		DoCommand('SceneGraph.Objects(*).SetOcclusion(0)');
		DoCommand('CameraCtrl.SetIgnoreInput(0)');	
		DoCommand('Measurement.SetMode(2)');
	}
	else if (on == 0)
	{
		DoCommand('SceneGraph.Objects(*).SetOcclusion(0)');
		DoCommand('CameraCtrl.SetIgnoreInput(0)');	
		DoCommand('Measurement.SetMode(0)');	
		spDistance.innerText = "0";
	}
}

function MeasureWidth(val)
{
	DoCommand('Measurement.SetLineSize(' + val + ')');
}

function OnMeasureUpdate(distance)
{
	var nDist = new Number(distance);
	spDistance.innerText = nDist.toFixed(2);
}

