
/* WPXI.com scripts */
// Begin national js scripts

/*
 * Copyright 2006, Internet Broadcasting Systems. All Rights Reserved.
 *
 * $Id: mediaplayer.js,v 1.27 2008/12/15 21:17:11 bstime Exp $
 */
//ddjohnson 16Feb2006
//brian betz 23Oct2006
//
// COID 9073507

var activexVideo = false;
var embedVideo = false;

try {
	if(window.ActiveXObject && ((new ActiveXObject("WMPlayer.OCX.7")) != null))
		activexVideo = true;
} catch(ex)  { }

if(!activexVideo)
{
	try {
		if(navigator.mimeTypes && navigator.mimeTypes['application/x-mplayer2'].enabledPlugin)
			embedVideo = true;
	} catch(ex) { }
}

// NOTE: USING windowlessVideo = 0
// USAGE: mediaPlayer.getInstance("player1").createPlayer("video",1234568,true);
var mediaPlayer =
{
	all: [],
	debug:false,
	controls: {},
	buffering: {},
	adDetect: {},
	adTarget: {},
	playlistHandler: {},
	getInstance: function(playerID)
	{
		for(var j=0, pp=this.all[j]; j < this.all.length; ++j)
			if(pp.playerID == playerID)
				return pp.player;

		var player =
		{
			playerID: playerID,		// player ID
			status: -1,			// setInterval ID number
			isActiveX: activexVideo,	// activeX
			lastClickTime: -1,		// time of last user click in millis
			hasTimedOut:false,		// Timeout status for live streams

			getPlugin: function()
			{
				return document.getElementById("videoplug" + player.playerID);
			},

			stop: function()
			{
				if(player.getPlugin() && activexVideo &&
					player.getPlugin().playState != 1)
				{
					player.getPlugin().controls.stop();
				}
				else if(player.getPlugin() && embedVideo &&
					player.getPlugin().parentNode)
				{
					player.getPlugin().parentNode.removeChild(
						player.getPlugin());
				}
			},
			timeout:{
				//duration:30, // minutes
				duration:10, // minutes
				delay:1, // minutes
				warningtext:'The live stream player will soon timeout.<br />Click this message to continue watching.',
				curritem:'',
				test:function(el){
					//Clear the delay timeouts and start fresh if this is a different stream.
					if(el.currentMedia && el.currentMedia.name != this.curritem) {
						// Clear all timeouts that might be running for the previous media
						if(player.stillThere) clearTimeout(player.stillThere);
						if(player.delay) clearTimeout(player.delay);
						var timeoutprompt = document.getElementById('timeoutmessage');
						if(timeoutprompt)timeoutprompt.parentElement.removeChild(timeoutprompt)
						//if the player has timedout make sure we are no longer showing the prompt
						if(player.hasTimedOut) {
							player.timeout.deletePrompt(el);
						}
						//If this new media is a "broadcast" item (livestream) reset the timer
						if(el.currentMedia.getItemInfo('type').toLowerCase() == 'broadcast') {
							player.isLivestream = true;
							player.hasTimedOut = false;
							this.reset(el);
						}
					}
					if(el.currentMedia) this.curritem = el.currentMedia.name;
				},
				reset:function(el){
					var self = this;
					if(player.delay) clearTimeout(player.delay);
					player.delay = setTimeout(
						(
							function(){
								player.hasTimedOut = true;
								player.stillThere = window.setTimeout(
									(
										function(){
											player.stop();
											player.timeout.curritem = '';
											el.parentElement.removeChild(player.message);
										}
									)
									,self.delay*60000
								);
								player.timeout.showPrompt(el);
							}
						)
						, this.duration*60000
					);
				},
				showPrompt:function(el){
					player.message = document.createElement('div');
					player.message.id = 'timeoutmessage';
					player.message.className = 'timeoutmessage';
					player.message.style.position = 'absolute';
					player.message.style.left = '0';
					player.message.style.cursor = 'pointer';
					player.message.style.bottom = '0';
					player.message.style.overflow = 'hidden';
					/*
					player.message.style.height = '75px';
					player.message.style.width = '250px';
					*/
					player.message.text = document.createElement('div');
					player.message.text.className = 'copy';
					player.message.text.innerHTML = player.timeout.warningtext;
					player.message.text.style.margin = '5px;'
					player.message.appendChild(player.message.text);
					player.message.onclick = function(){
						player.timeout.deletePrompt(el);
					}
					el.parentElement.appendChild(player.message);
					if (player.message.style.backgroundColor == '') player.message.style.backgroundColor = '#fff';
				},
				deletePrompt:function(el){
					clearTimeout(player.stillThere);
					player.message.parentNode.removeChild(player.message);
					player.hasTimedOut = false;
					player.timeout.reset(el);
				}
			},
			/** 
			 * AUDIT pings URLs when video progression reaches a given point
			 * Understands PARAM tags in the ASX file <PARAM name="audit_xx" value="" /> Where xx is the position in the stream to send the ping to the URL in the value attribute
			 * init() is called each time the player is recreated to reset the values for the audit
			 * exec() is called from within the progress tracker with 
			 * 		@el		= 	DOM element of the player
			 * attach() can be called if a progress indicator is not present with:	
			 * 		@el		=	DOM element of the player
			 */
			audit: {
				currentMedia:'',points:[],adid:'',adclick:'',companion:{elem:'adbanner1', height:90, width:728},
				setAdPosition:function(adSpecObj){
					if(typeof adSpecObj == 'object')this.companion = adSpecObj;
				},
				init:function(){
					this.currentMedia = '';
					this.points = [];
					this.adid='';
					this.adclick='';
				},
				attach:function(el) {
					this.status = window.setInterval(function() {
						var length = (el.controls.currentItem) ? el.controls.currentItem.duration : 1;
						var position = (el.controls) ? el.controls.currentPosition : 1;
						var pct = parseInt(Math.round((position / length) * 100));
						if(isNaN(pct)) pct = 0;
						player.audit.exec(el);
					}, 100);
				},
				exec:function(el)
				{
					var cm = el.currentMedia;
					if(cm)
					{
						if(this.currentMedia != cm.name)
						{
							this.points=[];
							if(cm.getItemInfo("tracker") &&	cm.getItemInfo("tracker").indexOf("http") != -1)
							{
								// HANDLE TRACKER PARAMS FIRST
								this.points=[{point:0, url:cm.getItemInfo("tracker")}];
							}
							// LOOK FOR AD RELATED PARAMS
							for (var p=0; p<cm.attributeCount; p++)
							{
								var attname = cm.getAttributeName(p).toLowerCase();
								var attvalue = cm.getItemInfo(cm.getAttributeName(p));
								//alert(cm.getAttributeName(p))
								//IBS - DART
								if(attname.indexOf('audit_') != -1){
								   var auditTime = parseInt(cm.getAttributeName(p).split('_')[1])-4;
								   this.points.push({point:auditTime, url:attvalue});
								}
								/* MEDIAPLAYER USES ADOBJ TO REFRESH AD
								 else if(cm.getAttributeName(p).toLowerCase() == 'dcadtag'){
									// IF THERE IS AN AD TAG SET THE AD TAG AND REQUEST THE COMPANION AD
									this.adid = cm.getItemInfo(cm.getAttributeName(p));
									var videoAdTag = (this.adid)? this.adid+';':'';
									var rand = Math.floor((Math.random()*1000000000));
									var adTag = 'http://ad.doubleclick.net/adi/ibs.' + siteinfo.sitekey.lc + '.interactive/;kw=video+banner1;ad=true;tile=2;pgtype=detail;sz=728x90;' + videoAdTag + 'ord='+rand+'?';
									document.getElementById(this.companion.elem).innerHTML = '<iframe name="banner1" width="'+this.companion.width+'" height="'+this.companion.height+'" marginwidth="0" marginheight="0" frameborder="0" scrolling="no" src="'+adTag+'"></iframe>'
								}
								*/
								//BBE
								else if(attname == 'companionbannercreativehtml'){
									getEl('adbanner1').style.overflow = 'hidden';
				   					getEl('adbanner1').innerHTML = unescape(attvalue);
								}
								else if(attname == 'sendannouncementtourlonend'){
									this.points.push({point:97, url:unescape(attvalue)});
								}
								else if(attname == 'sendannouncementtourlonmid'){
									this.points.push({point:50, url:unescape(attvalue)});
								}
								else if(attname == 'sendannouncementtourlonbegin'){
									this.points.push({point:0, url:unescape(attvalue)});
								}
								else if(attname == 'clickthroughurl'){
									this.adclick = unescape(attvalue);
								}
							}
							this.points.sort(function(a,b)
							{
								return a.point - b.point
							});
						} else {
							var length = (el.controls.currentItem) ? el.controls.currentItem.duration : 1;
							var position = (el.controls) ? el.controls.currentPosition : 1;
							var pct = parseInt(Math.round((position / length) * 100));
							if(isNaN(pct)) pct = 0;
							if(this.points.length != 0 && pct > this.points[0].point) 
							{
								var timg = document.createElement('img');
								timg.style.display = 'none';
								var rnd = parseInt(Math.random()*100000);
								var q = (this.points[0].url.indexOf('?') == -1)?'?'+rnd:'&'+rnd;
								timg.src = this.points[0].url;
								var thisimgid = 'timg_'+rnd;
								timg.id = thisimgid;
								YAHOO.util.Event.onDomReady(function() {
									document.body.appendChild(timg);
								});
								this.points.shift();
								this.exec(el);
							}
						}
						this.currentMedia = cm.name;
					}
				}
			},
			/**
			 * @type (video|url|image)
			 * @coid phaedra content id
			 * @autoplay autoplay value
			 * @uiMode (full|mini|none)
			 * @preroll (true | false)
			 */
			createPlayer: function(type,coid,autoplay,uiMode,preroll)
			{
				player.audit.setAdPosition({elem:'adbanner1',width:728, height:90});
				player.audit.init();
				player.hasTimedOut = false;
				preroll = (typeof preroll == 'boolean' ? (preroll?'y':'n'):'y');
				uiMode = (uiMode ? uiMode : "full");
				var nonIeUiMode = uiMode == "none" ? 0 : 1;
				var vidurl = ((type != 'url') ?
					"http://" + window.location.host + "/videofiles/" + coid + "/playlist.asx?qs=t;speed=high;ng=" + preroll :
					coid);
				if(type == 'url') {
					coid = vidurl.split("/")[4];
				}
				if(mediaPlayer.adTarget[this.playerID])
					vidurl += ";adtarget=" + mediaPlayer.adTarget[this.playerID];
				if(mediaPlayer["qstail"])
					vidurl += mediaPlayer["qstail"];
				if(window.ActiveXObject)
					vidurl += ";clienttrack=clienttrack";
				if(type == 'url' || type == 'video' || type == 'image')
				{
					//create video in IE / Win
					if(activexVideo)
					{
						var el = document.getElementById("videoplug" + this.playerID);

						// NOTE: redneck doubleclick detection
						var now = new Date().getTime();
						if(now - this.lastClickTime <= 3000)
						{
							//////debug.println("Waiting " + (now - this.lastClickTime));
							return;
						}
						else
						{
							this.lastClickTime = now;
						}

						//control functions
						function callStop() {
							if(mediaPlayer.controls[self.playerID] && mediaPlayer.controls[self.playerID].enabled) {
								el.controls.stop();
							}

						}
						function callPause() {
							if(mediaPlayer.controls[self.playerID] && mediaPlayer.controls[self.playerID].enabled) {
								el.controls.pause();
								mediaPlayer.controls[self.playerID].getPlay().className = "control play";
							}
						}
						function callFastReverse() {
							if(mediaPlayer.controls[self.playerID] && mediaPlayer.controls[self.playerID].enabled) {
								el.controls.fastReverse();
							}
						}

						function callPlay() {
							//debug(getStateString(el.playState));
							if(mediaPlayer.controls[self.playerID] && mediaPlayer.controls[self.playerID].enabled) {
								//if the player is playing, pause it.
								if(el.playState == 3) {
									el.controls.pause();
								//create a new player with the specified video (PLAYME)
								} else if (el.playState == 0) {
									player.hasTimedOut = false;
									mediaPlayer.getInstance(self.playerID).createPlayer("video",mediaPlayer.controls[self.playerID].PLAYME,true,"none");
									//enable seeking if required
									if(mediaPlayer.controls[self.playerID].seekEnabled && mediaPlayer.controls[self.playerID].enabled) {
										mediaPlayer.controls[self.playerID].startSeek();
									}
								} else {
									el.controls.play();
									player.hasTimedOut = false;
								}
							}
						}

						// IMPORTANT: call plugin.close() before removing an active player
						if(el != null)	{
							// //////debug.println("Player present, closing....");
							// el.controls.stop();
							el.close();
							if(mediaPlayer.adDetect[this.playerID]) {
								mediaPlayer.adDetect[this.playerID].stop();
							}
						} else {
							el = document.createElement("object");
							el.id = "videoplug"+this.playerID;
							el.setAttribute("classid","CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6");
							el.setAttribute("codebase","http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701");
							el.setAttribute("standby","Loading");
							el.setAttribute("type","application/x-oleobject");
							el.setAttribute("width","100%");
							el.setAttribute("height","100%");
							el.stretchToFit = true;
							el.autoStart = autoplay;
							el.windowlessvideo = true;
							el.uiMode = uiMode;
							document.getElementById(this.playerID).appendChild(el);
							// Add Advertising Audit DIV
							var adaudit = document.createElement("div");
							adaudit.style.display = 'none';
							adaudit.id = this.playerID+'adaudit';
							document.getElementById(this.playerID).appendChild(adaudit);
							document.getElementById("videoplug"+this.playerID).attachEvent("currentItemChange",AdObj.createAdRefreshHandler("videoplug"+this.playerID))}

						//ADDED DDJOHNSON Jun 1, 2006
						//NOTE: PLAYER ATTACHED TO DOCUMENT AT THIS TIME
						//ADD CLICK EVENT LISTENER FOR POPUP AD
						/**
						 * open an Ad window if the current media is an Ad.
						 */
						function playerMouseDown()
						{
							if(el.currentPlaylist && el.currentPlaylist.item(0).getItemInfo("MoreInfoRef") != "")
							{
								window.open(
									el.currentPlaylist.item(0).getItemInfo("MoreInfoRef"),
									"videoadwindow",
									"width=800,height=400,resizable=1,scrollbars=1,status=1,toolbar=1");
							}
						}
						// TODO: use addEvent to register events so we can
						// unload them with the window.  Internet Explorer
						// registers most DOM events using "ON" + event name,
						// while activeX events are registered with just the
						// event name, so addEvent may need to change.
						el.attachEvent("onmousedown", playerMouseDown);
						// addEvent(el,"mousedown",playerMouseDown);

						var self = this;

						//Gets status of video player, changes class name of buttons based on status.
						function statechangeHandler(newstate)
						{
							// SET LIVE STREAM TIMEOUT CONDITION
							player.timeout.test(el);
							
							if(mediaPlayer.controls[self.playerID])
							{
								// ADDED BY BRIANB - HANDLE CALLS TO LIGHTNINGCAST ON PLAYSTATE CHANGE
								var playerObjectDiv = el;
								var auditDiv = adaudit;
								if (typeof lcUpdatePlaylistState != 'undefined') {
									var bannerDiv = document.getElementById(player.audit.companion.elem);
									bannerDiv.style.height = player.audit.companion.height+'px';
									bannerDiv.style.width = player.audit.companion.width+'px';
									lcUpdatePlaylistState(playerObjectDiv, auditDiv, bannerDiv, newstate);
								} 
								switch(newstate)
								{
									//player is stopped
									case 1 :
									//player is paused
									case 2 :
									//player is in fast reverse
									case 5 :
									//ready
									case 10 :
										if(mediaPlayer.controls[self.playerID].enabled) {
											mediaPlayer.controls[self.playerID].getPlay().className = "control play";
										} else {
											mediaPlayer.controls[self.playerID].getPlay().className = "control playoff";
										}
										break;
									//media ended
									case 8 :
									//player is playing
									case 3 :
										if(mediaPlayer.controls[self.playerID] && mediaPlayer.controls[self.playerID].enabled) {
											mediaPlayer.controls[self.playerID].getPlay().className = "control pause";
										} else {
											mediaPlayer.controls[self.playerID].getPlay().className = "control pauseoff";
										}
										break;
									default :
										if(mediaPlayer.controls[self.playerID] && mediaPlayer.controls[self.playerID].enabled) {
											mediaPlayer.controls[self.playerID].getPlay().className = "control pause";
										} else {
											mediaPlayer.controls[self.playerID].getPlay().className = "control pauseoff";
										}
										break;
								}
							}
						}
						el.attachEvent("playstatechange", statechangeHandler);

						function openstatechangeHandler(newstate)
						{
							//window.status = "openstatechangeHandler: " +newstate;
							var pp = document.getElementById("videoplugplayer2");
							if(newstate == 13 && pp.currentMedia)
							{
								var lastEntry = pp.currentMedia.getItemInfo("LastEntry");
								if(lastEntry != "")
									mediaPlayer.playlistHandler[self.playerID]();
							}
						}

						if(mediaPlayer.playlistHandler[self.playerID])
						{
							el.attachEvent("openstatechange", openstatechangeHandler);
						}

						window.attachEvent("onunload", function() {
							window.clearInterval(player.status);
							// el.detachEvent("playstatechange",statechangeHandler);
							// el.detachEvent("openstatechange",openstatechangeHandler);
						});

						//unset timed function below
						if(typeof player.status != "undefined") {
							window.clearInterval(player.status);
						}

						player.status = window.setInterval(function() {
							
							var ps = document && document.getElementById("videoplug"+self.playerID) ?
								 document.getElementById("videoplug"+self.playerID).playState : -1;
							if(ps == -1)
								return;
							if(mediaPlayer.buffering[self.playerID])
							{
								if(ps == 6 || ps == 9)
								{
									document.getElementById(self.playerID).style.display = "none";
									mediaPlayer.buffering[self.playerID].style.display = "block";
								}
								else {
									document.getElementById(self.playerID).style.display = "block";
									mediaPlayer.buffering[self.playerID].style.display = "none";
								}
							}
							var length = (el.controls.currentItem) ? el.controls.currentItem.duration : 1;
							var position = (el.controls) ? el.controls.currentPosition : 1;
							var pct = parseInt(Math.round(((position / length) * 100) * 100) * 0.01);
							if(isNaN(pct))
								pct = 0;
							//See if I need to ping anybody now
							player.audit.exec(el);
							// window.status = getStateString(ps) + ", " + pct + "%";
							if(mediaPlayer.controls[self.playerID])
							{
								if(!mediaPlayer.controls[self.playerID].progressInterrupt) {
									try {
										mediaPlayer.controls[self.playerID].getFill().style.width = pct + "%";
									} catch(ex) {
									}
								}
							}

							if(mediaPlayer.playlistHandler[self.playerID])
							{
								if(pct > 95 && el.currentMedia && el.currentMedia.getItemInfo("LastEntry") != "")
								{
									//window.status = "calling playlistHandler: " + self.playerID;
									mediaPlayer.playlistHandler[self.playerID]();
								}
							}

						}, 100);

						if(mediaPlayer.controls[self.playerID])
						{
							mediaPlayer.controls[self.playerID].getStop().attachEvent("onclick", callStop);
							mediaPlayer.controls[self.playerID].getBack().attachEvent("onclick", callFastReverse);
							mediaPlayer.controls[self.playerID].getPlay().onclick = callPlay;
							mediaPlayer.controls[self.playerID].setEnabled(true);
						}

						//set the url, which starts the video player
						if(el.URL != vidurl) {
							el.URL = vidurl;
							//enable seeking if required
							if(mediaPlayer.controls[self.playerID] && mediaPlayer.controls[self.playerID].seekEnabled) {
								mediaPlayer.controls[self.playerID].startSeek();
							}
						}

						//start preroll ad detection if required
						if(mediaPlayer.adDetect[self.playerID]) {
							mediaPlayer.adDetect[self.playerID].go();
						}
					}
					//create video in other browsers / systems
					else if(embedVideo)
					{
						if(document.getElementById("videoplug"+this.playerID) != null)
							document.getElementById("videoplug"+this.playerID).parentNode.removeChild(
								document.getElementById("videoplug"+this.playerID));
						var str = "<embed showtracker=\"0\" showstatusbar=\"0\" transparentstart=\"1\" showcontrols=\"" + nonIeUiMode + "\""+
									" autostart=\"1\" + type=\"application/x-mplayer2\"" +
									" src=\"" + vidurl + "\"" +
									" id=\"videoplug" + this.playerID + "\""+
									" height=\"100%\" width=\"100%\">";
						document.getElementById(this.playerID).innerHTML = str;
					}
				}
			}
		}
		mediaPlayer.all.push({
			playerID:playerID,
			player:player});
		return player;
	}
};

