function notImplemented( functionBody )
{
    var bodyString = new String( functionBody );
    alert( bodyString.substring( 0, bodyString.indexOf( ")" ) + 1 ) + " is not implemented!" );
}

// Function prototypes for thirdparty users
function initGameScript( tThirdPartySource, tLanguage, tCountry, tSource, racTypeIN, distCodeIN )  { notImplemented( arguments.callee ); }
function getDownloadUrl( gameID, gameType, overInstall )                    { notImplemented( arguments.callee ); }
function getBuyUrl( gameID, priceID, gameType, urlArguments )               { notImplemented( arguments.callee ); }
function getBuyGpUrl( gpType, initTerm, urlArguments )                      { notImplemented( arguments.callee ); }
function getActivateGpUrl( initTerm, urlArguments )                         { notImplemented( arguments.callee ); }
function getUserReviewUrl( gameID, gameType, access )                       { notImplemented( arguments.callee ); }
function getScreenShotsUrl( gameID, gameType )                              { notImplemented( arguments.callee ); }
function getGameMessageBoardUrl( gameID, gameType, lang )                   { notImplemented( arguments.callee ); }
function getMessageBoardUrl( boardId )                                      { notImplemented( arguments.callee ); }
function getGameTellAFriendUrl( gameID, gameType )                          { notImplemented( arguments.callee ); }
function getTellAFriendUrl( tellAFriendId )                                 { notImplemented( arguments.callee ); }
function getLaunchWebGameUrl( gameID, webPlayUrl, urlArguments )            { notImplemented( arguments.callee ); }
function getGamePageUrl( gameID, gameType )                                 { notImplemented( arguments.callee ); }
function getGenrePageUrl( genreId )                                         { notImplemented( arguments.callee ); }
function getFaqPageUrl( faqId )                                             { notImplemented( arguments.callee ); }
function getPageUrl( pType )                                                { notImplemented( arguments.callee ); }
function getPromoPage( gameID, promoType )                                  { notImplemented( arguments.callee ); }
function getCouponPage( gameID, ecqs )                                      { notImplemented( arguments.callee ); }

// Internal functions and variables for Url generating functions.
function RealArcade()
{
    this.GENERATE_URL_ERROR = "error in generating url";
    this.DEFAULT_PRICE_ID = "4";
    this.DEFAULT_GAME_TYPE = "download";
    this.DEFAULT_GP_TYPE = "full";
    this.VALIDATION_ACTION_ERROR = "action=error";
    this.BASE_URL = "http://switchboard.real.com/arcade/feeds.html";
    this.TPS = "tps";
    this.LANG = "lang";
    this.COUNTRY = "country";
    this.PARTNER = "partner";
    this.GAMEID = "gameid";
    this.CLIENT = "client";
    this.RACTYPE = "ractype";
    this.RACVERSION = "racversion";
    this.INSTALLERVERSION = "installerversion";
    this.GAMETYPE = "gametype";
    this.OVERINSTALL = "overinstall";
    this.DOWNLOADTYPE = "dltype";
    this.RACINSTALLED = "arcadeinstalled";
	this.RACDISTCODE = "distcode";
    this.GAMEPASSTYPE = "gptype";
    this.ACCESS = "access";
    this.BOARDID = "boardid";
    this.TAFID = "tafid";
    this.GENREID = "genreid";
    this.GENRETYPE = "genretype";
    this.PAGETYPE = "ptype";
    this.PROMOTYPE = "promotype";
    this.FAQTYPE = "faqtype";
    this.FAQID = "faqid";
    this.COUPON = "ecqs";
    this.SOURCECONTENT = "sourcecontent";
    this.INIT_TERM = "init_term";
    this.SRC = "src";
    this.RSRC = "rsrc";
    this.LSRC = "lsrc";    
    this.ACTION = "action";
    this.PRICEID = "priceid";
    this.SHOCKWAVE = "shockwave";
    this.JAVA = "java";
    this.USECLIENT = "false";
    this.DOWNLOAD_ACTION		    = "download";
    this.BUYURL_ACTION			    = "buy";
    this.BUYGP_ACTION			    = "buy_gp";
    this.ACTIVATEGP_ACTION		    = "activate_gp";
    this.USERREVIEW_ACTION		    = "user_review";
    this.SCREENSHOTS_ACTION		    = "screen_shots";
    this.MESSAGEBOARD_ACTION	    = "message_board";
    this.TELLAFRIEND_ACTION		    = "tell_a_friend";
    this.LAUNCHWEBGAME_ACTION	    = "launch_web_game";
    this.PAGE_ACTION			    = "page";
    this.COMMON_ACTION			    = "common";
    this.DEFAULT_GAME_PAGE_TYPE     = "game";
    this.DEFAULT_GENRE_PAGE_TYPE    = "gpage";
    this.DEFAULT_FAQ_PAGE_TYPE      = "topfaqs";
    this.DEFAULT_PROMO_PAGE_TYPE    = "0";
    this.PROMO_PAGE_TYPE            = "promo";
    this.DOWNLOADTYPE_RDX           = "rdxbundle";
    this.DOWNLOADTYPE_BUNDLE        = "bundle";
    this.DOWNLOADTYPE_GAME          = "game";
    this.WEB_PLAY_URL               = "web_play_url";
    this.COUPONPATH_ACTION          = "validate_coupon";
    this.ACTION_RANGE = [ this.DOWNLOAD_ACTION,
                          this.BUYURL_ACTION,
                          this.BUYGP_ACTION,
                          this.ACTIVATEGP_ACTION,
					      this.USERREVIEW_ACTION,
					      this.SCREENSHOTS_ACTION,
					      this.MESSAGEBOARD_ACTION,
					      this.TELLAFRIEND_ACTION,
					      this.LAUNCHWEBGAME_ACTION,
					      this.PAGE_ACTION,
					      this.PROMO_ACTION,
					      this.COMMON_ACTION,
					      this.COUPONPATH_ACTION ];
	this.usePartnerPages = "1";
    this.baseUrl = "";
    this.thirdPartySource = "";
    this.language = "";
    this.country = "";
    this.client = "";
    this.source = "";
    this.rsrc = "";
    this.lsrc = "";    
    this.ractype = "oldclient";
    this.racversion = "";
    this.installerVersion = "";
    this.racInstalled = "";
    this.racDistCode = "";
    this.useAlternateURL = false;
    this.shockwaveInstalled = "";
    this.javaEnabled = "";
	this.debugInfo = "";

    this.allValidMappings = [ {name:this.ACTION,
						  range:this.ACTION_RANGE,
						  validateFunction:validateEnumeration},

						 {name:this.TPS,
						  range:null,
						  validateFunction:validateNotNull},

						 {name:this.LANG,
						  range:null,
						  validateFunction:validateNotNull},

						 {name:this.COUNTRY,
						  range:null,
						  validateFunction:validateNotNull},

						 {name:this.GAMEID,
						  range:null,
						  validateFunction:validateGameID},

						 {name:this.CLIENT,
						  range:["web", "arcade", "player"],
						  validateFunction:validateEnumeration},

                         {name:this.RACTYPE,
                          range:["oldclient", "clientless", "fullclient" ],
                          validateFunction:validateEnumeration},

                         {name:this.RACVERSION,
                          range:null,
						  validateFunction:validateNotNull},
                          
                         {name:this.INSTALLERVERSION,
                          range:null,
						  validateFunction:validateNotNull},
						  
                         {name:this.GAMETYPE,
                          range:["download", "palm", "web"],
                          validateFunction:validateEnumeration},

                         {name:this.OVERINSTALL,
                          range:["yes", "no"],
                          validateFunction:validateEnumeration},

                         {name:this.DOWNLOADTYPE,
                          range:[this.DOWNLOADTYPE_RDX, this.DOWNLOADTYPE_BUNDLE, this.DOWNLOADTYPE_GAME],
                          validateFunction:validateEnumeration},

                         {name:this.RACINSTALLED,
                          range:[ 1, 0 ],
                          validateFunction:validateEnumeration},

                         {name:this.GAMEPASSTYPE,
                          range:["full", "trial"],
                          validateFunction:validateEnumeration},

                         {name:this.ACCESS,
                          range:["read", "write"],
                          validateFunction:validateEnumeration},

                         {name:this.BOARDID,
                          range:["index", "rac", "general", "tips", "news",
                                 "comments", "de_games", "de_rac"],
                          validateFunction:validateEnumeration},

                         {name:this.TAFID,
                          range:["rac", "gamepass"],
                          validateFunction:validateEnumeration},

                         {name:this.PAGETYPE,
                          range:["game", "gpage", "topfaqs", "index", "featured", "allgames", "helpdesk",
                                 "eula", "ppolicy", "feedback", "gamepass", "custserv", "myacct", "gupdates",
                                 "sysreqs", "ractour", "realarcade", "gptrial", "gpfull", "promo"],
                          validateFunction:validateEnumeration},

                         {name:this.FAQID,
                          range:null,
                          validateFunction:validateNotNull},

						  {name:this.INIT_TERM,
						   range:null,
						   validateFunction:validateNotNull},

						  {name:this.SRC,
						   range:null,
						   validateFunction:validateNotNull},
						   
						  {name:this.RSRC,
						   range:null,
						   validateFunction:validateNotNull},
						   
						  {name:this.LSRC,
						   range:null,
						   validateFunction:validateNotNull},							   

  						  {name:this.PRICEID,
						   range:["7", "6", "5", "4", "3", "2", "1", "0"],
						   validateFunction:validateEnumeration},

						  {name:this.WEB_PLAY_URL,
						   range:[1, 2, 3, 4, 5],
						   validateFunction:validateEnumeration}

					   ];

}

var realArcade = new RealArcade();

function dbgout( str ) 
{
	realArcade.debugInfo += str + "<br>";
}

function output( str ) {
	var oConsole = window.open( '','cnsl','width=640,height=400,resizable=yes,scrollbars=yes,left=20,top=20' );
	oConsole.document.open( 'text/html' );
	oConsole.document.write( '<html><head><style>.error {color:red;} B {font-size:14px;}</style></head><body style="font-family:sans-serif;font-size:12px">' + str + '</body></html>' );
	oConsole.document.close();
	//var node = document.createElement("DIV");
	//node.appendChild( document.createTextNode( realArcade.debugInfo ) );
	//document.getElementsByTagName("BODY").item(0).appendChild(node);
}

function validateGameID( gameID )
{
	return (gameID.length > 0) && (gameID.match("\\W") == null);
}

