tkutils.createNamespace("TNT_XMP");

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

// TODO - need the following global values set up somehow (SSI or JS file):
// 1) cnnCurHour
// 2) cnnCurMin
// 3) cnnCurDay
// 4) cnnSectionName
// 5) cnnSubSectionName
// 6) whatever other values are needed to implement
//     'TNT_XMP.MosaicOmnitureTriggerCommand.prototype._reportSpecificStartValues'
//     (see the TODO comment for that function).

var dav0Img = new Image();
var dav1Img = new Image();

TNT_XMP.AbstractOmnitureTriggerCommand = function()
{
};

// Static 'now' date on client machine
TNT_XMP.AbstractOmnitureTriggerCommand._clientStartMs = (new Date()).getTime();

TNT_XMP.AbstractOmnitureTriggerCommand.prototype.doCommand = function(context)
{
	switch (context.getTriggerType())
	{
		case 'start': this._doStartCommand(context); break;
		//case 'mid': this._doMidCommand(context); break;
		case 'end': this._doEndCommand(context); break;
		default: break;
	}
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._doStartCommand = function(context)
{
	var s = this._createReportingObject(context);
	var videoId = this._getVideoContentId(context);
	var franchiseId = this._getVideoFranchiseId(context);
	var franchiseName = this._getVideoFranchiseName(context);
	var videoName = this._getVideoContentName(context);
	var videoSection = this._getVideoSection(context);
	var parentName = this._getParentName(context);
	var parentId = this._getParentId(context);


	// start of: VideoCensus ("dav0-" means start)
	var ScImgSrc;
	var ScRandom = Math.ceil(Math.random()*1000000000);
	ScImgSrc = 'http://secure-us.imrworldwide.com/cgi-bin/m?ci=us-100429';
	ScImgSrc += '&tl=dav0-' + escape(videoId + " / " + videoName);
	ScImgSrc += '&cg=' + escape(franchiseName);
	ScImgSrc += '&c6=vc,c06' + escape('');
	ScImgSrc += '&cc=1';
	ScImgSrc += '&rnd=' + ScRandom;

	dav0Img = new Image();
	dav0Img.src = ScImgSrc;
	// end of: VideoCensus ("dav0-" means start)

	// start of: send Omniture start
	if (parentName !== "") {
		s.prop5 = parentName + ":(" + parentId + ")";
	}
	if (franchiseId !== "") {
		s.prop1 = franchiseName + ":(" + franchiseId + ")";
		s.eVar8 = franchiseName + ":(" + franchiseId + ")";
	}
	s.pageName = "Video:" + videoName + ":(" + videoId + ")";
	s.server = "Content";
	s.channel = "Videos";
	s.prop3 = "Video:(200)";
	s.prop4 = videoSection;
	s.prop6 = videoName + ":(" + videoId + ")";
	s.eVar1 = "Videos: Content";
	s.eVar2 = videoName + ":(" + videoId + ")";
	s.eVar3 = videoName + ":(" + videoId + ")";
	s.eVar7 =  videoSection;
	s.eVar10 = "Videos";
	s.events = "event1,event2";

	this._postReportingObject(context, s, true, 'start');
	// end of: send Omniture start


	lastTrackedVideo.videoId = videoId;
	lastTrackedVideo.videoName = videoName;
	lastTrackedVideo.franchiseName = franchiseName;
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._doMidCommand = function(context)
{
	// not using it for TNT
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._doEndCommand = function(context)
{
	var s = this._createReportingObject(context);
	var videoId = this._getVideoContentId(context);
	var videoName = this._getVideoContentName(context);
	var franchiseName = this._getVideoFranchiseName(context);

	// start of: VideoCensus ("dav2-" means end)
	var ScImgSrc;
	var ScRandom = Math.ceil(Math.random()*1000000000);
	ScImgSrc = 'http://secure-us.imrworldwide.com/cgi-bin/m?ci=us-100429';
	ScImgSrc += '&tl=dav2-' + escape(videoId + " / " + videoName);
	ScImgSrc += '&cg=' + escape(franchiseName);
	ScImgSrc += '&c6=vc,c06' + escape('');
	ScImgSrc += '&cc=1';
	ScImgSrc += '&rnd=' + ScRandom;

	dav1Img = new Image();
	dav1Img.src = ScImgSrc;
	// end of: VideoCensus ("dav2-" means end)

	// start of: send Omniture end
	/*
	s.eVar2 = videoName + ":(" + videoId + ")";
	s.eVar3 = videoName + ":(" + videoId + ")";
	s.events = "event3";
	this._postReportingObject(context, s, true, 'end');
	*/

	s.events = "event3";
	s.linkTrackVars = "eVar2,eVar3,events";
	s.linkTrackEvents = "event3";
	this._postReportingObject(context, s, false, 'end');
	// end of: send Omniture end

	// video finished playing so clear the lastTrackedVideo object
	lastTrackedVideo = new Object();
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._postReportingObject = function(context, s, hit, cType)
{
	if (hit) {
		s.t();
	} else {
		s.tl(tkutils.getGlobalNamespace(), 'o', this._getCustomTriggerPrefix() + cType);
	}
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._createReportingObject = function(context)
{
	var s = tkutils.getGlobalNamespace().s_gi(this._getOmnitureAccount());
	return s;
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._getVideoContentId = function(context)
{
	var node = context.getPlayableNode();
	return node.getPlayableData().getDataObject().contentId;
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._getVideoFranchiseId = function(context)
{
	var node = context.getPlayableNode();
	return node.getPlayableData().getDataObject().franchiseId;
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._getVideoFranchiseName = function(context)
{
	var node = context.getPlayableNode();
	return node.getPlayableData().getDataObject().franchiseName;
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._getVideoContentName = function(context)
{
	var node = context.getPlayableNode();
	return node.getPlayableData().getDataObject().contentName;
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._getVideoSection = function(context)
{
	var node = context.getPlayableNode();
	return node.getPlayableData().getDataObject().section;
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._getParentName = function(context)
{
	var node = context.getPlayableNode();
	return node.getPlayableData().getDataObject().parentName;
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._getParentId = function(context)
{
	var node = context.getPlayableNode();
	return node.getPlayableData().getDataObject().parentId;
};


TNT_XMP.AbstractOmnitureTriggerCommand.prototype._getOmnitureAccount = function()
{
	return xmp.baseplayer.BasePlayer.getSettingsManager().
		getContextNode().getString('omniture account', '');
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._reportSpecificStartValues = function(context, s)
{
	// default does nothing
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._getVideoIdEvar = function()
{
	throw new Error('must override');
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._getPageType = function()
{
	throw new Error('must override');
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._getLogger = function()
{
	throw new Error('must override');
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._getCustomTriggerPrefix = function()
{
	throw new Error('must override');
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._didAdPlayBefore = function(context)
{
	var lba = this._getLookBehindNodeArray(context);
	for (var i=0; i<lba.length; i++)
	{
		var node = lba[i];
		if (node.getNodeTypeName() === 'Content')
		{
			return false;
		}
		// NOTE: 'isAd' set by CNNRules.CannotHaveTwoSequentialAdsRule
		if (node.getPlayableData().getRuntimeMetadata('isAd', false))
		{
			return true;
		}
	}
	return false;
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._getLookBehindNodeArray = function(context)
{
	var listener = context.getMetadata('nodeListener', {});
	return listener.getPlayer().getLookBehindNodeArray();
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._calcTimeStrings = function()
{
	return this._calcTimeStringsGeneric(tkutils.getGlobalNamespace().cnnCurHour,
		tkutils.getGlobalNamespace().cnnCurMin,
		tkutils.getGlobalNamespace().cnnCurDay);
};

TNT_XMP.AbstractOmnitureTriggerCommand.prototype._calcTimeStringsGeneric = function(curHour, curMin, curDOW)
{
	var retVal = { h15: '', dow: '' };
	if (typeof(curHour)==='undefined'||typeof(curMin)==='undefined'||typeof(curDOW)==='undefined')
	{
		return retVal;
	}
	var diffMs = (new Date()).getTime() - TNT_XMP.AbstractOmnitureTriggerCommand._clientStartMs;
	if (diffMs < 0)
	{	// did user set system clock into the past after xmp started?
		return retVal;
	}
	var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
	var doyi = 0; // day of week index
	for (var i=0; i<days.length; i++)
	{
		if (curDOW === days[i])
		{
			doyi = i;
			break;
		}
	}
	// NOTE: Jan 1, 1995 was a Sunday.  Note that this scheme works so long as
	// diffMs is not enough to take us past Feb 28, because leap years will mess things up,
	// but highly doubtful someone will leave xmp running for more than 59 days.
	// Note that since we are only calculating hours, 15-minute intervals, and day of the week,
	// it is OK to do calculations with a date in the past.
	var calcStartMs = Date.UTC(1995, 0, (1 + doyi), curHour, curMin);
	var finalDate = new Date(calcStartMs + diffMs);
	retVal.dow = days[finalDate.getUTCDay()];
	var min15 = 15 * (Math.floor(finalDate.getUTCMinutes()/15));
	retVal.h15 = finalDate.getUTCHours().toString() + ':' + ((min15 === 0) ? '00' : min15.toString());
	if (retVal.h15.length === 4) { retVal.h15 = '0' + retVal.h15; }
	return retVal;
};

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

TNT_XMP.DramavisionOmnitureTriggerCommand = function()
{
	this._logger = xmp.baseplayer.BasePlayer.createCategoryLogger('DramavisionOmnitureTriggerCommand');
};

xmp.DERIVE_CLASS( TNT_XMP.AbstractOmnitureTriggerCommand, TNT_XMP.DramavisionOmnitureTriggerCommand );

TNT_XMP.DramavisionOmnitureTriggerCommand.prototype._getVideoIdEvar = function()
{
	// dramavision isn't storing the video asx url
	return '';
};

TNT_XMP.DramavisionOmnitureTriggerCommand.prototype._getPageType = function()
{
	return 'Dramvision';
};

TNT_XMP.DramavisionOmnitureTriggerCommand.prototype._getCustomTriggerPrefix = function()
{
	return 'video link: ';
};

TNT_XMP.DramavisionOmnitureTriggerCommand.prototype._getLogger = function()
{
	return this._logger;
};

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

TNT_XMP.WebstatTriggerCommand = function()
{
};

TNT_XMP.WebstatTriggerCommand.prototype.doCommand = function(context)
{
	switch (context.getTriggerType())
	{
		case 'start': this._doStartCommand(context); break;
		default: break;
	}
};

TNT_XMP.WebstatTriggerCommand.prototype._doStartCommand = function(context)
{
	var node = context.getPlayableNode();
	var pingUrl = node.getPlayableData().getDataObject().id+'.vidt';
	xmp.net.AjaxRequestManager.ping('videoTracking', pingUrl);
};

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
