//////////////////////////////////////////////////////////////////////////////
// CREATE OBJECT
//////////////////////////////////////////////////////////////////////////////
//defines if splash animation is playing
var splashPlaying=0;

if (!window.Silverlight.Controls)
	window.Silverlight.Controls = {};
if (!window.DownloaderFun)
	window.DownloaderFun = {};
DownloaderFun.Scene = function()
{
}

DownloaderFun.Scene.prototype =
{
	handleLoad: function(control, userContext, rootElement)
	{
	//load xml
	loadingXML(rootElement);
			//now initializing from the loadingXML() function, so that initialization doesn't happen until after XML loads
			//initialize menu and load skin
			//initMenu(rootElement);
	this.control = control;
	//loadLCDSAnimation(rootElement);
	//loadLCDSVideo(rootElement);
	//Add Event Handler
	this.progressAnim = rootElement.findName("progressAnim");
	this.progressAnim.addEventListener("Completed", Silverlight.createDelegate(this, startTimer));
	//this.splashAniEvent = rootElement.findName("media_splashAnimation");
	//this.splashAniEvent.addEventListener("mediaOpened", Silverlight.createDelegate(this, handleMediaOpened));
	}
}

//////////////////////////////////////////////////////////////////////////////
// TRANSPORT CONTROLS
//////////////////////////////////////////////////////////////////////////////
function handleMediaOpened (sender, e){
	splashPlaying = 1;
}

function startTimer (sender, eventArgs) {
	progressAnim = sender.findName("progressAnim");
	progressAnim.stop(); //Stop Timer
	//check if animation or video is playing			//also need to check if media is loaded... otherwise it will cause an error while downloading
	//if (downloadReady == true){
	if ((topicTypeArray[currPage].firstChild.nodeValue=="animation")){
		//alert("loop! "+topicTypeArray[currPage]);
		updateProgressUI(sender, eventArgs);
	}else if ((topicTypeArray[currPage].firstChild.nodeValue=="video")||(topicTypeArray[currPage].firstChild.nodeValue=="video_demo")||(topicTypeArray[currPage].firstChild.nodeValue=="video_animation")){
		updateProgressUI(sender, eventArgs);
	//if splash animation is playing, wait until complete, then remove and initialize player
	}else if (splashPlaying == 1){
		splashAni = sender.findName("media_splashAnimation");
		splashAniPos = splashAni.Position.Seconds;
		totalTime = splashAni.NaturalDuration.Seconds;
		//alert(splashAniPos+"/"+totalTime+" status="+splashAni.CurrentState);
		if ((splashAniPos >= totalTime-.5)&&(splashAni.CurrentState!="Playing")){
			initMenu(sender);
			splashPlaying = 0;
			//remove video
			splashAni.Source = "";
			sender.findName("SplashAnimation").begin();
			showNavigationControls(sender);

	}
}
	//then fire off progress update
	progressAnim.begin();  //Restart Timer
}
var playingAni="1";

function transportPlay_clicked(sender, mouseEventArgs){
	tooltip_hide(sender);
	//swap play/pause icons back and forth
	var playButtonGraphic = sender.findName("playIcon");
	var pauseButtonGraphic = sender.findName("pauseIcon");
	if (playingAni == "1"){
		if (topicTypeArray[currPage].firstChild.nodeValue=="animation"){
			sender.findName("Timeline1").pause();
		}
		playingAni = "0";
		pauseButtonGraphic.Visibility = "Collapsed";
		playButtonGraphic.Visibility = "Visible";
		//alert(playingAni);
		sender.findName("media").pause();
		}else if (playingAni == "0"){
			if (topicTypeArray[currPage].firstChild.nodeValue=="animation"){
				sender.findName("Timeline1").resume();
			}
			playingAni = "1";
			//alert(playingAni);
			sender.findName("media").play();
			pauseButtonGraphic.Visibility = "Visible";
			playButtonGraphic.Visibility = "Collapsed";
		}else{
			if (topicTypeArray[currPage].firstChild.nodeValue=="animation"){
				sender.findName("Timeline1").begin();
			}
			playingAni="1";
			sender.findName("media").play();
			pauseButtonGraphic.Visibility = "Visible";
			playButtonGraphic.Visibility = "Collapsed";
	}
	//hide stop button blocker
	sender.findName("button_stop_buttonBlock").Visibility = "Collapsed";
}

function buttonPause_rollOver(sender, eventArgs){
	if (playingAni == "1"){
		tooltip_display(sender, eventArgs, 1);
	}else{
		tooltip_display(sender, eventArgs, 0);
	}
	sender.findName("buttonPause_lightUp").begin();
}
function buttonPause_rollOut(sender, eventArgs){
	sender.findName("buttonPause_lightDown").begin();
	tooltip_hide(sender);
}
function transportStop_clicked(sender, mouseEventArgs){
	tooltip_hide(sender);
	//set visibility of play/pause button
	var playButtonGraphic = sender.findName("playIcon");
	var pauseButtonGraphic = sender.findName("pauseIcon");
	pauseButtonGraphic.Visibility = "Collapsed";
	playButtonGraphic.Visibility = "Visible";
	if (topicTypeArray[currPage].firstChild.nodeValue=="animation"){
		sender.findName("Timeline1").stop();
	}
	sender.findName("media").stop();
	playingAni = "2";
	//reset position of playhead
	var transportHandle = sender.findName("transport_handle");
	transportHandle["Canvas.Left"]=mediaTimeDrag_startX;
	resetProgressMeter(sender);
	//show stop button disabler
	sender.findName("button_stop_buttonBlock").Visibility = "Visible";
}
function buttonStop_rollOver(sender, eventArgs){
	tooltip_display(sender, eventArgs, 2);
	sender.findName("buttonStop_lightUp").begin();
}
function buttonStop_rollOut(sender, eventArgs){
	tooltip_hide(sender);
	sender.findName("buttonStop_lightDown").begin();
}