/***************
* Custom controls
* 	@parent (string: id of div to hold controls)
*	@playerID (string: playerID of mediaPlayer object)
* 	@seekEnabled (boolean: enable/disable user seeking)
* Usage:
* 	mediaPlayer.controls["player"] = new Controls(parent,seekEnabled);
****************/
function Controls(parent,playerID,seekEnabled,detectAds)
{
	this.enabled = false;
	this.progressInterrupt = false;
	this.seekEnabled = seekEnabled;
	this.playerID = playerID ? playerID : false;
	this.detectAds = (typeof detectAds == "undefined") ? true : (detectAds ? detectAds : false);

	var el = document.getElementById(parent).appendChild(document.createElement("div"));
	el.className = "controls";
	this.getControls = function() { return el };

	var back = el.appendChild(document.createElement("div"));
	back.className = "control backoff";
	back.title = "Back";
	this.getBack = function() { return back; }

	var play = el.appendChild(document.createElement("div"));
	play.className = "control playoff";
	play.title = "Play / Pause";
	this.getPlay = function() { return play; }

	var stop = el.appendChild(document.createElement("div"));
	stop.className = "control stopoff";
	stop.title = "Stop";
	this.getStop = function() { return stop; }

	var track = el.appendChild(document.createElement("div"));
	track.className = "track trackoff";
	this.getTrack = function() { return track; }

	var fill = track.appendChild(document.createElement("div"));
	fill.className = "fill filloff";
	this.getFill = function() { return fill; }

	//seek knob
	var seekKnob = false;
	if(this.seekEnabled) {
		seekKnob = this.getFill().appendChild(document.createElement("div"));
		seekKnob.className = "seekKnob";
	}
	this.getSeekKnob = function() { return seekKnob; }

	this.setEnabled = function(b)
	{
		this.enabled = b;
		var str = b ? "" : "off";
		this.getBack().className = "control back" + str;
		this.getPlay().className = "control play" + str;
		this.getStop().className = "control stop" + str;
		this.getTrack().className = "track track" + (b ? "on" : "off");
		this.getFill().className = "fill fill" + (b ? "on" : "off");
		if(this.getSeekKnob()) {
			this.getSeekKnob().className = "seekKnob" + str;
		}
	}

	if(this.seekEnabled) {
		this.initSeek(this.playerID);
	}
	if(this.detectAds) {
		mediaPlayer.adDetect[this.playerID] = new AdDetect(this.playerID);
	}
}

