// Smart "Get Shockwave" button script
// copyright (c) Macromedia, Inc.
// version 1.2.5
// January 14, 1998
// April 14, 1998 modified for Flash 3.0 detection

var JAR_BASE				= "http://download.macromedia.com/pub/shockwave/jars/english/";

var COMBINED_WIN32_JAR		= "shock32.jar";
var DIRECTOR_WIN32_JAR		= "dir32.jar";
var FLASH_WIN32_JAR			= "flash32.jar";

var COMBINED_WIN16_JAR		= "shock16.jar";
var DIRECTOR_WIN16_JAR		= "dir16.jar";
var FLASH_WIN16_JAR			= "flash16.jar";

var COMBINED_PPC_JAR		= "shockppc.jar";
var DIRECTOR_PPC_JAR		= "dirppc.jar";
var FLASH_PPC_JAR			= "flashppc.jar";

var CONTROL_BASE			= "http://active.macromedia.com/";
var DIRECTOR_CONTROL_PAGE	= "director/default.htm";
var FLASH_CONTROL_PAGE		= "flash/default.htm";
var COMBINED_CONTROL_PAGE	= "default.htm";

var	DEFAULT_PAGE			= "http://www.macromedia.com/shockwave/download/";
var DEFAULT_PAGE_HEIGHT		= 480;
var DEFAULT_PAGE_WIDTH		= 640;

var JAR_STATUS_WINDOW		= "ShockwaveStatus";
var	JAR_STATUS_PAGE_HEIGHT	= 360;
var	JAR_STATUS_PAGE_WIDTH	= 470;

var	CONFIRM_MESSAGE			= "Are you sure you want to install Macromedia Shockwave?";

var gDirectorPluginName;
var gDirectorPluginDescription;
var gDirectorPluginFilename;

var gDirectorPluginTargetVersion;
var gDirectorMinimumVersion;
var gDirectorInstalledVersion;
	
var gFlashPluginName;
var gFlashPluginFilename;

var gFlashPluginTargetVersion;
var gFlashMinimumVersion;
var gFlashInstalledVersion;

var gDirectorControlVersion;
var gFlashControlVersion;

var gNeedDirector;
var gNeedFlash;

var gBeginPage;
var gDonePage;
var gErrorPage;

var gUserOS;


function initGlobals()
{
	gBeginPage	= "http://www.macromedia.com/shockwave/download/smart/jarstatus/begin.html";
	gDonePage	= "http://www.macromedia.com/shockwave/download/smart/jarstatus/test/both.html";
	gErrorPage	= "http://www.macromedia.com/shockwave/download/smart/jarstatus/error.html";

	gDirectorPluginTargetVersion	= 6.01;
	gFlashPluginTargetVersion		= 3.0;

	gDirectorControlVersion	= "6,0,1,6118";
	gFlashControlVersion	= "3,0,4,0";

	gNeedDirector	= false;
	gNeedFlash		= false;

	gUserOS = getUserPlatform();
}


function getUserPlatform()
{
	var userPlat = "unknown";
	
	var navInfo = navigator.appVersion;

	if (	( navInfo.indexOf( "Windows NT" )	!= -1 )
		||	( navInfo.indexOf( "Windows 95" )	!= -1 )
		||	( navInfo.indexOf( "WinNT" )		!= -1 )
		||	( navInfo.indexOf( "Win95" )		!= -1 )
	   )
	{
		userPlat = "Win32";
	}
	else if ( navInfo.indexOf( "Win16" ) != -1 )
	{
		userPlat = "Win16";
	}
	else if ( navInfo.indexOf( "Macintosh" ) != -1 )
	{
		userPlat = "PPC";
	}
	else if ( navInfo.indexOf( "68K" ) != -1 )
	{
		userPlat = "68K";
	}

	return userPlat;
}