var videoDownloadProgress;
function updateProgressUI(sender, mouseEventArgs){
	///////////////NEW////////////////////////
	var currSecondsDisplay;
	var currMinutesDisplay;
	var natDurSecondsDisplay;
	var mediaDragger = sender.findName("transport_handle");
	var draggerCurrPos = mediaDragger["Canvas.Left"]-mediaTimeDrag_startX;
	var draggerPercent = draggerCurrPos/mediaTimeDrag_width;
	var downloadMeterScale = sender.findName("downloadScale");
	///////////////NEW////////////////////////
	if (mediaTransportDragging == false){
		var currAudio = sender.findName("media");
		//var currAnimationTimeline = sender.findName("content");
		var timeReadout = sender.findName("timeReadout_ani");
		var progressMeterScale = sender.findName("progressScale");
		var bufferReadout = sender.findName("downloadProgress");
		//timeReadout.Text = (Math.round(currAudio.position.seconds*100)/100).toString()+"/"+(Math.round(currAudio.NaturalDuration.seconds*100)/100).toString();
		///////////////NEW////////////////////////
		//cleans up seconds and minute display:
		var currSeconds = (Math.ceil(currAudio.position.seconds)-(Math.floor(currAudio.position.seconds/60)*60));
		var currMinutes = Math.floor(currAudio.position.seconds/60);
		var natSeconds = (Math.ceil(currAudio.NaturalDuration.seconds)-(Math.floor(currAudio.NaturalDuration.seconds/60)*60));
		///////////////////////////////////////////////////////////////////////////
		//updated this to try to fix buffering in SL2, still not fixed... can revert to old updateProgressUI if necessary
		///////////////////////////////////////////////////////////////////////////
		if (currAudio.CurrentState=="Buffering"){
			//do nothing
			//alert ("buffering");
		}else{
		if (currSeconds<10){
			currSecondsDisplay = "0"+currSeconds.toString();
			currMinutesDisplay = currMinutesDisplay = currMinutes.toString();
		}else if (currSeconds == 60){
			currSecondsDisplay = "00";
			currMinutesDisplay = (currMinutes+1).toString();
		}else{
			currSecondsDisplay = currSeconds.toString();
			currMinutesDisplay = currMinutes.toString();
		}
		if (natSeconds<10){
			natDurSecondsDisplay = "0"+natSeconds.toString();
		}else if (natSeconds == 60){
			natDurSecondsDisplay = "00";
		}else{
			natDurSecondsDisplay = natSeconds.toString();
		}
		///////////////NEW////////////////////////
		timeReadout.Text = currMinutesDisplay +":" + currSecondsDisplay+"/"+ Math.floor(currAudio.NaturalDuration.seconds/60).toString() +":" + natDurSecondsDisplay;
		var percentComplete = currAudio.position.seconds/currAudio.NaturalDuration.seconds;			//not actually percent, but number between 0 and 1
		if (currAudio.position.seconds>=.01){
			progressMeterScale.scaleX = percentComplete;
			//update dragger position
			var transportHandle = sender.findName("transport_handle");
			transportHandle["Canvas.Left"]=mediaTimeDrag_startX+(mediaTimeDrag_width*percentComplete);
			///////////////NEW////////////////////////
			//checks and stops animation if complete
			if ((currAudio.position.seconds)>=(currAudio.NaturalDuration.seconds-.2)){
				transportStop_clicked(sender);
			}
			///////////////NEW////////////////////////
		}
		}
		/*
		still getting errors, so instead, show on timeline how much of the video is downloaded (color)
		when transport clicked, record location
		when transporter released, check if it's outside of DownloadProgress,
		if it is, move back to where transporter was originally clicked.
		*/
		bufferReadout.Text =(currAudio.CurrentState);
		if (currAudio.CurrentState == "Buffering"){
			//show buffering message
			sender.findName("dialog_buffering").Visibility = "Visible";

		}else{
			//hide buffering message
			sender.findName("dialog_buffering").Visibility = "Collapsed";
		}
		//update scale of download progress bar
		downloadMeterScale.scaleX = currAudio.DownloadProgress.toFixed(3);

	}
}


//////////////////////////////////////////////////////////////////////////////
// VARIABLES/ARRAYS
//////////////////////////////////////////////////////////////////////////////

var currPage = 0;					//starts with splash screen
var mediaType = "";				//media type of next page
var loadNewPageNum = 0;				//next page to load (on button click)
var totalPages = 0;				//total number of pages in lesson
var masterVolume = .5;

var downloadReady = false;

//this is defined in XML function, global variable used in place of "sender"
var viewport;

//defines if splash animation is playing
//var splashPlaying=1;

//create arrays for content
var topicArray = new Array();
var topicTypeArray = new Array();
var topicTitleArray = new Array();
var topicAudioVideoArray = new Array();
var toolTipArray = new Array();

toolTipArray.push("Play", "Pause", "Stop", "Open Menu", "Close Menu", "Next Topic", "Previous Topic", "Sound On", "Mute", "Seek", "Volume");

