//------------------------------------------------------
// The Video Tracker Object
VideoTracker.prototype = new CBSObject();
VideoTracker.prototype.constructor = VideoTracker;
VideoTracker.prototype.months = new Array();
VideoTracker.prototype.months["Jan"] = 1;
VideoTracker.prototype.months["Feb"] = 2;
VideoTracker.prototype.months["Mar"] = 3;
VideoTracker.prototype.months["Apr"] = 4;
VideoTracker.prototype.months["May"] = 5;
VideoTracker.prototype.months["Jun"] = 6;
VideoTracker.prototype.months["Jul"] = 7;
VideoTracker.prototype.months["Aug"] = 8;
VideoTracker.prototype.months["Sep"] = 9;
VideoTracker.prototype.months["Oct"] = 10;
VideoTracker.prototype.months["Nov"] = 11;
VideoTracker.prototype.months["Dec"] = 12;
function VideoTracker(videoPlayer, time) {
  this.superClass = CBSObject.prototype;
  this.superClass.constructor.call(this);
	this.objectType = "VideoTracker";
	_objects[this.objectId] = this;
	
	this.segmentTracking = false;	
	
	this.watchTracking = false;
	
	this.host = "cbs.112.2o7.net";
	this.account = "cbsnewscomdev";
	
	this.images = new Array();
	
	this.send = true;
	this.check = false;
	this.debug = "";
	
	this.pausing = false;
	this.closing = false;

	this.initialized = false;
	this.trackingVars = new Array();

	this.videoPlayer = videoPlayer;
	//this.videoPlayer.attachEvent("onSegmentOpened", this.onSegmentOpened, this);
	//this.videoPlayer.attachEvent("onSegmentSet", this.onSegmentSet, this);
	//this.videoPlayer.attachEvent("onSegmentStarted", this.onSegmentStarted, this);
	//this.videoPlayer.attachEvent("onSegmentClosed", this.onSegmentClosed, this);
	//this.videoPlayer.attachEvent("onPositionChanged", this.onPositionChanged, this);
	//this.videoPlayer.attachEvent("onVideoOpened", this.onVideoOpened, this);
	//this.videoPlayer.attachEvent("onVideoSet", this.onVideoSet, this);
	//this.videoPlayer.attachEvent("onVideoClosed", this.onVideoClosed, this);
	
	if (time != null) {
		this.initTime(time);
	}
}

VideoTracker.prototype.initOmniture = function() {
}