function validateNumber( num )
{
	if( typeof( num ) == "string" )
	{
		return (num.search( "^\\d+$" ) != -1);
	}
	return ( typeof( num ) == "number" );
}

function validateNotNull( val )
{
	return (val != null);
}

function validateEnumeration( item, list )
{
    for( var i = 0; i < list.length; i++ )
    {
        if( list[i] == item )
        {
			return true;
        }
    }
    return false;
}

function validateUrl( url )
{
	var regex = "(((https?)|(ftp)):\\/\\/([\\-\\w]+\\.)+\\w{2,3}(\\/[%\\-\\w]+(\\.\\w{2,})?)*(([\\w\\-\\.\\?\\\\/+@&amp;#;`~=%!]*)(\\.\\w{2,})?)*\\/?)";
	return ( url.search(regex) == 0 && url.search("\\s") == -1);
}

function validateArgument( argName, argValue )
{
	var validateMap = realArcade.allValidMappings[ argName ];
	if( validateMap != null)
	{
		var isRangeValidation = ( validateMap.range != null && validateMap.validateFunction != null );
		var isValueValidation = ( validateMap.validateFunction != null );

		if( isRangeValidation  )
		{
			return validateMap.validateFunction( argValue, validateMap.range );
		}
		else if( isValueValidation )
		{
			return validateMap.validateFunction( argValue );
		}
	}
	return true;
}

function detectV1Rac( ctrl ) 
{
	dbgout( "<br /><b>Detecting V1 Rac</b>" );

	var undefined;
	if ( undefined != ctrl ) 
	{
		dbgout( " -- v1 Rac control exists" );
		return 1;
	} 
	else if (  isFirefox() || isGoogle() || isNetscape() )
	{
		dbgout( " -- v1 Rac control does not exist, detecting v1 Rac in Firefox/Chrome/Netscape with mime type" );
		var i=0;
		while (navigator.plugins[i])
		{
			if ( (navigator.plugins[i].name) == 'RealArcade NS Plugin' || (navigator.plugins[i].name) == 'RealOne Arcade NS Plugin'  || (navigator.plugins[i].name) == 'RealArcade Mozilla Plugin' )
			{
				dbgout( " -- Mozilla v1 plugin detected - " + navigator.plugins[i].name );
				dbgout( " -- Mozilla v1 plugin filename = " + navigator.plugins[i].filename );
				dbgout( " -- v1 Rac detected in Firefox/Chrome/Netscape with mime type" );
				return 1;
			}
			i++;
		}
        return 0;
	}
	else
	{
		dbgout( " -- v1 Rac not detected" );
		return 0;
	}
	return 0;
}

function getV1RacDistCode( ctrl ) 
{
	dbgout( "<br /><b>Determining v1 Rac Distcode</b>" );

	var undefined;
	if ( isBrowerIE5OrAbove() ) 
	{
		dbgout( " -- Determining v1 rac distcode in IE" );
		if ( undefined == ctrl )
		{
			dbgout( " -- IE v1 distcode undefined" );
			return undefined;
		}
		else
		{
			dbgout( " -- IE v1 distcode = " + ctrl.RealArcadeDistCode );
			return ctrl.RealArcadeDistCode;
		}
	} 
	else if ( isNetscape() )
	{
		dbgout( " -- v1 rac distcode is not supported in the Netscape plugin" );
		return undefined;
	}
	else if ( isFirefox() || isGoogle() )
	{
		dbgout( " -- determining v1 rac distcode in Firefox/Chrome" );
		try
		{
			if ( ctrl.RealArcadeDistCode().length > 0 )
			{
				dbgout( " -- Firefox/Chrome v1 distcode = " + ctrl.RealArcadeDistCode() );
				return ctrl.RealArcadeDistCode();
			}
			else
			{
				dbgout( " -- Firefox/Chrome v1 distcode is undefined" );
				return undefined;
			}
			
		}
		catch(e)
		{
			dbgout( "<span class=error>Exception detecting v1 distcode Firefox/Chrome: " + e + "</span>" );
			return undefined;
		}
	}
	else
	{
		dbgout( "<span class=error>This browser is not supported in urlGenerator</span>" );
		return undefined;
	}
}

function detectV2Rac( ctrl ) 
{
	dbgout( "<br /><b>Detecting V2 Rac</b>" );
	try {
		var undefined;
		if ( (undefined != ctrl) || (navigator.mimeTypes["application/realarcade-npapi-scriptable-plugin"]) ) 
		{
			dbgout( " -- v2 Rac control exists" );
			return 1;
		} 
		else
		{
			dbgout( " -- v2 Rac not detected" );
			return 0;
		}
		return 0;
	}
	catch(e) {
		dbgout( " -- v2 Rac not detected" );
		return 0;
	}
}

function getV2RacSource( ctrl ) 
{
	dbgout( "<br /><b>Getting v2 Rac Source</b>" );
	try
		{
			if ( isBrowerIE5OrAbove() ) 
			{
				dbgout( " -- IE v2 Rac Source = " + ctrl.get_source() );
				return ctrl.get_source();
			} 
			else 
			{
				dbgout( " -- Firefox/Chrome/Netscape v2 Rac Source = " + ctrl.RealArcadeSource() );
				return ctrl.RealArcadeSource();
			}
		}
	catch(e)
		{
			dbgout( "<span class=error>Error determining Rac Source: " + e + "</span>" );
			return undefined;
		}
}

function getV2RacVersion( ctrl )
{
	dbgout( "<br /><b>Determining v2 Rac Version</b>" );

	var undefined;
	if ( isBrowerIE5OrAbove() || isFirefox() || isGoogle() || isNetscape() )
	{
		if ( undefined == ctrl )
		{
			dbgout( " -- Arcade 2.0 Version Control undefined" );
			return undefined;
		}

		try
		{
			dbgout( " -- v2 Rac Version = " + ctrl.item("ArcadeVersion") );
			return ctrl.item("ArcadeVersion");
		}
		catch(e)
		{
			dbgout( "<span class=error>Error determining Rac Version: " + e + "</span>" );
			return undefined;
		}
	}
	else
	{
		dbgout( "<span class=error>This browser is not supported in urlGenerator</span>" );
		return undefined;
	}
}

function getV2InstallerVersion( ctrl )
{
	dbgout( "<br /><b>Determining v2 Installer Version</b>" );

	var undefined;
	if ( isBrowerIE5OrAbove() || isFirefox() || isGoogle() || isNetscape() )
	{
		if ( undefined == ctrl )
		{
			dbgout( " -- Arcade 2.0 Version Control undefined" );
			return undefined;
		}

		try
		{
			dbgout( " -- v2 Installer Version = " + ctrl.item( "InstallerVersion" ) );
			return ctrl.item( "InstallerVersion" );
		}
		catch(e)
		{
			dbgout( "<span class=error>Error determining Installer Version: " + e + "</span>" );
			return undefined;
		}
	}
	else
	{
		dbgout( "<span class=error>This browser is not supported in urlGenerator</span>" );
		return undefined;
	}
}

function getV2RacTps( ctrl )
{
	dbgout( "<br /><b>Determining v2 Client Tps</b>" );

	var undefined;
	if ( isBrowerIE5OrAbove() || isFirefox() || isGoogle() || isNetscape() )
	{
		if ( undefined == ctrl )
		{
			dbgout( " -- Arcade 2.0 Version Control undefined" );
			return undefined;
		}

		try
		{
			dbgout( " -- v2 client tps = " + ctrl.item( 'Tps' ) );
			return ctrl.item("Tps");
		}
		catch(e)
		{
			dbgout( "<span class=error>Error determining v2 client tps: " + e + "</span>" );
			return undefined;
		}
	}
	else
	{
		dbgout( "<span class=error>This browser is not supported in urlGenerator</span>" );
		return undefined;
	}
}

function getV2RacType( ctrl ) {
	dbgout( "<br /><b>Determining v2 Rac Type</b>" );

	var undefined;

	if ( undefined == ctrl )
	{
		dbgout( " -- Arcade 2.0 Version Control undefined" );
		return undefined;
	}
	else
	{
		try
		{
			dbgout( " -- v2 client ractype = " + ctrl.item( 'Ractype' ) );
			return ctrl.item("Ractype");
		}
		catch(e)
		{
			dbgout( "<span class=error>Error determining v2 client ractype: " + e + "</span>" );
			return undefined;
		}
	}
}

function createArcadeV1VersionControl()
{
	var undefined;
	dbgout( "<br><b>Creating v1 ActiveX Control/Plug-in</b>" );
    var control;

    try
    {
		if ( isBrowerIE5OrAbove() ) {
			dbgout( "Creating v1 ActiveX Control in IE" );
			control = new ActiveXObject('RNGCIECtl.RNGCIECtl.1');
			dbgout( " -- v1 ActiveX Control in IE created" );
		}
		else if (  isFirefox() || isGoogle() || isNetscape() ) {
			var i=0;
			while( navigator.plugins[i] )
			{	
				if( -1 < navigator.plugins[i].name.indexOf("RealArcade Mozilla Plugin") )
				{
					dbgout( " -- Mozilla v1 plugin detected - " + navigator.plugins[i].name );
					dbgout( " -- Mozilla v1 plugin filename = " + navigator.plugins[i].filename );
					dbgout( " -- Creating v1 Mozilla control" );
					var control = createMozillaPlugin( "v1racplug", "application/vnd.rn-realarcade-javascript" );
					dbgout( " -- v1 Mozilla control created" );
					break;
				}
				i++;
			}
		}
		else
		{
			dbgout( "<span class=error>This browser is not supported in urlGenerator</span>" );
			return undefined;
		}
    }
    catch(e)
    {
		dbgout( "<span class=error>Exception creating ArcadeV1VersionControl: " + e + "</span>" );
    }

	return control;
}

function createArcadeV2VersionControl()
{
	dbgout( "<br><b>Creating v2 ActiveX Control/Plug-in</b>" );
	var control;
	try
	{
		if ( isBrowerIE5OrAbove() ) {
			dbgout( " -- Creating v2 ActiveX Control in IE" );
			control = new ActiveXObject('RAComponents.RAConfigureMgr');
			dbgout( " -- v2 ActiveX Control in IE created" );
		} 
		else 
		{
			if( isFirefox() || isGoogle() || isNetscape() )
			{	
				dbgout( " -- Creating v2 ActiveX Control in FF/Chrome" );
				if ( "undefined" !=  typeof GeckoActiveXObject ) {
					dbgout( " -- -- ...using GeckoActiveXObject" );
					control = new GeckoActiveXObject('RAComponents.RAConfigureMgr');
				} else {
					dbgout( " -- -- ...using NPAPI Plugin" );
					control = new ActiveXObject('RAComponents.RAConfigureMgr');
				}
				dbgout( " -- v2 ActiveX Control in FF/Chrome created" );
			}
		}
	}
	catch(e)
	{
		dbgout( "<span class=error>Exception creating arcade20VersionControl: " + e + "</span>" );
	}

	return control;
}