//////////////////////////////////////////////////////////////////////////////
// MAIN MENU
//////////////////////////////////////////////////////////////////////////////
function resetProgressMeter(sender){
	var progressMeterScale = sender.findName("progressScale");
	progressMeterScale.scaleX = 0;
	var transportHandle = sender.findName("transport_handle");
	transportHandle["Canvas.Left"]=mediaTimeDrag_startX
}
//control loading animation
function displayLoadingAni(sender, eventArgs){
	//alert ("loading");
	sender.findName("loadingAnimation");
}
function hideLoadingAni(sender, eventArgs){
	//alert("hide loading");
}

//define the text on the menu
function initMenu(sender, eventArgs){
	sender.findName("loading_text").Visibility = "Collapsed";
	silverlightLogoGlimmer(sender);
	sender.findName("mainMenu").Visibility = "Visible";

	//set background image according to XML
	//test swapping background image
	sender.findName("image").Source = backgroundSkin;
	//set text/font color
	sender.findName("text_currentPage").Foreground = globalTextColor;
	sender.findName("text_skin_topicName").Foreground = globalTextColor;
	sender.findName("timeReadout_ani").Foreground = globalTextColor;
	//play splash animation-- now being called in StartTimer function, which is checking to see if splash animation is complete
	sender.findName("SplashAnimation").begin();
	//hide navigation as well, which will be animated on by splashAnimation
	hideNavigationControls(sender);
	//turn off transport controls
	hideTransportControls(sender, eventArgs);
	myRootElement = sender;
	//loop through array and assign names
	//clunky, create textblocks later programmatically
	var numOfTopics = topicTitleArray.length;
	var totalTopicsAvail = 6;
	//sender.findName("menu_title").Text = topicTitleArray[0];
	for (i=1; i<numOfTopics; i++){
		var currTopic = "topicText0"+i;
		sender.findName(currTopic).Text = topicTitleArray[i].getAttribute("title");
	}
	//remove extra topic holders
	if (numOfTopics <= totalTopicsAvail){
		for (j=numOfTopics; j<=totalTopicsAvail; j++){
			var removeTopic = "menu_topic0"+j;
			sender.findName(removeTopic).Visibility = "Collapsed";
		}
	}
	//update topic name on player skin
	sender.findName("text_skin_topicName").Text = "";
	//put lesson name on menu
	sender.findName("menu_lessonTitle_txt").Text = lessonName;
	//don't block forward nav button
	sender.findName("button_forward_buttonBlock").Visibility = "Collapsed";
	//begin buffering animation, will play in background...
	sender.findName("bufferingSpinner_ani").begin();
}
function hideNavigationControls(sender){
	sender.findName("button_back").Visibility = "Collapsed";
	sender.findName("button_forward").Visibility = "Collapsed";
	sender.findName("text_currentPage").Visibility = "Collapsed";
	sender.findName("launchMenu_button").Visibility = "Collapsed";
	sender.findName("audioSlider_background").Visibility = "Collapsed";
	sender.findName("audioSliderButton").Visibility = "Collapsed";
	sender.findName("audioControls").Visibility = "Collapsed";
}
function showNavigationControls(sender){
	sender.findName("button_back").Visibility = "Visible";
	sender.findName("button_forward").Visibility = "Visible";
	sender.findName("text_currentPage").Visibility = "Visible";
	sender.findName("launchMenu_button").Visibility = "Visible";
	sender.findName("audioSlider_background").Visibility = "Visible";
	sender.findName("audioSliderButton").Visibility = "Visible";
	sender.findName("audioControls").Visibility = "Visible";

}
function freezeNavigation(sender,eventArgs){
	//freezes the navigation when topics are loading to avoid errors
	sender.findName("navigationBlock").Visibility = "Visible";
}
function unfreezeNavigation(sender,eventArgs){
	//freezes the navigation when topics are loading to avoid errors
	sender.findName("navigationBlock").Visibility = "Collapsed";
}
function menuTopic_clicked(sender, eventArgs){
	//reset the progress meter-- fixes freeze before next video loaded
	resetProgressMeter(sender);
	sender.findName("loading_text").Visibility = "Visible";
	silverlightLogoGlimmer(sender)
	downloadReady = false;
	playingAni="1";
	sender.findName("menu_fadeDown").begin();
	//replace text in button name to get just number
	var currName = sender.Name;
	currName = currName.replace("topic0","")
	currName = currName.replace("_button", "");
	currPage = currName;
	sender.findName("text_currentPage").Text = currPage.toString();
	var currZip = topicArray[currPage].firstChild.nodeValue;
	var currTopicType = topicTypeArray[currPage].firstChild.nodeValue;
	var currTitle = topicTitleArray[currPage].getAttribute("title");
	//load correct type of media
	if (currTopicType == "animation"){
		loadMyAnimation(sender);
	}else if (currTopicType == "video"){
		loadMyVideo(sender);
	}else if (currTopicType == "video_animation"){
		loadMyVideo_animation(sender);
	}else if (currTopicType == "video_demo"){
		loadMyVideo_demo(sender);
	}else if (currTopicType == "activity"||currTopicType == "activity_chapterVideo"){
		loadMyActivity(sender);
	}/*else if (currTopicType == "activity_chapterVideo"){
		loadMyActivity_chapterVideo(sender);
	}*/else{
		loadMyTextGraphic(sender);
	}
	//update topic name on player skin
	sender.findName("text_skin_topicName").Text = currTitle;
}
function menuTopic_rollover(sender, eventArgs){
	//figure out which topic
	//replace text in button name to get just number
	var currName = sender.Name;
	currName = currName.replace("_button", "_highlight_fadeUp");
	sender.findName(currName).begin();

}
function menuTopic_rollout(sender, eventArgs){
	//figure out which topic
	//replace text in button name to get just number
	var currName = sender.Name;
	currName = currName.replace("_button", "_highlight_fadeDown");
	sender.findName(currName).begin();
}
function menuLaunch_clicked(sender, eventArgs){
	tooltip_hide(sender);
	if (sender.findName("mainMenu").Opacity == 0){
		//sender.findName("mainMenu").Visibility = "Visible";
		sender.findName("menu_fadeUp").begin();
		sender.findName("mainMenu").Visibility = "Visible";
	}else{
		//sender.findName("mainMenu").Visibility = "Collapsed";
		sender.findName("menu_fadeDown").begin();
	}
	//pause current media
	//add if clause to make sure it's not a text/graphic
}
function menuLaunch_fadeComplete(sender,eventArgs){
	//when fade is complete, turn visibility to collapsed so buttons aren't active
	sender.findName("mainMenu").Visibility = "Collapsed";
}
//button functions
function buttonMenu_rollOver(sender, eventArgs){
	if (sender.findName("mainMenu").Visibility == "Collapsed"){
		tooltip_display(sender, eventArgs, 3);
	}else{
		tooltip_display(sender, eventArgs, 4);
	}
	sender.findName("buttonMenu_lightUp").begin();
}
function buttonMenu_rollOut(sender, eventArgs){
	tooltip_hide(sender, eventArgs);
	sender.findName("buttonMenu_lightDown").begin();
}
function menuCloseButton_rollover(sender,eventArgs){
	tooltip_display(sender, eventArgs, 4);
}
function menuCloseButton_rollout(sender, eventArgs){
	tooltip_hide(sender, eventArgs);
}