function getShockwave()
{
	initGlobals();
	
	var totalArgs = getShockwave.arguments.length;
	if ( totalArgs > 0 )
	{
		for ( var i = 0; i < totalArgs; i++ )
		{
			var currArg = getShockwave.arguments[ i ];

			if ( currArg.indexOf( "Director" ) != -1 )
			{
				gDirectorPluginTargetVersion = extractDoubleFromString( currArg );
			}
			else if ( currArg.indexOf( "Flash" ) != -1 )
			{
				gFlashPluginTargetVersion = extractDoubleFromString( currArg );
			}
		}
	}

	if ( gUserOS != "unknown" )
	{
		var userBrowser = navigator.appName;

		if ( userBrowser.indexOf( "Microsoft" ) != -1 )
		{
			handleExplorer();
		}
		else if ( userBrowser.indexOf( "Netscape" ) != -1 )
		{
			handleNetscape();
		}
		else
		{
			goToDefaultPage();
		}
	}
	else
	{
		goToDefaultPage();
	}
}


function handleExplorer()
{
	if ( gUserOS == "Win32" )
	{
		gNeedDirector	= stringToVersionDouble( gDirectorControlVersion	) > 0.0;
		gNeedFlash		= stringToVersionDouble( gFlashControlVersion		) > 0.0;
		
		if (( gNeedDirector ) && ( gNeedFlash ))
		{
			openWindow( CONTROL_BASE + COMBINED_CONTROL_PAGE );
		}
		else if ( gNeedDirector )
		{
			openWindow( CONTROL_BASE + DIRECTOR_CONTROL_PAGE );
		}
		else if ( gNeedFlash )
		{
			openWindow( CONTROL_BASE + FLASH_CONTROL_PAGE );
		}
		else
		{
			goToDefaultPage();
		}
	}
	else
	{
		goToDefaultPage();
	}
}


function handleNetscape()
{
	getInstalledPluginVersions();
	
	gNeedDirector	= gDirectorInstalledVersion < gDirectorPluginTargetVersion;
	gNeedFlash		= gFlashInstalledVersion < gFlashPluginTargetVersion;

	if ( gNeedDirector || gNeedFlash )
	{
		var navVersion = extractDoubleFromString( navigator.appVersion );
		if ( navVersion < 4.0 )
		{
			getInstaller();
		}
		else if ( smartUpdateEnabled() )

		{

			if ( confirm( CONFIRM_MESSAGE ))
			{
				getJAR();

			}
		}

		else

		{

			getInstaller();

		}
	}
	else
	{
		allSet();
	}
}




function smartUpdateEnabled()

{

	var smartUpdateOK = false;



	var javaOK = false;

	javaOK = navigator.javaEnabled();



	if ( javaOK )  

	{

		if ( netscape.softupdate != null )

		{

			smartUpdateOK = netscape.softupdate.Trigger.UpdateEnabled();

		}

	}



	return smartUpdateOK;

}




function allSet()
{
	if (( gDirectorInstalledVersion <= 0.0 ) && ( gFlashInstalledVersion <= 0.0 ))
	{
		goToDefaultPage();
	}
	else
	{
		var successMsg = "You already have";
		
		if ( gDirectorInstalledVersion > 0.0 )
		{
			successMsg += " Shockwave Director " + gDirectorInstalledVersion;
			if ( gFlashInstalledVersion > 0.0 )
			{
				successMsg += " and Flash " + gFlashInstalledVersion + ".";
			}
		}
		else
		{
			successMsg += " Flash " + gFlashInstalledVersion + ".";
		}
			
		alert( successMsg );
	}
}


