/* NBCFilterCaptureService.js 
   Exabre Ltd (c) 2008
   
   Evidence Capture for NBC Recommendation Service
*/

/***** Public Callback *****/

// Stored callback for returning capture event responses
// Arguments:
//      response    : string    - response string giving success or failure details
//      scriptId    : string    - id of javascript which sent event
var filterCaptureCallback = null;

/***** Event Handlers *****/

// On PlayStart Event
// When user clicks the play button
// Arguments:
//      itemId      : long      - catalog id for the play item
//      userGuid    : string    - NBC user id or null if anonymous
function NBCFilterCapture_OnItemPlayStarted(itemId, userGuid)
{
    return FilterCaptureRestCall('cmd=AddEvidence&eventType=PlayStart&itemid='+itemId, userGuid);
}

// On PlayCompleted Event
// When video finished playing
// Arguments:
//      itemId      : long      - catalog id for the play item
//      userGuid    : string    - NBC user id or null if anonymous
function NBCFilterCapture_OnItemPlayCompleted(itemId, userGuid)
{
    return FilterCaptureRestCall('cmd=AddEvidence&eventType=PlayCompleted&itemid=' + itemId, userGuid);
}

// On ItemRated Event
// When a user rates an item, should also get the rating to know if good or bad
// Arguments:
//      itemId      : long      - catalog id for the play item
//      userGuid    : string    - NBC user id or null if anonymous
//      rating      : ??        - User rating (range unknown)
function NBCFilterCapture_OnItemRated(itemId, userGuid, rating)
{
    return FilterCaptureRestCall('cmd=AddEvidence&eventType=ItemRated&itemid='+itemId+'&rating='+rating, userGuid);
}

// On ItemShared Event
// Arguments:
//      itemId      : long      - catalog id for the play item
//      userGuid    : string    - NBC user id or null if anonymous
//      shareDetails: string    - Any relevant evidence, such as userGuid
function NBCFilterCapture_OnItemShared(itemId, userGuid, shareDetails)
{
    return FilterCaptureRestCall('cmd=AddEvidence&eventType=ItemShared&itemid='+itemId, userGuid);
}

/** Private methods and vars **/

// Event Id counter
var filterCaptureCounter = 1;
var filterService_Location = 'http://partners.thefilter.com/NBCService/NBCFilterCaptureRest.ashx?';
var filterService_format = "IMG";
var filterService_allowDispatch = null;
var filterService_dispatchRate = 1.0;

// This should handle cross-server requests
function FilterCaptureRestCall(queryString, userId) 
{
    if (filterService_allowDispatch == null)
    {
        filterService_allowDispatch = Math.random()<filterService_dispatchRate;
    }
    
    if (filterService_allowDispatch == true)
    {
        if (filterService_format=="IMG")
            FilterCaptureIMGRestCall(queryString, userId)
        else if (filterService_format=="JSON")
            FilterCaptureJSONRestCall(queryString, userId)
    }
}

function FilterCaptureIMGRestCall(queryString, userId) 
{
    if (document.createElement)
    {
        var img = new Image();
        if (userId != null)
            img.src = filterService_Location+queryString + '&fmt=IMG&userid=' + userId + '&refid=' + new Date().getTime();
        else
            img.src = filterService_Location+queryString + '&fmt=IMG&anonId=' + FilterCaptureAnonymousUserGuid() + '&refid=' + new Date().getTime();

    }
}

//Vars to keep JSON calls from stalling onload
var filterService_Active = null;
var filterService_QS = [];
var filterService_UID = [];
var filterService_Count = 0;

function FilterCaptureJSONRestCall(queryString, userId) 
{
    if (document.createElement)
    {
        if (filterService_Active == null)
        {
            FilterPing_Init();
            filterService_Active = -1;        
        }
        if (filterService_Active == -1)
        {
            //store while waiting
            filterService_QS[filterService_Count] = queryString;
            filterService_UID[filterService_Count] = userId;
            filterService_Count++;
        }
        else if (filterService_Active != 0)
        {
             // Create script tag
            var serviceCallerScript = document.createElement("script");
            serviceCallerScript.setAttribute("type", "text/javascript");
            serviceCallerScript.setAttribute("charset", "utf-8");

            // Generate a unique script tag id
            var scriptId = 'FilterEvidenceId' + filterCaptureCounter++;
            serviceCallerScript.setAttribute("id", scriptId);

            if (userId != null)
                serviceCallerScript.setAttribute("src", filterService_Location+queryString + '&fmt=JSON&userid=' + userId + '&refid=' + scriptId);
            else
                serviceCallerScript.setAttribute("src", filterService_Location+queryString + '&fmt=JSON&anonId=' + FilterCaptureAnonymousUserGuid() + '&refid=' + scriptId);
     
            // Add script to head and request call
            document.getElementsByTagName("head").item(0).appendChild(serviceCallerScript); 
        }
    }
}

//Get anon user guid from cookie
function FilterCaptureAnonymousUserGuid()
{
    var userGuid = FilterCaptureGetCookie('FilterUserGuid');
    if (userGuid == null)
    {
        FilterCaptureSetCookie('FilterUserGuid',FilterCaptureGenerateGuid(),1000);
        userGuid = FilterCaptureGetCookie('FilterUserGuid');
    }
    return userGuid;
}

//General get cookie call
function FilterCaptureGetCookie(cookieName) 
{
	if (document.cookie.length>0)
    {
        var results = document.cookie.match ( '(^|;) ?' + cookieName + '=([^;]*)(;|$)' );
        if (results)
            return unescape(results[2]);
    }
    return null;
}

//General set cookie call
function FilterCaptureSetCookie(name,value,days) 
{
    if (days!=null)
    {
	    var date = new Date();
	    date.setDate(date.getDate()+days);
	    document.cookie = name+"="+escape(value)+"; expires="+date.toGMTString()+"; path=/";
	}
	else
	{
	    document.cookie = name+"="+escape(value)+"; path=/";
	}
}

//General Guid generator
function FilterCaptureGenerateGuid()
{
    var guid = []; 
    guid[8] = guid[13] = guid[18] = guid[23] = '-';
    guid[14] = 4;

    var val;
    var itoh = '0123456789ABCDEF'.split('');
    for (var i = 0; i <36; i++)
    {
        if (!guid[i])
        {
            val = 0 | Math.floor(Math.random()*16);
            guid[i] = itoh[(i == 19) ? (val & 0x3) | 0x8 : val & 0xf];
        }
    }
 
    return guid.join('');
}

/** Server Ping Test**/

function FilterPing_Init() 
{
    var img = new Image(1,1);
    img.onload = function() 
    {
        filterService_Active = 1;
        //delayed dispatch
        for(var i=0;i<filterService_Count;i++)
            FilterCaptureRestCall(filterService_QS[i],filterService_UID[i]);

        filterService_QS = [];
        filterService_UID = [];
        filterService_Count = 0;
    };
    img.onerror = function() 
    {
        filterService_Active = 0
        filterService_QS = [];
        filterService_UID = [];
        filterService_Count = 0;
    };
    img.src = filterService_Location + "cmd=ping&fmt=IMG";
}
/****/