//SOUND BUTTON
var currVolume=.5;
var currDraggerPos=255;
function buttonSound_clicked_master(sender, eventArgs){

	tooltip_hide(sender);
	//current audio/video object
	var currMediaObj = sender.findName("media");
	//volume dragger
	var volumeDragger = sender.findName("audioSliderButton");
	//sound waves graphics on audio button
	var soundWaves = sender.findName("soundWavesIcon");
	//to remember pre-mute volume
	//alert ("currVol="+currVolume+" currDragPos+"+currDraggerPos);
	if (currMediaObj.Volume > 0){
		currVolume = sender.findName("media").Volume;
		currDraggerPos = volumeDragger["Canvas.Left"];
		sender.findName("media").Volume = 0;				//is only muting video, will not mute animation audio? Found that it's an issue with the XAML in the converted animations... works with a simple animation
		masterVolume= 0;
		//update position of slider
		volumeDragger["Canvas.Left"]= 220;
		soundWaves.Visibility = "Collapsed";
	}else{										//looks like it's the <Canvas.Trigger>
		sender.findName("media").Volume = currVolume;
		masterVolume = currVolume;
		//update position of slider
		volumeDragger["Canvas.Left"]= currDraggerPos;
		soundWaves.Visibility = "Visible";
	}
}
//button functions
function buttonSound_rollOver(sender, eventArgs){
	sender.findName("buttonSound_lightUp").begin();
	if (sender.findName("soundWavesIcon").Visibility == "Collapsed"){
		tooltip_display(sender, eventArgs, 7);
	}else{
		tooltip_display(sender, eventArgs, 8);
	}
}
function buttonSound_rollOut(sender, eventArgs){
	sender.findName("buttonSound_lightDown").begin();
	tooltip_hide(sender);
}
//////////////////////////////////////////////////////////////////////////////
// NAVIGATION
//////////////////////////////////////////////////////////////////////////////
var disableBackButton = 0;
var disableForwardButton = 0;
//button functions
function buttonBack_clicked(sender, eventArgs){
	//reset the progress meter-- fixes freeze before next video loaded
	resetProgressMeter(sender);
	silverlightLogoGlimmer(sender)
	tooltip_hide(sender);
	//freezes the navigation when topics are loading to avoid errors
	//freezeNavigation(sender,eventArgs);
	downloadReady = false;
	//hide menu
	if (sender.findName("mainMenu").Opacity == 1){
		sender.findName("menu_fadeDown").begin();
	}
	if (currPage>1){
		currPage--;
		}else{
		currPage = 1;
		}
	//alert("back button clicked "+currPage);
	sender.findName("text_currentPage").Text = currPage.toString();
	var currZip = topicArray[currPage].firstChild.nodeValue;
	var currTopicType = topicTypeArray[currPage].firstChild.nodeValue;
	var currTitle = topicTitleArray[currPage].getAttribute("title");
	//load correct type of media
	if (currTopicType == "animation"){
		loadMyAnimation(sender);
	}else if (currTopicType == "video"){
		loadMyVideo(sender);
	}else if (currTopicType == "video_animation"){
		loadMyVideo_animation(sender);
	}else if (currTopicType == "video_demo"){
		loadMyVideo_demo(sender);
	}else if (currTopicType == "activity"||currTopicType == "activity_chapterVideo"){
		loadMyActivity(sender);
	}/*else if (currTopicType == "activity_chapterVideo"){
		loadMyActivity_chapterVideo(sender);
	}*/else{
		loadMyTextGraphic(sender);
	}
	//update topic name on player skin
	sender.findName("text_skin_topicName").Text = currTitle;
}
function buttonBack_rollOver(sender, eventArgs){
	tooltip_display(sender, eventArgs, 6);
	if (currPage>1){
		sender.findName("buttonBack_lightUp").begin();
		disableBackButton = 0;
		sender.findName("button_back").Cursor = "Hand";
	}else{
		disableBackButton = 1;
		sender.findName("button_back").Cursor = "Arrow";
	}
}
function buttonBack_rollOut(sender, eventArgs){
	tooltip_hide(sender);
	if (disableBackButton==0){
		sender.findName("buttonBack_lightDown").begin();
	}
}
function buttonForward_clicked(sender, eventArgs){
	//reset the progress meter-- fixes freeze before next video loaded
	resetProgressMeter(sender);
	sender.findName("loading_text").Visibility = "Visible";
	silverlightLogoGlimmer(sender)
	tooltip_hide(sender);
	//freezes the navigation when topics are loading to avoid errors
	//freezeNavigation(sender,eventArgs);
	downloadReady = false;
	//hide menu
	if (sender.findName("mainMenu").Opacity == 1){
		sender.findName("menu_fadeDown").begin();
	}
	//if currPage >= totalPages, disable
	totalPages = topicTitleArray.length-1;
	if (currPage>=totalPages){
		currPage = totalPages;
		}else{
		currPage ++;
		}

	//alert("forward button clicked "+currPage.toString());
	sender.findName("text_currentPage").Text = currPage.toString();
	var currZip = topicArray[currPage].firstChild.nodeValue;
	var currTopicType = topicTypeArray[currPage].firstChild.nodeValue;
	var currTitle = topicTitleArray[currPage].getAttribute("title");
	//load correct type of media
	if (currTopicType == "animation"){
		loadMyAnimation(sender);
	}else if (currTopicType == "video"){
		loadMyVideo(sender);
	}else if (currTopicType == "video_animation"){
		loadMyVideo_animation(sender);
	}else if (currTopicType == "video_demo"){
		loadMyVideo_demo(sender);
	}else if (currTopicType == "activity"||currTopicType == "activity_chapterVideo"){
		loadMyActivity(sender);
	}/*else if (currTopicType == "activity_chapterVideo"){
		loadMyActivity_chapterVideo(sender);
	}*/else{
		loadMyTextGraphic(sender);
	}
	//update topic name on player skin
	sender.findName("text_skin_topicName").Text = currTitle;

}
function buttonForward_rollOver(sender, eventArgs){
	tooltip_display(sender, eventArgs, 5);
	totalPages = topicTitleArray.length-1;
	if (currPage>=totalPages){
		disableForwardButton = 1;
		sender.findName("button_forward").Cursor = "Arrow";
	}else{
		sender.findName("buttonForward_lightUp").begin();
		disableForwardButton = 0;
		sender.findName("button_forward").Cursor = "Hand";
	}
}
function buttonForward_rollOut(sender, eventArgs){
	tooltip_hide(sender);
	if (disableForwardButton == 0){
		sender.findName("buttonForward_lightDown").begin();
	}
}
//content loading functions
function loadMyVideo(sender, eventArgs){
//set playing var = 1
	//clear the content object
	var contentRoot = sender.findName("content");
	if ( contentRoot.children.Count > 0 ) {
		contentRoot.children.Clear();
	}
	playingAni = 1;
	//display loading ani
	//set visibility of play/pause button
	sender.findName("pauseIcon").Visibility = "Visible";
	sender.findName("playIcon").Visibility = "Collapsed";
	sender.findName("media").Source=topicAudioVideoArray[currPage].firstChild.nodeValue;
	//unblock volume controls
	sender.findName("volume_buttonBlock").Visibility="Collapsed";
	//set transport visibility
	displayTransportControls(sender, eventArgs);
	sender.findName("media")["Canvas.Left"]=30;
	sender.findName("media")["Canvas.Top"]=53;
	//set nav button states
	setNavButtonStates(sender);
}