/*******************
*
* Seeking behavior
*
********************/
Controls.prototype.initSeek = function(playerID) {
	this.pl = "videoplug" + playerID;
	this.el = null;
	this.trackwidth = "";
	this.controlsheight = "";
	this.pos = {
		x: 0,
		y: 0,
		trackX: 0,
		mediaDur: 0,
		controlsY: 0
	};

	//div to hold time elapsed / total time
	var timeElapsed = this.getControls().appendChild(document.createElement("div"));
	timeElapsed.className = "timeElapsed";
	this.reportContainer = timeElapsed;

	this.active = true;
	this.track = this.getTrack();
	this.seekKnob = this.getSeekKnob();
	this.t = null; //timer object for progress monitoring
	this.t2 = null; //timer object for dragging progress bar knob
}

/****
 * reset for new video
 */
Controls.prototype.resetSeek = function() {
	window.clearInterval(this.t);
	this.reportContainer.innerHTML = "";
	this.pos.x = 0;
	this.pos.mediaDur = 0;
	this.el = null;
}

/*****
 * call this after video is played
 */
Controls.prototype.startSeek = function() {
	this.trackwidth = this.getTrack().offsetWidth;
	this.controlsheight = this.getControls().offsetHeight;

	//this element doesn't exist until after video starts the first time.
	this.el = document.getElementById(this.pl);

	//find and store beginning x position of progress bar
	var trackCoords = this.getOffset(this.track);
	this.pos.trackX = trackCoords.x;

	//find and store the beginning y position of controls
	var controlsCoords = this.getOffset(this.getControls());
	this.pos.controlsY = controlsCoords.y;

	var self = this;

	if(this.enabled) {
		//track x position over progress bar
		document.attachEvent("onmousemove",function() {
			coords = self.getMouseXY();
			self.pos.x = coords.x;
			self.pos.y = coords.y;
		});

		//allow user to click in progress bar to seek to that position
		this.track.attachEvent("onmouseup",function() {
			self.seekToMousePosition(self);
		});

		//this event monitors dragging of seek knob and repositions knob on x-axis
		this.seekKnob.attachEvent("onmousedown",function() {

			if(self.t2) {
				window.clearInterval(self.t2);
			}

			self.t2 = window.setInterval(function() {
				//interrupt WMP progress bar interval function
				self.progressInterrupt = true;
				self.moveBarToMouseX();
			},10);
		});

		//"drop" seek knob
		this.seekKnob.attachEvent("onmouseup",function() {
			//clear knob timer
			if(self.t2) {
				window.clearInterval(self.t2);
			}
			//allow WMP to resume updating the progress bar
			self.progressInterrupt = false;
		});

		//keeps seek working if user drags off of slider before mouseup
		document.attachEvent("onmouseup",function() {
			if(self.t2) {
				if(self.progressInterrupt) {
					self.moveBarToMouseX();
					//clear knob timer
					window.clearInterval(self.t2);
					//go to position user dragged knob to
					self.seekToMousePosition(self);
					//allow WMP to resume updating the progress bar
					self.progressInterrupt = false;
				}
			}
		});

		// attach event to stop button
		this.getStop().attachEvent("onclick", function() {
			return function() {
				self.resetSeek();
			}
		});

		//monitor elapsed time
		this.t = window.setInterval(function() {
			//record duration of video in seconds (for seeking)
			self.pos.mediaDur = self.el.currentMedia.duration;
			if(self.pos.mediaDur == 0) {
				self.reportContainer.style.display = "none";
			} else {
				self.reportContainer.style.display = "block";
			}
			//update elapsed time report in video controls box
			self.showTime(self.el.controls.currentPosition);
		},1000);
	}
}
/****
 * move slider/progress bar to position
 */