//--------------------------------------------------------
// Calls a omniture from sub HTML page
VideoTracker.prototype.callOmniture = function(events, eVars, props) {
	this.log("track", "callOmniture");

	// Setup URL to omniture 1x1
	var imgUrl = "http://" + this.host + "/b/ss/" + this.account + "/1/H.1-pdv-2/s" + parseInt(Math.random() * 1000000);
	imgUrl += "?events=" + escape(events);
	for (var i=1; i<20; i++) {
		if (eVars[i]) {
			imgUrl += "&v" + i + "=" + escape(eVars[i]);
		}
	}
	for (var i=24; i<30; i++) {
		if (props[i]) {
			imgUrl += "&c" + i + "=" + escape(props[i]);
		}
	}
	this.log("track", imgUrl);
	
	// Call omniture
	if (this.send) {
		var img = new Image();
		img.src = imgUrl;
		this.images[this.images.length] = img;
		//prompt('omni', imgUrl);
	

		if (this.closing) {
			var now = new Date();
			var then = new Date();
			while (now.getTime() > then.getTime() - 500) {
				then = new Date();
			}
		}
	}
	
	// Debugging
	if (this.debug) {
		var string = "acct = " + s_v_account + "\n";
		string += "ev = " + omni.events + "\n";
		string += "v1 = " + omni.eVar1 + "\n";
		string += "v2 = " + omni.eVar2 + "\n";
		string += "v3 = " + omni.eVar3 + "\n";
		string += "v4 = " + omni.eVar4 + "\n";
		string += "v5 = " + omni.eVar5 + "\n";
		string += "v6 = " + omni.eVar6 + "\n";
		string += "v7 = " + omni.eVar7 + "\n";
		string += "v8 = " + omni.eVar8 + "\n";
		string += "v9 = " + omni.eVar9 + "\n";
		string += "v10 = " + omni.eVar10 + "\n";
		string += "v11 = " + omni.eVar11 + "\n";
		string += "v12 = " + omni.eVar12 + "\n";
		string += "v13 = " + omni.eVar13 + "\n";
		string += "v14 = " + omni.eVar14 + "\n";
		string += "v15 = " + omni.eVar15 + "\n";
		string += "v16 = " + omni.eVar16 + "\n";
		string += "v17 = " + omni.eVar17 + "\n";
		string += "v18 = " + omni.eVar18 + "\n";
		string += "v19 = " + omni.eVar19 + "\n";
		string += "p24 = " + omni.prop24 + "\n";
		string += "p25 = " + omni.prop25 + "\n";
		string += "p26 = " + omni.prop26 + "\n";
		string += "p27 = " + omni.prop27 + "\n";
		string += "p28 = " + omni.prop28 + "\n";
		string += "p29 = " + omni.prop29 + "\n";
		
		if (this.debug.indexOf("alertAll") >= 0) {
			alert(string);
		}
		if (this.debug.indexOf("alertPath") >= 0) {
			alert(path);
		}
		
		if (this.debug.indexOf("divAll") >= 0) {
			var div;
			if ((events == "event1") || (events == "event2")) {
				div = document.getElementById("clipDiv");
			} else if ((events == "event4") || (events == "event5")) {
				div = document.getElementById("videoDiv");
			} else if ((events == "event6") || (events == "event7")) {
				div = document.getElementById("adDiv");
			}
			if (!div) {
				div = document.getElementById("trackerDiv");
			}
			if (div) {
				div.innerHTML = "<pre>" + string + "</pre>";
			}
		}
		
		if (this.debug.indexOf("divPath") >= 0) {
			var div;
			if ((events == "event1") || (events == "event2")) {
				div = document.getElementById("clipDiv");
			} else if ((events == "event4") || (events == "event5")) {
				div = document.getElementById("videoDiv");
			} else if ((events == "event6") || (events == "event7")) {
				div = document.getElementById("adDiv");
			}
			if (!div) {
				div = document.getElementById("trackerDiv");
			}
			if (div) {
				div.innerHTML = path;
			}
		}

		if (this.debug.indexOf("pathLog") >= 0) {
			var div = document.getElementById("trackerPathDiv");
			if (div) {
				div.innerHTML += path + "<br>";
			}
		}
	}
}



//--------------------------------------------------------------------
// Inserts the iframe into the document
VideoTracker.prototype.print = function(div) {
	this.log("track", "print");
}
// Returns the document for the iframe
VideoTracker.prototype.getIFrameDocument = function() {
	//if (this.iFrame == null) {
		this.iFrame = document.getElementById("videoTrackerIFrame" + this.objectId);
	//}
	return this.iFrame.contentWindow.document;
}



//---------------------------------------------------------------
// Initializes minute by minute tracking
VideoTracker.prototype.initTime = function(serverDateString) {
	this.log("track", "initTime " + serverDateString);
	var serverDate = new Date(serverDateString);
	var clientDate = new Date();
	this.dateOffset = clientDate.getTime() - serverDate.getTime();
}

//---------------------------------------------------------------
// Initializes minute by minute tracking
VideoTracker.prototype.initWatchTracking = function(serverDateString) {
	this.initTime(serverDateString);
}
//---------------------------------------------------------------
// Turns on minute by minute tracking
VideoTracker.prototype.enableWatchTracking = function(serverDateString) {
	this.log("track", "enableWatchTracking " + serverDateString);
	this.initWatchTracking(serverDateString);
	this.watchTracking = true;
}