function createMozillaPlugin( name, mime )
{
	dbgout( "<b> -- Begin createMozillaPlugin() " + name + " - " + mime + "</b>" );
	try
	{
		// create embed tag for plugin
		dbgout( " -- create OBJECT node" );
		var objectNode = document.createElement('OBJECT');

		dbgout( " -- attach plugin to Head element" );
		var head = document.getElementsByTagName("HEAD").item(0);

		dbgout( " -- set OBJECT node attributes" );
		objectNode.setAttribute( 'name', name );
		objectNode.setAttribute( 'id', name );
		objectNode.setAttribute('width',0);
		objectNode.setAttribute('height',0);
		objectNode.setAttribute( 'type', mime );

		head.appendChild(objectNode);

		// set reference to plugin
		dbgout( " -- set a reference to the plugin" );
		var npracplug = document.getElementById( name );

		// force the browser to 'parse' the plugin
		// this is to make firefox load the object
		dbgout( " -- force the browser to load the plugin" );
		var str='';
		for (o in npracplug)
		{
			str = npracplug[o];
		}

		dbgout( "Done createMozillaPlugin() " + name + " - " + mime );
		return npracplug;
	}
	catch(e)
	{
		dbgout( "<span class=error>Exception creating Mozilla plugin: " + e + "</span>" );
	}
}

function isShockwaveInstalled()
{
    if (window.ActiveXObject)
    {
        try
        {
            oShock= new ActiveXObject('SWCtl.SWCtl');

            if (oShock)
            {
                return 1;
            }
        }
        catch(e) 
		{
			dbgout( "Shockwave not detected in IE");
		}
    }
    return 0;
}

function isJavaEnabled()
{
    if ( navigator.javaEnabled() )
    {
        return 1;
    }

    return 0;
}

function isPageLoadedByRealPlayer()
{
    var agent = navigator.userAgent.toLowerCase();

    return agent.match( "\\(r1" ) != null;
}

function isBrowerIE5OrAbove()
{
    var agent = navigator.userAgent.toLowerCase();
    var isIE = ((agent.indexOf("msie") != -1) && (agent.indexOf("opera") == -1));

    return (isIE && parseInt(navigator.appVersion) >= 4 && agent.indexOf("msie 4")== -1 );
}

function isNetscape()
{
	// this category captures non-Firefox Gecko-based browsers
    var agent = navigator.userAgent.toLowerCase();
    return ( !isFirefox() && ( ( agent.indexOf("netscape") != -1 ) || ( agent.indexOf("gecko") != -1 ) ) && ( navigator.userAgent.charAt(8) ) >= ('3') );
}

function isFirefox()
{
    var agent = navigator.userAgent.toLowerCase();
    return ( agent.indexOf("firefox") != -1 );
}

function isGoogle()
{
    var agent = navigator.userAgent.toLowerCase();
    return ( agent.indexOf("chrome") != -1 );
}


function initGameScript( tThirdPartySource, tLanguage, tCountry, tSource, racTypeIN, distCodeIN )
{
	var undefined;

	dbgout( "<br /><b> -- Beginning initGameScript( " +  
			tThirdPartySource + ", " + 
			tLanguage + ", " + 
			tCountry + ", " + 
			tSource + ", " + 
			racTypeIN + ", " + 
			distCodeIN + " ) -- </b>" )

	dbgout( "baseUrl = " + realArcade.BASE_URL );
    realArcade.baseUrl = realArcade.BASE_URL;
    realArcade.thirdPartySource = tThirdPartySource;
    realArcade.language = tLanguage;
    realArcade.country = tCountry;

    //detect realone player and change client to PLAYER if we have player installed/running
    if ( isPageLoadedByRealPlayer() )
    {
        realArcade.client = "player";
    }
    else
    {
        realArcade.client = "web";
    }

    realArcade.source = tSource;

	//perform v1 rac detection
	var v1VersionControl = createArcadeV1VersionControl();
	var v1RacDistCode = getV1RacDistCode( v1VersionControl );
	var v1RacInstalled = detectV1Rac( v1VersionControl );
	realArcade.racDistCode = v1RacDistCode;
	
	//perform v2 rac detection
	var v2VersionControl = createArcadeV2VersionControl();
	var v2RacTps = getV2RacTps( v2VersionControl );
	var v2Version = getV2RacVersion( v2VersionControl );
	var v2InstallerVersion = getV2InstallerVersion( v2VersionControl );
	var v2RacType = getV2RacType( v2VersionControl );
	var v2RacInstalled = detectV2Rac( v2VersionControl );

	// always use the tps from the request for clientless,
	// even if a clientless game is already installed
	if ( "clientless" == v2RacType ) {
		realArcade.thirdPartySource = tThirdPartySource;
		dbgout( "<br />just set tps to  " + realArcade.thirdPartySource + " for clientless" );
	}

	if ( "clientless" == racTypeIN )
	{
		// always use the tps from the request for clientless,
		// even if a clientless game is already installed
		realArcade.thirdPartySource = tThirdPartySource;
		dbgout( "<br />just set tps to  " + realArcade.thirdPartySource + " for clientless" );
		
		if ( !v1RacInstalled ) 
		{
			// if a clientless experience is requested, and v1 rac is not installed
			// just check to see if clientless is installed
			realArcade.ractype = "clientless";
			realArcade.racInstalled = ( v2RacType == "clientless" ) ? 1 : 0 ;
		} else {
			realArcade.ractype = "oldclient";
			realArcade.racInstalled = 1;
		}
	}
	else if( "fullclient" == racTypeIN  ) {
		// if checking for full client, check for v2 first	
		realArcade.ractype = "fullclient";
		realArcade.racInstalled = v2RacInstalled ? 1 : 0 ;
	}
	else
	{
		// if ractype is not specified, it defaults to "oldclient"
		// so check to see if v1 is installed		
		realArcade.racInstalled = v1RacInstalled ? 1 : 0 ;
	}
	
	if ( v1RacInstalled && v2RacInstalled ) {
		dbgout( "<br /><b>V1 & V2 are both detected</b>" );

		realArcade.ractype = "fullclient";
		realArcade.racInstalled = 1;

		if ( realArcade.racDistCode == "W2JX" || realArcade.racDistCode == "W2J0" || tThirdPartySource == "cable2_" ) {
			dbgout( "-- CableVision V1 or CableVision Site detected - set ractype to fullclient, tps set to cable2_, and make sure racInstalled is set to true" );
			realArcade.thirdPartySource = "cable2_";
		} else {
			dbgout( "-- Set ractype to fullclient, tps set to upgrade_, and make sure racInstalled is set to true" );
			realArcade.thirdPartySource = "upgrade_";
		}
	}

	realArcade.racversion = v2Version ? v2Version : "";
	realArcade.installerVersion = v2InstallerVersion ? v2InstallerVersion : "";

    realArcade.shockwaveInstalled = isShockwaveInstalled();
    realArcade.javaEnabled = isJavaEnabled();
	
    for (var i = 0; i < realArcade.allValidMappings.length; ++ i )
    {
		realArcade.allValidMappings[ realArcade.allValidMappings[i].name ] = realArcade.allValidMappings[i];
    }
	dbgout( "<b> -- Exiting initGameScript() -- </b>" );
}

function generateQueryString()
{
    var returnString = "";
    var undefined;

    if( arguments.length > 0 && (arguments.length % 2) == 0 )
    {
        if( ! validateArgument( arguments[0], arguments[1] ) )
        {
            alert( "1) failed in validating " + arguments[0] + ", " + arguments[1] );
            return realArcade.VALIDATION_ACTION_ERROR;
        }
        returnString = arguments[0] + "=" + arguments[1];

        for( var i = 2; i < arguments.length; i +=2 )
        {
            var nameIndex = i;
            var valueIndex = i+1;

            if ( arguments[valueIndex] != undefined )
            {
                if(! validateArgument( arguments[nameIndex], arguments[valueIndex] ) )
                {
                    alert( "2) failed in validating " + arguments[nameIndex] + ", " + arguments[valueIndex] );
      			    return realArcade.VALIDATION_ACTION_ERROR;
                }

                returnString += "&" + arguments[nameIndex] + "=" + arguments[valueIndex];
            }
        }
    }
    return returnString;
}

function getCommonUrl(action)
{
    var queryString = generateQueryString( realArcade.TPS,		realArcade.thirdPartySource,
                                           realArcade.LANG,     realArcade.language,
                                           realArcade.COUNTRY,  realArcade.country,
                                           realArcade.CLIENT,   realArcade.client,
                                           realArcade.PARTNER,  realArcade.usePartnerPages,
                                           realArcade.SRC,      realArcade.source,
                                           realArcade.RSRC,     realArcade.rsrc,
                                           realArcade.LSRC,     realArcade.lsrc,                                           
                                           realArcade.RACTYPE,  realArcade.ractype,
                                           realArcade.ACTION,   action );

    return realArcade.baseUrl + "?os=true&" + queryString;

}

function getDownloadUrl( gameID, gameType, overInstall )
{
    var undefined;
    
    // set dlType to game if V2 rac is installed
	// this is for tracking purposes
	var dlType = ( ( "clientless" == realArcade.ractype || "fullclient" == realArcade.ractype ) &&  1 == realArcade.racInstalled ) ? realArcade.DOWNLOADTYPE_GAME : realArcade.DOWNLOADTYPE_BUNDLE;

    if ( gameID == undefined )
    {
        return realArcade.GENERATE_URL_ERROR;
    }

    if ( gameType == undefined )
    {
        gameType = realArcade.DEFAULT_GAME_TYPE;
    }

    var queryString = generateQueryString(realArcade.GAMEID,        gameID,
                                          realArcade.GAMETYPE,      gameType,
                                          realArcade.OVERINSTALL,   overInstall,
                                          realArcade.DOWNLOADTYPE,  dlType,
                                          realArcade.RACINSTALLED,  realArcade.racInstalled,
										  realArcade.RACDISTCODE,	realArcade.racDistCode,
										  realArcade.RACVERSION,	realArcade.racversion,
  										  realArcade.INSTALLERVERSION,	realArcade.installerVersion);
    return getCommonUrl( realArcade.DOWNLOAD_ACTION ) + "&" + queryString;
}

