private void loadLogFile()
	{
		try
		{
			DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
			builderFactory.setValidating(false);
			builderFactory.setNamespaceAware(true);
			DocumentBuilder builder = builderFactory.newDocumentBuilder();
			Document doc = builder.parse(logFile);
			XPathFactory xpathFactory = XPathFactory.newInstance();
			
			// get global log variables
			XPath xpath = xpathFactory.newXPath();
			XPathExpression xpathExpr = xpath.compile("./session");
			NodeList sessions = (NodeList) xpathExpr.evaluate(doc, XPathConstants.NODESET);
			if (sessions.getLength() == 0)
			{
				throw new Exception("No session!");
			}
			Node sessionNode = sessions.item(0);
			
			session = Session.fromXml(sessionNode, xpath, xpathExpr);
			
			xpathExpr = xpath.compile("./toolkit");
			NodeList toolkitSettingsList = (NodeList) xpathExpr.evaluate(sessionNode, XPathConstants.NODESET);
			if (toolkitSettingsList.getLength() == 0)
			{
				throw new Exception("No toolkit settings!");
			}
			Node toolkitSettingsNode = toolkitSettingsList.item(0);
			// FIXME TODO - not sure how the toolkit should be used, but it may ultimately
			// be necessary for displaying data from old toolkit versions.  Alternatively
			// A toolkit version could be treated as a unique toolkit, in which case
			// log files would be specific to a toolkit version, making a toolkit node obsolete
			//toolkitSettings = ToolkitSettings.fromXml(toolkitSettingsNode, xpath, xpathExpr);
			
			xpathExpr = xpath.compile("./event");
			NodeList events = (NodeList) xpathExpr.evaluate(sessionNode, XPathConstants.NODESET);
			if (events.getLength() == 0)
			{
				throw new Exception("No events!");
			}
			
			int eventLength = events.getLength();
			for (int i = 0; i < eventLength; i++)
			{
				// verify that we should still be running
				if (!run) break;
				
				Node node = events.item(i);
				
				// FIXME TODO - get event from xml
				StringWriter stringWriter = new StringWriter(); 
	            Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
	            transformer.transform(new DOMSource(node), new StreamResult(stringWriter)); 
	            Event event = (Event) DataManager.fromXml(stringWriter.toString());
				//Event event = Event.fromXml(node, xpath, xpathExpr);
				
				if (event == null) continue;
				
				// Don't initialize the start time stamp until we have something to place in the queue
				// FIXME TODO - should this not be at the start of go? Or, does it matter?
				if (startTimeStamp == -1)
				{
					startTimeStamp = System.currentTimeMillis();
				}
				
				// set timestamps for delay queue
				event.setReplayStartTimeStamp(startTimeStamp);
				event.setSessionStartTimeStamp(session.getTimeStamp());
			
				currentFileLoadStatus = (float) i / (float) eventLength;
				//System.err.println(currentFileLoadStatus);
				
				delayQueue.add(event);
			}
			
			//System.out.println("done!");
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}