//---------------------------------------------------------------
// Called when video has opened a connect to the server
VideoTracker.prototype.onVideoOpened = function(event, video) {
	// Redundancy checking
	video.startTracked = false;
	video.endTracked = false;

	var adtype;
	if (this.videoPlayer.getParam) {
		adtype = this.videoPlayer.getParam("adtype");
	} else {
		adtype = this.videoPlayer.adType;
	}
	this.log("track", "onVideoOpened " + adtype + " " + video.playFormat + " " + this.videoPlayer.capabilities.scripting[video.playFormat] + " " + this.segmentTracking);
	/*
	if ((adtype.indexOf("pre") >= 0) && (!this.videoPlayer.capabilities.scripting[video.playFormat]) && (!this.segmentTracking)) {
		this.log("track", "adSegment");
		video.adSegment = video.newSegment();
		video.adSegment.adSegment = true;
		video.adSegment.ad = true;
		video.adSegment.id = "ad";
		video.adSegment.title = "Unknown";
		this.onSegmentOpened("onSegmentOpened", video.adSegment);
		this.onSegmentSet("onSegmentSet", video.adSegment);
	}
	*/
}

//---------------------------------------------------------------
// Called when video has it's properties set
VideoTracker.prototype.onVideoSet = function(event, video) {
	// Redundancy checking
	if (video.startTracked) return;
	if (video.endTracked) return;
	video.startTracked = true;
	
	var now = new Date();
	video.durationString = this.getTimeString(video.duration);
	video.startTime = now.getTime();
	video.endTime = null;
	
	var events = "event4";
	if (video.startingTime) events = "event10";
	var eVars = this.getEVars(video, video);
	var props = new Array();
	props[29] = video.videoId;
	this.callOmniture(events, eVars, props);

	video.endTracked = false;

	// If no scripting, call closed immediately
	if ((!this.videoPlayer.capabilities.scripting[this.videoPlayer.format]) && (!video.live)) {
		this.onVideoClosed("onVideoClosed", video);
	}
	
	// Start watch tracking
	if ((this.watchTracking) || (video.watchTracking)) {
		eval("_objects['" + this.objectId + "'].onVideoWatch('onVideoWatch', _objects['" + video.objectId + "'])");
		video.watchId = window.setInterval("_objects['" + this.objectId + "'].onVideoWatch('onVideoWatch', _objects['" + video.objectId + "'])", 60*1000);
	}
}

//---------------------------------------------------------------
// Called when video is closed
VideoTracker.prototype.onVideoClosed = function(event, video) {
	// Check for redundancy
	if (video.endTracked) return;
	video.endTracked = true;
	video.startTracked = false;

	// Ending
	var now = new Date();
	video.endTime = now.getTime();
	
	// Omniture
	var events = "event5";
	if (this.pausing) events = "event11";
	var eVars = this.getEVars(video, video);
	var props = new Array();
	props[24] = eVars[12];
	props[25] = eVars[14];
	props[26] = eVars[16];
	props[27] = eVars[2];
	props[28] = eVars[8];
	this.callOmniture(events, eVars, props);

	// Stop watch tracking	
	if (video.watchId) {
		window.clearInterval(video.watchId);
	}
}

//---------------------------------------------------------------
// Called every minute while a video is being watched
VideoTracker.prototype.onVideoWatch = function(event, video) {
	this.log("track", "onVideoWatch " + this.dateOffset);
	var now = new Date();																 
	var real = new Date(now.getTime() - this.dateOffset - 4*60*60*1000); // WHY 4 ??????
	var gmt = real.toGMTString();
	var values = gmt.split(' ');
	var year = values[3];
	var month = this.months[values[2]];
	if (parseInt(month) < 10) month = "0" + parseInt(month);
	var day = values[1];
	if (parseInt(day) < 10) day = "0" + parseInt(day);
	var time = values[4];
	values = time.split(':');
	var hour = values[0];
	var min = values[1];
	var sec = values[2];
	var dateString = month + '/' + day + '/' + year + ' ' + hour + ':' + min;

	video.durationString = this.getTimeString(video.duration);

	var events = "event3";
	var eVars = this.getEVars(video, video);
	eVars[4] = dateString;
	var props = new Array();
	this.callOmniture(events, eVars, props);
}

