﻿// JScript File
// game ad globals.
var clearAdTimeout = null;
var adStart = false;
var inGameAd = false;
var checkAdStartStop = null;
var gameAdMode = "offscreen";
var gameAdTop = 0;
var gameAdLeft = 0;
var gameAdWidth = 0;
var gameAdHeight = 0;
var gameAdHideAtEnd = true;
var multiplayerGame = false;
var lastScoreSubmit = null;
var gotoMenu = false;

var gameHostContainer;
var chatHost;

var iChatInitPollingId;
// game script commands
function postLoad()
{
	gameHostContainer = document.getElementById("OberonGameHost");
	var gameHost = gameHostContainer.getElementsByTagName("object")[0];
	chatHost = document.getElementById("ChatComponent").getElementsByTagName("object")[0];
//	var avatarHost = null; // $$$ todo.
//	var chatOnlyText = document.getElementById("ChatOnly");
//        var chatOnlyTextStr = "";
//        if (chatOnlyText != null) chatOnlyTextStr = chatOnlyText.value;

	InitGameHostScripts(gameHost,chatHost);
    
    iChatInitPollingId = window.setInterval(ChatInitPolling, 1000);
    
    
    ShowAd();
    
}

//try{
//    Event.observe(window,"load",postLoad);
//}catch(e){
//    window.onload = postLoad;
//}

function ClearAd()
{
//alert('ClearAd');
	window.clearTimeout(clearAdTimeout);

	if (adStart == false)
	{
        OnAdEnd();
	}
}

function showEndGameScreen(player)
{
    endGameScreen.className = "endGameScreenShow";
    endGameScreenTween.className = "endGameScreenHide";

    if (multiplayerGame == true)
    {
        endGameScreenMultiPlayerData.style.display = "inline";
        // show the multiplayer options
        if (player == true)
        {
            singlePlayerendGameScreenOptions.className = 'displayNone';
            multiPlayerendGameScreenOptions.className = 'displayInline';
        }
        else
        {
            singlePlayerendGameScreenOptions.className = 'displayInline';
            multiPlayerendGameScreenOptions.className = 'displayNone';
        }
    }
    else
    {
        endGameScreenSinglePlayerData.style.display = "inline";
        singlePlayerendGameScreenOptions.className = 'displayInline';
        multiPlayerendGameScreenOptions.className = 'displayNone';
    }
}

function closeEndGameScreen()
{
    endGameScreen.className = "endGameScreenHide";
    if (GameHostObj != null)
    {
        gameHostContainer.className = "oghStartupShow";

		playAgain();

//        if (multiplayerGame == true)
//        {
//			GameHostObj.SendMessageToGame("RestartGame", "<data></data>");
//        }
    }
}

function omUnloadAx()
{
	if (gameHostContainer) gameHostContainer.innerHTML='';

	var chatHost = document.getElementById("ChatComponent");

	if (chatHost != null) chatHost.outerHTML='';

	var avatarHost = document.getElementById("Avatar");

	if (avatarHost != null) avatarHost.outerHTML='';
}


function playAgain()
{
//    closeEndGameScreen();
    if (multiplayerGame == true || pauseOnGameEnd == true)
    {
        if (GameHostObj != null)
        {
            if (gotoMenu)
            {
                gotoMenu = false;
                GameHostObj.SendMessageToGame("GameMenu", "<data></data>");
            }
            else
            {
                GameHostObj.SendMessageToGame("RestartGame", "<data></data>");
                GameHostObj.SendMessageToGame("GameStart", "<data></data>");
            }
        }
    }
}

function returnToLobby()
{
    closeEndGameScreen();
    if (GameHostObj != null)
    {
        GameHostObj.SendMessageToGame("GameMenu", "<data></data>");
    }
}

function ShowAd()
{
//alert('ShowAd');

	// to display the ad or not to display the ad, that is the question.
	//var adTimeoutObj = document.getElementById("AdTimeout");

	var adTimeout = GameShellDefinitions.adTimeout;
	try
	{
		adTimeout = Number(adTimeout);
	}
	catch(ex)
	{
		adTimeout = 0;
	}
	
    if (adTimeout == 0 && inGameAd == false)
    {
        OnAdEnd();
    }
    else
    {
        var ad = document.getElementById("ad");

        if (inGameAd == false)
        {
			ad.className = "adStyleShow";
    	    clearAdTimeout  = window.setTimeout("ClearAd()", adTimeout);
        }
        else
        {
            if (gameAdMode == "offscreen")
            {
                gameHostContainer.className = "oghStartup";
            }
            else
            {
                var offsetTop = ((GameHostObj.offsetTop + 1) / 2)
                var offsetLeft = GameHostObj.offsetLeft + 1;
                var currentObject = GameHostObj.offsetParent;
                while (currentObject != null)
                {
                    offsetTop += currentObject.offsetTop;
                    offsetLeft += currentObject.offsetLeft;
                    currentObject = currentObject.offsetParent;
                }
                ad.style.left = (offsetLeft + gameAdLeft) + "px";
                ad.style.top = (offsetTop + gameAdTop) + "px";
                ad.style.height = (gameAdHeight) + "px";
                ad.style.width = (gameAdWidth) + "px";
            }
            
            ad.className = "adStyleShow";
    	    checkAdStartStop  = window.setTimeout("CheckAdStart()", adTimeout);
        }
		
		// work around for Firefox
        // problems with show iframe content
        // need to change display after loading.
        window.setTimeout("void($('adFrame').style.display = 'block')", 10);
   	}
}