function getBuyUrl( gameID, priceID, gameType, urlArguments )
{
    var undefined;

    if ( gameID == undefined )
    {
        return realArcade.GENERATE_URL_ERROR;
    }

    if ( priceID == undefined || priceID == "undefined")
    {
        priceID = realArcade.DEFAULT_PRICE_ID;
    }

    if ( gameType == undefined || gameType == "undefined" )
    {
        gameType = realArcade.DEFAULT_GAME_TYPE;
    }

	var queryString = generateQueryString(realArcade.GAMEID,    gameID,
                                          realArcade.PRICEID,   priceID,
                                          realArcade.GAMETYPE,  gameType,
                                          realArcade.RACINSTALLED,  realArcade.racInstalled );

	if ( urlArguments != undefined )
	{
		queryString = queryString + "&" + urlArguments;
	}

    return getCommonUrl( realArcade.BUYURL_ACTION ) + "&" + queryString;
}

function getBuyGpUrl( gpType, initTerm, urlArguments )
{
    var undefined;

    if ( gpType == undefined )
    {
        gpType = realArcade.DEFAULT_GP_TYPE;
    }

    if( initTerm == undefined )
    {
        initTerm = "1";
    }

    var queryString = generateQueryString(realArcade.GAMEPASSTYPE, gpType,
                                          realArcade.RACINSTALLED,  realArcade.racInstalled,
                                          realArcade.INIT_TERM, initTerm );

    if ( urlArguments != undefined )
    {
        queryString = queryString + "&" + urlArguments;
    }

    return getCommonUrl( realArcade.BUYGP_ACTION ) + "&" + queryString;

}

function getActivateGpUrl( initTerm, urlArguments )
{
    var queryString = generateQueryString(realArcade.INIT_TERM, initTerm );
    
    if ( urlArguments != undefined )
    {
        queryString = queryString + "&" + urlArguments;
    }
    
    return getCommonUrl( realArcade.ACTIVATEGP_ACTION ) + "&" + queryString;
}

function getUserReviewUrl( gameID, gameType, access )
{
    var undefined;

    if ( gameID == undefined )
    {
        return realArcade.GENERATE_URL_ERROR;
    }

    if ( access == undefined )
    {
        return realArcade.GENERATE_URL_ERROR;
    }

    if ( gameType == undefined )
    {
        gameType = realArcade.DEFAULT_GAME_TYPE;
    }

    var queryString = generateQueryString(realArcade.GAMEID, gameID,
                                          realArcade.GAMETYPE, gameType,
                                          realArcade.ACCESS, access);
    return getCommonUrl(realArcade.USERREVIEW_ACTION) + "&" + queryString;
}


function getScreenShotsUrl( gameID, gameType )
{
    var undefined;

    if ( gameID == undefined )
    {
        return realArcade.GENERATE_URL_ERROR;
    }

    if ( gameType == undefined )
    {
        gameType = realArcade.DEFAULT_GAME_TYPE;
    }
    var queryString = generateQueryString( realArcade.GAMEID,    gameID,
                                           realArcade.GAMETYPE,  gameType );
    return getCommonUrl( realArcade.SCREENSHOTS_ACTION ) + "&" + queryString;
}

function getGameMessageBoardUrl( gameID, gameType, langID )
{
    var undefined;

    if ( gameID == undefined )
    {
        return realArcade.GENERATE_URL_ERROR;
    }

    if ( gameType == undefined )
    {
        gameType = realArcade.DEFAULT_GAME_TYPE;
    }

    var queryString = generateQueryString( realArcade.GAMEID,    gameID,
                                           realArcade.GAMETYPE,  gameType );

    return getCommonUrl(realArcade.MESSAGEBOARD_ACTION) + "&" + queryString;
}

function getMessageBoardUrl( boardId )
{
    var undefined;

    if ( boardId == undefined )
    {
        return realArcade.GENERATE_URL_ERROR;
    }

    var queryString = generateQueryString( realArcade.BOARDID, boardId );

    return getCommonUrl( realArcade.MESSAGEBOARD_ACTION ) + "&" + queryString;
}

function getGameTellAFriendUrl( gameID, gameType )
{
    var undefined;

    if ( gameID == undefined )
    {
        return realArcade.GENERATE_URL_ERROR;
    }

    if ( gameType == undefined )
    {
        gameType = realArcade.DEFAULT_GAME_TYPE;
    }

    var queryString = generateQueryString( realArcade.GAMEID, gameID,
                                           realArcade.GAMETYPE, gameType);

    return getCommonUrl( realArcade.TELLAFRIEND_ACTION ) + "&" + queryString;
}

function getTellAFriendUrl( tellAFriendId )
{
    var undefined;

    if ( tellAFriendId == undefined )
    {
        return realArcade.GENERATE_URL_ERROR;
    }

    var queryString = generateQueryString( realArcade.TAFID, tellAFriendId );

    return getCommonUrl( realArcade.TELLAFRIEND_ACTION ) + "&" + queryString;
}

function getLaunchWebGameUrl( gameID, webPlayUrl, urlArguments )
{
    var undefined;

    if ( gameID == undefined )
    {
        return realArcade.GENERATE_URL_ERROR;
    }

    if ( webPlayUrl == undefined )
    {
		return realArcade.GENERATE_URL_ERROR;
	}

    var queryString = generateQueryString( realArcade.GAMEID,       gameID,
                                           realArcade.SHOCKWAVE,    realArcade.shockwaveInstalled,
                                           realArcade.JAVA,         realArcade.javaEnabled,
                                           realArcade.WEB_PLAY_URL,	webPlayUrl );

	if ( urlArguments != undefined )
	{
		queryString = queryString + "&" + urlArguments;
	}

    return getCommonUrl( realArcade.LAUNCHWEBGAME_ACTION ) + "&" + queryString;
}


function getGamePageUrl( gameID, gameType )
{
    var undefined;

    var pType = realArcade.DEFAULT_GAME_PAGE_TYPE;

    if ( gameID == undefined )
    {
        return realArcade.GENERATE_URL_ERROR;
    }

    if ( gameType == undefined )
    {
        gameType = realArcade.DEFAULT_GAME_TYPE;
    }

    var queryString = generateQueryString( realArcade.PAGETYPE, pType,
										   realArcade.GAMEID,   gameID,
                                           realArcade.GAMETYPE, gameType );

    return getCommonUrl( realArcade.PAGE_ACTION ) + "&" + queryString;
}

function getGenrePageUrl( genreId )
{
    var undefined;

    var pType = realArcade.DEFAULT_GENRE_PAGE_TYPE;

    if ( genreId == undefined )
    {
        return realArcade.GENERATE_URL_ERROR;
    }

    var queryString = generateQueryString( realArcade.PAGETYPE, pType,
				                           realArcade.GENREID,  genreId );

    return getCommonUrl( realArcade.PAGE_ACTION ) + "&" + queryString;
}

function getFaqPageUrl( faqId )
{
    var undefined;

    var pType = realArcade.DEFAULT_FAQ_PAGE_TYPE;

    if ( faqId == undefined )
    {
        return realArcade.GENERATE_URL_ERROR;
    }

    var queryString = generateQueryString( realArcade.PAGETYPE, pType,
                                           realArcade.FAQID,    faqId);

    return getCommonUrl( realArcade.PAGE_ACTION ) + "&" + queryString;
}


function getPageUrl( pType )
{
    var undefined;

    if ( pType == undefined )
    {
        return realArcade.GENERATE_URL_ERROR;
    }

    var queryString = generateQueryString( realArcade.PAGETYPE, pType );

    return getCommonUrl( realArcade.PAGE_ACTION ) + "&" + queryString;
}

function getPromoPage( gameID, promoType )
{
    var undefined;

    var pType = realArcade.PROMO_PAGE_TYPE;

    if ( gameID == undefined )
    {
        return realArcade.GENERATE_URL_ERROR;
    }

    if( promoType == undefined )
    {
        promoType = realArcade.DEFAULT_PROMO_PAGE_TYPE;
    }

    var queryString = generateQueryString( realArcade.PAGETYPE, pType,
                                           realArcade.GAMEID, gameID,
                                           realArcade.PROMOTYPE, promoType );

    return getCommonUrl( realArcade.PAGE_ACTION ) + "&" + queryString;
}

function getCouponPage( gameID, ecqs )
{
    var undefined;

    //var pType = realArcade.PROMO_PAGE_TYPE;

    if ( ecqs == undefined || gameID == undefined )
    {
        return realArcade.GENERATE_URL_ERROR;
    }

    var queryString = generateQueryString(  realArcade.GAMEID, gameID,
                                            realArcade.COUPON, ecqs,
											realArcade.RACINSTALLED,  realArcade.racInstalled );

    return getCommonUrl( realArcade.BUYURL_ACTION ) + "&" + queryString;
}

function getValidateCouponURL( gameID, gameType, urlArguments)
{
    var undefined;

    if ( gameID == undefined )
    {
        return realArcade.GENERATE_URL_ERROR;
    }

    if ( gameType == undefined )
    {
        gameType = realArcade.DEFAULT_GAME_TYPE;
    }

    var queryString = generateQueryString(realArcade.GAMEID,    gameID,
                                          realArcade.GAMETYPE,  gameType,
                                          realArcade.RACINSTALLED,  realArcade.racInstalled );

	if ( urlArguments != undefined )
	{
		queryString = queryString + "&" + urlArguments;
	}
	
	
    return getCommonUrl( realArcade.COUPONPATH_ACTION ) + "&" + queryString;
}// ActiveX Objects
var APP_STATE_OBJECT	= "RAComponents.RAAppState";
var RESOURCE_MGR_OBJECT	= "RAComponents.RAResourceMgr";
var DATASTORE_OBJECT	= "RADataStore.RADataSourceMgr";
var CONFIG_MGR_OBJECT	= "RAComponents.RAConfigureMgr";
var GAME_SEARCH_OBJECT	= "RAComponents.RAGameSearch"
var RA_NETWORK_OBJECT	= "RAComponents.RANetwork";
var SMART_RECO_OBJECT	= "RASmartReco.RASmartRecoEngine";
var GENRE_LIST_OBJECT	= "RAComponents.RAGenreList";
var RA_USER_OBJECT		= "RAComponents.RAUser";
var RA_GAME_OBJECT		= "RABusDataModels.RAGame";
var APP_STATE_CORE		= "RAComponents.RAAppCore";
var INSTALLER_OBJECT	= "RACInstaller.StateCtrl";