Controls.prototype.moveBarToMouseX = function() {
	//calculate current mouse position in seconds
	var posSeconds = parseInt(((this.pos.x - this.pos.trackX) * this.pos.mediaDur) / this.trackwidth);
	//calculate current mouse position in percent
	var percent = parseInt(((this.pos.x - this.pos.trackX)/this.trackwidth)*100);
	//enforce limits on progress bar width
	if(percent > 99) {
		percent = 99;
	} else if (percent < 1) {
		percent = 1;
	}
	//move progress bar.  knob should be aligned right so it moves, too.
	this.getFill().style.width =  percent + "%";
	//show time of dragged knob
	this.showTime(posSeconds);
}
/****
 * show elapsed time as a string like this: 0:15/4:32
 */
Controls.prototype.showTime = function(seconds) {
	//enforce limits on time display
	if(parseInt(seconds) > parseInt(this.pos.mediaDur)) {
		seconds = this.pos.mediaDur;
	} else if (parseInt(seconds) < 0) {
		seconds = 0;
	}
	//construct time string
	var elapsed = this.timeVal(parseInt(seconds)) + " / ";
	elapsed += this.timeVal(parseInt(this.pos.mediaDur));
	this.reportContainer.innerHTML = elapsed;
}

/****
 * Turn base 10 seconds into base 60 time
 */
