var gBcExperience;
var gModExperience; 
var gModVideoPlayer;
var gModContent;
var gModCuePoints;
var gModAdvertising;
var gCPs;
var gBmId;
var gBmTc;
var gBmCurrent = 1;
var gBmSeek = null;
var gBmData = null;
var gBmEnabled = false;
var gBmTimer = null;
var gBmManualOnly = false;
var gDebug = false;
var gBmResume = false;
var gAdVolume = 0;

function sfSetDebug(f) {
	gDebug = f;
}

// as of 08/28/2009 Player update
function onTemplateLoaded(expId) {
	db("onTemplateLoaded");
	$.cookie("bmE", 1);
	if ($.cookie("bmE") == 1) {
		gBmEnabled = true;
	}
	db("cookies enabled:" + gBmEnabled);
	if (!gBmEnabled) return;
	
	gBcExperience = brightcove.getExperience(expId);

	gModExperience = gBcExperience.getModule("experience");
	gModExperience.addEventListener("contentLoad", sfHandleContentLoad);
	db("got experience");

	gModVideoPlayer = gBcExperience.getModule(APIModules.VIDEO_PLAYER);
	gModVideoPlayer.addEventListener("mediaComplete", sfHandleMediaComplete);
	gModVideoPlayer.addEventListener("mediaPlay", sfHandleMediaPlay);
	gModVideoPlayer.addEventListener("mediaStop", sfHandleMediaStop);
	gModVideoPlayer.addEventListener("mediaBufferBegin", sfHandleMediaBufferBegin);
	gModVideoPlayer.addEventListener("mediaBufferComplete", sfHandleMediaBufferComplete);
	gModVideoPlayer.addEventListener("renditionChange", sfHandleRenditionChange);		
	db("got player");
	
	gModAdvertising = gBcExperience.getModule(APIModules.ADVERTISING);
	gModAdvertising.addEventListener(BCAdvertisingEvent.AD_START, sfOnAdStart);
	gModAdvertising.addEventListener(BCAdvertisingEvent.AD_COMPLETE, sfOnAdComplete); 
	db("got advertising");
	
	gModVideoPlayer.setRenditionSelectionCallback(sfRenditionCb);
	sf_bmInitControls();
}

function sfRenditionCb(context) {
	db("sfRenditionCb");
	var renditions = context.renditions;
	var renditionIndex = 0;
	var size = 0;
	for (var j=0; j<renditions.length; j++) {
		if (0 == size || renditions[j].size < size) {
			size = renditions[j].size;
			renditionIndex = j;
		}
	}
	db("sfRenditionCb (" + renditionIndex + " of " + renditions.length +")");	
	return (renditionIndex);
}

function sfHandleRenditionChange(evt) {
	db("**sfHandleRenditionChange**");
}

function sfOnAdStart(evt) {
	db("sfOnAdStart");
	sf_bmShowControls(false);
	gAdVolume = gModVideoPlayer.getVolume();
	gModVideoPlayer.setVolume(0.1);	
  }

function sfOnAdComplete(evt) {
	db("sfOnAdComplete");
	sf_bmShowControls(true);
	gModVideoPlayer.setVolume(gAdVolume);	
	gModAdvertising.resumeAfterExternalAd(); 
}

function sfHandleMediaBufferBegin(evt) {
	db("sfHandleMediaBufferBegin");
	sf_bmShowControls(false);
  }

function sfHandleMediaBufferComplete(evt) {
	db("sfHandleMediaBufferComplete");
	sf_bmShowControls(true);
}

function sfRestartTimer(restart) {
	if (null != gBmTimer) {
		clearInterval(gBmTimer);
		gBmTimer = null;
	}
	if (restart) {
		sfCheckTC();
		gBmTimer = setInterval(sfCheckTC, 20000);
	}
}

function sfHandleMediaPlay(evt) {
	db("sfHandleMediaPlay");
	sf_bmShowControls(true);
	sfRestartTimer(true);	
}

function sfCheckTC(force) {
	var tc = gModVideoPlayer.getVideoPosition();
	if (tc) {
		tc = Math.floor(tc);
		db("sfCheckTC:" + tc);	
		if (force == true) {
			gBmCurrent = tc;
		} else {
			sf_bmCheckRuntime(tc);
		}
	}
	if (gBmSeek != null) {
		sf_bmHandleGoTo(gBmSeek);
	}
}

function sfHandleMediaComplete(evt) {
	db("sfHandleMediaComplete");
	gBmCurrent = 0;
	sfRestartTimer(false);
	sf_bmStore();
}

function sfHandleMediaStop(evt) {
	db("sfHandleMediaStop");
	sfRestartTimer(false);
	sf_bmStore();
}

function sfHandleContentLoad(evt) {
	db("sfHandleContentLoad");
	
	var currentVideo = gModVideoPlayer.getCurrentVideo();
	db("VideoID:" + currentVideo.id);
	gBmId = currentVideo.id;	
	sf_bmInit();
	sf_bmCheckResume();	
}