// event observer classid
var RA_EVENT_OBJECT_CLASSID = "clsid:F443E9CB-9EEC-456E-8AE7-F3102D5CD47D";
var GAME_OBJ_CLASSID	= "clsid:368F3685-543E-4812-9FDE-96E097E453FC";

// Error codes and messages
var ERROR_MSG_CREATE_ACTIVEX	= "Error creating ActiveXControl:";
var ERROR_MSG_CLOSING_APP		= "Error shutting down App Core object:";
var ERROR_MSG_CRITICAL_FAIL		= "Application Error:";
var ERROR_MSG_LOADING_LIST		= "Error loading game list:";
var ERROR_MSG_INIT_PAGE			= "Error initializing page";
var ERROR_CODE_CRITICAL_FAIL	= "0000";	//ERROR_MSG_CRITICAL_FAIL
var ERROR_CODE_APP_STATE_CORE	= "0001";	//ERROR_MSG_CREATE_ACTIVEX
var ERROR_CODE_APP_STATE		= "0002";	//ERROR_MSG_CREATE_ACTIVEX
var ERROR_CODE_RESOURCE_MGR		= "0003";	//ERROR_MSG_CREATE_ACTIVEX
var ERROR_CODE_DATA_SOURCE_MGR	= "0004";	//ERROR_MSG_CREATE_ACTIVEX
var ERROR_CODE_CONFIGURE_MGR	= "0005";	//ERROR_MSG_CREATE_ACTIVEX
var ERROR_CODE_USER_OBJ			= "0006";	//ERROR_MSG_CREATE_ACTIVEX
var ERROR_CODE_LOADING_LIST		= "0007";	//ERROR_MSG_LOADING_LIST
var ERROR_CODE_LOC_STRINGS		= "0007";	//error creating ActiveXControl
var ERROR_CODE_INIT_PAGE		= "0008";	//ERROR_MSG_INIT_PAGE
var ERROR_CODE_DRM_FILE_MISSING	= "0157";	//drm error - file missing or renamed

// URLs
var IMAGE_BASE_URL		= "http://www.realarcade.com/gameimage?gameid=";

// localization constants
var LOC_STRING_CONTEXTID = "loctext";

// Game Lists
var gameLists = new Object();
gameLists.ALL_GAMES_DOWNLOADABLE	= "allGamesDownloadable";
gameLists.FEATURED_GAMES			= "featuredGames";
gameLists.MY_GAMES					= "myGames";
gameLists.NEW_GAMES					= "newGames";
gameLists.TOP_GAMES					= "topGames";
gameLists.WEB_GAMES					= "webGames";

// list sort parameters
var SORT_BY_GAMENAME	= "gamename";
var SORT_BY_GENRE		= "genre";
var SORT_BY_DEVELOPER	= "developer";
var SORT_BY_TIMEREM		= "MinutesPlayed";
var SORT_BY_LASTPLAY	= "LastPlayedDate";
var SORT_BY_POSITION	= "Position";

// game image types
var TINY_SQUARE_IMAGE	= "tinySquareImage";	//50x50
var THUMBNAIL_IMAGE		= "thumbnailImage";	//80x45
var FEATURE_IMAGE		= "featureImage";	//146x110
var SQUARE_IMAGE		= "squareImage";	//150x150
var MAIN_IMAGE			= "gameImage";	//240x135
var WRAPPER_IMAGE		= "promoPageImage";	//750x550
var INSTALLER_IMAGE		= "promoPageImage";	//not imp. yet
var SCREENSHOT_THUMBNAIL_IMAGE = "ScreenshotImageThumbnails";	//120x90

//online game image naming map
var oOnlineImageMap = new Object();
oOnlineImageMap[TINY_SQUARE_IMAGE]	= "Image Set Tiny Square Image";	//50x50
oOnlineImageMap[THUMBNAIL_IMAGE]	= "Image Set Thumbnail Image";	//80x45
oOnlineImageMap[FEATURE_IMAGE]		= "Image Set Feature Image";	//146x110
oOnlineImageMap[SQUARE_IMAGE]		= "Image Set Square Image";	//150x150
oOnlineImageMap[MAIN_IMAGE]			= "Image Set Main Image";	//240x135
oOnlineImageMap[WRAPPER_IMAGE]		= "Image Set Wrapper Image";	//750x550
oOnlineImageMap[INSTALLER_IMAGE]	= "Image Set Installer Image";	//not imp. yet
oOnlineImageMap[SCREENSHOT_THUMBNAIL_IMAGE] = "Game Screenshot Thumbnail";	//120x90

// global image collections
var oSmallButtonImg = new Object();
oSmallButtonImg.leftOn = staticFileBase + "images/SM_button_L_on.gif";
oSmallButtonImg.leftOff = staticFileBase + "images/SM_button_L_off.gif";
oSmallButtonImg.centOn = staticFileBase + "images/SM_button_sp_on.gif";
oSmallButtonImg.centOff = staticFileBase + "images/SM_button_sp_off.gif";
oSmallButtonImg.rightOn = staticFileBase + "images/SM_button_R_on.gif";
oSmallButtonImg.rightOff = staticFileBase + "images/SM_button_R_off.gif";

var oSmallGreenButtonImg = new Object();
oSmallGreenButtonImg.leftOn = staticFileBase + "images/SM_GR_button_L_on.gif";
oSmallGreenButtonImg.leftOff = staticFileBase + "images/SM_GR_button_L_off.gif";
oSmallGreenButtonImg.centOn = staticFileBase + "images/SM_GR_button_spacer_on.gif";
oSmallGreenButtonImg.centOff = staticFileBase + "images/SM_GR_button_spacer_off.gif";
oSmallGreenButtonImg.rightOn = staticFileBase + "images/SM_GR_button_R_on.gif";
oSmallGreenButtonImg.rightOff = staticFileBase + "images/SM_GR_button_R_off.gif";

var oLargeButtonImg = new Object();
oLargeButtonImg.leftOn = staticFileBase + "images/LG_button_L_on.gif";
oLargeButtonImg.leftOff = staticFileBase + "images/LG_button_L_off.gif";
oLargeButtonImg.centOn = staticFileBase + "images/LG_button_sp_on.gif";
oLargeButtonImg.centOff = staticFileBase + "images/LG_button_sp_off.gif";
oLargeButtonImg.rightOn = staticFileBase + "images/LG_button_R_on.gif";
oLargeButtonImg.rightOff = staticFileBase + "images/LG_button_R_off.gif";

var oLargeGreenButtonImg = new Object();
oLargeGreenButtonImg.leftOn = staticFileBase + "images/LG_Green_button_L_on.gif";
oLargeGreenButtonImg.leftOff = staticFileBase + "images/LG_Green_button_L_off.gif";
oLargeGreenButtonImg.centOn = staticFileBase + "images/LG_Green_button_sp_on.gif";
oLargeGreenButtonImg.centOff = staticFileBase + "images/LG_Green_button_sp_off.gif";
oLargeGreenButtonImg.rightOn = staticFileBase + "images/LG_Green_button_R_on.gif";
oLargeGreenButtonImg.rightOff = staticFileBase + "images/LG_Green_button_R_off.gif";


// site page pathnames
var LANDING_PAGE = "/";
var FIND_GAMES_PAGE = "download";
var MY_REALARCADE_PAGE = "myrealarcade";
var GAME_PAGE = "games/";
var ONLINE_PLAY_PAGE = "play/";

// game status codes
var FULL_VERSION_INSTALLED	= 1;
var DEMO_VERSION_INSTALLED	= 2;
var GAME_NOT_INSTALLED		= 3;

// defaults, etc.
var DEFAULT_TPS			= "ambient_";
var DEFAULT_LANG		= "EN";
var DEFAULT_COUNTRY		= "US";
var DOWNLOAD_GAME_TYPE	= "download";
var ONLINE_GAME_TYPE	= "web";
var DEFAULT_GAME_TYPE	= DOWNLOAD_GAME_TYPE;
var DEFAULT_GP_TYPE		= "full";
var SHORT_DESC_TRUNC 	= "68";

// exit wrapper
var DEFAULT_PRICE_TYPE	= "standard";
var BG_IMAGE_SRC		= "background_281x496.gif";
var MORE_GAMES_LINK_URL = "http://www.realarcade.com";
var DEFAULT_CURRENCY_CODE = "USD";
var DEFAULT_COUNTRY_CODE = "US";
var DEFAULT_LANGUAGE_CODE = "EN";
var GAME_PASS_PTYPE		= "gpfull";
var MY_GAMES_URL		= "http://www.realarcade.com/mygames";
var DEFAULT_GAME_IMAGE	 = "_750x550.jpg";/* 
|	 
|	ra.jsutils.js
|	JavaScript utility package
|
*/


/* 
|	 
|	Extend built-in classes here
|
*/
String.prototype.trim = function(){ return this.replace(/(^\s+)|\s+$/g,"")}
String.prototype.ltrim = function(){ return this.replace(/(^\s+)/g,"")}
String.prototype.rtrim = function(){ return this.replace(/\s+$/g,"")}

/* 
|	 
|	Browser Detection
|	Detect IE and Firefox
|
*/
var agent = navigator.userAgent.toLowerCase();
var isIE = ( agent.indexOf( "msie" ) != -1 );
var isFfox = ( agent.indexOf( "firefox" ) != -1 );
var isFfox3 = ( agent.indexOf( "fox/3" ) != -1 );
var isChrome = ( agent.indexOf( "chrome" ) != -1 );

/* 
|	 
|	Flag to show debug info
|	in Firebug console
|
*/
var debugme = false;

/* 
|	 
|	The OMNITURE object will be used by the games service
|	installer to implement tracking
|
*/
if ( "undefined" ==  typeof OMNITURE ) {
	var OMNITURE = {};
}

/*
/
/	Game Object Utilities
/
*/
function createGameObject(sId) {
	var head = document.getElementsByTagName("HEAD").item(0);
	var obj = head.appendChild( document.createElement("OBJECT") );
	obj.id = sId;
	obj.name = sId;
	obj.classid = GAME_OBJ_CLASSID;
}

function fillGameObject( oTarget, oSource ) {
	oTarget.gameName = oSource.gamename;
	oTarget.gameid = oSource.gameid;
	oTarget.gameType = oSource.gameType;
	oTarget.languageCode = oSource.languageCode;
	oDataSource.fillGame( oTarget );
}

