0) {
IVService.url = configFile.settings[0].videoList;
loadVideoPlayListFromConfig = true;
IVService.send();
}else {
loadVideoPlayListFromConfig = false;
}
videoDir = configFile.settings[0].videoDir;
}
public function setVideoFeed(myFeed:String):void {
IVService.url = myFeed;
loadVideoPlayListFromConfig = false;
IVService.send();
}
private function IVServiceResultHandler(event:ResultEvent):void {
videoFeed = event.result as XML;
if(!loadVideoPlayListFromConfig){
startInteractiveVideo();
}
}
public function startInteractiveVideo():Boolean {
//this.visible = true;
currentSubject = 0;
currentVideo = 0;
gameScore = 0;
updateGameScoreLabel();
subjectNameTraceArray = new Array();
videoFileTraceArray = new Array();
overlayArray = new Array();
clickOverlay1SubjectName = "";
clickOverlay2SubjectName = "";
clickOverlay3SubjectName = "";
timerArray = new Array();
gameScoreArray = [0];
extraQuestionScoreArray = [0];
overlay1Array = new Array();
overlay2Array = new Array();
overlay3Array = new Array();
videoDisplay.source= "";
videoDisplay.initialize();
if(findFirstPlayableVideoForAllSubjects()) {
handlePlayVideo();
return true;
}
else {
stopInteractiveVideo();
return false;
}
}
public function stopInteractiveVideo():void {
//this.visible = false;
videoDisplay.close();
dispatchEvent(new InteractiveVideoEvent(InteractiveVideoEvent.COMPLETE));
}
private function updateGameScoreLabel():void {
currentScoreLabel.text = (gameScore * SCORE_MULTIPLIER).toString();
}
public function outputPlayedSubjects():Array {
dpPlayedSubjects = new Array();
var string:String = "";
for (var i:int = 0; i < subjectNameTraceArray.length; i++) {
if(string != subjectNameTraceArray[i]) {
string = subjectNameTraceArray[i];
dpPlayedSubjects.push(string);
dpPlayedSubjects.push("|");
}
}
dpPlayedSubjects.push("End");
return dpPlayedSubjects;
}
public function getGameScore():String {
return (gameScore * SCORE_MULTIPLIER).toString();
}
private function findFirstPlayableVideo():Boolean {
var filename:String;
while(currentVideo < videoFeed.subject[currentSubject].videos.video.length()) {
if (videoFeed.subject[currentSubject].videos.video[currentVideo].@file.length() > 0) {
return true;
}
currentVideo++;
gameScoreArray.push(0);
extraQuestionScoreArray.push(0);
}
return false;
}
private function findFirstPlayableVideoForAllSubjects():Boolean {
while(currentSubject < videoFeed.subject.length()) {
if(findFirstPlayableVideo()) {
return true;
}
currentSubject++;
currentVideo = 0;
gameScoreArray.push(0);
extraQuestionScoreArray.push(0);
}
return false;
}
private function previousVideo():void {
if(subjectNameTraceArray.length < 2) return;
stopOverlayTimers();
//First pop data of currently playing video
subjectNameTraceArray.pop();
videoFileTraceArray.pop();
gameScore -= gameScoreArray.pop();
gameScore -= extraQuestionScoreArray.pop();
//Now pop and store previous video data
var previousSubject:String = subjectNameTraceArray.pop();
var previousVideo:String = videoFileTraceArray.pop();
gameScore -= extraQuestionScoreArray.pop();
currentSubject = videoFeed.subject.(longname == previousSubject).childIndex();
currentVideo =
videoFeed.subject[currentSubject].videos.video.(@file == previousVideo).childIndex();
extraQuestionScoreArray.push(0);
updateGameScoreLabel();
handlePlayVideo();
}
private function nextVideo():void {
videoDisplay.dispatchEvent(new VideoEvent("complete"));
}
private function pauseVideo():void {
var i:int;
if(videoDisplay.playing) {
for (i = 0; i < timerArray.length; i++) {
timerArray[i].stop();
var newTime:int = overlayArray[i].time - videoDisplay.playheadTime;
timerArray[i] = new Timer(newTime*1000,1);
timerArray[i].addEventListener(TimerEvent.TIMER, createOverlayDelayed);
}
videoDisplay.pause();
}
else {
for (i = 0; i < timerArray.length; i++) {
timerArray[i].start();
}
videoDisplay.play();
}
}
private function goToVideoBySubjectName(subjectName:String):void {
if (//(subjectName != "") &&
(videoFeed.subject.(@name == subjectName).videos.video.length() > 0)) {
currentSubject = videoFeed.subject.(@name == subjectName).childIndex();
currentVideo = 0;
gameScoreArray.push(0);
extraQuestionScoreArray.push(0);
if(findFirstPlayableVideo()) {
gameScore += int(videoFeed.subject[currentSubject].score);
gameScoreArray[gameScoreArray.length-1] += int(videoFeed.subject[currentSubject].score);
updateGameScoreLabel();
handlePlayVideo();
}
}
else {
stopInteractiveVideo();
}
}
private function handleClickOverlay(subjectName:String):void {
stopOverlayTimers();
goToVideoBySubjectName(subjectName);
}
private function clickOverlay1(event:MouseEvent):void {
handleClickOverlay(clickOverlay1SubjectName);
}
private function clickOverlay2(event:MouseEvent):void {
handleClickOverlay(clickOverlay2SubjectName);
}
private function clickOverlay3(event:MouseEvent):void {
handleClickOverlay(clickOverlay3SubjectName);
}
private function stopOverlayTimers():void {
var timer:Timer;
while (timerArray.length > 0) {
timer = timerArray.shift();
timer.removeEventListener(TimerEvent.TIMER, createOverlayDelayed);
timer.stop();
overlayArray.shift();
}
extraQuestionTimer.reset();
extraQuestionEvaluationTimer.reset();
}
private function clearOverlay():void {
var rowLength:int = dpOverlayCols.length-1;
for (var r:int = 0; r < dpOverlayRows.length; r++){
for (var c:int = 0; c < dpOverlayCols.length; c++){
overlayCel[r][c].visible = false;
//brute force ftw
overlayCel[r][c].removeEventListener(MouseEvent.CLICK,clickOverlay1);
overlayCel[r][c].removeEventListener(MouseEvent.CLICK,clickOverlay2);
overlayCel[r][c].removeEventListener(MouseEvent.CLICK,clickOverlay3);
overlayCel[r][c].removeEventListener(MouseEvent.MOUSE_OVER, displayOverlay1Text);
overlayCel[r][c].removeEventListener(MouseEvent.MOUSE_OVER, displayOverlay2Text);
overlayCel[r][c].removeEventListener(MouseEvent.MOUSE_OVER, displayOverlay3Text);
overlayCel[r][c].removeEventListener(MouseEvent.MOUSE_OVER, displayHighlightOverlay1);
overlayCel[r][c].removeEventListener(MouseEvent.MOUSE_OVER, displayHighlightOverlay2);
overlayCel[r][c].removeEventListener(MouseEvent.MOUSE_OVER, displayHighlightOverlay3);
overlayCel[r][c].removeEventListener(MouseEvent.MOUSE_OUT, removeHighlightOverlay1);
overlayCel[r][c].removeEventListener(MouseEvent.MOUSE_OUT, removeHighlightOverlay2);
overlayCel[r][c].removeEventListener(MouseEvent.MOUSE_OUT, removeHighlightOverlay3);
}
}
handleRemoveHighlight(overlay1Array);
handleRemoveHighlight(overlay2Array);
handleRemoveHighlight(overlay3Array);
overlay1Array = new Array();
overlay2Array = new Array();
overlay3Array = new Array();
}
private function getPositionFromString(positionString:String):Position {
var myPosition:Position = new Position();
if (positionString.length > 0) {
myPosition.column = (int)(positionString.charAt(0));
myPosition.row = (int)(positionString.charAt(1));
}
return myPosition;
}
private function getSizeFromString(sizeString:String):Size {
var mySize:Size = new Size();
if (sizeString.length > 0) {
mySize.xsize = (int)(sizeString.charAt(0));
mySize.ysize = (int)(sizeString.charAt(1));
}
return mySize;
}
private function getLabelFromString(labelString:String):String {
return labelString.length > 0 ? labelString : "";
}
private function checkForOverlay():void {
//Clean up previous overlays and question boxes
clearOverlay();
branchQuestionBox.visible = false;
extraQuestionBox.visible = false;
extraQuestionBoxViewStack.selectedIndex = 0;
var xmlFeed:XML = videoFeed.subject[currentSubject].videos.video[currentVideo];
var overlayCount:int = xmlFeed.overlays.overlay.length();
if (overlayCount > 0) {
for (var i:int = 0; i < overlayCount; i++) {
var xmlOverlay:XML = xmlFeed.overlays.overlay[i];
var overlay:Overlay = new Overlay();
if (xmlOverlay.@time.length() > 0) {
if(xmlOverlay.@time > 0) {
overlay.time = xmlOverlay.@time;
}
}
//overlay 1
overlay.pos1 = getPositionFromString(xmlOverlay.@position);
overlay.size1 = getSizeFromString(xmlOverlay.@size);
overlay.label1 = getLabelFromString(xmlOverlay.@label);
//overlay 2
overlay.pos2 = getPositionFromString(xmlOverlay.@position2);
overlay.size2 = getSizeFromString(xmlOverlay.@size2);
overlay.label2 = getLabelFromString(xmlOverlay.@label2);
//overlay 3
overlay.pos3 = getPositionFromString(xmlOverlay.@position3);
overlay.size3 = getSizeFromString(xmlOverlay.@size3);
overlay.label3 = getLabelFromString(xmlOverlay.@label3);
overlayArray.push(overlay);
if (overlay.time > 0) {
var timer:Timer = new Timer(overlay.time*1000,1);
timerArray.push(timer);
timer.addEventListener(TimerEvent.TIMER, createOverlayDelayed);
timer.start();
} else {
createOverlay();
}
}
}
}
private function createOverlayDelayed(event:TimerEvent):void {
timerArray.shift();
createOverlay();
}
private function setClickOverlaySubjectName(subjectName:String,overlayID:int):void {
switch(overlayID){
case(3):
clickOverlay3SubjectName = subjectName;
break;
case(2):
clickOverlay2SubjectName = subjectName;
break;
case(1):
clickOverlay1SubjectName = subjectName;
break;
}
}
private function addOverlayEventListeners(dispatcher:EventDispatcher,overlayID:int):void {
switch(overlayID){
case(3):
dispatcher.addEventListener(MouseEvent.CLICK, clickOverlay3);
dispatcher.addEventListener(MouseEvent.MOUSE_OVER, displayOverlay3Text);
overlay3Array.push(dispatcher);
dispatcher.addEventListener(MouseEvent.MOUSE_OVER, displayHighlightOverlay3);
dispatcher.addEventListener(MouseEvent.MOUSE_OUT, removeHighlightOverlay3);
break;
case(2):
dispatcher.addEventListener(MouseEvent.CLICK, clickOverlay2);
dispatcher.addEventListener(MouseEvent.MOUSE_OVER, displayOverlay2Text);
overlay2Array.push(dispatcher);
dispatcher.addEventListener(MouseEvent.MOUSE_OVER, displayHighlightOverlay2);
dispatcher.addEventListener(MouseEvent.MOUSE_OUT, removeHighlightOverlay2);
break;
case(1):
dispatcher.addEventListener(MouseEvent.CLICK, clickOverlay1);
dispatcher.addEventListener(MouseEvent.MOUSE_OVER, displayOverlay1Text);
overlay1Array.push(dispatcher);
dispatcher.addEventListener(MouseEvent.MOUSE_OVER, displayHighlightOverlay1);
dispatcher.addEventListener(MouseEvent.MOUSE_OUT, removeHighlightOverlay1);
break;
}
}
private function createOverlayCels(position:Position, size:Size, subjectName:String,
overlayID:int):void {
var k:int;
var l:int;
if (!((position.column == -1) || (position.row == -1) || (size.xsize == -1) ||
(size.ysize == -1) || (subjectName == ""))) {
for (k = position.column; k < (position.column + size.xsize); k++) {
for (l = position.row; l < (position.row + size.ysize); l++) {
addOverlayEventListeners(overlayCel[l][k],overlayID);
overlayCel[l][k].visible = true;
overlayCel[l][k].setStyle("backgroundColor", 0xffc0c0);
}
}
setClickOverlaySubjectName(subjectName,overlayID);
}
}
private function createOverlay():void {
clearOverlay();
if (overlayArray.length > 0) {
var overlay:Overlay = overlayArray.shift();
//overlay 3
createOverlayCels(overlay.pos3, overlay.size3, overlay.label3, 3);
//overlay 2
createOverlayCels(overlay.pos2, overlay.size2, overlay.label2, 2);
//overlay 1
createOverlayCels(overlay.pos1, overlay.size1, overlay.label1, 1);
}
}
private function checkForBranchQuestion():void {
var myCurrentVideo:XML = videoFeed.subject[currentSubject].videos.video[currentVideo];
if(myCurrentVideo.hasOwnProperty("branchquestion")) {
branchQuestion.text = myCurrentVideo.branchquestion;
branchQuestionBox.visible = true;
}
}
private function checkForExtraQuestion():void {
var myCurrentVideo:XML = videoFeed.subject[currentSubject].videos.video[currentVideo];
if(myCurrentVideo.hasOwnProperty("question")) {
if(myCurrentVideo.hasOwnProperty("rightanswer")) {
extraQuestion.text = myCurrentVideo.question;
extraQuestionBox.visible = true;
extraQuestionBox.alpha =.8;
extraQuestionAnswer = (myCurrentVideo.rightanswer == "true" ? true : false);
extraQuestionTimerDisplayCount.text = String(extraQuestionTimer.repeatCount);
extraQuestionTimer.reset();
extraQuestionTimer.start();
}
}
}
private function handlePlayVideo():void {
checkForOverlay();
checkForBranchQuestion();
checkForExtraQuestion();
checkForExtraSegment();
currentSubjectLabel.text = videoFeed.subject[currentSubject].longname;
videoDisplay.source = videoDir +
videoFeed.subject[currentSubject].videos.video[currentVideo].@file +
VIDEO_EXTENSION;
videoDisplay.play();
subjectNameTraceArray.push(videoFeed.subject[currentSubject].longname);
videoFileTraceArray.push(videoFeed.subject[currentSubject].videos.video[currentVideo].@file);
}
private function onVideoComplete(event:VideoEvent):void {
var leadsToString:String = videoFeed.subject[currentSubject].videos.video[currentVideo].@leadsto;
var repeatString:String = videoFeed.subject[currentSubject].videos.video[currentVideo].@repeat;
if (leadsToString != "") {
stopOverlayTimers();
goToVideoBySubjectName(leadsToString);
}
else if (repeatString == "true") {
videoDisplay.play();
}
else if (currentVideo + 1 < videoFeed.subject[currentSubject].videos.video.length()) {
currentVideo++;
gameScoreArray.push(0);
extraQuestionScoreArray.push(0);
stopOverlayTimers();
if((videoFeed.subject[currentSubject].videos.video[currentVideo].@file.length() > 0) &&
(videoFeed.subject[currentSubject].videos.video[currentVideo].@file != "")) {
handlePlayVideo();
}
else {
nextVideo();
}
}
else {
stopInteractiveVideo();
}
}
private function formatPositionToolTip(value:int):String {
//do only handle minutes
var result:String = (value % 60).toString();
if (result.length == 1){
result = Math.floor(value / 60).toString() + ":0" + result;
} else {
result = Math.floor(value / 60).toString() + ":" + result;
}
return result;
}
private function handleDisplayHighlight(array:Array):void {
for (var i:int = 0; i < array.length; i++) {
array[i].alpha = 0.6;
}
}
private function displayHighlightOverlay1(event:MouseEvent):void {
handleDisplayHighlight(overlay1Array);
}
private function displayHighlightOverlay2(event:MouseEvent):void {
handleDisplayHighlight(overlay2Array);
}
private function displayHighlightOverlay3(event:MouseEvent):void {
handleDisplayHighlight(overlay3Array);
}
private function handleRemoveHighlight(array:Array):void {
for (var i:int = 0; i < array.length; i++) {
array[i].alpha = 0.3;
}
}
private function removeHighlightOverlay1(event:MouseEvent):void {
handleRemoveHighlight(overlay1Array);
}
private function removeHighlightOverlay2(event:MouseEvent):void {
handleRemoveHighlight(overlay2Array);
}
private function removeHighlightOverlay3(event:MouseEvent):void {
handleRemoveHighlight(overlay3Array);
}
private function handleDisplayOverlayText(subjectName:String):void {
branchChoice.text = videoFeed.subject.(@name == subjectName).longname;
displayOverlayText();
}
private function displayOverlay1Text(event:MouseEvent):void {
handleDisplayOverlayText(clickOverlay1SubjectName);
}
private function displayOverlay2Text(event:MouseEvent):void {
handleDisplayOverlayText(clickOverlay2SubjectName);
}
private function displayOverlay3Text(event:MouseEvent):void {
handleDisplayOverlayText(clickOverlay3SubjectName);
}
private function displayOverlayText():void {
branchChoiceBox.visible = true;
}
private function removeOverlayText():void {
branchChoiceBox.visible = false;
}
private function updateExtraQuestionTimerDisplayCount(event:TimerEvent):void {
extraQuestionTimerDisplayCount.text =
String(extraQuestionTimer.repeatCount - extraQuestionTimer.currentCount);
}
private function removeExtraQuestionBox(event:TimerEvent):void {
extraQuestionBox.visible = false;
}
private function evaluateAnswer(userAnswer:Boolean):void {
extraQuestionBoxViewStack.selectedIndex = 1;
extraQuestionTimer.reset();
if(extraQuestionAnswer == userAnswer){
extraQuestionEvaluation.text = "Right!";
extraQuestionBox.alpha =.6;
gameScore += EXTRA_QUESTION_SCORE;
extraQuestionScoreArray[extraQuestionScoreArray.length-1] += EXTRA_QUESTION_SCORE;
updateGameScoreLabel();
}else {
extraQuestionEvaluation.text = "Wrong!";
extraQuestionBox.alpha =.6;
}
extraQuestionEvaluationTimer.reset();
extraQuestionEvaluationTimer.start();
}
private function evaluateAnswerTrue():void {
evaluateAnswer(true);
}
private function evaluateAnswerFalse():void {
evaluateAnswer(false);
}
private function checkForExtraSegment():void {
var extraSegmentString:String = videoFeed.subject[currentSubject].videos.video[currentVideo].@extra;
if (extraSegmentString == "true") {
extraSegmentLabel.visible = true;
}else {
extraSegmentLabel.visible = false;
}
}
]]>