import mx.utils.Delegate;
import flash.display.*;
import lineupGrid;
class nwPlayer{
//---------------------------------
// Player Settings
private var _pX:Number = null;
public function get pX():Number { return _pX; }
public function set pX(pX:Number):Void {
_pX = pX;
if (_loaded == true) { _root.bcPlayer._x = _pX; }
if (_root.playerStill) { _root.playerStill._x = _pX; }
}
private var _pY:Number = null;
public function get pY():Number { return _pX; }
public function set pY(pY:Number):Void {
_pY = pY;
if (_loaded == true) { _root.bcPlayer._y = _pY; }
if (_root.playerStill) { _root.playerStill._y = _pY; }
}
private var _pWidth:Number = null;
public function get pWidth():Number { return _pWidth; }
public function set pWidth(pWidth:Number):Void {
_pWidth = pWidth;
if (_loaded == true) { _root.bcPlayer.setSize(_pWidth, _pHeight); }
if (_root.playerStill) { _root.playerStill._width = _pWidth; }
}
private var _pHeight:Number = null;
public function get pHeight():Number { return _pHeight; }
public function set pHeight(pHeight:Number):Void {
_pHeight = pHeight;
if (_loaded == true) { _root.bcPlayer.setSize(_pWidth, _pHeight); }
if (_root.playerStill) { _root.playerStill._height = _pHeight; }
}
private var _pAutoStart:Boolean = null;
public function get pAutoStart():Boolean { return _pAutoStart; }
public function set pAutoStart(pAutoStart:Boolean):Void { _pAutoStart = pAutoStart; }
private var _pAdURL:String = null;
public function get pAdURL():String { return _pAdURL; }
public function set pAdURL(pAutoStart:String):Void { _pAdURL = pAdURL; }
private var _pDepth:Number = null;
public function get pDepth():Number { return _pDepth; }
public function set pDepth(pDepth:Number):Void { _pDepth = pDepth; }
private var _volume:Number = 100;
public function get volume():Number { return _volume; }
public function set volume(volume:Number):Void {
_volume = volume;
_root.bcPlayer.setVolume(volume);
}
private var _mute:Boolean = false;
public function get mute():Boolean { return _mute; }
public function set mute(mute:Boolean):Void {
_mute = mute;
if (_mute == false) {
_root.bcPlayer.setVolume(_volume);
} else {
_root.bcPlayer.setVolume(0);
}
}
private var _flashId:String = null;
public function get flashId():String { return _flashId; }
public function set flashId(flashId:String):Void { _flashId = flashId; }
private var bcln:Object = new Object(); // Listener
private var movie:MovieClip = null;
//---------------------------------
// Player States
private var _loaded:Boolean = null;
public function get loaded():Boolean { return _loaded; }
public function set loaded(loaded:Boolean):Void { _loaded = loaded; }
private var _isAdMode:Boolean = null;
public function get isAdMode():Boolean { return _isAdMode; }
public function set isAdMode(isAdMode:Boolean):Void { _isAdMode = isAdMode; }
private var _isLoading:Boolean = null;
public function get isLoading():Boolean { return _isLoading; }
public function set isLoading(isLoading:Boolean):Void { _isLoading = isLoading; }
private var _isPlaying:Boolean = null;
public function get isPlaying():Boolean { return _isPlaying; }
public function set isPlaying(loaded:Boolean):Void { _isPlaying = isPlaying; }
private var _isBuffering:Boolean = null;
public function get isBuffering():Boolean { return _isBuffering; }
public function set isBuffering(isBuffering:Boolean):Void { _isBuffering = isBuffering; }
//---------------------------------
// Title Settings
// IDs
private var _bctid:Number = null;
public function get bctid():Number { return _bctid; }
private var _bclid:Number = null;
public function get bclid():Number { return _bclid; }
private var _bcpid:Number = null;
public function get bcpid():Number { return _bcpid; }
// Current Title
private var _title:Object;
public function get title():Object { return _title; }
public function set title(title):Void {
_title = arguments[0];
update();
}
//---------------------------------
// Feed Properties
private var _feedNum:Number = 0;
public function get feedNum():Number { return _feedNum; }
public function set feedNum(feedNum:Number):Void { _feedNum = feedNum; }
private var _numItems:Number = null;
public function get numItems():Number { return _numItems; }
public function set numItems(numItems:Number):Void { _numItems = numItems; }
private var _bcXML:Object = null;
public function get bcXML():Object { return _bcXML; }
public function set bcXML(bcXML:Object):Void { _bcXML = bcXML; }
//---------------------------------
// Lineup Grid Properties
private var _lgCount:Number = null;
//---------------------------------
// Object References
private var _guiPath:MovieClip = null;
public function get guiPath():MovieClip { return _guiPath; }
public function set guiPath(loaded:MovieClip):Void { _guiPath = guiPath; }
private var _lgPath:MovieClip = null;
public function get lgPath():MovieClip { return _lgPath; }
public function set lgPath(loaded:MovieClip):Void { _lgPath = lgPath; }
//---------------------------------
// Class Constructor
public function nwPlayer(bcpid:Number, pWidth:Number, pHeight:Number, pX:Number, pY:Number, pAutoStart:Boolean, pDepth:Number, pAdURL:String, flashId:String) {
_bcpid = bcpid;
_pWidth = pWidth;
_pHeight = pHeight;
_pX = pX;
_pY = pY;
_pAutoStart = pAutoStart;
_loaded = false;
_pDepth = pDepth;
_flashId = flashId;
_pAdURL = pAdURL;
if (!_feedNum) { _feedNum = 0; }
_global.nwPlayer = this; // Set a Global Reference
}
//---------------------------------
// Init Auto-Refresh
public function startActiveUpdate():Void {
// Update that is ran on loop, runs function below
setInterval(this, "activeUpdate", 1000);
}
//---------------------------------
// Auto-Refresh
public function activeUpdate():Void {
// Update that is ran on loop
// UPDATE LINK BAR
// RELATED LINK WITH LINK BAR CONTENT
if (_global.nwPlayer.title.linkURL && _root.linkBar != "") {
_root.guiLinkBar.htmlText = ("" + _global.nwPlayer.title.linkText + " | " + _root.linkBar);
// LINK BAR, but NO RELATED LINK
} else if (_root.linkBar != "") {
_root.guiLinkBar.htmlText = (_root.linkBar);
// RELATED LINK, but NO LINK BAR
} else if (_global.nwPlayer.title.linkURL) {
_root.guiLinkBar.htmlText = ("" + _global.nwPlayer.title.linkText + "")
// NO RELATED LINK, NO LINK BAR
} else {
_root.guiLinkBar.htmlText = "";
}
// UPDATE GUI WHILE VIDEO IS PLAYING
if (_root.bcPlayer.isPlaying() == true) { // If Brightcove says the video is playing...
_isPlaying = true; // Flag locally
_isAdMode = false; // Flag the fact that the ad is not playing
_isLoading = false; // Flag the fact that the ad is not loading
// Hide All Buttons, except Pause
_root.guiPauseButton._visible = true;
_root.guiPlayButton._visible = false;
_root.guiPlayButtonDisabled._visible = false;
// Update Time Displays
for(var val:String in _root.guiStatusRefs) {
_root.guiStatusRefs[Number(val)].text = _root.bcPlayer.getVideoPosition(true) + " / " + _root.bcPlayer.getVideoDuration(true);
}
//_root.guiPlayButton.enabled = true; // Don't think we need this...
// UPDATE GUI WHILE ADVERTISEMENT IS PLAYING
} else if (_isAdMode == true || _isLoading == true) {
if (_isAdMode == true) {
// Update Titles
for(var val:String in _root.guiTitleRefs) {
_root.guiTitleRefs[Number(val)].text = "Coming Up: " + _bcXML[_feedNum].title;
addHEllipse(_root.guiTitleRefs[Number(val)]);
}
// Update Descriptions
for(var val:String in _root.guiDescriptionRefs) {
_root.guiDescriptionRefs[Number(val)].text = "Advertisement - Your selection will begin momentarily";
}
// Update Time Displays
for(var val:String in _root.guiStatusRefs) {
_root.guiStatusRefs[Number(val)].text = " ... ";
}
} else {
// Update Titles
for(var val:String in _root.guiTitleRefs) {
_root.guiTitleRefs[Number(val)].text = "";
}
// Update Descriptions
for(var val:String in _root.guiDescriptionRefs) {
_root.guiDescriptionRefs[Number(val)].text = "";
}
// Update Time Displays
for(var val:String in _root.guiStatusRefs) {
_root.guiStatusRefs[Number(val)].text = " ... ";
}
}
// Hide All Buttons, except Play
_root.guiPauseButton._visible = false;
_root.guiPlayButton._visible = false;
_root.guiPlayButtonDisabled._visible = true;
// UPDATE GUI WHILE VIDEO IS STOPPED OR NOT ACTIVE
} else {
_isPlaying = false; // Flag locally
_isAdMode = false;
_isLoading = false; // Flag the fact that the ad is not loading
// Hide All Buttons, except Play
_root.guiPauseButton._visible = false;
_root.guiPlayButton._visible = true;
_root.guiPlayButtonDisabled._visible = false;
}
// Update the Linear Nav (Upper Right Hand Corner)
_root.guiFeedNum.text = Number(Number(_feedNum) + 1) + "/" + Number(_numItems);
}
//---------------------------------
// MANUAL REFRESH
public function update():Void {
// Overload Option: Make all fields blank: update("clear");
if (arguments[0] == "clear") {
// Clear All Titles
for(var val:String in _root.guiTitleRefs) {
_root.guiTitleRefs[Number(val)].text = "";
}
// Clear All Descriptions
for(var val:String in _root.guiDescriptionRefs) {
_root.guiDescriptionRefs[Number(val)].text = "";
}
// Regular Function: update();
} else {
// If FeedNum isn't defined, default to 0
if (!_feedNum) { _feedNum = 0; }
// Update Titles
for(var val:String in _root.guiTitleRefs) {
_root.guiTitleRefs[Number(val)].text = _bcXML[_feedNum].title;
addHEllipse(_root.guiTitleRefs[Number(val)]);
}
// Update Descriptions
for(var val:String in _root.guiDescriptionRefs) {
_root.guiDescriptionRefs[Number(val)].text = _bcXML[_feedNum].description;
}
// Set Link Bar Text Format
_root.guiLinkBar.setTextFormat(_root.linkBarFmt);
// Update the Linear Nav (Upper Right Hand Corner)
_root.guiFeedNum.text = Number(Number(_feedNum) + 1) + "/" + Number(_numItems);
// UPDATE WHEN PLAYER ISN'T LOADED OR LOADING!
if (_loaded != true && _isLoading != true) {
// Load Still over Video
var playerStill:MovieClip = _root.createEmptyMovieClip("playerStill", _pDepth + 1);
playerStill._x = _pX;
playerStill._y = _pY;
// Update Still
var imgListener:Object = new Object();
var img_mcl:MovieClipLoader = new MovieClipLoader();
img_mcl.addListener(imgListener);
img_mcl.loadClip(_bcXML[_feedNum].still, _root.playerStill);
imgListener.onLoadComplete = function(target_mc:MovieClip, status:Number):Void {
target_mc.onEnterFrame = function() {
_root.playerStill._width = _global.nwPlayer._pWidth;
_root.playerStill._height = _global.nwPlayer._pHeight;
// Allow Play / Load on Click
_root.playerStill.onRelease = function() {
_root.guiPlayButton.onRelease();
}
this.onEnterFrame = undefined; // remove the loop now we have changed things
}
}
}
}
}
//---------------------------------
// LINEUP CONSTRUCTION (Pulls in LineupGrid.as
public function generateLineupGrid(lgPath:MovieClip, numCols:Number, numRows:Number, padding:Number, resize:Boolean, numItems:Number):Void {
// Initiate Lineup Object
_global.lineupGrid = new lineupGrid(lgPath, numCols, numRows, padding, resize, numItems); // LineupGrid Constructor
}
//---------------------------------
// SET NEW PLAYER POSITION
function setPlayerPosition(x:Number, y:Number, width:Number, height:Number):Void {
// Move Player
_global.nwPlayer.pX = x;
_global.nwPlayer.pY = y;
_global.nwPlayer.pWidth = width;
_global.nwPlayer.pHeight = height;
}
//---------------------------------
// CROP LONG TEXT HORIZONTALLY WITH AN ELLIPSE ...
public function addHEllipse(tf:TextField):Void {
var ELLIPSIS:String="..."
var origText:String = tf.text;
var textArray:Array = origText.split("");
var finalText:String;
tf.text = "";
for (var i:Number = 0; i=tf._width - 10) {
finalText = finalText.substr(0, finalText.length - 3) + "...";
tf.text = finalText;
break;
}
}
}
//---------------------------------
// Load Brightcove Media RSS
public function loadPlayerFeed(xmlFeed:String):Void {
// Fills the bcXML object with data from an RSS feed
trace("Loading XML ...");
var xmlBC = new XML();
xmlBC.ignoreWhite = true;
xmlBC.load(xmlFeed);
xmlBC.onLoad = function(success) {
trace("XML Loaded.");
var bcDataObject:Object = new Object();
if (success) {
var aNodes:Array = xmlBC.firstChild.firstChild.childNodes;
var j:Number = 0;
for(var i:Number = 0; i < aNodes.length; i++) {
if (aNodes[i].nodeName != "item") {
bcDataObject[aNodes[i].nodeName] = aNodes[i].firstChild.nodeValue;
} else {
var bcTitle:Object = new Object();
bcTitle["title"] = aNodes[i].childNodes[0].firstChild.nodeValue;
bcTitle["link"] = aNodes[i].childNodes[1].firstChild.nodeValue;
bcTitle["description"] = aNodes[i].childNodes[2].firstChild.nodeValue;
bcTitle["guid"] = aNodes[i].childNodes[3].firstChild.nodeValue;
bcTitle["pubdate"] = aNodes[i].childNodes[4].firstChild.nodeValue;
bcTitle["still"] = aNodes[i].childNodes[5].attributes.url;
bcTitle["thumb"] = aNodes[i].childNodes[6].attributes.url;
bcTitle["playerid"] = aNodes[i].childNodes[7].firstChild.nodeValue;
bcTitle["lineupid"] = aNodes[i].childNodes[8].firstChild.nodeValue;
bcTitle["titleid"] = aNodes[i].childNodes[9].firstChild.nodeValue;
bcDataObject[j] = bcTitle;
j++;
}
}
_global.nwPlayer.bcXML = bcDataObject;
if (_root.onFeedLoaded()) { _root.onFeedLoaded(); }
}
}
}
//---------------------------------
// Load a Title / Launch Player
public function loadTitle(bctid:Number, bclid:Number):Void {
// If the player isn't loaded, wait a moment, then launch player and play
if (_global.nwPlayer.loaded != true && _global.nwPlayer.isLoading != true) {
_isLoading = true;
_root.playerStill.unloadMovie();
_root.bcPlayer._visible = false;
_root.createEmptyMovieClip("waitMC", _root.getNextHighestDepth());
var i = 0;
// Wait 1 Seconds --> Increasing this wait time seems to positively effect the ability for the template to load
_root.waitMC.onEnterFrame = function() {
if (i < 1) {
i++;
} else {
_global.nwPlayer.launchPlayer(bctid, bclid);
_root.waitMC.onEnterFrame = null;
}
}
// If the player is already loaded, switch videos
} else if (_global.nwPlayer.loaded == true) {
_root.bcPlayer.fetchTitleById(bctid);
}
}
//---------------------------------
// Load a Title from Feed
public function loadPlayerFeedNum(feedNum:Number, playFlag:Boolean):Void {
// Loads a feed item into the player, only auto-updates if player is already loaded
_feedNum = feedNum;
_bctid = _bcXML[arguments[0]].titleid;
_bclid = _bcXML[arguments[0]].lineupid;
trace("Item #" + Number(_feedNum) + " loaded from feed.");
if (playFlag == true) {
loadTitle(_bcXML[arguments[0]].titleid, _bcXML[arguments[0]].lineupid);
}
_root.pauseAndFade();
update();
}
//---------------------------------
// Launch the Player
public function launchPlayer(bctid:Number, bclid:Number):Void {
// Launch the BrightCove player
trace("Loading Player ... ");
var config = new Object();
config["videoId"] = bctid;
config["videoRef"] = null; //the default video loaded into the player by ref id specified in console
config["lineupId"] = bclid; //the default lineup loaded into the player
config["playerTag"] = null; //player tag used for identifying this page in brightcove reporting
config["autoStart"] = true; //tells the player to start playing video on load
config["width"] = Math.round(_pWidth);
config["height"] = Math.round(_pHeight);
config["playerId"] = _bcpid;
//config["playerId"] = 155868114;
config["flashId"] = _flashId; // determines under which id the SWF will be embedded in the HTML
config["adServerURL"] = _pAdURL;
var movie:MovieClip = _root;
bcln.onLoadInit = function(player:MovieClip):Void {
if (player != _root.bcPlayer) _root.bcPlayer.unloadMovie();
_root.bcPlayer = player;
trace("Player Loaded.");
_root.bcPlayer.onTemplateLoadStart = function() {
trace("Loading Template ... ");
_root.txtPlayerTitle.text = "Template Init Fired...";
}
_root.bcPlayer.onTemplateLoadProgress = function(bytesLoaded:Number, bytesTotal:Number) {
trace("Loading Template: " + Math.round((bytesLoaded / bytesTotal) * 100) + "% of " + Math.round((bytesTotal/1024)) + " kilobytes" );
_root.txtPlayerTitle.text = "Template Loading " + bytesLoaded + " of " + bytesTotal;
if (bytesLoaded >= bytesTotal) {
}
}
_root.bcPlayer.onTemplateLoaded = function() {
trace("Template Loaded, Video Ready, API Ready");
_global.nwPlayer.loaded = true;
_global.nwPlayer.isLoading = false;
_root.bcPlayer._visible = true;
var dataListener:Object = new Object();
// Custom onLoad
if (_root.onAPIReady()) { _root.onAPIReady(); }
// Player Events (from API)
_root.bcPlayer.addEventListener("lineupLoad", dataListener);
dataListener.lineupLoad = function(event:Object):Void {
trace("Lineup retrieved from Server ... ");
_global.nwPlayer.lineup = event.parameters.lineup;
for(var val:String in event.parameters.lineup) {
trace("Lineup Properties | Name:" + val + " Value: " + event.parameters.lineup[val]);
}
}
_root.bcPlayer.addEventListener("titleLoad", dataListener);
dataListener.titleLoad = function(event:Object):Void {
trace("Title retrieved from Server ... ");
_global.nwPlayer.title = event.parameters.title;
if (_root.firstRun != true) {
_root.bcPlayer.loadTitleById(event.parameters.title.id);
}
_root.firstRun = false;
}
_root.bcPlayer.addEventListener("mediaComplete", dataListener);
dataListener.mediaComplete = function(event:Object):Void {
var goTo:Number = Number(_global.nwPlayer.feedNum) + 1;
if (goTo < _global.nwPlayer.numItems) {
_root.guiFeedNum.text = goTo + "/" + _global.nwPlayer.numItems;
_global.nwPlayer.loadPlayerFeedNum(goTo, true);
_global.lineupGrid.resetcellStates();
_global.lineupGrid.lg[_global.nwPlayer.feedNum].cellState = "selected";
}
}
_root.bcPlayer.addEventListener("adLoadStart", dataListener);
dataListener.adLoadStart = function(event:Object):Void {
_global.nwPlayer.isAdMode = true;
_global.nwPlayer.activeUpdate();
_root.guiPlayButton.enabled = false;
_root.guiPlayButton._visible = false;
_root.guiPauseButton._visible = false;
_root.guiPlayButtonDisabled._visible = true;
}
_root.bcPlayer.addEventListener("adStop", dataListener);
dataListener.adStop = function(event:Object):Void {
_global.nwPlayer.isAdMode = false;
_global.nwPlayer.update();
_root.guiPlayButton.enabled = true;
_root.guiPlayButton._visible = false;
_root.guiPauseButton._visible = true;
_root.guiPlayButtonDisabled._visible = false;
for(var val:String in _root.guiStatusRefs) {
_root.guiStatusRefs[Number(val)].text = " 00:00 / 00:00 ";
}
}
}
}
bcln.onLoadProgress = function(player:MovieClip, bytesLoaded:Number, bytesTotal:Number):Void {
trace("Loading Player: " + Math.round((bytesLoaded / bytesTotal) * 100) + "% of " + Math.round((bytesTotal/1024)) + " kilobytes" );
_root.bcPlayer._visible = false;
//_root.txtPlayerTitle.text = "P. Loading " + bytesLoaded + " of " + bytesTotal;
if (bytesLoaded == bytesTotal) {
//_root.txtPlayerTitle.text = "Player Loaded...";
}
}
bcln.onLoadComplete = function(player:MovieClip):Void {
//_root.txtPlayerTitle.text = "Player Load Complete...";
}
System.security.allowDomain("*");
System.security.allowInsecureDomain("*");
var servicesURL:String = "http://services.brightcove.com/services";
var cdnURL:String = "http://admin.brightcove.com";
var unique = new Date().getTime();
var file:String = cdnURL + "/viewer/federated.swf?playerId="+escape(config["playerId"])+
"&playerWidth="+escape(config["width"])+
"&playerHeight="+escape(config["height"])+
"&playerTag="+escape(config["playerTag"])+
"&flashId="+escape(config["flashId"])+
"&autoStart="+escape(config["autoStart"])+
"&videoId="+escape(config["videoId"])+
"&videoRef="+escape(config["videoRef"])+
"&lineupId="+escape(config["lineupId"])+
"&servicesURL="+escape(servicesURL)+
"&adServerURL="+escape(config["adServerURL"])+
"&additionalAdTargetingParams="+escape(config["additionalAdTargetingParams"])+
"&continuousPlay="+escape(config["continuousPlay"])+
"&playAll="+escape(config["playAll"])+
"&maximized="+escape(config["maximized"])+
"&cdnURL="+escape(cdnURL)+
"&preloaderURL="+escape(config["preloaderURL"])+
"&buildNumber=" + 93 +
"&" + unique;
var player:MovieClip = _root.createEmptyMovieClip("bcPlayer", _pDepth);
_root.txtPlayerTitle.text = "QString: " + file;
player._x = _pX;
player._y = _pY;
// Load Movie Clip
var mcl:MovieClipLoader = new MovieClipLoader();
mcl.addListener(bcln);
mcl.loadClip(file, player);
}
}