function getDemoMinutesTotal( oGm ) {
	try {
		return Number( oGm.demoMinutes );
	}
	catch(e) {
		return 0;
	}
}

function getDemoMinutesRemaining( oGm ) {
	try {
		return Number( oGm.minutesRemaining );
	}
	catch(e) {
		return 0;
	}
}

/*
/
/	Game Utilities
/
*/
function getGamePurchaseStatus( gm ) {
	try {
		return gm.purchaseStatus;
	}
	catch(e) {
		return 0;
	}
}

function isGameInstalled( gm ) {
	try {
		return gm.installStatus;
	}
	catch(e) {
		return false;
	}
}

function isDemoInstallation( gm ) {
	try {
		if( isGameInstalled( gm ) && !getGamePurchaseStatus( gm ) )
			return 1;
		else
			return 0;
	}
	catch(e) {
		return 0;
	}
}

function isUnlimitedPlayGame( gm ) {
	try {
		return gm.unlimitedPlay;
	}
	catch(e) {
		return false;
	}
}

function loadAndLaunchGame( gameList, gameId, gameType ) {
	var game = getGameFromGameList( gameList, gameId, gameType );
	game.launch();
}

function loadAndUninstallGame( gameList, gameId, gameType, msg ) {
	var game = getGameFromGameList( gameList, gameId, gameType );
	var confirmMsg = msg + game.gameName + "?";
	if ( confirm( confirmMsg ) ) {
		game.uninstall();
	}
}

function registerGamePlay( contextPath, id ) {

	// register game play with the server
	try {
			var bindArgs = {
			url: contextPath + "registerGames.jsf?gameId=" + id + "&type=rpg",
			mimetype: "text/json",
			error: function( type, error, httpObj ) {
				return true;
			},
			load: function( type, game, httpObj ) {
				return true;
			}
		};
		dojo.io.bind( bindArgs );
	}
	catch(e) {
		//alert(e);
	}
}

/*
/
/	Game List Utilities
/
*/
function getGameFromGameList( gameList, gameId, gameType ) {
    try {
	    for ( i=0; i<gameList.count; i++ ){
		    var myGame = gameList.item(i);
		    //alert("Game: " + myGame.gameName);
		    if( myGame.gameid == gameId ){
			    return myGame;
		    }
	    }
	    return null;
	}
	catch(e) {	
	    //alert(e);
		return false;
	}
	/*
	try {
		var queryString = "id == " + gameId  + " AND type == " + gameType;
		var raGameListFiltered = gameList.createFilteredGameList( queryString );
		
		return raGameListFiltered.item(0);
	}
	catch(e) {	
		return false;
	}
	*/
}

function sortGameList( list, sortby, bSortup ) {
	try {
		list.sortOrderAscending = bSortup;
		list.sort( sortby );
	}
	catch(e) {
		return false;
	}
}

function getPurchasedGames() {
	try {
		var arrPurchased = new Array();
		var tempGamesList = oDataSource.loadGameList( gameLists.MY_GAMES );
	    //check for purchased games
		for ( i=0; i < tempGamesList.count; i++ ) {
			var myGame = tempGamesList.item(i);
			if( myGame.purchaseStatus ) {
				arrPurchased.push( myGame );			
			}
		}
		return arrPurchased;
	}
	catch(e) {
		//alert(e);
		return false;
	}
	
}

/*
/
/	Game Status Utilities
/
*/

function checkGameStatus( o ) {
	if(debugme) console.log("Check game status for " + o.gameId)
	try {
		var returnVal = false;
		var tempGamesList = oDataSource.loadGameList( gameLists.MY_GAMES );
		
		var game = getGameFromGameList( tempGamesList, o.gameId, o.gameType );
		if( game == null) {
			returnVal = "topic-onGameUninstalled";
			if(debugme) console.log(o.gameId + returnVal)
		}
		if( getGamePurchaseStatus(game) != o.purchaseStatus ) {
			returnVal = "topic-onGamePurchased";
			if(debugme) console.log(o.gameId + returnVal)
		}	
		if( isDemoInstallation( game ) && parseInt( game.playCount ) != o.playCount ) {
			returnVal = "topic-onGamePlayFinished:" + game.gameid;
			if(debugme) console.log(o.gameId + returnVal)
		}	
		if(debugme) console.log("Publish topic: " + returnVal)
		return returnVal;		
	}
	catch(e) {
		if(debugme) console.log(e);
		//alert(e);
		return false;
	}
}

function refreshGameListContents() {	
	try {
		if(debugme) console.log("Refresh game list contents");
		var tempGamesList = oDataSource.loadGameList( gameLists.MY_GAMES );
		
		//refresh the list itself
	    if( tempGamesList.count < window.myGamesListLength ) {
	    	dojo.event.topic.publish("topic-onGameUninstalled");
	    }
	    else if( tempGamesList.count > window.myGamesListLength ) {
	    	dojo.event.topic.publish("topic-onGameInstalled");
	    }	    
	    else {
			var arrTopics = new Array();
		    //check for display updates
			for ( i=0; i < tempGamesList.count; i++ ) {
				var myGame = tempGamesList.item(i);
				var oGame = myGamesGameObjects[myGame.gameid];
				try {
					arrTopics.push( checkGameStatus( oGame  ) );			
				}
				catch(e) {
					//alert(e)
				}
			}
			//take action, if needed
			var topic="", arg="";		
			for( j=0; j<arrTopics.length; j++) {
				if (arrTopics[j]) {
					if (arrTopics[j].indexOf("onGamePlayFinished") != -1) {
						temp = arrTopics[j].split(":");
						topic = temp[0];
						arg = temp[1];
					}
					else {
						topic = arrTopics[j];
					}
				}
			}
			if (topic) {
				if(debugme) console.log("PUBLISH " + topic + " : " + arg);
				dojo.event.topic.publish(topic, arg)
			}
	    }
	}
	catch(e) {
		if(debugme) console.log(e);
		//alert(e);
	}
	
}

function refreshGameInformationContents() {	
	try {
		if(debugme) console.log("Refresh game information contents");		
		var arrTopics = new Array();
	    //check for display updates
		var oGame = gameInformationGameObject;
		try {
			arrTopics.push( checkGameStatus( oGame  ) );			
		}
		catch(e) {
			//alert(e)
		}
		//take action, if needed
		var topic="", arg="";		
		for( j=0; j<arrTopics.length; j++) {
			if (arrTopics[j]) {
				if (arrTopics[j].indexOf("onGamePlayFinished") != -1) {
					temp = arrTopics[j].split(":");
					topic = temp[0];
					arg = temp[1];
				}
				else {
					topic = arrTopics[j];
				}
			}
		}
		if (topic) {
			if(debugme) console.log("PUBLISH " + topic + " : " + arg);
			dojo.event.topic.publish(topic, arg)
		}
	}
	catch(e) {
		if(debugme) console.log(e);
		//alert(e);
	}
}
/* 
|	 
|	HTML Element Utilities
|
*/
function selectRadioButton( group, val ) {
	var group = document.getElementsByName(group);
	for ( var i = 0; i < group.length; i++ ) {
		if ( group[i]. value == val ) {
			group[i].click();
			return;
		}
	}
}

/* 
|	 
|	DOM Utilities
|
*/
function getChildElementsByTagName(nParent, tagName) {
	try {
		var arrChildren = new Array();	
		var kids = nParent.childNodes;
		for(i=0; i<kids.length; i++) {
			if( kids[i].nodeName == tagName ) {
				arrChildren.push(kids[i]);
			}
		}
		return arrChildren;
	}
	catch(e) {
		return null;
	}
};

function getChildElementById(nParent, id) {
	try {
		var kids = nParent.childNodes;
		for(i=0; i<kids.length; i++) {
			if( kids[i].id == id ) {
				return(kids[i]);
			}
		}
	}
	catch(e) {
		return null;
	}
};

function toggleElementDisplay(id) {
	try {
		var elem = document.getElementById(id);
		elem.style.display = elem.style.display == "block" ? "none" : "block";
	} 
	catch(e) {
		// alert(e);
	}
}
function createObjectTag( objectTagId, objectClassId ) {
	try {
		var head = document.getElementsByTagName("HEAD").item(0);
		var objectNode = document.createElement("OBJECT");
		objectNode.setAttribute( 'name', objectTagId );
		objectNode.setAttribute( 'id', objectTagId );
		objectNode.setAttribute( 'classid', objectClassId );
		head.appendChild( objectNode );
		return true;
	}
	catch(e) {
		return false;
	}
}

function createThumbnailLink( game ) {
	var elem = document.createElement( "IMG" );
	elem.src = oImageFactory.getGameImage( game.gameid, game.gameType, THUMBNAIL_IMAGE);
	elem.className = "cursorHand";
	var gameId = game.gameid;
	elem.onclick = function() { document.location = GAME_PAGE + gameId };
	return elem;
}

function createFeatureLink( game ) {
	var elem = document.createElement( "IMG" );
	elem.src = oImageFactory.getGameImage( game.gameid, game.gameType, FEATURE_IMAGE);
	elem.className = "cursorHand";
	var gameId = game.gameid;
	elem.onclick = function() { document.location = GAME_PAGE + gameId };
	return elem;
}

function createDivLink( height, width, cssClass, text, url ) {
	var elem = document.createElement( "DIV" );
	elem.style.width = width + "px";
	elem.style.height = height + "px";
	var link = document.createElement( "A" );
	link.className = cssClass;
	link.setAttribute( "href", url );
	link.appendChild( document.createTextNode( text) );
	elem.appendChild( link );

	return elem;
}

function createRolloverImageLink( elemType, width, height, css, onImageName, offImageName, clickAction ) {
	var elem = document.createElement( elemType );
	var sCss = "width:" + width + ";height:" + height + ";cursor:pointer;background-repeat:no-repeat;background-image:url(" + offImageName + ");";
	elem.style.cssText = sCss + css;
	elem.onmouseover = function() { this.style.backgroundImage = "url(" + onImageName + ")" };
	elem.onmouseout = function() { this.style.backgroundImage ="url(" + offImageName + ")" };
	elem.onclick = new Function( clickAction );
	return elem;
}

function appendTextNode( parent, text ) {
	document.getElementById(parent).appendChild( document.createTextNode( text ) );
}

function clearChildNodes( nParent ) {
	while ( nParent.firstChild ) {
		nParent.removeChild( nParent.firstChild );
	}
}

function createImgElement( src ) {
	var elem = document.createElement("IMG");
	elem.src = src;
	return elem;
}