function getInstalledPluginVersions()
{
	gDirectorInstalledVersion	= 0;
	gFlashInstalledVersion		= 0;
	
	if ( gUserOS == "Win32" )
	{
		var navVersion = extractDoubleFromString( navigator.appVersion );
		if ( navVersion >= 4.0 )
		{
			return;
		}
	}
	
	var shockwave4	= "dummy";
	var flash1		= "dummy";

	if ( gUserOS == "Win32" )
	{
		shockwave4	= "NP32DSW.DLL";
		flash1		= "NPSPL32.DLL";
	}
	else if ( gUserOS == "Win16" )
	{
		shockwave4	= "NP16DSW.DLL";
		flash1		= "NPSPL16.DLL";
	}
	else if ( gUserOS == "PPC" )
	{
		shockwave4	= "NP-MacPPC-Dir-Shockwave";
		flash1		= "FutureSplashPM";
	}
	else if ( gUserOS == "68K" )
	{
		shockwave4	= "NP-Mac68K-Dir-Shockwave";
		flash1		= "Shockwave Flash 68K";
	}
	
	var totalPlugins = navigator.plugins.length;
	if ( totalPlugins > 0 )
	{
		var stillLookingForDirector	= gDirectorPluginTargetVersion > 0.0;
		var stillLookingForFlash	= gFlashPluginTargetVersion > 0.0;
	
		for ( var whichPlug = 0; whichPlug < totalPlugins; whichPlug++ )
		{
			currPlug = navigator.plugins[ whichPlug ];
	
			var plugName = currPlug.name;
			if ( plugName.indexOf( "Shockwave" ) != -1 )
			{
				if ( plugName.indexOf( "Director" ) != -1 )
				{
					gDirectorInstalledVersion = directorPluginVersion( whichPlug );
					stillLookingForDirector = false;
				}
				else if ( plugName.indexOf( "Flash" ) != -1 )
				{
					gFlashInstalledVersion = flashPluginVersion( whichPlug );
					stillLookingForFlash = false;
				}
			}
			else
			{
				var plugFileName = currPlug.filename;
				if ( plugFileName.indexOf( shockwave4 ) != -1 )
				{
					gDirectorInstalledVersion = 4.0;
					stillLookingForDirector = false;
				}
				else if ( plugFileName.indexOf( flash1 ) != -1 )
				{
					gFlashInstalledVersion = 1.1;
					stillLookingForFlash = false;
				}
				else if ( gUserOS == "68K" )
				{
					if ( plugFileName.indexOf( "Shockwave Flash NP-68K" ) != -1 )
					{
						gFlashInstalledVersion = 2.0;
						stillLookingForFlash = false;
					}
				}
			}
			
			if ( !( stillLookingForDirector || stillLookingForFlash ))
			{
				break;
			}
		}
	}
}


function directorPluginVersion( plugIndex )
{
	gDirectorPluginName			= navigator.plugins[ plugIndex ].name;
	gDirectorPluginDescription	= navigator.plugins[ plugIndex ].description;
	
	var theVer = 5.0;

	var j = gDirectorPluginDescription.indexOf( "version" );
	if ( j != -1 )
	{
		var tempVersionString = gDirectorPluginDescription.substring( j + 8 );
		tempVersion = extractDoubleFromString( tempVersionString );
		if ( tempVersion > -1.0 )
		{
			theVer = tempVersion;
		}
	}

	return theVer;
}


function flashPluginVersion( plugIndex )
{
	gFlashPluginName		= navigator.plugins[ plugIndex ].name;
	gFlashPluginFileName	= navigator.plugins[ plugIndex ].filename;
	
	var theVer = 0.0;

	if ( gFlashPluginFileName == "NPSPL32.DLL" )
	{
		theVer = 1.1;
	}
	else if ( gFlashPluginFileName == "NPSPL16.DLL" )
	{
		theVer = 1.1;
	}
	else if ( gFlashPluginFileName == "FutureSplashPM" )
	{
		theVer = 1.1;
	}
	else if ( gFlashPluginFileName == "Shockwave Flash 68K" )
	{
		theVer = 1.1;
	}
	else if ( gFlashPluginFileName == "Shockwave Flash NP-68K" )
	{
		theVer = 2.0;
	}


	if ( gFlashPluginName.indexOf( "Shockwave Flash" ) == 0 )
	{
		var tempVersion = extractDoubleFromTail( gFlashPluginName );
		if ( tempVersion > 0.0 )
		{
			theVer = tempVersion;
		}
		
		var flashPluginDescription = navigator.plugins[ plugIndex ].description;
		tempVersion = extractDoubleFromString( flashPluginDescription );
		if ( tempVersion > 0.0 )
		{
			theVer = tempVersion;
		}
	}


	return theVer;
}


function getInstaller()
{
	var	installerBase = "http://www.macromedia.com/shockwave/download/";

	if (( gNeedDirector ) && ( gNeedFlash ))
	{
		openWindow( installerBase + "index.cgi?P1_Prod_Version=Shockwave" );
	}
	else if ( gNeedDirector )
	{
		openWindow( installerBase + "index.cgi?P1_Prod_Version=Shockwave" );
	}
	else
	{
		openWindow( installerBase + "index.cgi?P1_Prod_Version=ShockwaveFlash" );
	}
}