function OutputDebugString(output)
{
    try
    {
        var odsTextArea = document.getElementById("ODS");
    	odsTextArea.value = (output + "\r\n") + odsTextArea.value;
	}
	catch (e)
	{
	}
}


function SendMessageToPage(command, data)
{
    if ("CustomEvent" == command ||             // msnapi
        "pc_launchinstaller" == command ||      // popcap api.
        "DownloadFullVersion" == command)       // playfirst api
    {
		var downloadLink = document.getElementById("lnkDownloadTitle");
		if (downloadLink != null)
		{
			window.location.href = downloadLink.href;
		}
    }
    else if ("GameEnd" == command) // msnapi.
    {
        multiplayerGame = true;
    }
    else if ("Game_Ad" == command)              // oberon api.
    {
        // parse data to show or hide ad. 
        // <data><visibility>show</visibility><mode>overlay</mode><rect top=’200’ left=’400’ width=’200’ height=’250’ /><hideAtEnd>false</hideAtEnd></data>
        var re = new RegExp("\<data\>(?:\<(visibility)\>(hide|show)\</visibility\>)(?:\<(mode)\>(overlay|offscreen)\</mode\>)?(?:\<(rect) top='([0-9]+)' left='([0-9]+)' width='([0-9]+)' height='([0-9]+)' /\>)?(?:\<(hideAtEnd)\>(false|true)\</hideAtEnd\>)?(?:.*)\</data\>");
        var parsedData = data.match(re);
        if (parsedData == null)
        {
            //alert("bad data for Game_Ad: \r\n'" + data + "'");
            return;
        }
        // initialize defaults
        var visibility = "";
        gameAdMode = "offscreen";
        gameAdTop = GameHostObj.style.top;
        gameAdLeft = GameHostObj.style.left;
        gameAdWidth = GameHostObj.style.width;
        gameAdHeight = GameHostObj.style.height;
        gameAdHideAtEnd = true;
        
        for (pos = 0; pos < parsedData.length; ++pos)
        {
            var field = parsedData[pos];
            if (field == "visibility")
            {
                visibility = parsedData[++pos];
            }
            else if (field == "mode")
            {
                gameAdMode = parsedData[++pos];
            }
            else if (field == "rect")
            {
                gameAdTop = Number(parsedData[++pos]);
                gameAdLeft = Number(parsedData[++pos]);
                gameAdWidth = Number(parsedData[++pos]);
                gameAdHeight = Number(parsedData[++pos]);
            }
            else if (field == "hideAtEnd")
            {
                gameAdHideAtEnd = (parsedData[++pos] == "true");
            }
        }
        
        if (visibility == "show")// show
        {
            // in game ad. don't let page clear the ad
            inGameAd = true;
            ShowAd();
        }
        else
        {
	        window.clearTimeout(checkAdStartStop);
            HideAd();
        }
    }
    else if ("ScoreSubmit" == command)
    {
        lastScoreSubmit = data;
    }
    else if ("Game_Booted" == command)
    {
		GameHostObj.SendMessageToGame(command, "<data></data>");
    }

    else if ("Chat_ShowUserProfile" == command)
    {
		OnlineShellMgr.showProfileByNick(data);
        //userProfile.className = 'userProfileShow';
    }
    else if ("Chat_Connect" == command ||
            "Chat_HandleKeyPress" == command ||
            "Chat_Refresh" == command ||
            "Chat_AddStatusMessage" == command)
    {
        ChatHostObj.SendMessageToGame(command, data);
    }
    else if ("Avatar_PlayEmotion" == command)
    {
    
//        var emoteExp = new RegExp("\<data\>\<emotion\>(.*)\</emotion\>\</data\>");
//        var results = data.match(emoteExp);
//        if (results.length == 2)
//        {
//            var emotion = "happyAnimation"; // default/unknown
//            if (results[1].toLowerCase() == "sad")
//            {
//                emotion = "sadAnimation";            
//            }
//            AvatarHostObj.SetVariable("val", emotion);
//            AvatarHostObj.SetVariable("command", "startAnimation");
//        }
    }
    else if ("GameEnd" == command)
    {
//        var gameEndExp = new RegExp("\<gamedata\>(.*)\</gamedata\>");
//        var results = data.match(gameEndExp);
//        if (results.length == 2)
//        {
//            if (results[1] == "<NoRestart />")
//            {
//                gotoMenu = true;
//            }
//        }
    }

}