function loadMyVideo_demo(sender, eventArgs){
//set playing var = 1
	//clear the content object
	var contentRoot = sender.findName("content");
	if ( contentRoot.children.Count > 0 ) {
		contentRoot.children.Clear();
	}
	playingAni = 1;
	//display loading ani
	//set visibility of play/pause button
	sender.findName("pauseIcon").Visibility = "Visible";
	sender.findName("playIcon").Visibility = "Collapsed";
	sender.findName("media").Source=topicAudioVideoArray[currPage].firstChild.nodeValue;
	//unblock volume controls
	sender.findName("volume_buttonBlock").Visibility="Collapsed";
	//set transport visibility
	displayTransportControls(sender, eventArgs);
	sender.findName("media")["Canvas.Left"]=85;
	sender.findName("media")["Canvas.Top"]=53;
	sender.findName("media").Width = 688;
	//set nav button states
	setNavButtonStates(sender);
}

function loadMyVideo_animation(sender, eventArgs){
//set playing var = 1
	//clear the content object
	var contentRoot = sender.findName("content");
	if ( contentRoot.children.Count > 0 ) {
		contentRoot.children.Clear();
	}
	playingAni = 1;
	//display loading ani
	//set visibility of play/pause button
	sender.findName("pauseIcon").Visibility = "Visible";
	sender.findName("playIcon").Visibility = "Collapsed";
	sender.findName("media").Source=topicAudioVideoArray[currPage].firstChild.nodeValue;
	//unblock volume controls
	sender.findName("volume_buttonBlock").Visibility="Collapsed";
	//set transport visibility
	displayTransportControls(sender, eventArgs);
	sender.findName("media")["Canvas.Left"]=30;
	sender.findName("media")["Canvas.Top"]=53;
	sender.findName("media").Width = 800;
	//set nav button states
	setNavButtonStates(sender);
}

