/**
* Captions display management of the players MCV pattern.
*
* @author Jeroen Wijering
* @version 1.3
**/
import com.jeroenwijering.players.*;
import com.jeroenwijering.utils.CaptionsParser;
import flash.filters.DropShadowFilter;
class com.jeroenwijering.players.CaptionsView extends AbstractView {
/** The current volume **/
private var parser:CaptionsParser;
/** The captions array **/
private var captions:Array;
/** The current elapsed time **/
private var currentTime:Number;
/** The captions textfield **/
private var clip:MovieClip;
/** Boolean for captionate captions **/
private var captionate:Boolean = false;
/** Time of last caption **/
private var capTime:Number;
/** Captionate track to use **/
private var capTrack:Number = 0;
/** Constructor, loads caption file. **/
function CaptionsView(ctr:AbstractController,cfg:Object,fed:Object) {
super(ctr,cfg,fed);
var ref = this;
Stage.addListener(this);
parser = new CaptionsParser();
parser.onParseComplete = function() {
this.parseArray.sortOn("bgn",Array.NUMERIC);
ref.captions = this.parseArray;
delete this;
}
clip = config["clip"].captions;
setDimensions();
};
/** onLoad override, sets capture sizes. **/
private function setDimensions() {
clip.txt.autoSize = "center";
clip.bck._height = clip.txt._height + 10;
if(Stage["displayState"] == "fullScreen") {
clip._width = Stage.width;
clip._yscale= clip._xscale;
clip._y = Stage.height - clip._height;
} else {
clip._width = config["displaywidth"];
clip._yscale = clip._xscale;
clip._y = config["displayheight"] - clip._height;
}
if(System.capabilities.version.indexOf("7,0,") == -1) {
var blr = 2 + Math.round(clip._yscale/100);
var flt = new flash.filters.DropShadowFilter(
0,0,0x000000,1,blr,blr,50,2);
clip.filters = new Array(flt);
}
};
/** parse a new captions file every time an item is set **/
private function setItem(idx:Number) {
captions = new Array();
if(feeder.feed[idx]["captions"] == undefined) {
clip.bck._alpha = 0;
} else if(feeder.feed[idx]["captions"].indexOf("captionate") > -1 ||
feeder.feed[idx]["captions"] == "true") {
captionate = true;
var tck = Number(feeder.feed[idx]["captions"].substr(-1));
trace("TRACK: "+tck);
if(isNaN(tck)) {
capTrack = 0;
} else {
capTrack = tck;
}
} else {
parser.parse(feeder.feed[idx]["captions"]);
}
};
/** Check elapsed time, evaluate captions every second. **/
private function setTime(elp:Number,rem:Number) {
if(Math.round(elp) != currentTime) {
currentTime = Math.round(elp);
if (captionate == false) {
setCaption();
} else if (Math.abs(elp-capTime) > 5) {
clip.txt.htmlText = "
";
}
}
};
/** Check if a new caption should be displayed **/
private function setCaption() {
var nxt:Number = captions.length;
for (var i=0; i currentTime) {
nxt = i;
break;
}
}
if(captions[nxt-1]["bgn"] + captions[nxt-1]["dur"] > currentTime) {
clip.txt.htmlText = captions[nxt-1]["txt"];
if(System.capabilities.version.indexOf("7,0,") > -1) {
clip.bck._alpha = 50;
clip.bck._height = Math.round(clip.txt._height + 10);
} else {
clip.bck._height = Math.round(clip.txt._height + 15);
}
if(Stage["displayState"] == "fullScreen") {
clip._y = Stage.height - clip._height;
} else {
clip._y = config["displayheight"] - clip._height;
}
} else {
clip.txt.htmlText = "";
}
};
/** Captionate input **/
public function onCaptionate(cap:Array) {
clip.txt.htmlText = cap[capTrack];
capTime = currentTime;
};
/** OnResize Handler: catches stage resizing **/
public function onResize() { setDimensions(); };
/** Catches fullscreen escape **/
public function onFullScreen(fs:Boolean) {
if(fs == false) { setDimensions(); }
};
}