﻿var usageTrackingFrame = null;
var silverlightInitiallyInstalled = null;

createSilverlightUsageTrackingFrame = function(uri)
{
    // For debugging and development...
    /*
    alert(uri);
    return;
    */

    // Create a 1x1 pixel IFRAME and place it in the bottom right of the page. This IFRAME will host
    // a benign page whose sole purpose is to record (in WebTrends or other metrics measuring systems)
    // whether we have Silverlight installed, whether we chose to install it while on this page, etc.
    usageTrackingFrame = document.createElement("IFRAME");
    usageTrackingFrame.scrolling = "no";
    usageTrackingFrame.width = "1";
    usageTrackingFrame.height = "1";
    usageTrackingFrame.src = uri;
    usageTrackingFrame.frameBorder = 0;
    usageTrackingFrame.style.position = "absolute";
    usageTrackingFrame.style.bottom = "0";
    usageTrackingFrame.style.right = "0";
    document.body.appendChild(usageTrackingFrame);
}

isRootedUri = function()
{
    var ret = false;
    if ((typeof(window.rootFolder) != "undefined") && (window.rootFolder != null) &&
        (typeof(window.trackerBase) != "undefined") && (window.trackerBase != null))
    {
        var currentUri = window.location.href;
        var appPath = trackerBase.toLowerCase() + rootFolder.toLowerCase();
        if (appPath.charAt(appPath.length - 1) == "/")
        {
            appPath = appPath.substring(0, appPath.length - 1);
        }
        if (currentUri.toLowerCase().indexOf(trackerBase.toLowerCase() + rootFolder.toLowerCase()) == 0)
        {
            ret = true;
        }
    }
    return ret;
}

pseudoEncodeCurrentUri = function()
{
    // Create a version of the current page's URI address that contains only certain (safe) characters.
    // We'll use this special version of the URI when we record the current page in our tracking page.
    var currentUri = window.location.href;
    
    // Strip off any bookmark
    var bookmarkStart = currentUri.indexOf("#");
    var qsStart = currentUri.indexOf("?");
    if (bookmarkStart > qsStart)
    {
        currentUri = currentUri.substring(0, bookmarkStart);
    }
    
    // If we are navigating to a folder, not specifying a particular page, assume that we get to default.aspx.
    // If we somehow have an odd URI with a bookmark or query string but not page just move one; don't try to
    // fix anything up.
    if ((currentUri.indexOf(".aspx") == -1) && (currentUri.indexOf(".htm") == -1) && (currentUri.indexOf("?") == -1) && (currentUri.indexOf("#") == -1))
    {
        if (currentUri.charAt(currentUri.length - 1) != "/")
        {
            currentUri += "/";
        }
        currentUri += "default.aspx";
    }
    
    var encodedUri = "";
    var re = /^([a-zA-Z0-9_])$/;
    for (var i=0; i<currentUri.length; i++)
    {
        if (re.test(currentUri.charAt(i)))
        {
            encodedUri += currentUri.charAt(i);
        }
        else if ((encodedUri.length > 0) && (encodedUri.charAt(encodedUri.length - 1) != "-"))
        {
            encodedUri += "-";
        }
    }
    return encodedUri;
}

getUrlTailForMiscTrackingData = function()
{
    var result = "";
    
	var ending = "_WithTracking=";
	var cookies = document.cookie.split(';');
	for(var i=0; i < cookies.length; i++)
	{
		var c = cookies[i];
		while (c.charAt(0) == ' ') 
		{
    		c = c.substring(1, c.length);
		}
		var marker = c.indexOf(ending);
		if (marker > 0)
		{
		    var name = c.substring(0, marker);
		    value = c.substring(marker + ending.length, c.length).toLowerCase();
		    if (value.length > 0)
		    {
		        result += "/" + name + "/" + value;
		    }
		}
    }
    
    return result;
}

wasSilverlightRecentlyMissing = function()
{
    // Do we have a cookie indicating that Silverlight was previously missing?
    var value = getCookie("SilverlightStatus");
    return (value == "missing");
}

rememberSilverlightStatus = function(isInstalled)
{
    if (isInstalled)
    {
        deleteCookie("SilverlightStatus", "installed");
    }
    else
    {
        var millisecondsPerMinute = 60000;
        var minutesToRememberTheseData = 10;
        var millisecondsToRememberTheseData = millisecondsPerMinute * minutesToRememberTheseData;
        var today = new Date();
        var expires = new Date(); 
        expires.setTime(today.getTime() + millisecondsToRememberTheseData); 
        setCookie("SilverlightStatus", "missing", expires);
    }
}

doSilverlightUsageTracking = function(isInstalled)
{
    if ((typeof(window.rootFolder) != "undefined") && (window.rootFolder != null) &&
        (typeof(window.trackerPage) != "undefined") && (window.trackerPage != null))
    {
        var trackingUri = null;
        if (silverlightInitiallyInstalled == null)
        {
            if (isInstalled && wasSilverlightRecentlyMissing())
            {
                trackingUri = rootFolder + trackerPage + "/url/" + pseudoEncodeCurrentUri() + "/conversion/true/inplace/false" + getUrlTailForMiscTrackingData();
            }
            else
            {
                trackingUri = rootFolder + trackerPage + "/url/" + pseudoEncodeCurrentUri() + "/installed/" + isInstalled.toString().toLowerCase() + getUrlTailForMiscTrackingData();
            }
            silverlightInitiallyInstalled = isInstalled;
        }
        else if (!silverlightInitiallyInstalled && isInstalled)
        {
            trackingUri = rootFolder + trackerPage + "/url/" + pseudoEncodeCurrentUri() + "/conversion/true/inplace/true" + getUrlTailForMiscTrackingData();
        }
        
        if (trackingUri != null)
        {
            if (usageTrackingFrame == null)
            {
                createSilverlightUsageTrackingFrame(trackingUri);
            }
            else
            {
                usageTrackingFrame.src = trackingUri;
            }
        }

        rememberSilverlightStatus(isInstalled);        
    }
}

isSilverlightInstalled = function()
{
    var status = (typeof(window.Silverlight) != "undefined") && (window.Silverlight != null) && Silverlight.isInstalled("1.0");
    return status;
}

monitorSilverlightUsage = function()
{
    // Only track whether or not Silverlight is installed when we are using a browser that has the potential
    // of having Silverlight installed. If Silverlight isn't (yet) supported in the browser we are using
    // then we have no chance of installing it now (i.e., a "conversion").
    if (isRootedUri() && ((typeof(document.readyState) == "undefined") || (document.readyState == "complete")))
    {
        var hasSilverlight = isSilverlightInstalled();
        doSilverlightUsageTracking(hasSilverlight);
        
        if ((!hasSilverlight) && (typeof(window.trackerRetryInterval) != "undefined") && (window.trackerRetryInterval != null))
        {
            // If we don't have Silverlight installed keep checking periodically because we might decide to
            // install it from the current page.
            setTimeout(monitorSilverlightUsage, trackerRetryInterval);
        }
    }
    else
    {
        setTimeout(monitorSilverlightUsage, trackerRetryInterval);
    }
}

if (window.addEventListener) 
{
    window.addEventListener('load', monitorSilverlightUsage , false);
}
else 
{
    window.attachEvent('onload', monitorSilverlightUsage);
}
