﻿function onSilverlightError(sender, args) 
{
    var appSource = "";
    if (sender != null && sender != 0) {
        appSource = sender.getHost().Source;
    } 
    var errorType = args.ErrorType;
    var iErrorCode = args.ErrorCode;
    
    var errMsg = "Unhandled Error in Silverlight 2 Application " +  appSource + "\n" ;

    errMsg += "Code: "+ iErrorCode + "    \n";
    errMsg += "Category: " + errorType + "       \n";
    errMsg += "Message: " + args.ErrorMessage + "     \n";

    if (errorType == "ParserError")
    {
        errMsg += "File: " + args.xamlFile + "     \n";
        errMsg += "Line: " + args.lineNumber + "     \n";
        errMsg += "Position: " + args.charPosition + "     \n";
    }
    else if (errorType == "RuntimeError")
    {           
        if (args.lineNumber != 0)
        {
            errMsg += "Line: " + args.lineNumber + "     \n";
            errMsg += "Position: " +  args.charPosition + "     \n";
        }
        errMsg += "MethodName: " + args.methodName + "     \n";
    }

    throw new Error(errMsg);
}

function onSourceDownloadProgressChanged(sender, eventArgs)
{
	sender.findName("uxProgressBar").ScaleX = eventArgs.progress;
}

function onSourceDownloadProgressCompleted(sender, eventArgs)
{
	sender.findName("uxProgressBar").ScaleX = 1;
}

var BrowserDetect = {
	init: function () {
		try {
		    this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		    this.version = this.searchVersion(navigator.userAgent)
			    || this.searchVersion(navigator.appVersion)
			    || "an unknown version";
		    this.OS = this.searchString(this.dataOS) || "an unknown OS";
	    } catch(e)
	    {
		    this.browser = "An unknown browser";
		    this.version = "an unknown version";
		    this.OS = "an unknown OS";
	    }
	},
	searchString: function (data) {
		try {
		    for (var i=0;i<data.length;i++)	{
			    var dataString = data[i].string;
			    var dataProp = data[i].prop;
			    this.versionSearchString = data[i].versionSearch || data[i].identity;
			    if (dataString) {
				    if (dataString.indexOf(data[i].subString) != -1)
					    return data[i].identity;
			    }
			    else if (dataProp)
				    return data[i].identity;
		    }
	    } catch(e)
	    {
            return "Unknown; An exception fired!";
	    }
	},
	searchVersion: function (dataString) {
		try {
		    var index = dataString.indexOf(this.versionSearchString);
		    if (index == -1) return;
		    return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	    } catch(e)
	    {
            return "Unknown version; An exception fired!";
	    }
	},
	dataBrowser: [
        {
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "iPhone",
			identity: "iPhone"
		},
		{
			string: navigator.platform,
			subString: "iPod",
			identity: "iPod"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

function checkIfThisPlatformSupportsSilverlight()
{
    var ok = true;
    
    try {
        if ((BrowserDetect.browser != "Firefox" && BrowserDetect.browser != "Safari" && BrowserDetect.browser != "Explorer" && BrowserDetect.browser != "Chrome") ||
            (BrowserDetect.browser == "Firefox" && (BrowserDetect.OS == "iPhone" || BrowserDetect.OS == "iPod" || BrowserDetect.OS == "Linux")) ||
            (BrowserDetect.browser == "Safari" && (BrowserDetect.OS == "iPhone" || BrowserDetect.OS == "iPod" || BrowserDetect.OS == "Linux")) ||
            (BrowserDetect.browser == "Chrome" && (BrowserDetect.OS == "iPhone" || BrowserDetect.OS == "iPod" || BrowserDetect.OS == "Linux")) )
        {
            ok = false;
        }
//        if( (BrowserDetect.browser != "Firefox" && BrowserDetect.browser != "Safari" && BrowserDetect.browser != "Explorer" && BrowserDetect.browser != "Chrome") ||
//            (BrowserDetect.browser == "Firefox" && (BrowserDetect.OS == "iPhone" || BrowserDetect.OS == "iPod" || BrowserDetect.OS == "Linux")) ||
//            (BrowserDetect.browser == "Safari" && (BrowserDetect.OS == "iPhone" || BrowserDetect.OS == "iPod" || BrowserDetect.OS == "Linux")) ||
//            (BrowserDetect.browser == "Chrome" && (BrowserDetect.OS == "iPhone" || BrowserDetect.OS == "iPod" || BrowserDetect.OS == "Linux")) )
//        {
//            ok = false;
//        }

    } catch(e) {
    }
    
    if( !ok )
    {
        $('silverlightControlHost').style.display = 'none';
    }
}

//////////////////////////////////////////////////////////////////
// isInstalled, checks to see if the correct version is installed
// @kd - copied from Silverlight.js in SDK
//////////////////////////////////////////////////////////////////
isSilverlightInstalled = function(version)
{
    var isVersionSupported=false;
    var container = null;
    
    try 
    {
        var control = null;
        
        try
        {
            control = new ActiveXObject('AgControl.AgControl');
            if ( version == null )
            {
                isVersionSupported = true;
            }
            else if ( control.IsVersionSupported(version) )
            {
                isVersionSupported = true;
            }
            control = null;
        }
        catch (e)
        {
            var plugin = navigator.plugins["Silverlight Plug-In"] ;
            if ( plugin )
            {
                if ( version === null )
                {
                    isVersionSupported = true;
                }
                else
                {
                    var actualVer = plugin.description;
                    if ( actualVer === "1.0.30226.2")
                        actualVer = "2.0.30226.2";
                    var actualVerArray =actualVer.split(".");
                    while ( actualVerArray.length > 3)
                    {
                        actualVerArray.pop();
                    }
                    while ( actualVerArray.length < 4)
                    {
                        actualVerArray.push(0);
                    }
                    var reqVerArray = version.split(".");
                    while ( reqVerArray.length > 4)
                    {
                        reqVerArray.pop();
                    }
                    
                    var requiredVersionPart ;
                    var actualVersionPart
                    var index = 0;
                    
                    
                    do
                    {
                        requiredVersionPart = parseInt(reqVerArray[index]);
                        actualVersionPart = parseInt(actualVerArray[index]);
                        index++;
                    }
                    while (index < reqVerArray.length && requiredVersionPart === actualVersionPart);
                    
                    if ( requiredVersionPart <= actualVersionPart && !isNaN(requiredVersionPart) )
                    {
                        isVersionSupported = true;
                    }
                }
            }
        }
    }
    catch (e) 
    {
        isVersionSupported = false;
    }
    if (container) 
    {
        document.body.removeChild(container);
    }

    return isVersionSupported;
}

var slVersion = "2.0";

WaitForInstallCompletion = function()
{
    try
    {
        //This forces Firefox/Safari to refresh their 
        //list of known plugins.
        navigator.plugins.refresh();
    }
    catch(e)
    {
        //IE does not support the method, so an 
        //exception will be thrown.
    }
    try
    {
        if ( isSilverlightInstalled(slVersion) )
        {
            //Silverlight is installed. Refresh the page.
            window.location.reload(false);
        }
        else
        {   
            //Wait 3 seconds and try again
            setTimeout(WaitForInstallCompletion, 3000);
        }    
    } catch(e) {
    }
};

onLoad = function()
{
    try
    {
        //This only works if we are performing a clean install, 
        //not an upgrade.
        if ( !isSilverlightInstalled(slVersion) )
        {
            //Silverlight is not installed. Try to refresh 
            //the page when it is installed.
            WaitForInstallCompletion();
        }
    } catch(e) {
    }
}