Controls.prototype.timeVal = function(seconds) {
	//minutes
	var mins = parseInt(seconds/60);
	//seconds
	var secs = seconds%60;
	if(parseInt(secs) < 10) {
		secs = "0" + secs;
	}
	var time = mins + ":" + secs;
	return time;
}

/*****
 * Calculate mouse position within progress bar, seek to that position in video
 */
Controls.prototype.seekToMousePosition = function(self) {
	//find user mouse position relative to progress bar
	var xRelativePos = self.pos.x - self.pos.trackX;
	//enforce limits on mouse position relative to progress bar
	if(xRelativePos > self.trackwidth) {
		xRelativePos = self.trackwidth - 1;
	} else if (xRelativePos < 1) {
		xRelativePos = 1;
	}
	//turn that number into seconds
	var currentSeconds = parseInt((xRelativePos * self.pos.mediaDur)/self.trackwidth);
	//seek to that time in the video
	if(self.enabled) {
		self.el.controls.currentPosition = currentSeconds;
	}
	return true;
}

/*****
 * Track user mouse position
 * note: this fct is IE-specific...
 */
Controls.prototype.getMouseXY = function(e) {
	var coords = {
		x: event.clientX + document.body.scrollLeft,
		y: event.clientY + document.body.scrollTop
	}
	return coords;
}