function getJAR()
{
	if (( gNeedDirector ) && ( gNeedFlash ))
	{
		gDonePage = "http://www.macromedia.com/shockwave/download/smart/jarstatus/test/both.html";
	}
	else if ( gNeedDirector )
	{
		gDonePage = "http://www.macromedia.com/shockwave/download/smart/jarstatus/test/director.html";
	}
	else
	{
		gDonePage = "http://www.macromedia.com/shockwave/download/smart/jarstatus/test/flash.html";
	}

	installJAR();
}


function installJAR()
{
	if ( gUserOS == "68K" )
	{
		getInstaller();
	}
	else
	{
		if ( gNeedDirector && gNeedFlash )
		{
			if ( gUserOS == "Win32" )
			{
				triggerJAR( COMBINED_WIN32_JAR );
			}
			else if ( gUserOS == "Win16" )
			{
				triggerJAR( COMBINED_WIN16_JAR );
			}
			else if ( gUserOS == "PPC" )
			{
				triggerJAR( COMBINED_PPC_JAR );
			}
		}
		else if ( gNeedDirector )
		{
			if ( gUserOS == "Win32" )
			{
				triggerJAR( DIRECTOR_WIN32_JAR );
			}
			else if ( gUserOS == "Win16" )
			{
				triggerJAR( DIRECTOR_WIN16_JAR );
			}
			else if ( gUserOS == "PPC" )
			{
				triggerJAR( DIRECTOR_PPC_JAR );
			}
		}
		else
		{
			if ( gUserOS == "Win32" )
			{
				triggerJAR( FLASH_WIN32_JAR );
			}
			else if ( gUserOS == "Win16" )
			{
				triggerJAR( FLASH_WIN16_JAR );
			}
			else if ( gUserOS == "PPC" )
			{
				triggerJAR( FLASH_PPC_JAR );
			}
		}
	}
}


function triggerJAR( jarFileName )
{
	var extraInfo = "?" + JAR_BASE + jarFileName;

	extraInfo += ",";
	if ( gDonePage != null )
	{
		extraInfo += gDonePage;
	}

	extraInfo += ",";
	if ( gErrorPage != null )
	{
		extraInfo += gErrorPage;
	}

	var statusWindowFeatures = "toolbar=0,location=0,directories=0,status=0,menubar=0,resizable=0";
	statusWindowFeatures += ",width=" + JAR_STATUS_PAGE_WIDTH + ",height=" + JAR_STATUS_PAGE_HEIGHT;
	
	openWindow( gBeginPage + extraInfo, statusWindowFeatures );
}


function goToDefaultPage()
{
	var statusWindowFeatures = "toolbar=0,location=0,directories=0,status=0,menubar=0,resizable=0";
	statusWindowFeatures += ",width=" + DEFAULT_PAGE_WIDTH + ",height=" + DEFAULT_PAGE_HEIGHT;
	openWindow( DEFAULT_PAGE, statusWindowFeatures );
}


function openWindow( theLocation, windowFeatures )
{
	if ( theLocation != null )
	{
		if ( windowFeatures == null )
		{
			var defaultWindowFeatures = "toolbar=0,location=0,directories=0,status=0,menubar=0,resizable=0";
			defaultWindowFeatures += ",width=" + DEFAULT_PAGE_WIDTH + ",height=" + DEFAULT_PAGE_HEIGHT;
			open( theLocation, JAR_STATUS_WINDOW, defaultWindowFeatures );
		}
		else
		{
			open( theLocation, JAR_STATUS_WINDOW, windowFeatures );
		}
	}
}


function stringToVersionDouble( s )
{
	var returnVal = -1.0;

	if ( s != null )
	{
		var newStr = s.toString();
		if ( newStr.length > 0 )
		{
			if ( validVersionString( newStr ) )
			{
				returnVal = convertVersionStringToDouble( newStr );
			}
			else
			{
				returnVal = extractDoubleFromString( newStr );
			}
		}
	}
	
	return returnVal;
}


function validVersionString( s )
{
	var valid		= true;
	var totalCommas	= 0;
	var c;

	var inputStringLength = s.length;	
	for ( var i = 0; i < inputStringLength; i++ )
	{
		c = s.charAt( i );
		if ( c == "," )
		{
			if ( ++totalCommas > 3 )
			{
				break;
			}
		}
		else if ( "1234567890".indexOf( c ) == -1 )
		{
			valid = false;
			break;
		}
	}

	if ( totalCommas != 3 )
		valid = false;

	return valid;
}


