
if ( navigator.appVersion.substring(0,1) < 4 )
{ 
   if ( navigator.appName != "Netscape" ) 
   { 
   	window.navigate ("downlvl.htm"); 
   } 
   else 
   { 
	    window.location.href = "downlvl.htm"; 
   } 
   alert ("Sorry, but your Web browser needs to be updated. You must have at least a version 4.0 browser to view this project.");
} 
if ( navigator.appName != "Netscape" ) 
{ 
	document.body.background = ""; 
} 
 
strPlatform = new String(navigator.platform); 
strPlatform = strPlatform.toLowerCase(); 
if ("mac" == strPlatform.substring(0,3)) 
   document.all("DocClientData").style.overflow = "visible"; 
 

var	OBJ_SCENE		= 0;			
var	OBJ_PLAYER		= 1;			
var PLAYER_IMAGE	= 0;			
var	PLAYER_TEXT		= 1;			
var PLAYER_DRAW		= 2;			
var	NAME_SCENE		= "S"			
var	NAME_PLAYER		= "P"			
var	PLAYER_NAME_IMAGE	= "I"		
var	PLAYER_NAME_TEXT	= "T"
var PLAYER_NAME_DRAW	= "D"
var	IE_VISIBLE			= "visible";
var	IE_HIDDEN			= "hidden";
var	IE_INHERIT			= "inherit";
var	NAV_VISIBLE			= "show";
var	NAV_HIDDEN			= "hide";
var	NAV_INHERIT			= "inherit";
var	DEFAULT_TICK_RATE		= 100;		
var DEFAULT_SCENE_DURATION	= 10000;	
var	DEFAULT_PLAYER_DELAY	= 0;		
var	TMR_PROJ				= 0;		
var	TMR_SCENE				= 1;		
var	RR_NONE					= 0;		
var	RR_PAGE_BUTTONS			= 1;		
var	RR_FULL_RUNTIME			= 2;		
var	DUR_FOREVER				= -1;		
var	DELAY_NONE				= 0;		
var	DELAY_UNTIL_TRANSITION	= -1;		
var	DELAY_UNTIL_TRIGGER		= -2;		
var	DUR_UNTIL_DONE			= -1;		
var TT_ALL_MOUSE_EVENTS	= 0;		
var	TT_BUTTONDOWN			= 1;		
var	TT_BUTTONUP				= 2;		
var	TT_MOUSEOVER			= 3;		
var	TT_MOUSEOUT				= 4;		
var	TB_PAGE_TURNER			= -1;		
var	TB_START_PLAYER			= -2;		
var NULL_TRANSITION			= -1;
var	TEXT_FLYIN				= 101;
var TEXT_TYPEWRITER		= 102;
var	FLYIN_TOP				= 0;
var	FLYIN_BOTTOM			= 1;
var	FLYIN_LEFT				= 2;
var	FLYIN_RIGHT				= 3;
var	FLYIN_ROTATE			= 4;
var	FLYIN_BY_LETTER			= 1;
var	FLYIN_BY_WORD			= 2;
var	FLYIN_BY_LINE			= 3;
var	FLYIN_PER_TICK = new Array (200, 160, 120, 80, 40);		
var	TRANSITION_RATES = new Array(1,2,3,4,5);				
var	PS_UNINITIALIZED	= 0;
var PS_INITIALIZED		= 1;
var	PS_RUNNING			= 2;
var PS_PAUSED			= 3;
var PS_COMPLETE			= 4;
var TS_NORMAL = 0;
var TS_HOVER  = 1;
var TS_SELECT = 2;
var	sceneArray		= new Array();	
var currentScene	= null;			
var nScenes			= 0;			
var stProjState = PS_UNINITIALIZED;	
var stButtons	= false;			
var	stNoInput	= 0;				
var strPause = new Array( "" );
var strPlay = new Array( "" );
var	formStatus = null;
var	tickTimer		= null;			
var sys			= navigator.appName;										
var vers		= navigator.appVersion.substring(0,1);						
var os			= navigator.appVersion.indexOf("NT") >= 0 ? "NT" : "95";	
var	platform	= navigator.platform;										
var g_strPlatform = new String (navigator.platform);
    g_strPlatform = g_strPlatform.toLowerCase ();