/******
 * Get the x offset of an element on the page
 */
Controls.prototype.getOffset = function(el) {
	var coords = {
		x:el.offsetLeft,
		y:el.offsetTop
	}
	var parent = el.offsetParent;
	while(parent != null)
	{
		coords.x += parent.offsetLeft;
		coords.y += parent.offsetTop;
		parent = parent.offsetParent;
	}
	return coords;
}

/***************
* Ad Detection
* 	Disables custom controls based on presence of advertisement
*	@playerID (string: playerID of mediaPlayer object)
* Usage:
* 	init:
* 	mediaPlayer.adDetect["player"] = new AdDetect("player");
****************/
function AdDetect(playerID) {
	this.playerID = playerID ? playerID : false;
	this.timer = null;
	this.currentFileName = null;
	this.isDisabled = false;
	this.adFlags = ["/ads/","/sponsors/"];
}
/*******
* clear timed driver
********/
AdDetect.prototype.stop = function() {
	var self = this;
	if(self.timer != null) {
		window.clearInterval(self.timer);
	}
}
/*****************
* checks <title> attr of asx playlist for "Advertisement:"
******************/
AdDetect.prototype.checkTitle = function() {
	var self = this;
	var title = document.getElementById("videoplug" + self.playerID).currentMedia.getItemInfo("Title");
	if(title.indexOf("Advertisement:") != -1) {
		return true;
	}
	return false;
}