function InvokeAvatar(obj)
{
//    var val;
//    if(obj.value == "startAnimation")
//    {
//        if (emotionSad.checked == true)
//        {
//            val = emotionSad.value;
//        }
//        else
//        {
//            val = emotionHappy.value;
//        }
//        val += "Animation";
//    }
//    else
//    {
//        if (emotionSad.checked == true)
//        {
//            val = "Sad";
//        }
//        else
//        {
//            val = "Happy";
//        }
//        avatarEmotionText.innerText = val;
//    }

//    AvatarHostObj.SetVariable("val", val);
//    AvatarHostObj.SetVariable("command", obj.value);
}


function HideAd()
{
//alert('HideAd');
    inGameAd = false;
    var ad = document.getElementById("ad");
    ad.className ="adStyleHide";
}

function CheckAdStart()
{
//alert('CheckAdStart');
	window.clearTimeout(checkAdStartStop);

    var timeout = GameShellDefinitions.adTimeout;//document.getElementById("EnchancedAdTimeout").value;
	checkAdStartStop = window.setTimeout("CheckAdStop()", 15);
}

function CheckAdStop()
{
//alert('CheckAdStop');
	window.clearTimeout(checkAdStartStop);
    OnAdEnd();
}

// webhost_ad.aspx technology
function OnAdStart()
{
//alert('OnAdStart');
    adStart = true;
    if (inGameAd)
    {
        GameHostObj.SendMessageToGame("Game_AdStateChange", "<data><state>start</state></data>");
    }
}

var iGameInitPollingId;
function OnAdEnd()
{
//alert('OnAdEnd');

    if (inGameAd == false)
    {
    
//	    if (GameHostObj != null)
//	    {
//    	    gameHostContainer.className = "oghStartupShow";
//	    }

	    HideAd();

	    if (GameShellDefinitions.isTier0)
	    {
			OberonGameImplanter.injectGameHost();

			gameHostContainer = $("OberonGameHost");
			gameHostContainer.className = "oghStartupShow";
			GameHostObj = OberonGameImplanter.getGameHostObject();
        }
        else
        {
			iGameInitPollingId = window.setInterval(GameInitPolling, 1000);
		}
    }
    else
    {
	    window.clearTimeout(checkAdStartStop);
        GameHostObj.SendMessageToGame("Game_AdStateChange", "<data><state>end</state></data>");
        if (gameAdHideAtEnd)
        {
            HideAd();
        }
    }
}

// Update score in chat for single player game.
function Chat_UpdatePlayerScore(score)
{
    return function(request){
		var command = "<player self='true'>" + 
				"<token>" + GetUserToken() + "</token>" + 
				"<name>" + escape( request.nickname ) + "</name>" + 
				"<oldrating>0</oldrating>" + 
				"<newrating>" + score + "</newrating>" +  
				"</player>";
		
		ChatHostObj.SendMessageToGame("Chat_Refresh", "<data>" + command + "</data>");
		}
}

function GameInitPolling()
{
	var isSuccess = false;
	try{
		GameHostObj.Run();
		isSuccess = true;
	}
	catch(e)
	{
		isSuccess = false;
	}
	
	if(isSuccess)
		window.clearInterval(iGameInitPollingId);
}

function ChatInitPolling()
{
	var isSuccess = false;
	try{
		ChatHostObj.Run();
		isSuccess = true;
	}
	catch(e)
	{
		isSuccess = false;
	}
	
	if(isSuccess)
		window.clearInterval(iChatInitPollingId);
}

function GetUserToken()
{
    var token = "";
 
	if ( Clearance.level >= Clearance.UNCLASSIFIED )
	{   
		var token = Clearance.getParams( Clearance.UNCLASSIFIED );
		token = Url.appendParams("", token);
		var session = Cookies.get(Clearance.cookieName(Clearance.ANONYMOUS, false))
		if(session != null && session.en != null)
		{
			 token = Url.appendParamValue(token, "an", session.en) ; 
		}
		token = token.substring(1, token.length);
		token = escape(token);
	}
   return token;
}

function AutoPlayFvarsAppend()
{
	if(Url.here.params.autojoin && Url.here.params.autojoin == "1")
		return "FVAR_AutoJoinMode = 1&FVAR_GameTableId = -1&FVAR_GameTableSide = -3";
	else
		return "";
}

if(!window.GameShell)
	GameShell = {};

//GameShell.GameHTMLReplacer.symbols = { '%%page-name%%' : function(){ return GameCatalog.DynamicCharacteristics.GetPageName()} };	
GameShell.GameHTMLReplacer = function(html)
{
	this.rep = function(a) { return GameShell.GameHTMLReplacer.symbols[a]()||a; }
	if (html === undefined || html === null)
		return '';

	return (html+'').replace(/(@[^@]*@)/g, this.rep);
}
GameShell.GameHTMLReplacer.symbols = {
									'@current_domain@'	: function(){ return document.location.host},
									'@user_token@'		: function(){ return GetUserToken()},
									'@autoplay_fvars@'	: function(){ return AutoPlayFvarsAppend()}
									};