function loadMyAnimation(sender, eventArgs){
	currAudioVideo = topicAudioVideoArray[currPage].firstChild.nodeValue;
	playingAni = 1;
	sender.findName("pauseIcon").Visibility = "Visible";
	sender.findName("playIcon").Visibility = "Collapsed";
	sender.findName("media").Source=currAudioVideo;
	//unblock volume controls
	sender.findName("volume_buttonBlock").Visibility="Collapsed";
	//set transport visibility
	displayTransportControls(sender, eventArgs);
	// Build the XAML
	var XamlDom = new XmlDom();
	var success = XamlDom.load(topicArray[currPage].firstChild.nodeValue);
	var theXaml = XamlDom.documentElement.xml;
	var theContent = sender.getHost().content.createFromXaml( theXaml );
	// Add to the Root
	var contentRoot = sender.findName("content");
	//clear the content canvas
	if ( contentRoot.children.Count > 0 ) {
		contentRoot.children.Clear();
	}
	contentRoot.children.Add(theContent);
	theContent["Canvas.Left"]=30;
	theContent["Canvas.Top"]=53;
	theContent.Width=800;
	theContent.Height=520;
	//set nav button states
	setNavButtonStates(sender);
}
function loadMyTextGraphic(sender, eventArgs){
	sender.findName("media").Source = "";
	//display loading ani
	//uncollapseLoadingAnimation(sender,eventArgs);
	sender.findName("loadingText").Visibility = "Visible";
	sender.findName("loadingAnimation_fadeUp").begin();
	sender.findName("loadingAnimation_spinner").begin();
	//block volume controls
	sender.findName("volume_buttonBlock").Visibility="Visible";
	hideTransportControls(sender, eventArgs);
	// Build the XAML
//	var theXaml = sender.getResponseText("Scene.xaml");
	var XamlDom = new XmlDom();
	var success = XamlDom.load(topicArray[currPage].firstChild.nodeValue);
	var theXaml = XamlDom.documentElement.xml;
//	var theXaml = '<Canvas\n	xmlns="http://schemas.microsoft.com/client/2007"\n	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"\n	x:Name="Scene" \n	Width="640" Height="480">\n	<Rectangle Width="406" Height="234" Fill="#FF953D3D" Stroke="#FF000000" Canvas.Left="65" Canvas.Top="87"/>\n</Canvas>';
	var theContent = sender.getHost().content.createFromXaml( theXaml );
//	alert( theXaml );
	// Add to the Root
	var contentRoot = sender.findName("content");
	if ( contentRoot.children.Count > 0 ) {
		contentRoot.children.Clear();
	}
	contentRoot.children.Add(theContent);
	theContent["Canvas.Left"]=30;
	theContent["Canvas.Top"]=53;
	theContent.Width=800;
	theContent.Height=520;
	//add picture
	sender.findName("thePicture").Source = topicAudioVideoArray[currPage].firstChild.nodeValue;
	//set nav button states
	setNavButtonStates(sender);
}
function loadMyActivity(sender, eventArgs){
	//unload media element so audio/video doesn't continue playing:
	sender.findName("media").Source = "";
	//display loading ani
	//uncollapseLoadingAnimation(sender,eventArgs);
	sender.findName("loadingText").Visibility = "Visible";
	sender.findName("loadingAnimation_fadeUp").begin();
	sender.findName("loadingAnimation_spinner").begin();
	//block volume controls
	sender.findName("volume_buttonBlock").Visibility="Visible";
	hideTransportControls(sender, eventArgs);

	// Build the XAML
//	var theXaml = sender.getResponseText("Scene.xaml");
	var XamlDom = new XmlDom();
	var success = XamlDom.load(topicArray[currPage].firstChild.nodeValue);
	var theXaml = XamlDom.documentElement.xml;
//	var theXaml = '<Canvas\n	xmlns="http://schemas.microsoft.com/client/2007"\n	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"\n	x:Name="Scene" \n	Width="640" Height="480">\n	<Rectangle Width="406" Height="234" Fill="#FF953D3D" Stroke="#FF000000" Canvas.Left="65" Canvas.Top="87"/>\n</Canvas>';
	var theContent = sender.getHost().content.createFromXaml( theXaml );
//	alert( theXaml );
	// Add to the Root
	var contentRoot = sender.findName("content");
	if ( contentRoot.children.Count > 0 ) {
		contentRoot.children.Clear();
	}
	contentRoot.children.Add(theContent);
	theContent["Canvas.Left"]=30;
	theContent["Canvas.Top"]=53;
	theContent.Width=800;
	theContent.Height=520;
	//set nav button states
	setNavButtonStates(sender);

}