//---------------------------------------------------------------
// Called when segment has opened a connect to the server
VideoTracker.prototype.onSegmentOpened = function(event, segment) {
	// Redundancy checking
	segment.startTracked = false;
	segment.endTracked = false;
}

//---------------------------------------------------------------
// Called when segment params have been set
VideoTracker.prototype.onSegmentSet = function(event, segment) {
	// Redundancy checking
	if (segment.endTracked) return;
	if (segment.startTracked) return;
	segment.startTracked = true;
	segment.endTracked = false;

	// Timing
	var now = new Date();
	segment.startTime = now.getTime();
	segment.endTime = null;
	segment.durationString = this.getTimeString(segment.duration);

	// Omniture
	var events = "event1";
	if (segment.video.startingTime) {
		for (var i=0; i<segment.video.segments.length; i++) {
			if (segment.video.segments[i].ad) 
				continue;
			else if (segment.video.segments[i] == segment)
				events = "event8";
			else
				break;
		}
	}
	var eVars = this.getEVars(segment, segment.video);
	var props = new Array();
	props[29] = segment.id || segment.video.videoId;
	if (segment.ad) {
		events = "event6";
		var current = segment.video.getCurrentContentSegmentNum();
		var num = segment.video.getNumContentSegments();
		if (current == 0) {
			eVars[7] = "pre";
		} else if (current < num) {
			eVars[7] = "mid";
		} else {
			eVars[7] = "post";
		}
	}
	// Handle start images
	if (segment.startImg) {
		//alert("start");
		segment.startImage = new Image;
		segment.startImage.src = segment.startImg;
		this.images[this.images.length] = segment.startImage;
	}
	this.callOmniture(events, eVars, props);

	// If no scripting, call closed immediately
	if ((!this.videoPlayer.capabilities.scripting[this.videoPlayer.format]) && (!segment.live)) {
		this.onSegmentClosed("onSegmentClosed", segment);
	}
}

//---------------------------------------------------------------
// Called when segment params have been set
VideoTracker.prototype.onSegmentStarted = function(event, segment) {
	// Redundancy checking
	if (segment.endTracked) return;
	if (segment.playTracked) return;
	segment.playTracked = true;

	// Handle play images
	if (segment.playImg) {
		//alert("play");
		segment.playImage = new Image;
		segment.playImage.src = segment.playImg;
		this.images[this.images.length] = segment.playImage;
	}
}

//---------------------------------------------------------------
// Called when segment is closed
VideoTracker.prototype.onSegmentClosed = function(event, segment) {
	// Redundancy checking
	if (segment.endTracked) return;
	segment.endTracked = true;
	segment.startTracked = false;
	
	// Timing
	var now = new Date();
	segment.endTime = now.getTime();

	// Omniture		
	var events = "event2";
	if (this.pausing) events = "event9";
	var eVars = this.getEVars(segment, segment.video);
	var props = new Array();
	props[24] = eVars[12];
	props[25] = eVars[14];
	props[26] = eVars[16];
	props[27] = eVars[2];
	props[28] = eVars[8];
	if (segment.ad) {
		events = "event7";
		var current = segment.video.getCurrentContentSegmentNum();
		var num = segment.video.getNumContentSegments();
		if (current == 0) {
			eVars[7] = "pre";
		} else if (current < num) {
			eVars[7] = "mid";
		} else {
			eVars[7] = "post";
		}
	}
	// Handle end or stop images
	if ((segment.endImg) && (segment.maxPosition > segment.duration - 2)) {
		//alert("end");
		segment.endImage = new Image;
		segment.endImage.src = segment.endImg;
		this.images[this.images.length] = segment.endImage;
	}
	if (segment.stopImg) {
		//alert("stop");
		segment.stopImage = new Image;
		segment.stopImage.src = segment.stopImg;
		this.images[this.images.length] = segment.stopImage;
	}
	this.callOmniture(events, eVars, props);
}
//---------------------------------------------------------------
// Called when segment is closed
VideoTracker.prototype.onPositionChanged = function(event, pos, dur) {
	if (pos >= dur/2) {
		var video = this.videoPlayer.getCurrentVideo();
		if (!video) return;
		var segment = video.getCurrentSegment();
		if (!segment) return;
		if (!segment.midImg) return;
		if (!segment.midImage) {
			//alert("mid");
			segment.midImage = new Image;
			segment.midImage.src = segment.midImg;
		}
	}
}