/******************
* checks the path of currently playing file for adFlags (defined above)
******************/
AdDetect.prototype.checkPath = function() {
	var self = this;
	var path = document.getElementById("videoplug" + self.playerID).currentMedia.sourceURL;
	for(var i=0; i<self.adFlags.length;i++) {
		if(path.indexOf(self.adFlags[i]) != -1) {
			return true;
		}
	}
	return false;
}

/*******************
* driver for ad detection / control enabling
*******************/
AdDetect.prototype.go = function() {
	var self = this;
	if(activexVideo && mediaPlayer.controls[this.playerID]) {
		self.timer = window.setInterval(function() {
			if(document.getElementById("videoplug"+self.playerID) == null) return false;
			if(self.checkTitle() || self.checkPath()) {
				//if(!self.isDisabled) {
					mediaPlayer.controls[self.playerID].setEnabled(false);
					self.isDisabled = true;
				//}
			} else {
				if(self.isDisabled) {
					mediaPlayer.controls[self.playerID].setEnabled(true);
					mediaPlayer.controls[self.playerID].getPlay().className = "control pause";
					self.isDisabled = false;
				}
			}
		},750);
		//remove this function on page unload
		if(window.attachEvent) {
			window.attachEvent("onunload",function() {
				self.stop();
			});
		}
	}
}
/*************************
* Write in a "buffering" swf file
* 	this is necessary to avoid an ActiveX component activation bounding box
*	drawn in by Internet Explorer
*
* 	Usage:
*		var url = "http://my.site.com/mybuffer.swf";
*		mediaPlayer.buffering["player"] = new BufferingSwf("buffer",url).loadSwf();
*************************/
function BufferingSwf(bufferingId,url) {
	this.url = url;
	this.bufferingId = bufferingId;
}
BufferingSwf.prototype.loadSwf = function() {
	var parent = document.getElementById(this.bufferingId);
	var embed = '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ';
		embed += 'codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0"';
		embed += 'width="100%" height="100%" id="buffering" align="middle">';
		embed += '<param name="allowScriptAccess" value="sameDomain" />';
		embed += '<param name="bgcolor" value="#000000" />';
		embed += '<param name="quality" value="high" />';
		embed += '<param name="movie" value="';
		embed += this.url;
		embed += '" />';
		embed += '<embed src="';
		embed += this.url;
		embed += '"  quality="high" bgcolor="#000000" width="100%" height="100%" ';
		embed += 'align="middle" allowScriptAccess="sameDomain"  type="application/x-shockwave-flash" ';
		embed += 'pluginspage="http://www.macromedia.com/go/getflashplayer" />';
		embed += '</object>';
	parent.innerHTML = embed;
	return parent;
}


var stateStrings = ["Stopped","Paused","Playing","ScanForward",
					"ScanReverse","Buffering","Waiting","MediaEnded",
					"Transitioning","Ready","Reconnecting"];
function getStateString(i)
{
	return i > 0 && i < stateStrings.length ? stateStrings[i-1] : null;
}

addEvent(window,"load",
	function()
	{
		// Can't do much without pageProps
		if(typeof pageProps == "undefined")
			return;
		
		// if 'PlayerFactory' is present, the page already has its
		// own companion ad item change handlers
		//if(typeof PlayerFactory != "undefined")
		///	return;
		
		// if(/\x2Fvideo\x2F/.exec(window.location.href) != null)
			// return;
		AdObj.create("banner1", "728x90", "-1", (pageProps.coid ? String(pageProps.coid) : "-1"), pageProps.sectiontag);

		/*
		 if(document.getElementById("videoplug") &&
			document.getElementById("videoplug").attachEvent)
		{
			document.getElementById("videoplug").attachEvent(
				"currentItemChange",
				AdObj.createAdRefreshHandler("videoplug"));
		}
		*/
	}
);


// 
// End national_js scripts