function sf_bmHandleGoTo(tc) {
	db("sf_bmHandleGoTo:" + tc);

	if (gModVideoPlayer.isPlaying()) {
		gModVideoPlayer.seek(tc);
		gBmSeek = null;
	} else {
		gBmSeek = tc;
		gModVideoPlayer.play();
	}
}

function db(s) {
	if (gDebug) {
		var oldS = $("#info").html();
		$("#info").html(oldS + "<br />" + s);
	}
}

function sf_bmCheckRuntime(tc) {
	var tca = Math.floor(tc/30) * 30;
	db("sf_bmCheckRuntime:" + tc + "(" + tca + ")," + gBmCurrent);
	if (0 == tca) {
		return;
	}
	if (gBmCurrent == undefined || Math.abs(gBmCurrent - tca) >= 15) {
		gBmCurrent = tca;
		sf_bmStore();
	}
}

function sf_bmCheckResume() {
	db("sf_bmCheckResume");
	var c = $.cookie("bm");
	db("sf_bmCheckResume cookie:" + c);
	gBmData = "";
	var valid = false;
	if (c) {
		var data = c.split("|");
		if (data.length > 0) {
			for (var j=0; j<data.length; j++) {
				var bm = data[j].split("=");
				if (bm.length == 2) {
					if (bm[0] != undefined && bm[1] != undefined) {
						if (gBmId == bm[0]) {
							gBmTc = bm[1];
							db("cookie:" + gBmId + "=" + gBmTc);
							$("#bm_resume").click(function() { 
								sf_bmHandleGoTo(gBmTc); 
								if (pageTracker != undefined) { 
									pageTracker._trackEvent('bm','action','resume'); 
								} 
							});
							var s = 'Viewed this film earlier? Continue at ' + sf_bmTcToStr(gBmTc);
							$("#bm_resume_info").text(s);
							$("#bm_resume_info").show();
							valid = true;
						} else {
							gBmData+= bm[0] + "=" + bm[1] + "|";
						}
					}
				}
			}
		}
	}
	gBmResume = valid;
}

function sf_bmInit() {
	db("sf_bmInit");
	$("#bm_bookmark").click(function() { 
		sf_bmHandleManualBm(); 
		if (pageTracker != undefined) { 
			pageTracker._trackEvent('bm','action','bookmark'); 
		} 
	});
	var s = "Don't have time to watch it all? Save your spot with one click";
	$("#bm_bookmark_info").text(s);
	$("#bm_bookmark").hover( 
		function() { 
			if (gBmResume) { 
				$("#bm_resume_info").hide(); 
			}
			$("#bm_bookmark_info").show(); 
		}, 
		function() { 
			$("#bm_bookmark_info").hide(); 
			if (gBmResume) { 
				$("#bm_resume_info").show(); 
			}
		} 
	);							
}

function sf_bmHandleManualBm() {
	db("sf_bmHandleManualBm");
	sfCheckTC(true);
	gBmManualOnly = true;
	sf_bmStore(true);
	$("#bm_saved").fadeIn(1000, function() { $("#bm_saved").hide(); });
}

function sf_bmInitControls() {
	db("sf_bmInitControls");
	$("#bm").show();
}

function sf_bmShowControls(visible) {
	db("sf_bmShowControls:" + visible);
	if (visible) {
		$("#bm_bookmark").show();
		$("#bm_bookmark_off").hide();
		if (gBmResume) {
			$("#bm_resume").show();
			$("#bm_resume_off").hide();
		}
		$("#bm_info").removeClass("bm_disabled");
	} else {
		$("#bm_bookmark").hide();
		$("#bm_bookmark_off").show();
		if (gBmResume) {
			$("#bm_resume").hide();
			$("#bm_resume_off").show();
		}
		$("#bm_info").addClass("bm_disabled");
	}
}

function sf_bmTcToStr(tc) {
	var hours = Math.floor(tc/3600);
	var mins = Math.max(Math.floor((tc - (hours*3600)) / 60), 0);
	var secs = Math.max(Math.floor(tc - (mins*60 + hours*3600)), 0);
	var s = "";
	if (hours > 0) {
		s+= hours + ":";
	}
	if (mins < 10 && hours > 0) {
		s+= "0";
	}
	s+= mins + ":";
	if (secs < 10) {
		s+= "0";
	}
	s+= secs;
	return (s);	
}

function sf_bmStore(force) {
	if (gBmManualOnly && !force) {
		return;
	}
	if (gBmCurrent != 0) { 
		var c = gBmData + gBmId + "=" + Math.floor(gBmCurrent);
	} else {
		var c = gBmData;
	}
	db("store:" + c);
	$.cookie("bm", c, { expires: 30, path: '/' });
}