//---------------------------------------------------------------
// Returns a time string in MM:SS format
VideoTracker.prototype.getTimeString = function(time) {
	var secs = time % 60;
	var mins = Math.floor(time / 60);
	if (secs < 10) {
		return mins + ":0" + secs;
	} else { 
		return mins + ":" + secs;
	}
}

//---------------------------------------------------------------
// Returns a time range string in MM:SS - MM:SS format
VideoTracker.prototype.getTimeRangeString = function(time) {
	if (time < 15) {
		var t = 5*Math.floor(time / 5);
		return t + 5;
		//return this.getTimeString(t) + " - " + this.getTimeString(t+5);
	} else if (time < 300) {
		var t = 15*Math.floor(time / 15);
		return t + 15;
		//return this.getTimeString(t) + " - " + this.getTimeString(t+15);
	} else {
		var t = 60*Math.floor(time / 60);
		return t + 60;
		//return this.getTimeString(t) + " - " + this.getTimeString(t+60);
	}
}

//--------------------------------------------------------------
// Sets all the eVars
VideoTracker.prototype.getEVars = function(content, video) {
	var eVars = new Array();
	
	var id;
	if (content.videoId) 
		id = content.videoId;
	else if (content.id) 
		id = content.id;
	else 
		id = video.videoId;

	// 1 is id and title
	eVars[1] = id + " - " + content.title + " (" + content.durationString + ")";

	// 2 and 3 are duration
	if (content.endTime) {
		if (!this.videoPlayer.capabilities.scripting[this.videoPlayer.format]) {
			eVars[2] = "Unknown";
			eVars[3] = "Unknown";
		} else {
			content.elapsedTime = Math.floor((content.endTime - content.startTime) / 1000);
			var timeWatched;
			if (content.elapsedTime < content.getMaxPosition()) 
				timeWatched = content.elapsedTime;
			else 
				timeWatched = content.getMaxPosition();
	
			eVars[2] = this.getTimeRangeString(timeWatched);
			if ((!content.duration) || (content.duration == 0)) {
				eVars[3] = "0%";
			} else {
				var tenth = Math.round(timeWatched*10 / content.duration);
				if (tenth == 0) {
					eVars[3] = "0%";
				} else {
					eVars[3] = tenth + "0%";
				}
			}
		}
		eVars[5] = this.getTimeRangeString(content.getMaxPosition());
	}
	// 6 is format
	if (content.videoId) {
		eVars[6] = this.videoPlayer.format;
	} else {
		eVars[6] = content.format;
	}
	// 7 is ad type
	
	// 8 is page
	eVars[8] = document.location.pathname;
	if (eVars[8].charAt(eVars[8].length - 1) == '/') {
		eVars[8] += "index";
	} else {
		var p = eVars[8].lastIndexOf('.');
		if (p > 0) {
			eVars[8] = eVars[8].substring(0, p);
		}
	}

	// 9 is hour of day
	if (typeof(this.dateOffset) != "undefined") {
		var now = new Date();																 
		var real = new Date(now.getTime() - this.dateOffset - 4*60*60*1000); // WHY 4 ??????
		var gmt = real.toGMTString();
		var values = gmt.split(' ');
		var time = values[4];
		values = time.split(':');
		var hour = values[0];
		eVars[9] = hour + ':00';
	}
	
	// 11 -> 15 are props
	if (video.props) {
		var propNum = 11;
		for (var i=0; i<video.props.length; i++) {
			eVars[propNum++] = video.props[i];
		}
		var lastProp = eVars[propNum-1];
		while (propNum < 16) {
			eVars[propNum++] = lastProp;
		}
	}
	
	// 16 is title
	eVars[16] = content.title;
	
	return eVars;
}