function hideTransportControls(sender, eventArgs){
	//set transport visibility
	sender.findName("mainTransportControls").Visibility = "Collapsed";
	sender.findName("transport_handle").Visibility = "Collapsed";
}
function displayTransportControls(sender, eventArgs){
	//set transport visibility
	sender.findName("mainTransportControls").Visibility = "Visible";
	sender.findName("transport_handle").Visibility = "Visible";
}
function setNavButtonStates(sender){
	totalPages = topicTitleArray.length-1;
	//back button
	if (currPage>1){
		//don't block
		sender.findName("button_back_buttonBlock").Visibility = "Collapsed";
	}else{
		//block
		sender.findName("button_back_buttonBlock").Visibility = "Visible";
	}
	//forward button
	if (currPage>=totalPages){
		//block
		sender.findName("button_forward_buttonBlock").Visibility = "Visible";
	}else{
		//don't block
		sender.findName("button_forward_buttonBlock").Visibility = "Collapsed";
	}
}
////////////////////////////////////////////////////////////////////////////
//need to collapse loading animation or it blocks stuff
function collapseLoadingAnimation(sender,args){
	sender.findName("loadingGraphic").Visibility="Collapsed";
}
function uncollapseLoadingAnimation(sender,args){
	sender.findName("loadingGraphic").Visibility="Visible";
}

//////////////////////////////////////////////////////////////////////////////
// DRAG AND DROP
//////////////////////////////////////////////////////////////////////////////
// Define state variables for drag and drop operation.
var transport_mouseDownX;
var transport_mouseDownY;
var beginX;
var beginY;
var volumeDrag_startX = 245;
var volumeDrag_endX = 325;
var volumeDrag_width = volumeDrag_endX - volumeDrag_startX;
var mediaTimeDrag_startX =620;
var mediaTimeDrag_endX = 760;
var mediaTimeDrag_width = mediaTimeDrag_endX - mediaTimeDrag_startX;
var isMouseDown = false;
var mediaTransportDragging = false;

//for volume
// Start drag and drop operation.
function onMouseDown_forDrag(sender, mouseEventArgs)
{
    // Set the beginning position of the mouse.
    beginX = mouseEventArgs.getPosition(null).x;
    beginY = mouseEventArgs.getPosition(null).y;
    isMouseDown = true;
    // Ensure this object is the only one receiving mouse events.
    sender.captureMouse()
}
function onMouseMove_forDrag_Volume(sender, mouseEventArgs)
{
    // Determine whether the mouse button is down.
    // If so, move the object.
    if (isMouseDown == true)
    {
        // Retrieve the current position of the mouse.
        var currX = mouseEventArgs.getPosition(null).x;
        var currY = mouseEventArgs.getPosition(null).y;
	if (currX >= volumeDrag_startX){
		if (currX <= volumeDrag_endX){
        // Reset the location of the object.
        sender["Canvas.Left"] += currX - beginX;
        // Update the beginning position of the mouse.
        beginX = currX;
        beginY = currY;
	  //set audio volume
	  //check position of dragger and calculate percentage of dragger width (mediaTimeDrag_width)
		var draggerCurrPos = (sender["Canvas.Left"]-214);	//unfortunately needed to put in coordinate manually, since it wasn't reading properly
		var draggerUpdatedPercent = draggerCurrPos/88;	//again, needed to put in exact value, not reading properly
		sender.findName("media").Volume = draggerUpdatedPercent;
		masterVolume = draggerUpdatedPercent;
	  }
	  }
    }
}
// Stop drag and drop operation.
function onMouseUp_forDrag(sender, mouseEventArgs)
{
    isMouseDown = false;
    // Allow all objects to receive mouse events.
    //sound waves graphics on audio button
	var soundWaves = sender.findName("soundWavesIcon");
    sender.releaseMouseCapture();
    if (masterVolume>0){
	soundWaves.Visibility = "Visible";
    }else{
	soundWaves.Visibility = "Collapsed";
    }
}

