// JScript File


//==============Bridgeworks Web API=================//
// 		Acts as an interface for web elements
// 		to interact with a Bridgeworks scene
//==================================================//

/**
	Interface object for communicating with Bridgeworks
	@example: var BWexample = new BridgeWorksObject();
*/	
function BridgeWorksObject()
{
	/** 
		sceneControl (object): creates a reference to a Bridgeworks scene
		object embedded in the web page. This value must be set for the
		interaction to work.
	 */  
	this.sceneControl = "";
	
	this.FRAME_RATE_DEFAULT = 30;
	this.FRAME_RATE_MAX = this.FRAME_RATE_DEFAULT * 32;
    	this.FRAME_RATE_MIN = this.FRAME_RATE_DEFAULT * -32;

	
	/**
		frameRate (float): sets the default playback speed of the scene.
		This value is adjusted using the setFrameRate method.
	*/	
	this.frameRate = this.FRAME_RATE_DEFAULT;
	
	//isPaused (boolean): sets whether the scene is currently paused or not
	this.isPaused = true;
	
	this.play = play;
	this.pause = pause;
	this.resetStop = resetStop;
	this.resetPlay = resetPlay;
	this.setFrameRate = setFrameRate;
	
	/**
		call the UpdateScene interface in the Bridgeworks scene to send in XML
		@param newXML (string): the raw XML text that will be passed into
		Bridgeworks
	*/	
	function UpdateScene(newXML)
	{
		if (this.sceneControl)
		{
			this.sceneControl.UpdateScene(newXML);
		}
		else
		{
			alert("There is no control defined for this Bridgeworks interface. Scene not updated.");
		}
	}

	/**
		plays or pauses the scene. Resets speed if not at the default.
		@param void
	*/	
	function play()
	{
	    this.sceneControl.Play();
	    this.isPaused = false;
	}
	
	/**
		plays or pauses the scene. Resets speed.
		@param void
	*/	
	function pause()
	{
		this.sceneControl.Pause();
		this.isPaused = true;
	}
	
	/**
		resets the scene to the beginning and stops playback
		@param void
	*/	
	function resetStop()
	{
	    this.sceneControl.Stop();
	    this.isPaused = true;
	}
	
	/**
		resets the scene to the beginning and resumes playback
		@param void
	*/	
	function resetPlay()
	{
		this.sceneControl.Reset();
		this.isPaused = false;
	}
	
	/**
		sets the playback speed of the scene
		@param frameRate (float): new speed value
	*/	
	function setFrameRate(frameRate)
	{
		this.frameRate = frameRate;
		var setCmd = "<Set target='RenderAgent' desiredFrameRate='" + frameRate + "'/>";
        	this.sceneControl.UpdateScene(setCmd);
	}
}

function GetBridgeworks()
{
    return document.getElementById("Bridgeworks");
}

function jsPeer(){} // constructor
jsPeer.prototype =
{
    QueryInterface : function(iid)
    {
        if(iid.equals(Components.interfaces.nsIJSPeer))
            return this;
        throw Components.results.NS_NOINTERFACE;
    },
    ReceiveMessage : function(message)
    {
        handleReceiveMessage(message);
    }
}; 

function createObject(scene, width, height)
{
    var browser = navigator.appName;
    
    if (browser.indexOf("Netscape") != -1)
    {
        var object = '<embed ID="Bridgeworks" type="application/bridgeworks" width="';
            object += (width + '" height="' + height + '" scene="' + scene + '" threadModel="' + "0" + '"/>');
            
        document.write(object);
        
        document.embeds[0].jsPeer = new jsPeer();
        
    }
    else if (browser.indexOf("Microsoft") != -1)
    {
	    document.write('<OBJECT ID="Bridgeworks" CLASSID="CLSID:3E1A7D52-C16E-4E94-AF5F-E6C1759F736B">')
	    document.write('<param name="scene" value="' + scene +'">')
	    document.write('<param name="width" value="'  + width  +'">')
	    document.write('<param name="height" value=" '+ height +'">')
	    document.write('<param name="threadModel" value=" '+ 0 +'">')
	    document.write('</OBJECT>')
	}
	else
	{
	    document.write('Your browser is not supported.');
	}
}


var g_msgDom = null;


var g_lastNode = null;

function handleReceiveMessage(msg)
{
    
    var browser = whichBrowser();
    
    switch (browser)
    {
        case 'N':
        {
            //create a DOMParser
            var objDOMParser = new DOMParser();
            
            //create new document from string
            g_msgDom = objDOMParser.parseFromString(msg, "text/xml");
        }
        break;
        case 'M':
        {
            g_msgDom = createXMLDomDocument();
            g_msgDom.loadXML(msg);
        }
        break;
        default:
        break;
    }
    
    if (!g_msgDom) return;
    
    g_msgDom.async = false;
				
    // "event" is an inline attribute
	var evt = g_msgDom.getElementsByTagName("Message").item(0).attributes.getNamedItem("event");
	
	// name is an element with text content
	var name = g_msgDom.getElementsByTagName("name").item(0);
	
	if (evt && name)
	{
	    if (g_lastNode)
	    {
	        g_lastNode.style.backgroundColor = "transparent";
	    }
	    
	    //alert (name.textContent);
	    
	    var selectedName = name.textContent == null ? name.text : name.textContent;
	    
		selectedName = selectedName.replace("Label_", "");
		
		Selected = selectedName;
		
		if (selectedName != null && selectedName != "" && selectedName != "Selector")
		{
		    // TODO:  move colors to config/style
			//window.status = selectedName;
			var divCurrentSelection = document.getElementById("divCurrentSelection");
			if (divCurrentSelection)
			{
			    divCurrentSelection.innerHTML = selectedName + "'s network:";
			}
			
			var update = "<Set target=\"EdgeRenderer\" selectedNode=\"" + selectedName + "\"/>";
			//alert(update);
			Bridgeworks.UpdateScene(update);
			var node = document.getElementById(selectedName);
			if (node)
			{
			    g_lastNode = node;
			    g_lastNode.style.backgroundColor = "CCCCFF"; 
			    g_lastNode.scrollIntoView(false); 
			   
			}
		}
		
		if (evt.value == "MButton1.Click")
		{
		    HideMenu();
		}
		else if (evt.value == "MButton1.DoubleClick" && selectedName != "Selector" && selectedName != "PolyLines")
		{
		    Bridgeworks.UpdateScene("<Set target=\"GraphData\" layoutRoot=\"" + selectedName + "\"/>");
		}
		else if (evt.value == "MButton1.DoubleClick" && selectedName == "Selector") // if nothing selected on double
		{
		    Locate("Graph", ".5");
		}
		else if (evt.value == "MButton3.Click" && selectedName != "Selector" && selectedName != "PolyLines")
		{
		    ShowMenu(selectedName);
		}
		else if (evt.value == "Mouse.Hover" && selectedName != "Selector" && selectedName != "PolyLines")
		{
		    // TODO:  move colors to config/style
			var divCurrentSelection = document.getElementById("divCurrentSelection");
			if (divCurrentSelection)
			{
			    divCurrentSelection.innerHTML = name.text + "'s network:";
			}
			
			Bridgeworks.UpdateScene("<Set target=\"EdgeRenderer\" selectedNode=\"" + selectedName + "\"/>");
			
			var node = document.getElementById(selectedName);
			if (node)
			{
			    g_lastNode = node;
			    g_lastNode.style.backgroundColor = "CCCCFF"; 
			    g_lastNode.scrollIntoView(false); 
			   
			}
		}	
	}
}