function getDocumentElementWidth() {
	if ( self.innerHeight ) // all except Explorer
	{
		return self.innerWidth;
	}
	else if ( document.documentElement && document.documentElement.clientHeight )  // Explorer 6 Strict Mode
	{
		return document.documentElement.clientWidth;
	}
	else if ( document.body ) // other Explorers
	{
		return document.body.clientWidth;
	}
}

function getDocumentElementHeight() {
	if ( self.innerHeight ) // all except Explorer
	{
		return self.innerHeight;
	}
	else if ( document.documentElement && document.documentElement.clientHeight )  // Explorer 6 Strict Mode
	{
		return document.documentElement.clientHeight;
	}
	else if ( document.body ) // other Explorers
	{
		return document.body.clientHeight;
	}
}

function getVerticalScrollOffset() {
	if ( self.pageYOffset ) // all except Explorer
	{
		return self.pageYOffset;
	}
	else if ( document.documentElement && document.documentElement.scrollTop )  // Explorer 6 Strict
	{
		return document.documentElement.scrollTop;
	}
	else if ( document.body ) // all other Explorers
	{
		return document.body.scrollTop;
	}
}

/* 
|	 
|	DHTML Utilities
|
*/
function setBgImage( elem, imageUrl ) {
	//is it an image element? if so, set the src
	if( elem.tagName == "IMG" ) {
		elem.src == imageUrl ;
	}
	//if not, it's a css background image
	else {
		elem.style.backgroundImage = "url(" + imageUrl + ")";
	}
}

function getWindowWidth() {
	return (document.all) ? document.documentElement.clientWidth : window.innerWidth;
}

function getWindowHeight() {
	return (document.all) ? document.documentElement.clientHeight : window.innerHeight;
}

function showElementOffset( elemId, width, height, X, Y )
{	
	var layerObj = document.getElementById( elemId );
	var topOfWindow = getVerticalScrollOffset();
	var bottomOfWindow = getWindowHeight() + getVerticalScrollOffset();
	var windowWidth = getWindowWidth();
	
	if( Y + height > bottomOfWindow ) Y -= ( Y + height - bottomOfWindow );
	if( X > windowWidth - width ) X -= ( X + width - windowWidth );
	
	layerObj.style.left = X + "px";
	layerObj.style.top = Y + "px";
	layerObj.style.display = "block";
}

function setWindowTitle( str ) {
	document.title = str;
}

/**********************************************************
/	function create3PieceRolloverButton
/
/	oImages is a JS object with the following properties:
/		var oImg = new Object();
/		oImg.leftOn = "";
/		oImg.leftOff = "";
/		oImg.centOn = "";
/		oImg.centOff = "";
/		oImg.rightOn = "";
/		oImg.rightOff = "";	
/	where the values are the corresponding image urls
/
************************************************************/
function create3PieceRolloverButton( id, width, height, oImages, caption, cssClassName, clickAction, contentWidth ) {
	var table = document.createElement("TABLE");
	table.images = oImages;
	table.id = id;
	table.cellPadding = "0";
	table.cellSpacing = "0";
	table.border = "0";
	table.className = "cursorHand";
	table.onclick = new Function( clickAction );
	table.onmouseover = rollOver3PieceButton;
	table.onmouseout = rollOut3PieceButton;
	var tbody = document.createElement("TBODY");
	table.appendChild( tbody );

	var row = document.createElement("TR");
	tbody.appendChild( row );

	var col1 = document.createElement("TD");
	col1.style.width = width + "px";
	col1.style.height = height + "px";
	col1.style.backgroundImage = "url(" + oImages.leftOff + ")";
	row.appendChild( col1 );

	var col2 = document.createElement("TD");
	col2.style.height = height + "px";
	col2.style.backgroundImage = "url(" + oImages.centOff + ")";
	var captionNode = document.createElement("DIV");
	captionNode.className = cssClassName;
	captionNode.style.textAlign = "center";
	if(contentWidth) captionNode.style.width = contentWidth + "px";
	captionNode.style.height = height + "px";
	var textNode = document.createTextNode( caption );
	captionNode.appendChild( textNode );
	col2.appendChild( captionNode );
	row.appendChild( col2 );

	var col3 = document.createElement("TD");
	col3.style.width = width + "px";
	col3.style.height = height + "px";
	col3.style.backgroundImage = "url(" + oImages.rightOff + ")";
	row.appendChild( col3 );
	
	return table;
}

function rollOver3PieceButton() {
	this.rows[0].childNodes[0].style.backgroundImage = "url(" + this.images.leftOn + ")";
	this.rows[0].childNodes[1].style.backgroundImage = "url(" + this.images.centOn + ")";
	this.rows[0].childNodes[2].style.backgroundImage = "url(" + this.images.rightOn + ")";
}

function rollOut3PieceButton() {
	this.rows[0].childNodes[0].style.backgroundImage = "url(" + this.images.leftOff + ")";
	this.rows[0].childNodes[1].style.backgroundImage = "url(" + this.images.centOff + ")";
	this.rows[0].childNodes[2].style.backgroundImage = "url(" + this.images.rightOff + ")";
}

/*
/
/	Image Factory
/
*/
function imageFactory() {
	//constructor function for image factory
	//properties
	this.imageBaseUrl = IMAGE_BASE_URL;
	
	//methods
	this.getGameImage = getGameImage;
	this.getScreenshotImageThumbnails = getScreenshotImageThumbnails;	//120x90
	this.getImageBaseUrl = getImageBaseUrl;
}

function getGameImage( gameId, gameType, imageType ) {
	return encodeURI( this.imageBaseUrl + gameId + "&gametype=" + gameType + "&imagetype=" + oOnlineImageMap[imageType] );
}

function getScreenshotImageThumbnails(gameid, gametype ) {
	var arrImages = new Array(3);
	for ( i = 0; i < arrImages.length; i++ )
		arrImages[i] = encodeURI( this.imageBaseUrl + gameid + "&gametype=" + gametype + "&imagetype=Game Screenshot Thumbnail&index=" + i );
	return arrImages;
}

function getImageBaseUrl() {
	return this.imageBaseUrl;
}

var oImageFactory = new imageFactory();

/* 
|	 
|	Misc pop-ups
|
*/
function launchScreenshotSlideshow( gameId, gameType ) {
	window.open( getScreenShotsUrl( gameId, gameType ), 'blank', 'scrollbars=auto,left=20,top=20,width=600,height=550,noresize');
}

/* 
|	 
|	String Utilities
|
*/
function trimAndEllipse( str, num ) {
	return ( str.length > num ) ? ( str.substr( 0,num ) + "..." ) : str ;
}

function trimAndEllipseToSpace( str, num ) {
	if ( str.length > num ) {
		var teStr = str.substr( 0,num );
		teStr = teStr.substr( 0,teStr.lastIndexOf(" ") ) + "...";
	} else {
		teStr = str;
	}
	return teStr;
}

/*
|
| Error handling utils
|
*/
function createErrorMessage( errorNumber, errorString ) {
	return errorString + "\nErrorCode: " + errorNumber;
}

/* 
|	 
|	Cookie Utilities
|
*/
// the duration here is days (pass a number)
function setCookie( name, value, duration ) {
	var dExp = new Date();
	var expiration = '';
	if ( duration > 0 ) {
	    dExp.setTime( dExp.getTime() + ( duration*24*60*60*1000 ) );
	    expiration = 'expires='+ dExp.toGMTString();
    }
	document.cookie = name + '=' + value + ';path=/;' + expiration;
}

function getCookie( name ) {
	var cookies = document.cookie.split(";");
	for( var i=0; i < cookies.length; i++ ) {
		var c = cookies[i];
		var pos = c.indexOf( "=" );
		var nm = c.substring( 0, pos );
		if ( name.trim() == nm.trim() )
			return c.substring( pos+1 );
	}
	return null;
}

function delCookie( name ) {
	var dExp = new Date();
	dExp.setTime( dExp.getTime() - ( 365*24*60*60*1000 ) );
	document.cookie = name + '=value; expires=' + dExp.toGMTString();
}

function cookieEnabled() {
	setCookie( 'rn','y' );	//try to set a cookie
	if( 'y' == getCookie('rn') ) {	//did it work?
		delCookie( 'rn' )	//it worked, clean up
		return true;
	} else {
		return false;	//it didn't work
	}
}

/*
/
/	User Utilities
/
*/
function getUserFirstName() {
	try {
		return raUserObject.firstName;
	}
	catch(e) {
		return false;
	}
}

function getUserLastName() {
	try {
		return raUserObject.lastName;
	}
	catch(e) {
		return false;
	}
}
/* 
|	 
|	Misc Utilities
|
*/
function getMonthStr(iMonth) {
	arrMonth = ["Jan","Feb","March","April","May","June","July","Aug","Sept","Oct","Nov","Dec"];
	return(arrMonth[iMonth]);
}

function pingServer( url ) {
	var elem = document.createElement("IFRAME");
	elem.style.height = "0px";
	elem.style.width = "0px";
	document.body.appendChild( elem );
	elem.src = url;
}

function loadAlternateImage( imgElem, url ) {
	try {
		imgElem.src = url;
	}
	catch(e) {
		//alert(e + " in loadAlternateImage");
	}
}

/* 
|	 
|	Drop Down Utilities
|
*/
function toggleDropDown( dropDownMenuId, dropDownMenuButtonId, staticFileBase ) {
	var dropDownMenuDiv = document.getElementById(dropDownMenuId);
    var dropDownMenuButton = document.getElementById(dropDownMenuButtonId);
    if ( dropDownMenuDiv.style.display == "none" ) {
    	dropDownMenuDiv.style.display = "block";
        dropDownMenuButton.style.background = "url(" + staticFileBase + "images/dropdown_list_button_on.gif) no-repeat";
    } else {
        dropDownMenuDiv.style.display = "none";
        dropDownMenuButton.style.background = "url(" + staticFileBase + "images/dropdown_list_button_off.gif) no-repeat";
    }
}
/* 
|	 
|	Pop Up Utilities
|
*/
function popUpOnlineGame( url, windowName ) {
	var newWindow = window.open( url, windowName,'width=800,height=800,scrollbars=yes,status=no,toolbar=no,menubar=no,location=no,resizable=yes');
	if ( window.focus ) {
		newWindow.focus();
	}
}

function popUpReview( url, windowName ) {
	var newWindow = window.open( url, windowName, 'width=540,height=500,scrollbars=yes,status=no,toolbar=no,menubar=no,location=no,resizable=yes');
	if ( window.focus ) {
		newWindow.focus();
	}
}