//for MEDIA TRANSPORT CONTROLS
// Reposition object during drag and drop operation.
function onMouseDown_forDrag_Media(sender, mouseEventArgs)
{
	//set the mouse down position, in case dragged outside of loaded video
    transport_mouseDownX = mouseEventArgs.getPosition(null).x;
    transport_mouseDownY = mouseEventArgs.getPosition(null).y;
    // Set the beginning position of the mouse.
    beginX = mouseEventArgs.getPosition(null).x;
    beginY = mouseEventArgs.getPosition(null).y;
    mediaTransportDragging = true;			//this stops the constant update of the dragger position
    isMouseDown = true;
    // Ensure this object is the only one receiving mouse events.
    sender.captureMouse();
}
// Reposition object during drag and drop operation.
var newTime;
function onMouseMove_forDrag_Media(sender, mouseEventArgs)
{
    // Determine whether the mouse button is down.
    // If so, move the object.
    if (isMouseDown == true)
    {
    var currAudio = sender.findName("media");
	//check position of dragger and calculate percentage of dragger width (mediaTimeDrag_width)
	var draggerCurrPos = sender["Canvas.Left"]-mediaTimeDrag_startX;
	var draggerUpdatedPercent = draggerCurrPos/mediaTimeDrag_width;
	//calculate where to set timelines in seconds and convert to 0:0:0
	var totalSeconds = Math.round(draggerUpdatedPercent*currAudio.NaturalDuration.seconds);			// The initial data, in seconds
	if (totalSeconds>0 && totalSeconds<currAudio.NaturalDuration.seconds){						//check that dragger value is greater than 0 and less than duration
		var minVar = Math.floor(totalSeconds/60);  									// The minutes
		var secondsVar = totalSeconds % 60;              								// The balance of seconds
		newTime = "0:"+minVar+":"+secondsVar;										//newTime defined
	}else{
		newTime = "0:0:0";
	}
        // Retrieve the current position of the mouse.
        var currX = mouseEventArgs.getPosition(null).x;
        var currY = mouseEventArgs.getPosition(null).y;
		if (currX >= mediaTimeDrag_startX){
			if (currX <= mediaTimeDrag_endX){
			// Reset the location of the object.
			sender["Canvas.Left"] += currX - beginX;
			// Update the beginning position of the mouse.
			beginX = currX;
			beginY = currY;

			}
		}
    }
}
// Stop drag and drop operation.
function onMouseUp_forDrag_Media(sender, mouseEventArgs)
{

	//check if video is loaded at curr point, if it is, do function below
	//if it's not loaded, send the transport back to orig point
	var currAudio = sender.findName("media");
	var draggerCurrPos = sender["Canvas.Left"]-mediaTimeDrag_startX;
	var percentComplete = currAudio.position.seconds/currAudio.NaturalDuration.seconds;
	var draggerUpdatedPercent = draggerCurrPos/mediaTimeDrag_width;

	var downloadProgress = currAudio.DownloadProgress;
	//alert ("orig="+transport_mouseDownX+" curr="+mouseEventArgs.getPosition(null).x);
	//alert ("downloadComplete="+downloadProgress.toFixed(3)+" draggerPercent="+draggerUpdatedPercent);
	if (downloadProgress>=(draggerUpdatedPercent)){
		if (playingAni == "1"){
			if (topicTypeArray[currPage].firstChild.nodeValue=="animation"){
				sender.findName("Timeline1").seek(newTime);
			}
			sender.findName("media").position=newTime;
			}else if (playingAni == "0"){
				if (topicTypeArray[currPage].firstChild.nodeValue=="animation"){
					sender.findName("Timeline1").seek(newTime);
				}
				sender.findName("media").position=newTime;
			}else{
				if (topicTypeArray[currPage].firstChild.nodeValue=="animation"){
					sender.findName("Timeline1").seek(newTime);
				}
				sender.findName("media").position=newTime;
		}
	}else{
		//return dragger to pre drag position and time
		//this happens automatically in updateProgressUI()
	}
	//and update variables

	//alert (newTime+" is newTime and status is "+currAudio.CurrentState);
	isMouseDown = false;
	mediaTransportDragging = false;
	// Allow all objects to receive mouse events.
	sender.releaseMouseCapture();
}
//button functions
function buttonTransport_rollOver(sender, eventArgs){
	sender.findName("buttonTransport_lightUp").begin();
}
function buttonTransport_rollOut(sender, eventArgs){
	sender.findName("buttonTransport_lightDown").begin();
}


//////////////////////////////////////////////////////////////////////////////
// TOOLTIPS
//////////////////////////////////////////////////////////////////////////////
function tooltip_display(sender, eventArgs, whichNum){
	//mouse position:
	var xMouse = eventArgs.getPosition(null).x;
	var yMouse = eventArgs.getPosition(null).y;
	sender.findName("tTip")["Canvas.Left"]= xMouse+10;
	sender.findName("tTip")["Canvas.Top"]= yMouse;
	sender.findName("tTip").Visibility="Visible";
	sender.findName("toolTip_display").begin();
	//define text
	sender.findName("tTip_text").Text = toolTipArray[whichNum];
	//define width of and
	//text actual width
	var tipActualWidth = sender.findName("tTip_text").ActualWidth;
	sender.findName("tTip_background").width = tipActualWidth+20;
	sender.findName("tTip_shadow").width = tipActualWidth+20;
}
function tooltip_hide(sender,eventArgs){
	sender.findName("tTip").Visibility="Collapsed";
}

//////////////////////////////////////////////////////////////////////////////
// XML PARSER
//////////////////////////////////////////////////////////////////////////////
test_topicArray = new Array;
test_topicTypeArray = new Array;
test_topicTitleArray = new Array;
test_topicAudioVideoArray = new Array;
var backgroundSkin = "";

//working with XML
function loadingXML(sender){
// zvon xpath
	var myXmlDom = new XmlDom();
	var success = myXmlDom.load("readinessPlayer.xml");
	topicTypeArray = myXmlDom.selectNodes("//pageType");
	topicArray = myXmlDom.selectNodes("//xamlFile");
	topicTitleArray = myXmlDom.selectNodes("//topic");
	topicAudioVideoArray = myXmlDom.selectNodes("//media");
	backgroundSkin = myXmlDom.selectSingleNode("/readinessLesson").getAttribute("skin");
	globalTextColor = myXmlDom.selectSingleNode("/readinessLesson").getAttribute("textColor");
	lessonName = myXmlDom.selectSingleNode("/readinessLesson").getAttribute("title");
	initSplashAnimation(sender);
	//hide all graphical elements, which will be shown after splash animation plays
	hideNavigationControls(sender);
	hideTransportControls(sender);
	sender.findName("mainMenu").Visibility = "Collapsed";

	//create a global variable to use in place of "sender"
	viewport = sender;
}
function initSplashAnimation(sender){
	//load video
	sender.findName("media_splashAnimation").Source=topicAudioVideoArray[0].firstChild.nodeValue;
	sender.findName("media_splashAnimation")["Canvas.Top"]=93;
	sender.findName("media_splashAnimation")["Canvas.Left"]=112;
	sender.findName("media_splashAnimation").Width = 620;
	sender.findName("media_splashAnimation").Height = 440;
	//splashPlaying = 1;

}

function silverlightLogoGlimmer(sender){
	sender.findName("silverlight_glimmer").Begin();
}