function convertVersionStringToDouble( s )
{
	var returnVal	= -1.0;

	var chunkNum	= 1;
	var tempNumber	= null;
	var temp		= 0.0;

	var inputStringLength = s.length;
	var c;
	
	for ( var i = 0; i < inputStringLength; i++ )
	{
		c = s.charAt( i );
		if ( "1234567890".indexOf( c ) != -1 )
		{
			if ( tempNumber != null )
			{
				tempNumber += parseInt( c );
			}
			else
			{
				tempNumber = parseInt( c );
			}
		}
		else
		{
			if ( chunkNum == 1 )
			{
				temp = parseFloat( tempNumber );
				returnVal = temp;
			}
			else if ( chunkNum == 2 )
			{
				temp = ( parseFloat( tempNumber )) / 10.0;
				returnVal += temp;
			}
			else if ( chunkNum == 3 )
			{
				temp = ( parseFloat( tempNumber )) / 100.0;
				returnVal += temp;
			}
			tempNumber = null;
			chunkNum++;
		}
	}

	return returnVal;
}


function extractDoubleFromTail( s )
{
	var returnVal = -1.0;
	
	var lastChar		= s.length - 1;
	var currentChar		= lastChar;
	var c				= s.charAt( lastChar );

	while (( "1234567890.".indexOf( c ) == -1 ) && ( !( currentChar < 0 )))
	{
		c = s.charAt( --currentChar );
	}

	var digitsHead		= currentChar;
	var digitsTail 		= currentChar;
	var totalDecimals	= 0;
	
	while ( !( currentChar < 0 ))
	{
		if ( "1234567890".indexOf( c ) != -1 )
		{
		}
		else if ( c == "." )
		{
			++totalDecimals;
		}
		else if ( currentChar < lastChar )
		{
			digitsHead = currentChar + 1;
			break;
		}

		c = s.charAt( --currentChar );
	}

	var chunkOfDigits = s.substring( digitsHead, digitsTail + 1 );
	
	if ( totalDecimals < 2 )
	{
		returnVal = parseFloat( chunkOfDigits );
	}
	else if ( totalDecimals == 2 )
	{
		var firstDecimal	= chunkOfDigits.indexOf( "." );
		var secondDecimal	= chunkOfDigits.indexOf( ".", firstDecimal + 1 );
		var lastChar		= chunkOfDigits.length;
		
		var newChunk = chunkOfDigits.substring( 0, secondDecimal );
		newChunk += chunkOfDigits.substring( secondDecimal + 1, lastChar );

		returnVal = parseFloat( newChunk );
	}
	else
	{
		var firstDecimal	= chunkOfDigits.indexOf( "." );
		var secondDecimal	= chunkOfDigits.indexOf( ".", firstDecimal + 1 );
		var thirdDecimal	= chunkOfDigits.indexOf( ".", secondDecimal + 1 );
		
		var newChunk = chunkOfDigits.substring( 0, secondDecimal );
		newChunk += chunkOfDigits.substring( secondDecimal + 1, thirdDecimal );

		returnVal = parseFloat( newChunk );
	}
	
	return returnVal;
}


function extractDoubleFromString( s )
{
	var returnVal		= -1.0;

	var c				= s.charAt( 0 );
	var lastChar		= s.length - 1;
	var currentChar		= 0;

	var totalDecimals	= 0;
	var numString		= "";


	while (( currentChar < lastChar ) && ( "1234567890".indexOf( c ) == -1 ))
	{
		c = s.charAt( ++currentChar );
	}

	while (( currentChar <= lastChar ) && ( totalDecimals < 3 ))
	{
		c = s.charAt( currentChar );

		if ( "1234567890".indexOf( c ) != -1 )
		{
			numString += c;				
		}
		else if ( c == "." )
		{
			if ( ++totalDecimals == 1 )
			{
				numString += c;
			}
		}
		else
		{
			break;
		}

		currentChar++;
	}

	if ( numString.length > 0 )
	{
		returnVal = parseFloat( numString );
	}
	
	return returnVal;
}

