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); } }