var g_fMac        = ("mac" == g_strPlatform.substring (0,3) ? true : false);
window.onload = PreSetup;
window.onerror = Error;
function Error()
{
	alert("There has been an unidentified error in this file's script. You may be able to fix this problem by refreshing your browser.");
	return true;
}
function Project( tickRate, startScene, stopScene, rtReq, autoStart, delay, webpage, startHTMLScene )
{
	this.tickRate = tickRate;
	this.startScene = startScene;
	this.stopScene = stopScene;
	this.rtReq = rtReq;
	this.autoStart = autoStart;
	this.delay = delay;
	this.webpage = webpage;
	this.startHTMLScene = startHTMLScene;
}
function PreSetup()
{
	if ( (Project.delay != null) && (Project.delay != 0) )			
	{
		setTimeout( "Setup();", Project.delay*1000 ); 
		return;
	}
	
	Setup();
}
function Setup() 
{  
	stNoInput++;								
	if ( vers < 4 ) return;						
	strPlatform = new String(navigator.platform);
	strPlatform = strPlatform.toLowerCase();
	if ("mac" == strPlatform.substring(0,3))
	{
		
		
		document.all("DocClientData").style.overflow = "visible";
	}
	if ( sys == "Netscape" )					
	{
		document.all = new Array;				
		Extract(document);						
		
		document.body = new Object;
		document.body.clientWidth = window.innerWidth;
		document.body.clientHeight = window.innerHeight;
		document.body.scrollTop = window.pageXOffset; 
		document.body.scrollLeft = window.pageYOffset;
	}
	stButtons = SetupButtons();					
	ProjectInitialize();						
	stNoInput--;								
	if ( (stButtons == false) || (Project.autoStart == true) )	
	{
		if (Project.startHTMLScene == -1)
			StartOnScene(Project.startScene);								
		else
			StartOnScene(Project.startHTMLScene);							
	}
}
function ProjectInitialize()
{
	
	tickTimer = new Timer();
	
	
	InitializeScenes();
	
	InitializeTables();
	
	tickTimer.StartTicking();								
	
	if ( Project.startScene == null )			
		Project.startScene = 0;					
	stProjState = PS_INITIALIZED;				
	
}
function ProjectStart( startScene )
{
	stProjState = PS_RUNNING;
	if ( startScene != null )
		ChangeScene( startScene );
	else
		ChangeScene( Project.startScene );
}
function ProjectComplete()
{
	if ( Project.rtReq == RR_PAGE_BUTTONS )		
		return;									
	ProjectShutdown();
	StatusChange();								
}
function ProjectShutdown()
{
	KillTimer();										
	StopEverythingOnScenes( false );
	currentScene = null;
	stProjState = PS_COMPLETE;							
}
function Extract( obj )
{
	
	
	for (var intLayer = 0; intLayer< obj.layers.length; intLayer++)	
	{
		var el = obj.layers[intLayer];			
		document.all[el.id] = new Object		
		var newEl = document.all[el.id];		
		
		newEl.id = el.id;								
		newEl.style = new Object;						
		newEl.style.pixelTop = parseInt(el.top);
		newEl.style.pixelLeft = parseInt(el.left);
		if (null!=el.clip) 
		{
			newEl.offsetWidth = el.clip.width;		
            newEl.offsetHeight = el.clip.height
		}
		
		if		( el.visibility == NAV_HIDDEN )
			newEl.style.visibility = IE_HIDDEN;
		else if ( el.visibility == NAV_VISIBLE )
			newEl.style.visibility = IE_VISIBLE;
		else if	( el.visibility == NAV_INHERIT )
			newEl.style.visibility = IE_INHERIT;
		else
			newEl.style.visibility = "";
		
		newEl.style.zIndex = el.zIndex;
		newEl.style.backgroundColor = el.bgColor;
		newEl.style.backgroundImage = "url("+el.background+")";
		newEl.NSLayer = el;							
		
		
		
		for (var intLoop = 0; intLoop< el.document.images.length; intLoop++)
		{
			var image = el.document.images[intLoop]		
			var	imageName = image.name;					
			if ( imageName == null )					
				continue;								
			
			document.all[imageName] = image;			
			document.images[imageName] = image;			
		}
		
		for (var intLoop = 0; intLoop< el.document.forms.length; intLoop++) 
		{
			var form = el.document.forms[intLoop];		
			var formName = form.name;					
            if ( formName == null )
				continue;
			document.all[formName] = form;				
            document.forms[formName] = form;			
			
			for ( var innerLoop = 0; innerLoop < form.elements.length; innerLoop++)
			{
				var element = form.elements[innerLoop]	
				var elementName = element.name;
				if ( elementName == null )				
					continue;
				document.all[elementName] = element;	
			}
		}
		if ( el.layers.length > 0 )					
			Extract(el)								
	}
}
function TableCell (nextScene, styleName)
{
	if (sys != "Netscape")
    {
	    this.Cell = document.all[styleName + "_" + nextScene];
    }
	this.nextScene = nextScene;
	this.styleName = styleName;
}
function InitializeTables()
{
	if (sys == "Netscape")
    {
        return;
    }
    if (document.all["NavForms"] != null)
        document.all["NavForms"].style.visibility = IE_HIDDEN;
    var indxHTML
    var objCell
    var CellName
    
	for (CellName in TableCells)
	{
		objCell = TableCells[CellName];			
		objCell.name = CellName;
		objCell.HTML = document.all[CellName];
        if (objCell.HTML.length == null)
        {
		    objCell.HTML.onmouseover = OnTableMove;
		    objCell.HTML.onmouseout  = OnTableOut;
			objCell.HTML.onmousedown = OnTableDown;
		    objCell.HTML.style.cursor="hand";						
        }
        else
        {
            for (indxHTML = 0; indxHTML < objCell.HTML.length; indxHTML++)
            {
		        objCell.HTML[indxHTML].onmouseover = OnTableMove;
		        objCell.HTML[indxHTML].onmouseout  = OnTableOut;
			    objCell.HTML[indxHTML].onmousedown = OnTableDown;
		        objCell.HTML[indxHTML].style.cursor="hand";						
            }
        }
    }
}
function UpdateTables ()
{
	if (sys == "Netscape")
    {
        NavUpdateTables ();
        return;
    }
    var CellPageName = currentScene.name;
    
	for (CellName in TableCells)
	{
		if (TableCells[CellName].nextScene == CellPageName)
            SetCellState (TableCells[CellName], TS_SELECT)
        else
            SetCellState (TableCells[CellName], TS_NORMAL)
    }
}
function NavUpdateTables ()
{
    var CellPageName = currentScene.name;
    
    var FormObj
    var SceneName
    for (FormObj in document.forms)
    {
        if (document.forms[FormObj][FormObj + "_" + CellPageName] != null)
        {
            SetButtonText (document.forms[FormObj][FormObj + "_" + CellPageName], true);
        }
        for (SceneName in Scenes)
        {
            if (SceneName != CellPageName)
            {
                if (document.forms[FormObj][FormObj + "_" + SceneName] != null)
                {
                    SetButtonText (document.forms[FormObj][FormObj + "_" + SceneName], false);
                }
            }
        }
    }
}
function SetButtonText (objInput, fSelect)
{
	
	
	var strPageName = objInput.value;
	var indxStart = strPageName.indexOf("<");
	if (indxStart != -1)
	{
		var indxEnd = strPageName.indexOf(">");
		strPageName = strPageName.substring (indxStart+1, indxEnd);
	}
	 
	
	if (fSelect == true)
	{
		objInput.value = "<" + strPageName + ">";
	}
	else
	{
		objInput.value = strPageName;
	}
}
function OnTableMove ()
{
    var EventCell = event.srcElement
    while (EventCell.tagName != "TD")
        EventCell = EventCell.parentElement
    if (EventCell.className != (TableCells[EventCell.id].styleName + "_selected"))
        SetCellState (TableCells[EventCell.id], TS_HOVER)
}
function OnTableOut ()
{
    var EventCell = event.srcElement
    while (EventCell.tagName != "TD")
        EventCell = EventCell.parentElement
    if (EventCell.className != (TableCells[EventCell.id].styleName + "_selected"))
        SetCellState (TableCells[EventCell.id], TS_NORMAL)
}
function OnTableDown ()
{
    var EventCell = event.srcElement
    while (EventCell.tagName != "TD")
        EventCell = EventCell.parentElement
    var nextScene = Scenes[TableCells[EventCell.id].nextScene];
    if (Project.startScene > nextScene.number ||
        Project.stopScene < nextScene.number)
        return; 
    if (nextScene != currentScene)
    {
	    ProjectShutdown ();
		ProjectInitialize ();
        ProjectStart (nextScene.number)
    }
}
function OnTableButtonClick (gotoScene)
{
    var nextScene = Scenes[gotoScene];
    if (nextScene != currentScene)
    {
	    ProjectShutdown ();
		ProjectInitialize ();
        ProjectStart (nextScene.number)
    }
}
function SetCellState (TableCell, state)
{
    var NewClassName
    if (state == TS_NORMAL)
        NewClassName = (TableCell.styleName + "_normal");
    else
    {
        if (state == TS_HOVER)
            NewClassName = (TableCell.styleName + "_hover");
        else
            NewClassName = (TableCell.styleName + "_selected");
    }
    if (TableCell.Cell.length == null)
    {
        TableCell.Cell.className = NewClassName;
        SetSingleCellImage (TableCell.Cell, state, TableCell.styleName)
    }
    else
    {
        for (var indx = 0; indx < TableCell.Cell.length; indx++)
        {
            TableCell.Cell[indx].className = NewClassName;
            SetSingleCellImage (TableCell.Cell[indx], state, TableCell.styleName)
        }
    }
}
function SetSingleCellImage (Cell, state, styleName)
{
    var indxChild  = 0;
    var ImageCount = 0;
    while (Cell.children[indxChild] != null)
    {
        if (Cell.children[indxChild].tagName == "IMG")
        {
            if (ImageCount == state)
                
				Cell.children[indxChild].className = "";
            else
                Cell.children[indxChild].className = "NavBarBlocked";
            ImageCount++;
        }
        indxChild++;
    }
}
function Scene( duration )
{
	this.duration = duration;
}
function InitializeScenes()
{
	var objScene;								
	var sceneNumber = 0;						
	
	for ( sceneName in Scenes )
	{
		objScene = Scenes[sceneName];			
		objScene.number = parseInt(sceneNumber);					
		objScene.name = sceneName;						
		if (objScene.URL == null)
		{
			objScene.HTML = document.all[sceneName];		
			SetVisibility( objScene.HTML, IE_HIDDEN );	
			if ( Project.rtReq == RR_PAGE_BUTTONS )		
				objScene.duration = DUR_FOREVER;
			InitializePlayers( objScene );			
			
			if ( objScene.entryTrans == null )
			{
				objScene.entryTrans = new Object();
				objScene.entryTrans.type = NULL_TRANSITION;
			}
			
			if ( objScene.Bhv != null )
				for ( var bhvIdx=0; (bhv=objScene.Bhv[bhvIdx]) != null; bhvIdx++ )	
					bhv.Initialize( objScene, bhv);
			objScene.numBhv = bhvIdx;												
		}
		sceneArray[sceneNumber++] = objScene;	
	}
	nScenes = sceneNumber;						
}
function StopEverythingOnScenes( fPause )
{
	var objScene;								
	for ( sceneName in Scenes )
	{
		objScene = Scenes[sceneName];						
		
		if (objScene.URL == null)
		{		
		    if ( objScene.Bhv != null )
			    for ( var bhvIdx=0; (bhv=objScene.Bhv[bhvIdx]) != null; bhvIdx++ )	
				    bhv.StopEverything( bhv, fPause );
		    StopEverythingOnPlayers( objScene, fPause );			
        }
	}
	return;
}
function ChangeScene( nextSceneNumber )
{
	var	previousScene = currentScene;						
	StopSceneTimers();										
	currentScene = GetSceneFromNumber( nextSceneNumber );	
	if (currentScene.URL != null)
	{
		if (navigator.appName == "Netscape")
		{
			window.location.href = currentScene.URL;
		}
		else
		{
			window.navigate (currentScene.URL);
		}
		return;
	}
	currentScene.previousScene = previousScene;				
	if ( currentScene.duration == null )					
		currentScene.duration = DEFAULT_SCENE_DURATION;		
	
	if ( currentScene.Bhv != null )
		for ( var bhvIdx=0; bhvIdx<currentScene.numBhv; bhvIdx++ )	
		{
			var bhv = currentScene.Bhv[bhvIdx]
			if ( bhv == null)								
				continue;
			var delay = bhv.delay
			if		( (delay == null) || (delay == DELAY_NONE) )	
				bhv.Start( bhv );										
			else if ( delay > 0 )									
				StartOneShotTimer( bhv, bhv.delay, bhv.Start, TMR_SCENE );
		}
	StartScenePlayers( currentScene );								
	StartTransition( currentScene, currentScene.entryTrans, IE_VISIBLE, SceneTransitionDone );	
	
	if ( currentScene.duration != DUR_FOREVER )				
		StartOneShotTimer( currentScene, currentScene.duration, SceneExit, TMR_SCENE );
	StatusChange();											
	UpdateTables();											
	return;
}
function SceneTransitionDone( objScene )
{
	
	
	if ( currentScene.previousScene != null )
		SetVisibility( currentScene.previousScene.HTML, IE_HIDDEN );
	
	if ( currentScene.Bhv != null )
		for ( bhvIdx=0; bhvIdx<currentScene.numBhv; bhvIdx++ )	
		{
			var bhv = currentScene.Bhv[bhvIdx]
			if ( bhv == null)								
				continue;
			if ( bhv.delay == DELAY_UNTIL_TRANSITION  )	
				bhv.Start( bhv );									
		}
		
	StartScenePlayersAfterTransition( currentScene );	
}
function SceneExit( thisScene, nextScene )
{
	var nextSceneNumber = nextScene == null ? currentScene.number+1 : nextScene.number;
	var finalScene = (nextSceneNumber <= Project.stopScene) ? false : true;
	
	
	
	for ( playerName in currentScene.Players )
	{
		objPlayer = currentScene.Players[playerName];			
		PlayerExitTransitionDone( objPlayer, finalScene );		
	}
	
	if ( currentScene.Bhv != null )
		for ( bhvIdx=0; bhvIdx<currentScene.numBhv; bhvIdx++ )	
		{
			var bhv = currentScene.Bhv[bhvIdx]
			if ( bhv == null)								
				continue;
			if ( bhv.duration == DUR_UNTIL_DONE  )			
				bhv.Stop( bhv );							
		}
	
	
	if ( finalScene == false )						
		ChangeScene( nextSceneNumber )				
	else
		ProjectComplete()							
		
}
function Player( delay, duration )
{
	this.delay = delay;
	this.duration = duration;
}
function InitializePlayers( objScene )
{
	var objPlayer;							
	var	playerNumber = 0;					
	for ( playerName in objScene.Players )
	{
		objPlayer = objScene.Players[playerName];			
		objPlayer.number = playerNumber;					
		objPlayer.name = playerName;						
		objPlayer.HTML = document.all[playerName];			
		SetVisibility( objPlayer.HTML, IE_HIDDEN );			
		objPlayer.position = new Position(objPlayer);		
		
		if ( objPlayer.delay == null )						
			objPlayer.delay = DEFAULT_PLAYER_DELAY;			
		
		
		if		( objPlayer.entryTrans == null )
		{
			objPlayer.entryTrans = new Object();
			objPlayer.entryTrans.type = NULL_TRANSITION;
		} 
		
		else if ((objPlayer.entryTrans != null) &&				
			(GetPlayerTypeFromName(objPlayer.name) == PLAYER_TEXT))
		{
			if ( (objPlayer.entryTrans.type == TEXT_FLYIN) || (objPlayer.entryTrans.type == TEXT_TYPEWRITER) )
				if ( InitializeTextFlyin( objPlayer ) == false )
					objPlayer.entryTrans.type = null;								
		}
		
		if ( objPlayer.exitTrans == null )
		{
			objPlayer.exitTrans = new Object();
			objPlayer.exitTrans.type = NULL_TRANSITION;
		}
		
		if ( objPlayer.Bhv != null )
		{
			for ( bhvIdx=0; (bhv=objPlayer.Bhv[bhvIdx]) != null; bhvIdx++ )	
				bhv.Initialize( objPlayer, bhv);
			objPlayer.numBhv = bhvIdx;										
		}
		else
			objPlayer.numBhv = 0;
		playerNumber ++;					
	}	
}
function StopEverythingOnPlayers( objScene, fPause )
{
	var objPlayer;							
	for ( playerName in objScene.Players )
	{
		objPlayer = objScene.Players[playerName];			
		
		
		if ( objPlayer.Bhv != null )
		{
			for ( bhvIdx=0; (bhv=objPlayer.Bhv[bhvIdx]) != null; bhvIdx++ )	
				bhv.StopEverything( bhv, fPause );
		}
		DisableTrigger( objPlayer );						
	}	
	return;
}
function StartScenePlayers( objScene )
{
	
	for ( playerName in objScene.Players )
	{
		objPlayer = objScene.Players[playerName];			
		
		
		
		if		( objPlayer.delay == DELAY_NONE )			
			StartPlayer( objPlayer )						
		else if ( objPlayer.delay	> 0 )					
			StartOneShotTimer( objPlayer, objPlayer.delay, StartPlayer, TMR_SCENE);
	}
}
function StartScenePlayersAfterTransition( objScene )
{
	
	for ( playerName in objScene.Players )
	{
		objPlayer = objScene.Players[playerName];			
		if ( objPlayer.delay == DELAY_UNTIL_TRANSITION )	
			StartPlayer( objPlayer )						
	}
}
function StartPlayer( objPlayer )
{
	
	if ( objPlayer.Bhv != null )
		for ( bhvIdx=0; bhvIdx<objPlayer.numBhv; bhvIdx++ )	
		{
			var bhv = objPlayer.Bhv[bhvIdx]
			if ( bhv == null)								
				continue;
			var delay = bhv.delay
			if		( (delay == null) || (delay == DELAY_NONE) )	
				bhv.Start( bhv );									
			else if ( delay > 0 )									
				StartOneShotTimer( bhv, bhv.delay, bhv.Start, TMR_SCENE );
		}
	
	StartTransition( objPlayer, objPlayer.entryTrans, IE_VISIBLE, PlayerEntryTransitionDone );
	
	
	if ( objPlayer.duration > 0 )
		StartOneShotTimer( objPlayer, objPlayer.duration, PlayerExit, TMR_SCENE );									
}
function PlayerEntryTransitionDone( objPlayer )
{
	
	if ( objPlayer.Bhv != null )
		for ( bhvIdx=0; bhvIdx<objPlayer.numBhv; bhvIdx++ )	
		{
			var bhv = objPlayer.Bhv[bhvIdx]
			if ( bhv == null)								
				continue;
			if ( bhv.delay == DELAY_UNTIL_TRANSITION  )	
				bhv.Start( bhv );									
		}
	
	if ( objPlayer.Triggers != null )
		EnableTrigger( objPlayer );
}
function PlayerExit( objPlayer )
{
	
	StartTransition( objPlayer, objPlayer.exitTrans, IE_HIDDEN, PlayerExitTransitionDone );
}
function PlayerExitTransitionDone( objPlayer, finalScene )
{
	
	if ( objPlayer.Bhv != null )
		for ( bhvIdx=0; bhvIdx<objPlayer.numBhv; bhvIdx++ )	
		{
			var bhv = objPlayer.Bhv[bhvIdx]
			if ( bhv == null)								
				continue;
			if ( bhv.duration == DUR_UNTIL_DONE  )			
				bhv.Stop( bhv );							
		}
	
	if ( (finalScene == null) || (finalScene == false) )
		SetVisibility( objPlayer.HTML, IE_HIDDEN );			
	
	
	
	if ( (sys != "Netscape") && (objPlayer.HTML.Preview != null) )
		SetVisibility( objPlayer.HTML, IE_VISIBLE ); 
	return;
}
function Trigger( trigType, trigBhv, player, scene )
{
    if (g_fMac && TT_BUTTONUP == trigType)
        trigType = TT_BUTTONDOWN;
	this.triggerType = trigType;
	this.triggerBhv = trigBhv;
	this.player = player;
	this.nextSceneNum = scene;
}
function EnableTrigger( objPlayer )
{
	if ( sys != "Netscape" )									
	{
		objPlayer.HTML.style.cursor="hand";						
		for ( trx in objPlayer.Triggers )						
		{
			var	trigger = objPlayer.Triggers[trx];				
			if ( trigger.triggerType == null )
				trigger.triggerType = 0;						
			var tt = trigger.triggerType;						
			if			( tt == TT_ALL_MOUSE_EVENTS )								
			{
				objPlayer.HTML.onmousedown = EventProcessor;
				objPlayer.HTML.onmouseup = EventProcessor;	
				objPlayer.HTML.onmouseover = EventProcessor;		
				objPlayer.HTML.onmouseout = EventProcessor;
			}
			else if		( tt == TT_BUTTONDOWN )					
				objPlayer.HTML.onmousedown = EventProcessor;
			else if		( tt == TT_BUTTONUP )			
				objPlayer.HTML.onmouseup = EventProcessor;
			else if		( tt == TT_MOUSEOVER )			
				objPlayer.HTML.onmouseover = EventProcessor;
			else if		( tt == TT_MOUSEOUT )			
				objPlayer.HTML.onmouseout = EventProcessor;
		}
	}
	else											
	{
		for ( trx in objPlayer.Triggers )			
		{
			var	trigger = objPlayer.Triggers[trx];	
			if ( trigger.triggerType == null )
				trigger.triggerType = 0;						
			var tt = trigger.triggerType;						
			if ( tt== 0 )										
			{
				objPlayer.HTML.NSLayer.captureEvents( Event.MOUSEUP | Event.MOUSEDOWN | Event.MOUSEOVER | Event.MOUSEOUT );
				objPlayer.HTML.NSLayer.onMouseUp = EventProcessor;
				objPlayer.HTML.NSLayer.onMouseDown = EventProcessor;
				objPlayer.HTML.NSLayer.onMouseOver = EventProcessor;
				objPlayer.HTML.NSLayer.onMouseOut = EventProcessor;
			}
			else if	( tt == TT_BUTTONUP )
			{
				objPlayer.HTML.NSLayer.captureEvents(Event.MOUSEUP);
				objPlayer.HTML.NSLayer.onMouseUp = EventProcessor;
			}
			else if ( tt == TT_BUTTONDOWN )
			{
				objPlayer.HTML.NSLayer.captureEvents(Event.MOUSEDOWN);
				objPlayer.HTML.NSLayer.onMouseDown = EventProcessor;
			}
		}
		
	}
}
function DisableTrigger( objPlayer )
{
	if ( sys != "Netscape" )				
	{
		objPlayer.HTML.onmousedown = null;
		objPlayer.HTML.onmouseup = null;	
		objPlayer.HTML.onmouseover = null;		
		objPlayer.HTML.onmouseout = null;
	}
	else									
		objPlayer.HTML.NSLayer.releaseEvents(Event.MOUSEUP | Event.MOUSEDOWN | Event.MOUSEOVER | Event.MOUSEOUT );
}
function EventProcessor( e )
{
	var trigger;									
	var	type;										
	var	button;										
	var	eventType;									
	var objPlayer;									
	if ( (objPlayer = GetPlayerFromName(this.id)) == null)	
		return;
	if ( sys != "Netscape" )						
	{
		type = event.type;
		button = event.button;
	}
	else											
	{
		type = e.type;
		button = e.which;
	}
	
	if (type == "mousedown")
	{
		if ( button != 1 )						
			return;
		eventType = TT_BUTTONDOWN;
		if ( sys == "Netscape" )				
		{
			objPlayer.HTML.NSLayer.releaseEvents(Event.MOUSEDOWN);
			objPlayer.HTML.NSLayer.captureEvents(Event.MOUSEDOWN);
		}
	}
	else if (type == "mouseup")
	{
		if ( button != 1 )						
			return;
		eventType = TT_BUTTONUP;
		if ( sys == "Netscape" )				
		{
			objPlayer.HTML.NSLayer.releaseEvents(Event.MOUSEUP);
			objPlayer.HTML.NSLayer.captureEvents(Event.MOUSEUP);
		}
	}
	else if (type == "mouseover")
	{
		eventType = TT_MOUSEOVER;
	}
	else if (type == "mouseout")
	{
		eventType = TT_MOUSEOUT;
	}
	var triggerArray = objPlayer.Triggers;			
	var trigger;									
	
	for ( var trx=0; (trigger=triggerArray[trx]) != null; trx++ )
	{
		if ( (trigger.triggerType == 0) || (trigger.triggerType == eventType) )
		{
			
			
			
			if		( trigger.triggerBhv == TB_PAGE_TURNER )
			{
				
				
				if ( (trigger.nextSceneNum == null) || (trigger.nextSceneNum == "") )
					SceneExit( currentScene );
				else
				{
					if ( Scenes[trigger.nextSceneNum].number < currentScene.number )
					{
						for ( ii=0; ii<=currentScene.number; ii++ )
							InitializePlayers( sceneArray[ii] );
					}
					SceneExit( currentScene, Scenes[trigger.nextSceneNum] );
				}
			}
			else if	( trigger.triggerBhv == TB_START_PLAYER )
				StartPlayer( GetPlayerFromName( trigger.player ) );				
			else 
			{
				
				var objTrigPlayer = GetPlayerFromName( trigger.player );		
				var bhv = objTrigPlayer.Bhv[trigger.triggerBhv];				
				bhv.Trigger( bhv, eventType );									
			}  	
		}
	}
	return;	
}
function Transition( type, rate, flyFrom, flySubtype )
{
	this.type = type;
	this.rate = rate;
	this.flyFrom = flyFrom;
	this.flySubtype = flySubtype;
}
function StartTransition( transObj, trans, visibility, callback )
{
	var	playerType = GetObjectTypeFromName( transObj.name );		
	
	
	
	if	( ("Netscape" == sys) || 
		( (playerType == OBJ_PLAYER) && (trans.type == NULL_TRANSITION) ) )
	{
		SetVisibility( transObj.HTML, visibility );
		callback( transObj );
		return;
	}
	
	
	
	
	if ( ((trans.type == TEXT_FLYIN) || (trans.type == TEXT_TYPEWRITER)) && (visibility == IE_VISIBLE) )
	{
		StartTextFlyin( transObj );
		return;
	}
	
	if ( platform != "Win32" )
	{
		SetVisibility( transObj.HTML, visibility );
		callback( transObj );
		return;
	}
		
	
	
	
	
	
	if ( trans.type == NULL_TRANSITION )
	{
		transObj.HTML.style.filter = "revealTrans(duration=0, transition=0)";
	}
	else		
	{
		duration = TRANSITION_RATES[trans.rate];
		transObj.HTML.style.filter = "revealTrans(duration=" + duration + ", transition=" + trans.type + ")";
	}
	stNoInput++;										
	
	
	
	
	
	
	
	
	
	if (transObj.HTML.filters(0).Status != 2)
	{
		transObj.HTML.filters(0).Apply();					
		SetVisibility( transObj.HTML, visibility );			
		transObj.HTML.filters(0).Play()						
		transObj.HTML.onfilterchange = TransitionDoneEvent;	
	}
	else
		SetVisibility( transObj.HTML, visibility );			
}
function TransitionDoneEvent( )
{
	var	type = GetObjectTypeFromName( event.srcElement.id );		
	stNoInput--;													
	if		( type == OBJ_SCENE )
	{
		
		if ( (currentScene != null) && (event.srcElement.id == currentScene.name) )
			SceneTransitionDone();
	}
	else if	( type == OBJ_PLAYER )			
	{
		var objPlayer = GetPlayerFromName( event.srcElement.id );
		if ( this.style.visibility == IE_VISIBLE )					
			PlayerEntryTransitionDone( objPlayer );  
		else														
			PlayerExitTransitionDone( objPlayer, false );
	}
	return;
}
function InitializeTextFlyin( objPlayer )
{
	if ( sys == "Netscape" )										
		return false;
	var	transition = objPlayer.entryTrans;							
	var	transUnits = transition.flySubtype;							
	var	movePerTick	= parseInt(FLYIN_PER_TICK[transition.rate]);	
	
	var	transDirection = (transition.type == TEXT_FLYIN) ? transition.flyFrom : FLYIN_TOP;		
		
	
	if ( stProjState == PS_UNINITIALIZED )
	{
		var	textHTML	= objPlayer.HTML;					
		var	oldInnerHTML	= textHTML.innerHTML;			
        textHTML.oldInnerHTML = oldInnerHTML;
		var	newInnerHTML	= "";							
		
		transition.textOrder = new Array();					
		textOrder = transition.textOrder;					
	
		
		
		
		
		var flyinIdx = 0;							
		var	flyinBuffer = "";
		
		
		
		var spanStyle = (transition.type == TEXT_FLYIN) ? " style='position:relative;visibility:hidden;'" : " style='visibility:hidden;'";
		for ( var letterIdx=0; letterIdx<oldInnerHTML.length; )
		{
			
			tempID = objPlayer.name+"_tempID"+flyinIdx.toString();
			newInnerHTML += "<span id=" + tempID + spanStyle + ">";
			while ( letterIdx<oldInnerHTML.length )
			{
				
				
				
				if ( ( (charNext = oldInnerHTML.substring(letterIdx, letterIdx+1)) == "<") || (charNext == "&") )		
				{
					if ( charNext == "<" )																	
						endTagIdx = oldInnerHTML.indexOf( ">", letterIdx );	
					else
						endTagIdx = oldInnerHTML.indexOf( ";", letterIdx );	
					var tagString = oldInnerHTML.substring( letterIdx, ++endTagIdx );
					newInnerHTML += tagString;
					letterIdx = endTagIdx;												
					
					if ( transUnits == FLYIN_BY_LETTER && charNext=="&" ) break;
					
					if ( ((tagString == "</P>") || (tagString == "<BR>") || (tagString == "</UL>")) && ( transUnits != FLYIN_BY_LETTER ) )	
						break;
				}
				
				else
				{
					thisChar = oldInnerHTML.substring( letterIdx, ++letterIdx );
					newInnerHTML += thisChar;
					if		( transUnits == FLYIN_BY_LETTER )			
						break;											
					else if	( (transUnits == FLYIN_BY_WORD ) && thisChar == " " )		
						break;
				}
			}
			newInnerHTML += "</span>"
			textOrder[flyinIdx] = new Object();
			textOrder[flyinIdx].name = tempID;										
			flyinIdx++;																
		}
		
		if ( flyinIdx == 0 )
			return false;
		
		textHTML.innerHTML = newInnerHTML;
        textHTML.newInnerHTML = newInnerHTML;
		transition.numUnits = flyinIdx;							
	}
    else
    {
		objPlayer.HTML.innerHTML = objPlayer.HTML.newInnerHTML;
    }
	
	
	
	textOrder = transition.textOrder;
	var currentEl = document.all[textOrder[0].name];		
	var currentOffset = currentEl.offsetLeft;	
	var previousEl, previousOffset;
	
	var UltimateParent = currentEl.offsetParent;
	var ParTop=0,ParLeft=0,DocHeight=0,DocWidth=0;
	while( UltimateParent.offsetParent != null && UltimateParent != document.body )
	{
		ParLeft += UltimateParent.offsetLeft;
		ParTop += UltimateParent.offsetTop;
		if( UltimateParent.offsetHeight > DocHeight) DocHeight = UltimateParent.offsetHeight;
		if( UltimateParent.offsetWidth  > DocWidth)  DocWidth  = UltimateParent.offsetWidth;
		UltimateParent = UltimateParent.offsetParent;
	}
	for ( var count=0; count<transition.numUnits; count++ )			
	{
		previousOffset = currentOffset;								
		previousEl = currentEl;
		textElName = textOrder[count].name;						
		currentEl = document.all[textElName];
		SetVisibility( currentEl, IE_HIDDEN );
		currentOffset = currentEl.offsetTop;
		
		
		
		
		
		
		if ( currentOffset != previousOffset )									
			if ( previousEl.innerHTML == " " )										
				previousEl.innerHTML = "<br>";
		if ( transDirection == FLYIN_ROTATE )			
			direction = count % FLYIN_ROTATE;				
		else
			direction = transDirection;
		
		if		( direction == FLYIN_LEFT )
		{
			tempPos = -(currentEl.offsetParent.offsetLeft + currentEl.offsetParent.offsetWidth);
			currentEl.style.posLeft = tempPos;						
			textOrder[count].dx = -movePerTick;						
			textOrder[count].dy = 0;
			textOrder[count].iterations = tempPos / (-movePerTick);	
		}
		else if ( direction == FLYIN_RIGHT )
		{
			tempPos = DocWidth - currentEl.offsetParent.offsetLeft;
			currentEl.style.posLeft = tempPos;
			textOrder[count].dx = movePerTick;						
			textOrder[count].dy = 0;
			textOrder[count].iterations = tempPos / movePerTick;	
		}
		else if	( direction == FLYIN_TOP )
		{
			tempPos = -( ParTop + currentEl.offsetParent.offsetHeight );
			currentEl.style.posTop = tempPos;
			textOrder[count].dx = 0;
			textOrder[count].dy = (-movePerTick);					
			textOrder[count].iterations = tempPos / (-movePerTick);	
		}
		else if ( direction == FLYIN_BOTTOM )
		{
			tempPos = DocHeight 
			currentEl.style.posTop = tempPos;
			textOrder[count].dx = 0;
			textOrder[count].dy = movePerTick;						
			textOrder[count].iterations = tempPos / movePerTick;	
		}
	}
	
	transition.charIdx = 0;								
	transition.moveIdx = 0;								
	textElName = transition.textOrder[0].name;
	transition.currentEl = document.all[textElName];	
	SetVisibility( transition.currentEl, IE_VISIBLE );
	return true;
}
function StartTextFlyin( objPlayer )
{
	
	SetVisibility( objPlayer.HTML, IE_VISIBLE );
	StartAnimationTimer( objPlayer, TextFlyinTick );
}
function TextFlyinTick( objPlayer )
{
	var	transition = objPlayer.entryTrans;						
	var	spanObj = transition.textOrder[transition.charIdx];		
	var textEl = transition.currentEl;							
	
	
	if ( ++transition.moveIdx < spanObj.iterations)				
	{
		textEl.style.posTop -= spanObj.dy;						
		textEl.style.posLeft -= spanObj.dx;
		return false;											
	}
		
	
	textEl.style.posTop = 0;									
	textEl.style.posLeft = 0;
		
	
	if ( (charIdx = ++transition.charIdx) >= transition.textOrder.length )	
	{
		objPlayer.HTML.innerHTML = objPlayer.HTML.oldInnerHTML;
		PlayerEntryTransitionDone( objPlayer );					
		return true;											
	}
	else
	{
		transition.moveIdx = 0;									
		textElName = transition.textOrder[charIdx].name;
		transition.currentEl = document.all[textElName];		
		transition.currentEl.style.visibility = IE_VISIBLE;		
		return false;											
	}															
}
var	SND_DUR_SCENE			= -1;	
var	SND_DUR_PROJECT			= 0;	
var ST_WAV					= 1;	
var	ST_MID					= 2;	
var	NAV_EXT					= "nav"	
var MidiTag					= null;	
function Sound( delay, duration, loop, soundType, tagName, fileName )
{
	
	this.Initialize = InitializeSound;
	this.Start = StartSound;
	this.Trigger = StartSound;
	this.Stop = StopSound;
	this.StopEverything = StopEverythingOnSounds;
	
	this.delay = delay;
	this.duration = duration;
	this.loop = loop;
	this.tagName = tagName;
	this.fileName = fileName;
	this.soundType = soundType;
}
function InitializeSound( objParent, objSound )
{
	if ( sys == "Netscape" )
	{
		objSound.navLoop = (objSound.loop == -1) ? true : false;
		objSound.html = document[objSound.tagName+NAV_EXT];
		return;
	}
	objSound.objParent = objParent;					
	objSound.html = document.all[objSound.tagName];	
	objSound.fileName = objSound.html.soundsrc;		
	
	
	if (objSound.soundType == ST_MID )
	{
		if ( MidiTag == null )						
			MidiTag = objSound.html;				
		else
			objSound.html = MidiTag;				
	}			
}
function StartSound( objSound )
{
	if ( sys == "Netscape" )						
	{
		if ( objSound.html != null )				
			objSound.html.play(objSound.navLoop);
		return;
	}
    
    
	objSound.html.loop = objSound.loop;				
	objSound.html.src = objSound.fileName;			
	if ( objSound.soundType == ST_WAV )			
		objSound.html.volume = 0;						
	if ( objSound.duration > 0 )
		StartOneShotTimer( objSound, objSound.duration, objSound.Stop, TMR_PROJ );
}
function StopSound( objSound, fPause )
{
	if ( sys == "Netscape" )						
	{
		if ( objSound.html != null )				
			objSound.html.stop();
		return;
	}
	objSound.html.loop = 0;
	objSound.html.src = "";								
	if ( objSound.soundType == ST_WAV )
		objSound.html.volume = -10000;
}
function StopEverythingOnSounds( objSound )
{
	StopSound( objSound, true );
	if ( (sys != "Netscape") && (os == "NT") )					
		objSound.html.volume = -500;							
}
var	SND_DUR_SCENE			= -1;	
var	SND_DUR_PROJECT			= 0;	
function Swapper( idle, hover, click, replace )
{
	
	this.Initialize = InitializeSwap;
	this.Start = StartSwap;
	this.Trigger = TriggerSwap;
	this.Stop = StopSwap;
	this.StopEverything = StopSwap;
	
	this.idle = idle;
	this.hover = hover;
	this.click = click;
    this.replace = replace;
    this.Swapped = false;
}
function InitializeSwap( objParent, objSwap )
{
	if ( stProjState != PS_UNINITIALIZED )				
		return;
	
	var	idle	= objSwap.idle;							
	var	hover	= objSwap.hover;
	var	click	= objSwap.click;
	
	
	
	
	
	
	
	if ( (hover != null) && (hover != "") && (document.all[hover].src != null) )
	{
		SetVisibility( document.all[hover], IE_HIDDEN );
		objSwap.srcHover = document.all[hover].src;
		document.all[hover].src = "";
	}
	else
		objSwap.srcHover = document.all[idle].src;
	if ( (click != null) && (click != "") && (document.all[click].src != null) )
	{
		SetVisibility( document.all[click], IE_HIDDEN );
		objSwap.srcClick = document.all[click].src;
		document.all[click].src = "";
	}
	else
		objSwap.srcClick = document.all[idle].src;
	
	objSwap.srcIdle = document.all[idle].src;
}
function StartSwap( objSwap )
{
	
    document.all[objSwap.idle].src = objSwap.srcIdle;
}
function TriggerSwap( objSwap, eventType )
{
	if ( eventType == TT_BUTTONDOWN )
    {
		document.all[objSwap.idle].src = objSwap.srcClick;
        if (true == objSwap.Swapped)
        {
            objSwap.Swapped = false;
            if ((objSwap.hover == null) || (objSwap.hover == ""))
                objSwap.srcHover = objSwap.srcIdle;
        }
        else
        {
            objSwap.Swapped = true;
            if ((objSwap.hover == null) || (objSwap.hover == ""))
            {
                if (0 != objSwap.replace)
                {
                    objSwap.srcHover = objSwap.srcClick;
                }
            }
        }
    }
	else if ( eventType == TT_BUTTONUP )
		document.all[objSwap.idle].src = objSwap.srcHover;
	else if ( eventType == TT_MOUSEOVER )
		document.all[objSwap.idle].src = objSwap.srcHover;
	else if ( eventType == TT_MOUSEOUT )
    {
        if (true == objSwap.Swapped && 0 != objSwap.replace)
		    document.all[objSwap.idle].src = objSwap.srcClick;
        else
		    document.all[objSwap.idle].src = objSwap.srcIdle;
    }
	return;
}
function StopSwap( objSwap, fPause )
{
	if ( fPause )							
		return;
}
var	PATH_PER_TICK = new Array(50,40,30,20,10);		
var	PE_STOP		= 0;								
var	PE_AGAIN	= 1;								
var	PE_REV		= 2;								
var	PE_EXIT		= 3;								
var	PD_FWD		= 1;
var	PD_BACK		= -1;
function Point( x, y, rate )
{
	this.x = x;
	this.y = y;
	this.rate = rate;
}
function Paths( delay, edgeEffect )
{
	
	this.Initialize = InitializePathAnimation;
	this.Start = StartPathAnimation;
	this.Trigger = StartPathAnimation;
	this.Stop = StopPathAnimation;
	this.StopEverything = StopPathAnimation;
	
	this.delay = delay;
	this.edgeEffect = edgeEffect;
}
function InitializePathAnimation( objPlayer, path )
{
	var	segment;									
	var pathIndex;
	var totalDistance;								
	var	distanceX;									
	var	distanceY;
	var dx;											
	var	dy;
	var travelTime;									
	var	remX;										
	var	remY;
	
	if ( stProjState != PS_UNINITIALIZED )
	{
		objPlayer.position.SetPosition( path[0].x, path[0].y );
		return;
	}
	path.objPlayer = objPlayer;						
	halfWidth = Math.floor(objPlayer.HTML.offsetWidth/2);		
	halfHeight = Math.floor(objPlayer.HTML.offsetHeight/2);
	
	
	path[0].x -= halfWidth;
	path[0].y -= halfHeight;
	objPlayer.position.SetPosition( path[0].x, path[0].y );
	for ( pathIndex=0; path[pathIndex+1] != null; pathIndex++ )	
	{
		px = parseInt(pathIndex);					
		segment = path[px];							
		
		
		path[px+1].x -= halfWidth;
		path[px+1].y -= halfHeight;
		
		distanceX = path[px+1].x - segment.x;		
		distanceY = path[px+1].y - segment.y;		
		
		totalDistance = Math.sqrt( (distanceX*distanceX) + (distanceY*distanceY) );
		
		
		travelTime = Math.round(totalDistance / PATH_PER_TICK[segment.rate]);
		
		
		if( travelTime > 0 )
		{
			if ( distanceX > 0 )							
				dx = Math.floor( distanceX / travelTime );	
			else if ( distanceX < 0 )						
				dx = Math.ceil( distanceX / travelTime );	
			else
				dx = 0;
			
			if ( distanceY > 0 )							
				dy = Math.floor( distanceY / travelTime );
			else if ( distanceY < 0 )
				dy = Math.ceil( distanceY / travelTime );
			else
				dy = 0;
		}
		else
		{
			dx = dy = 0;
		}
		
		
		
		
		remX = distanceX - dx*travelTime;
		remY = distanceY - dy*travelTime;
		segment.number = px;							
		segment.ticks  = 0;
		segment.travelTime = travelTime;
		segment.dx = dx;
		segment.dy = dy;
		segment.remX = remX;
		segment.remY = remY;
	}
	path.numSegs = parseInt(pathIndex);					
	path.dir = PD_FWD;											
	return;
}
function StartPathAnimation( path )
{
	path.currentSegment = path[0];		
	path.currentSegment.ticks = 0;		
	path.cntSegs = 0;									
	
	
	if ( path.dir == PD_BACK )								
	{
		for ( var ii=0; ii<path.numSegs; ii++ )				
		{
			path[ii].dx *= -1;
			path[ii].dy *= -1;
			path[ii].remX *= -1;
			path[ii].remY *= -1;
		}
		path.dir = PD_FWD;									
	}
	StartAnimationTimer( path, PathAnimationTick );
}
function StopPathAnimation( path, fPause )
{
	return;
}
function PathAnimationTick( path )
{
	var	objPlayer = path.objPlayer;				
	var segment = path.currentSegment;			
	var	currentPosition = objPlayer.position;	
	if ( ++segment.ticks <= segment.travelTime )		
	{
		var newX = currentPosition.x + segment.dx;			
		if ( segment.ticks <= Math.abs(segment.remX) )	
			segment.remX > 0 ? newX++ : newX--;
		var newY = currentPosition.y + segment.dy;			
		if ( segment.ticks <= Math.abs(segment.remY) )	
			segment.remY > 0 ? newY++ : newY--;
		currentPosition.SetPosition( newX, newY );	
		return false;								
	}
	
	else if( segment.ticks==1 && segment.travelTime==0 )
	{
		currentPosition.SetPosition( currentPosition.x + segment.remX, currentPosition.y + segment.remY);	
		return false;								
	} 
	
	
	if ( ++path.cntSegs < path.numSegs )
	{
		
		path.currentSegment = path[segment.number+path.dir];		
		path.currentSegment.ticks = 0;								
				
		return false;
	}
		
	
	if			( path.edgeEffect == PE_AGAIN )		
	{
		
		objPlayer.position.SetPosition( path[0].x, path[0].y );
		
		path.currentSegment = path[0];					
		path.currentSegment.ticks = 0;					
		path.cntSegs = 0;								
		return false;									
	}							
	else if		( path.edgeEffect == PE_REV )			
	{
		path.dir *= -1;									
		
		for ( var ii=0; ii<path.numSegs; ii++ )
		{
			path[ii].dx *= -1;
			path[ii].dy *= -1;
			path[ii].remX *= -1;
			path[ii].remY *= -1;
		}
		path.currentSegment.ticks = 0;					
		path.cntSegs = 0;								
		return false;
	}
	else if		( path.edgeEffect == PE_EXIT )
	{
		PlayerExit( objPlayer );
		return true;
	}
	else
		return true;									
}
var	GROW_PER_TICK = new Array(20,14,8,4,1);		
function Size( zoom, rate )
{
	this.zoom = zoom;
	this.rate = rate;
}
function Grows( delay )
{
	
	this.Initialize = InitializeGrowAnimation;
	this.Start = StartGrowAnimation;
	this.Trigger = StartGrowAnimation;
	this.Stop = StopGrowAnimation;
	this.StopEverything = StopGrowAnimation;
	
	this.delay = delay;
}
function InitializeGrowAnimation( objPlayer, grow )
{
	if ( sys == "Netscape" )
		return;
	var	child = objPlayer.HTML.children[0];
	if (child.tagName == "A")
		child = child.children[0];
	var playerType = GetPlayerTypeFromName( objPlayer.name );	
    
    
    
    	
	
	
	if ( stProjState == PS_UNINITIALIZED )
	{
        
        
        if (objPlayer.realWidth == null)
        {
		    objPlayer.realWidth = child.width;
		    objPlayer.realHeight = child.height;
        }
		grow.realWidth = objPlayer.realWidth;
		grow.realHeight = objPlayer.realHeight;
	}
	if ( (playerType == PLAYER_TEXT) || sys == "Netscape" )	
	{
		grow = null;											
		return;
	}
	grow.objPlayer = objPlayer;									
	
	grow.currentSegment = grow[0];								
	grow.currentGrowth = grow.currentSegment.zoom;				
	
    if (objPlayer.firstGrowDelay == null || objPlayer.firstGrowDelay > grow.delay)
    {
        
        objPlayer.firstGrowDelay = grow.delay;
	    
	    child.width = grow.realWidth * (grow.currentSegment.zoom / 100);	
	    child.height = grow.realHeight * (grow.currentSegment.zoom / 100);
    }
	
	for ( var growIndex=0; grow[growIndex] != null; growIndex++ )	
	{
		gx = parseInt(growIndex);					
		segment = grow[gx];							
		if ( grow[gx+1] == null )					
		{
			grow.finalSegment = grow[gx-1];			
			break;									
		}
		
		growth = grow[gx+1].zoom - segment.zoom;					
		if ( growth >= 0 )											
			growthFactor = GROW_PER_TICK[segment.rate];				
		else
			growthFactor = -(GROW_PER_TICK[segment.rate]);
		
		growthTicks = growth / growthFactor;			
		
		segment.number = gx;							
		segment.growth = growth;
		segment.growthFactor = growthFactor;
		segment.growthTicks = growthTicks;
		segment.currentTicks = 0;
	}
}
function StartGrowAnimation( grow )
{	
	if ( sys == "Netscape" )
		return;
	grow.currentSegment = grow[0];							
	grow.currentTicks = 0;
	StartAnimationTimer( grow, GrowAnimationTick );
}
function StopGrowAnimation( grow, fPause )
{
    grow.objPlayer.firstGrowDelay = null;
}
function GrowAnimationTick( grow )
{
	if ( sys == "Netscape" )
		return true;										
	var	objPlayer = grow.objPlayer;							
	var	child = objPlayer.HTML.children[0];
	if (child.tagName == "A")
		child = child.children[0];
	var segment = grow.currentSegment;						
    var EndZoom = grow[segment.number+1].zoom;
    var NewcurrentGrowth = grow.currentGrowth + segment.growthFactor; 
    if (segment.growthFactor < 0 && NewcurrentGrowth < EndZoom)  // Shrink
        NewcurrentGrowth = EndZoom;
    if (segment.growthFactor >= 0 && NewcurrentGrowth > EndZoom) // Grow
        NewcurrentGrowth = EndZoom;
    if (NewcurrentGrowth != grow.currentGrowth)
    {
	    grow.currentGrowth = NewcurrentGrowth;
	    child.width = grow.realWidth*(grow.currentGrowth/100);
	    child.height = grow.realHeight*(grow.currentGrowth/100);
    }
	if ( ++grow.currentTicks <= segment.growthTicks )		
		return false;										
	if ( grow.currentSegment == grow.finalSegment )			
		return true;										
	grow.currentSegment = grow[ segment.number+1 ];			
	grow.currentTicks = 0;
	return false;											
}
function Timer()
{
	if ( Project.tickRate == null )			
		this.tickRate = DEFAULT_TICK_RATE;
	else
		this.tickRate = Project.tickRate;
	this.oneShots = new Array();
	this.animations = new Array();
	this.tickCounter = 0;							
	this.ticksPerSecond = 1000 / (this.tickRate);	
	this.timerID = null;
	this.StartTicking = StartTicking;				
	this.StopTicking = StopTicking;
	
}
function StartTicking()
{
	if ( this.timerID == null )
		this.timerID = setInterval( "TimerTick()", this.tickRate );
}
function StopTicking()
{
	if ( this.timerID != null )
		clearInterval( this.timerID );
	this.timerID = null;
}
function TimerTick()
{
	var timerEvent;
	
	for ( var ii=0; ii<tickTimer.animations.length; ii++ )		
	{
		if ( (timerEvent=tickTimer.animations[ii]) == null )	
			continue;											
		if ( timerEvent.callback( timerEvent.callbackObj ) == true )	
			tickTimer.animations[ii] = null;					
	}
	
    ++tickTimer.tickCounter;
		
	var length = tickTimer.oneShots.length;					
	for ( var ii=0; ii<length && (tickTimer!=null); ii++ )	
	{
		if ( (timerEvent=tickTimer.oneShots[ii]) == null )	
			continue;										
		
		if ( timerEvent.time <= tickTimer.tickCounter )		
		{
			tickTimer.oneShots[ii] = null;					
			timerEvent.callback( timerEvent.callbackObj );	
		}
	}
}
function StartOneShotTimer( obj, time, callback, type )
{
	var	timerIndex;									
	var timerEvent = new Object();					
	
	timerEvent.callbackObj = obj;					
	timerEvent.callback = callback;					
	timerEvent.type = type;							
	
	
	timerEvent.time = tickTimer.tickCounter + (time * tickTimer.ticksPerSecond);
	for ( timerIndex=0; tickTimer.oneShots[timerIndex]!=null; timerIndex++ );	
	tickTimer.oneShots[timerIndex] = timerEvent;	
	return;
}
function StartAnimationTimer( obj, callback )
{
	var timerIndex; 
	timerEvent = new Object();
	timerEvent.callbackObj = obj;					
	timerEvent.callback = callback;					
	for ( timerIndex=0; tickTimer.animations[timerIndex]!=null; timerIndex++);	
	tickTimer.animations[timerIndex] = timerEvent;
}
function StopSceneTimers()
{
	for (var ii=0; ii<tickTimer.oneShots.length; ii++)	
	{
		if ( tickTimer.oneShots[ii] == null )			
			continue;
		if ( tickTimer.oneShots[ii].type == TMR_SCENE )
			tickTimer.oneShots[ii] = null;				
	}
	
	for (var ii=0; ii<tickTimer.animations.length; ii++)
		tickTimer.animations[ii] = null;
}
	