function popUpMessageBoard( url, windowName ) {
	var newWindow = window.open( url, windowName, 'width=540,height=500,scrollbars=yes,status=no,toolbar=no,menubar=no,location=no,resizable=yes');
	if ( window.focus ) {
		newWindow.focus();
	}
}

function popUpHelpAnswer( url, windowName ) {
	var newWindow = window.open( url, windowName, 'width=350,height=400,scrollbars=yes,status=no,toolbar=no,menubar=no,location=no,resizable=yes');
	if ( window.focus ) {
		newWindow.focus();
	}
}

/* 
|	 
|	Game Download Tool Tip
|
*/
function gameDownloadToolTip( domId, gameName ) {
	var strInstructions, imageSrc;
	
	try {
		// detect os and set values
		if ( navigator.userAgent.toLowerCase().indexOf("windows nt 6.0") != -1 ) {
			strInstructions = "To begin your download of " + gameName + ", click the \"<b>Run</b>\" button in the first window that appears, then click the \"<b>Continue</b>\" button in the second window.";
			imageSrc = "vista_download_tip.jpg";
		} else {
			strInstructions = "To begin your download of " + gameName + ", simply click the \"<b>Run</b>\" button in each window that appears.";
			imageSrc = "xp_download_tip.jpg";
		}
	
		var elem = document.createElement("DIV");
			elem.id = domId;
			elem.style.height = "249px";
			elem.style.width = "382px";
			elem.style.background = "url(" + staticFileBase + "images/gameTipBack.gif) no-repeat";
			elem.className = "gameToolTip";
		var textElem = document.createElement("DIV");
			textElem.className = "gameToolTipText";
			textElem.innerHTML = strInstructions;
		var imgNode = document.createElement("DIV");
			imgNode.className = "gameToolTipImage";
		var imgElem = document.createElement("IMG");
			imgElem.src = staticFileBase + "images/" + imageSrc;
			imgNode.appendChild( imgElem );
		var guaranteeElem = document.createElement("DIV");
			guaranteeElem.className = "gameToolTipGuarantee";
			var guaranteeText = document.createElement("SPAN");
			guaranteeText.className = "px10 bold";
			guaranteeText.appendChild( document.createTextNode("100% Safe & Secure") );
			guaranteeElem.appendChild( guaranteeText );
			guaranteeElem.appendChild( document.createElement("BR") );
			guaranteeElem.appendChild( document.createTextNode("No spyware or adware - guaranteed!") );
		var bbbElem = document.createElement("IMG");
			bbbElem.className = "gameToolTipBBSeal";
			bbbElem.src = staticFileBase + "images/bbbseal.gif";
	   
	   elem.appendChild( textElem );
	   elem.appendChild( imgNode );
	   elem.appendChild( guaranteeElem );
	   elem.appendChild( bbbElem );
	   
	   return elem;
	}
	catch(e) {
		if( window.console && console.log ) {
			console.log( e );
		}
		return false;
	}	   
}

function showToolTip( elem ) {
	try {
		if ( !createArcadeV2VersionControl() ) {
			var showAbove = false, shiftLeft = false, tmpTop, tmpLeft;
		
			var viewportWidth = (document.all) ? document.body.clientWidth : window.innerWidth;
			var viewportHeight = document.documentElement.clientHeight || window.innerHeight;
			var scrollAmount = document.documentElement.scrollTop;
			
			var evet = window.event || arguments.callee.caller.arguments[0];
			//var srcElem = evet.srcElement || evet.target;
		
			//show above?
			if ( evet.clientY > parseInt(elem.style.height) & ( viewportHeight < evet.clientY + parseInt(elem.style.height) ) ) showAbove = true;

			//shift left?
			if ( evet.clientX + parseInt(elem.style.width) > viewportWidth ) shiftLeft = true;
		
			tmpTop = showAbove ? evet.clientY - parseInt(elem.style.height) - 35 : evet.clientY + 35;
			tmpLeft = shiftLeft? evet.clientX - (evet.clientX + parseInt(elem.style.width) - viewportWidth + 20) : evet.clientX;
				
			elem.style.left = tmpLeft - 370 + "px";
			elem.style.top = tmpTop + scrollAmount + "px";
			elem.style.display = "block";
		}
	}
	catch(e){
		if( window.console && console.log ) {
		console.log( e );
		}	
	}
}

function hideToolTip( elem ) {
	elem.style.display = "none";
}/* 
|	 
|	ra.appCore.js
|
*/

/* 
|	 
|	embed the codewalla plugin, where supported
|
*/
if( navigator.plugins && navigator.mimeTypes ){
	try {
		var plugin = navigator.mimeTypes["application/realarcade-npapi-scriptable-plugin"];
	    if(plugin){
	    	document.write('<embed id="RANPAPIPlugin" type="application/realarcade-npapi-scriptable-plugin" pluginspage="http://games-dl2.real.com/gameconsole/v3/npapiplugin/RAPluginInstaller.exe" width="0" height="0"></embed>');
	    }
	}
	catch(e) {
		//alert(e);
	}
}

var ActiveXObject = ActiveXObject;
if( (navigator.userAgent.toLowerCase().indexOf( "chrome" ) != -1) || (navigator.userAgent.toLowerCase().indexOf( "firefox" ) != -1) ) {
	ActiveXObject = NPPluginObject;
}

function NPPluginObject( className ) {
	try {
		var raNPAPIPlugin = document.getElementById( 'RANPAPIPlugin' );
		
		raNPAPIPlugin.onGamePlayFinished = "onGamePlayFinish";
		raNPAPIPlugin.onGameInstalled = "onGameInstalled";
		raNPAPIPlugin.onGameUninstalled = "onGameUninstalled";
		raNPAPIPlugin.onGamePurchased = "onGamePurchased";
		raNPAPIPlugin.onGameReturned = "onGameReturned";	
		
		return raNPAPIPlugin.getRANPObject( className );
	}
	catch(e) {
		return false;
	}
}

dojo.addOnLoad(appCore_startUp);
dojo.addOnUnload(appCore_shutDown);

function appCore_startUp() {
	if( "fullclient" == realArcade.ractype && realArcade.racInstalled ) {
		try	{
			oAppCore = new ActiveXObject( APP_STATE_CORE );
			oAppCore.startUp();
			initializeApplication();
		}
		catch(e) {
			//alert( createErrorMessage( ERROR_CODE_APP_STATE_CORE, ERROR_MSG_CREATE_ACTIVEX ) + "\n" + e );
			window.onerror = function() { return true; };
		}
	}
}

function appCore_shutDown() {
	if( detectV2Rac( createArcadeV2VersionControl() ) && window.oAppCore ) {
		try {
			oAppCore.shutDown();
		}
		catch(e) {
			//alert( createErrorMessage( ERROR_CODE_APP_STATE_CORE, ERROR_MSG_CLOSING_APP ) + "\n" + e );
		}
	}
}

function initializeApplication() {
	try {
		oAppState = new ActiveXObject( APP_STATE_OBJECT );
	}
	catch(e) {
		//alert( createErrorMessage( ERROR_CODE_APP_STATE, ERROR_MSG_CREATE_ACTIVEX ) );
	}

	try {
		oResourceManager = new ActiveXObject( RESOURCE_MGR_OBJECT );
	}
	catch(e) {
		//alert( createErrorMessage( ERROR_CODE_RESOURCE_MGR, ERROR_MSG_CREATE_ACTIVEX) );
	}

	try {
		var oLocalizedStrings = oResourceManager.loadLocalizedStrings();
		oLocText = oLocalizedStrings.getScopedValues( LOC_STRING_CONTEXTID );
	}
	catch(e) {
		//alert( createErrorMessage( ERROR_CODE_LOC_STRINGS, ERROR_MSG_CRITICAL_FAIL ) );
	}

	try {
		oDataSourceMgr = new ActiveXObject( DATASTORE_OBJECT );
		oDataSource = oDataSourceMgr.defaultDataSource;	
	}
	catch(e) {
		//alert( createErrorMessage( ERROR_CODE_DATA_SOURCE_MGR, ERROR_MSG_CREATE_ACTIVEX ) );
	}

	try {
		configureMgr = new ActiveXObject( CONFIG_MGR_OBJECT );
	}
	catch(e) {
		//alert( createErrorMessage( ERROR_CODE_CONFIGURE_MGR, ERROR_MSG_CREATE_ACTIVEX ) );
	}

	try {
		raUserObject = new ActiveXObject( RA_USER_OBJECT );
	}
	catch(e) {
		//alert( createErrorMessage( ERROR_CODE_USER_OBJ, ERROR_MSG_CREATE_ACTIVEX ) );
	}
}

/* 
|	 
|	Plugin event handlers for Firefox & Chrome
|
*/
function onGamePlayFinish( productId, exitCode )
{
	try {
		dojo.event.topic.publish( "topic-onGamePlayFinished", productId, exitCode );
	}
	catch(e) {
		//alert( "topic-onGamePlayFinished publish failed" );
	}		
	//alert( "onGamePlayFinish : " + productID + "  : " + exitCode );
	return 0;
}

function onGameInstalled( productId, exitCode )
{
	try {
		dojo.event.topic.publish( "topic-onGameInstalled", productId, exitCode );
	}
	catch(e) {
		//alert( "topic-onGameInstalled publish failed" );
	}	
	//alert( "onGameInstalled : " + productID + "  : " + exitCode );
	return 0;
}

function onGameUninstalled( productId, exitCode )
{
	try {
		dojo.event.topic.publish( "topic-onGameUninstalled", productId, exitCode );
	}
	catch(e) {
		//alert( "topic-onGameUninstalled publish failed" );
	}	
	//alert( "onGameUninstalled : " + productID + "  : " + exitCode );
	return 0;
}

function onGamePurchased( productId, exitCode )
{
	try {
		dojo.event.topic.publish( "topic-onGamePurchased", productId, exitCode );
	}
	catch(e) {
		//alert( "topic-onGamePurchased publish failed" );
	}
	//alert( "onGamePurchased : " + productID + "  : " + exitCode );
	return 0;
}

function onGameReturned( productId, exitCode )
{
	try {
		dojo.event.topic.publish( "topic-onGameReturned", productId, exitCode );
	}
	catch(e) {
		//alert( "topic-onGameReturned publish failed" );
	}	
	//alert( "onGameReturned : " + productID + "  : " + exitCode );
	return 0;
}