function KillTimer()
{
	if ( tickTimer != null )						
	{
		window.clearTimeout( tickTimer.timerID);	
		tickTimer = null;							
	}
}
function SetColor(el, color) 
{
	if ( el.style == null )					
		return;
	
	el.style.backgroundColor = color;		
	if ("Netscape"==sys) 
		el.NSLayer.bgColor = color;			
}
function SetZIndex(el, zindex) 
{
	if ( el.style == null )					
		return;
	
	el.style.zIndex = zindex;				
	if ("Netscape"==sys) 
		el.NSLayer.zIndex = zindex			
}
function SetVisibility(el, val) 
{
    if ( el.style == null )					
		return;
	el.style.visibility = val;				
        
	if ( "Netscape"==sys )					
	{
		if		( val == IE_HIDDEN )
		    el.NSLayer.visibility = NAV_HIDDEN;
		else if ( val == IE_VISIBLE )
			el.NSLayer.visibility = NAV_VISIBLE;
		else if ( val == IE_INHERIT )
			el.NSLayer.visibility = NAV_INHERIT;
		else
			el.NSLayer.visibility = "";
	}
}
function Position( obj )
{
	this.object = obj;							
	this.x = obj.HTML.style.pixelLeft;			
	this.y = obj.HTML.style.pixelTop;			
	this.SetPosition = SetPosition;
}
function SetPosition( newX, newY ) 
{
	var el = this.object.HTML;					
	if ( el.style == null )						
		return;
					
	el.style.pixelTop = newY;		
	el.style.pixelLeft = newX;
	this.x = newX;								
	this.y = newY;
	if ( "Netscape"==sys )						
	{
		el.NSLayer.top = parseInt( newY );
		el.NSLayer.left = parseInt( newX );
		el.offsetTop = el.NSLayer.top;
		el.offsetLeft = el.NSLayer.left;
	}
}
function SetContent(el, content) 
{
	if ( el.style == null )						
		return;
	if ( "Netscape"==sys )						
	{
		el.NSLayer.document.open();				
		el.NSLayer.document.write(content);		
		el.NSLayer.document.close();			
	}
	else										
		el.innerHTML=content;
}
function SetupButtons()
{
	var rtn = false;						
	if ( document.all.Pause != null )
	{
		document.all.Pause.onclick = Pause;
		strPause = document.all.Pause.value.split( '/' );
		document.all.Pause.value = strPause[0];
	}
	if (document.all.Stop != null )
		document.all.Stop.onclick = Stop;
	if ( document.all.Forward != null )
		document.all.Forward.onclick = Forward;
	if ( document.all.Backward != null )
		document.all.Backward.onclick = Backward;
	if ( document.all.Webpage != null )
		document.all.Webpage.onclick = GotoWebpage;
	if ( document.all.SceneStatus != null )
		formStatus = document.all.SceneStatus;
	if ( document.all.Start != null )
	{
		document.all.Start.onclick = Start;
		strPlay = document.all.Start.value.split( '/' );
		document.all.Start.value = strPlay[0];
		rtn = true;
	}
	else
		rtn = false;
	if ( document.all.NavigationButtons != null )
		SetVisibility( document.all.NavigationButtons, IE_VISIBLE );
	return rtn;
}
function Start()
{
    StartOnScene(Project.startScene);
}
function StartOnScene(startScene)
{
	if ( stNoInput )										
		return;
	if ( stButtons == true )								
	{
		document.all.Start.value = strPlay[1];
		if ( document.all.Pause != null )
		{
			document.all.Pause.value = strPause[0];
		}
	}
	if			( (stProjState == PS_RUNNING) || (stProjState == PS_PAUSED) )	
	{
		ProjectShutdown();
		ProjectInitialize();
	}
	else if		( stProjState != PS_INITIALIZED )		
		ProjectInitialize();
	ProjectStart(startScene);										
}
function Pause()
{
	
	if ( stProjState == PS_PAUSED )						
	{
		tickTimer.StartTicking();						
		if ( document.all.Pause != null )
		{
			document.all.Pause.value = strPause[0];
		}
		stProjState = PS_RUNNING;
		StatusChange();									
	}
	else
	{
		if ( tickTimer != null )						
			tickTimer.StopTicking();					
		if	( stProjState != PS_RUNNING )				
			return;
		stProjState = PS_PAUSED;
		if ( document.all.Pause != null )
		{
			document.all.Pause.value = strPause[1];
		}
		StopEverythingOnScenes( true );					
		StatusChange();									
	}
}
function Stop()
{
	if ( stNoInput )										
		return;
	location.reload();
}
function Forward()
{
	if ( stNoInput )										
		return;
	
	if ( stProjState != PS_RUNNING )
		return;
	SceneExit( currentScene );					
}
function Backward()
{
	if ( stNoInput )										
		return;
	var nextScene;
	
	
	
	if		( stProjState == PS_COMPLETE )
		nextScene = Project.stopScene;
	else if ( stProjState != PS_RUNNING )
		return;
	else
		nextScene = (currentScene.number == 0) ? 0 : currentScene.number - 1;
	ProjectShutdown();
	ProjectInitialize();
	ProjectStart( nextScene );				
}
function GotoWebpage()
{
	window.open( Project.webpage);						
}
function StatusChange( )
{
	var		stsPage = null;					
	var		stsState = null;				
	if		( stProjState == PS_UNINITIALIZED )
	{
		stsState = "Initializing";
		stsPage = ""
	}
	else if ( stProjState == PS_INITIALIZED )
	{
		stsState = "Ready";
		stsPage = "";
	}
	else if	( stProjState == PS_RUNNING )
	{
		stsState = "Playing";
		stsPage = (currentScene.number+1) + " / " + nScenes;
	}
	else if	( stProjState == PS_PAUSED )
		stsState = "Paused";
	else if	( stProjState == PS_COMPLETE )
	{
		stsState = "Complete";
		stsPage = "Done";
	}
	
	if ( (formStatus != null) && (stsPage != null) )
		formStatus.value = stsPage;
	
	if ( stsState != null )
		top.status = stsState; 
}
function GetSceneFromNumber( sceneNum )
{
	return sceneArray[sceneNum];		
}
function GetPlayerFromName( playerName )
{
	var objPlayer;
	
	
	if ( (currentScene) && (currentScene.Players !=null) && ((objPlayer = currentScene.Players[playerName]) != null) )																
		return objPlayer;						
	
	var objScene;
	for ( sceneName in Scenes )						
	{
		objScene = Scenes[sceneName];
		if ( objScene.Players != null )
		{
			objPlayer = objScene.Players[playerName];
			if ( objPlayer != null )
				return objPlayer;						
		}
	}	
			
	return null;									
}
function GetObjectTypeFromName( nameString )
{
	var type = nameString.substr(0,1);		
	if		( type == NAME_SCENE )			
		return OBJ_SCENE;
	else if	( type == NAME_PLAYER )			
		return OBJ_PLAYER;
}
function GetPlayerTypeFromName( nameString )
{
	var type = nameString.substr(1,1);		
	if		( type == PLAYER_NAME_IMAGE )		
		return PLAYER_IMAGE;
	else if	( type == PLAYER_NAME_DRAW )		
		return PLAYER_DRAW;
	else if	( type == PLAYER_NAME_TEXT )		
		return PLAYER_TEXT;
}
function resetGifAnimation()
{
	var temp = document.all["img1"].src;
	document.all["img1"].src = temp;
}

