﻿package captivate.veela_as3 
{
	import flash.display.*;
	import flash.net.*;
	import flash.net.navigateToURL;
	import flash.net.URLRequest;
	import flash.ui.*;
	import flash.events.*;
	import flash.media.*;
	import flash.utils.*;
	
	import flash.external.ExternalInterface;
	import flash.system.ApplicationDomain;
	import flash.system.LoaderContext;
	import mmquizzingv4_as3.mmquizclasses.QuizParams;
	
	import flash.accessibility.*;
	import flash.system.Capabilities;
	import fl.accessibility.ComboBoxAccImpl;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.text.AntiAliasType;
	import flash.events.EventDispatcher;
	import captivate.veela_as3.internalEvents.*;
	import captivate.veela_as3.cpSharedDefinitonsMgr;

public dynamic class CaptivateMainTimeline extends MovieClip 
{
	private var m_EventDispatcher:Object;
	public var isCPMovie:Boolean = true;
	public var CPMovieType:Number = 1;
	var waitCount:Number = 0;
	var expired:Boolean = false;
//	public var rdinfoHasPlaybar:Boolean = true;
//	public var cpInfoFrameCount:Number = 90;
	public var rdinfoSlidesInProject:Number = 1;
//	public var rdinfoFPS:Number = 30;
	public var rdinfocurrFrame:Number = 1;
//	public var cpInfoCurrentFrame:Number = 1;
//	public var cpInfoCurrentSlide:Number = 0;
	public var rdinfoCurrentSlideInProject:Number = 1;
	public var swfCommenting:Boolean = false;
	//Only used by SWF Cmt AIR app
	public var swfCmtAutoPlay:Boolean = false;
	public var cpMovieHeight:Number;
	public var cpMovieWidth:Number;
//	public var cpInfoSlideCount:Number = 1;
//	var cpInfoIsMainMovie:Boolean = true;
	public var rdIsPreview:Boolean = false;
	public var rdIsPreviewInBrowser:Boolean = false; 
	public var rdIsStandalone:Boolean = false;
	var rdIsInLivePreviewMode:Boolean = false;
//	public var cpCmndGotoFrame:Number = -1;
//	public var cpCmndResume = 0;
//	public var cpCmndPause = 0;
//	public var cpCmndPrevious = 0;
//	public var cpCmndNext = 0;
//	public var cpCmndShowPlaybar = 1;
	//public var cpCmndCC:Boolean = false;//cpplaybar.as expects number.. for preivew???
//	public var cpCmndCC:Number = 0;
	public var _cpCmndMute:Boolean = false;
//	public var cpCmndPlaybarMoved = 0;
	var movieQuality:String = "best";
	var CaptivateVersion:String = "5.0.0";
	
	public var TOCEntries :Array;
	public var TOCStringTable:Array;
	public var TOCSettings:Object;
	public var NoOfTOCEntries:Number = -1;
	public var tocInitDone:Boolean=false;
	//public var playbarPosition:Number = 4;
	public var playbarHeight:Number = 30;
	public var isPlayBarBtnClicked:Boolean = false;
	//public var isPlayingFromSkin:Boolean;
//	TOCENTRIESDEFINITION
	POOL_LOADER_DECLARATIONS
	public var movie = null;
	
	
	public var m_Sub_mc_array:Array = new Array();
	//dnayak:flv list for closing net connections
	public var m_flv_array:Array = new Array();
	public var g_serranoViewerController = null;
	

	//KK Needed for Info
	/*
	public var author:String;
	public var email:String;
	public var company:String;
	public var website:String;
	public var copyright:String;
	*/
	VARIABLESDECLARATIONS

	public var movieXML:XML = CAPTIVATEXMLSTR;
	
	//Needed for embedding playbar
	//RK The properties below here are also present 
	//in cpSkinMainTimeLine for embedding playbar.
	//For Localization, need to modify there also.
	public var PlaybarProperties:XML = CPSKINXMLSTR;
	//public var PlaybarProperties:XML = <Playbar/>;
		
	var pbcBtnTips_ENU:Array = new Array("Rewind ",
									 "Back ",
									 "Play ",
									 "Pause ",
									 "Forward ",
									 "Closed Captioning ",
									 "Audio On ",
									 "Audio Off ",
									 "Exit ",
									 "Information ",
									 "Dummy for slider",
									 "Table Of Contents",
									 "2x Fast Forward Speed",
									 "4x Fast Forward Speed",
									 "Normal Speed",
									 "Print");

	public var pbcBtnTips:Array = pbcBtnTips_ENU;
	
	public var isPreviewSkin;
	public var isPreviewForAudioDialog:Boolean = false;
	public var isForceMuteAudio:Boolean = false;
	public var isPreview;
	
	var rdClibBoxSound_mc:MovieClip;
	
	private var preloaderPresent:Boolean = false;
	public var quizPlaybackController;//:rdQuizPlaybackController;
	public var _slideContent2;
	public var _slideContent;
	public var slideInfo = null;
	public var LocalConnectionInUse:Boolean;
	
	
	//TOC
	public var  TOCManager:Object = null;
	public var  TOCContainer_mc:MovieClip;
	public var  TOCInfoImage_mc:MovieClip;
    public var  contentLeft:int = 0;
    public var  contentTop:int = 0;
    public var  contentWidth:int = 0;
    public var  contentHeight:int = 0;
	public var 	ShowHideTocLeft_mc:MovieClip;
	public var 	ShowHideTocRight_mc:MovieClip;
	public var 	loadedFromAggregator:Boolean = false;
	public var 	DoNotRegisterRightClickBecauseOfAggregator:Boolean = false;
	public var cpHasSkinSWF:Boolean = false;
	public var errorDialog:MovieClip = null;
	
	//Border
	public var  cpSkinBorder_mc:MovieClip;
	
	//KK for Randomization
	public var  loadbase;
    public var m_quizPoolColl:Object;
	public var loading_mc:MovieClip;
	//public var poolSwf_Pool1_mc:MovieClip;
    var cpLoaderContext:LoaderContext = new LoaderContext();
	
	public var passwordPresent:Boolean = false;

	var cpMovieXForEmbededPlaybar:Number = 0;
	var cpMovieYForEmbededPlaybar:Number = 0;
	var cpMovieXForTOC:Number = 0;
	var cpMovieYForTOC:Number = 0;
	
	public var cpAutoPlay:Boolean = true;	//By default movie will start playing
	public var inAutoPlayState:Boolean = false;
	public var autoPlay_mc:MovieClip;
	public var autoPlayImage:MovieClip = null;
	
	public var cpCmndFastForward:Number = 0;
	var endSwfAction;
	private var projectEndAction;
	private var projectEndActionArg1;
	private var projectEndActionArg2;
	
	protected static const ACTION_OPEN_URL:int 				= 5;
	protected static const ACTION_OPEN_PROJECT:int 			= 6;
	protected static const ACTION_SEND_EMAIL:int 			= 7;
	protected static const ACTION_EXECUTE_JAVASCRIPT:int 	= 8;	
	
	private static const FLASH_MSG_SWFINITIALIZED = "SwfInitialized";
	
	var lmsString:String = " ";
	
	public var isContiniousModeRecording:Number = 0;
	private var EICallbacksAdded:Boolean = false;
	public var hasProjectFadeOut:Boolean = true;
	private var lmsInit_mc = null;

	public function get eventDispatcher():EventDispatcher
	{
		return m_EventDispatcher;
	}

	function sharedClassesLoadingDone(aEvent:Event):void
	{
		if(rdIsInLivePreviewMode == true)
		{
			// had to add hard coded text only for live preview
			trace("we are in live preview");
			var lSharedDefnMgr = cpSharedDefinitonsMgr.getInstance();
			var	lObjectClass:Class = lSharedDefnMgr.GetSharedDefinitonClass('com.adobe.captivate.events.CPSlideEnterEvent');
			if( ! lObjectClass )
			{
				trace("CaptivateMainTimeline::Critical Error : lObjectClass==null");
				return;
			}
			eventDispatcher.addEventListener(lObjectClass.CPSLIDEENTEREVENT, movieStartEventListener);
		}
		trace("loaded shared defintions");
		decrementWait();
	}

	function CaptivateMainTimeline()
	{
		try
		{
			incrementWait();
			m_EventDispatcher = cpEventDispatcher.getInstance();
			this.addChildAt(m_EventDispatcher,0);
			var lSharedDefnMgr = cpSharedDefinitonsMgr.getInstance();
			cpSharedDefinitonsMgr.executeOnLoadComplete(sharedClassesLoadingDone);
		}
		catch(e)
		{
			decrementWait();
			trace("we have an exception "+e);
		}
		if(TOCContainer_mc != null)
		{
			TOCContainer_mc.visible = false;
		}
		if (TOCInfoImage_mc != null)
		{
			TOCInfoImage_mc.visible = false;
		}
		if(ShowHideTocLeft_mc)
		{
			ShowHideTocLeft_mc.visible = false;
		}
		if(ShowHideTocRight_mc)
		{
			ShowHideTocRight_mc.visible = false;
		}
			
		var startFrame:int = 0;
		
		CAPTIVATEMAINTIMELINESTMNTS
		//passwordPresent = PASSWORDPRESENT;
		if(passwordPresent)
		{
			startFrame += 2;
			addFrameScript(0, dummyFrame1);
			addFrameScript(1,passwordframe1);
			//passwordPresent = true;
			if(preloaderPresent)
				startFrame += 1;
		}
		
		
		addFrameScript(startFrame, frame1);	//0
		startFrame++;
		addFrameScript(startFrame, frame2);	//1
		
		//preloaderPresent = PRELOADERPRESENT;
		if(preloaderPresent && !passwordPresent)
		{
			startFrame++;
			addFrameScript(startFrame, cpFrame3);	//2
			//preloaderPresent = true;
		}
		//addFrameScript(LASTFRAMEXMLSTR, lastFrame);
		//addFrameScript(2, lastFrame);
		
		//TODOAS3 Move it back to frame2 from constructor
		

		movie = (new captivate.veela_as3.rdMovie(this));
		_captivateMovie = movie;
		
		LocalConnectionInUse = false;

		this.addEventListener(Event.ENTER_FRAME,onenterframe);
		incrementWait();
		//INFO_INITIALIZATION_STR		
	}
	function dummyFrame1()
	{
		AddEICallbacks();	//Needed for Aggregator password protected cases
	}
	function passwordframe1()
	{		
		var lSharedDefnMgr = cpSharedDefinitonsMgr.getInstance();
		if(TOCContainer_mc != null)
		{
			TOCContainer_mc.visible = false;
		}
		if (TOCInfoImage_mc != null)
		{
			TOCInfoImage_mc.visible = false;
		}
		if(ShowHideTocLeft_mc)
		{
			ShowHideTocLeft_mc.visible = false;
		}
		if(ShowHideTocRight_mc)
		{
			ShowHideTocRight_mc.visible = false;
		}
		stop();
	}

	public function isWaiting() 
	{
		if (waitCount) {
		    return(true);
		}
		return(false);
	}

	public function incrementWait() 
	{
		if (waitCount) {
		    waitCount++;
		} else {
		    waitCount = 1;
		}
		trace("incrementWait = " + waitCount);
	}

	public function decrementWait() 
	{
		if (waitCount) {
		    waitCount--;
		}
		trace("decrementWait = " + waitCount);
	}

	public function setExpired() 
	{
		expired = true;
	}

	public function isExpired() 
	{
		if (expired == true) {
		    return(true);
		} else {
		    return(false);
		}
	}

	function createCpContextMenu() 
	{
		//var myContextMenu:ContextMenu = new ContextMenu();
//		myContextMenu.hideBuiltInItems();
//
//		var item:ContextMenuItem = new ContextMenuItem("Created with Adobe Captivate");// Any Menu  item with "adobe" wont appear in FP9
		//myContextMenu.customItems.push(item);
		//item.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, adobeHomeMenuItemHandler);

		//this.contextMenu = myContextMenu			
	}	
	
	function getItem(objName:String,parentObject:Object):Object
	{
		var childCount = parentObject.numChildren;
		var retVal = null;
		for(var i = 0; i < childCount; ++i)
		{
			if( parentObject.getChildAt(i).name == objName)
			{
				retVal = parentObject.getChildAt(i);
			}
		}
		return retVal;
	}

	public function FindObjectByName(objName:String):Object
	{
		var retVal = null;
		var curSlideData = movie.getCurrentSlideData();
		var curSlide = null;
		if(curSlideData)
			curSlide = curSlideData.getSlideMC();
		var aObj = curSlide;
		var isQuestionSlide = (curSlide.className == "rdQSlide");
		var isResultSlide:Boolean = false;
		if(isQuestionSlide)
			isResultSlide = aObj["m_resultSlide"];
		while(aObj != null)
		{
			/*******************************************************
			This is temporary fix for live preview.
			At runtime we are not able to get objects in earlier way.
			Just putting a hack to make it at least work now.
			*******************************************************/
			retVal = getItem(objName,aObj);
			trace("return value = " + retVal);
			if(retVal != null)
				break;
			if(isResultSlide)
			{
				var questionMC = getItem("_scoreDisplay",aObj);
				trace("resultslide = " + questionMC);
				if(questionMC)
				{
					trace("got result slide");
					//retVal = getItem(objName,questionMC);
					retVal = questionMC[objName];
					if(retVal != null)
						break;
				} 
			}
			if(isQuestionSlide)
			{
				var questionMC = getItem("_question",aObj);
				if(questionMC)
				{
					retVal = getItem(objName,questionMC);
					if(retVal != null)
						break;
				}
			}
			/*			
			if(aObj.hasOwnProperty(objName))	
			{
				retVal = aObj[objName];
				trace("return value = " + retVal);
				break;
			}
			if(isResultSlide)
			{
				var questionMC = aObj["_scoreDisplay"];
				if(questionMC && questionMC.hasOwnProperty(objName))
				{
					retVal = questionMC[objName];
					break;
				}
			}
			if(isQuestionSlide)
			{
				var questionMC = aObj["_question"];
				if(questionMC && questionMC.hasOwnProperty(objName))
				{
					retVal = questionMC[objName];
					break;
				}
			}
			*/
			aObj = aObj.parent;
		}
		trace("effect object = "+retVal);
		return retVal;
	}

	//For Setting effects for live preview.
	public function SetEffectOnObject(objectName:String, xml:String, delayFrames:int = 0):void
	{
		var targetObject = FindObjectByName(objectName);
		trace("object found "+ objectName);	
		var effectXML:XML = new XML(xml);
		if(effectXML)
		{
			if(targetObject.hasOwnProperty("RestoretoOriginalItemProperties"))
				targetObject.RestoretoOriginalItemProperties();
			if(targetObject.hasOwnProperty("setItemForLivePreview"))
				targetObject.setItemForLivePreview();
			targetObject.SetCurrentEffect(effectXML,delayFrames);
		}
	}
		
	function adobeHomeMenuItemHandler(e:ContextMenuEvent) 
	{
	    var url:String = "http://www.adobe.com/products/captivate";
	    var request:URLRequest = new URLRequest(url);
	    navigateToURL(request);
	}		

	//used by swf commenting
	public function doRightClick():void{
		trace("calling RIGHT Click");
		rdRightClickBox.doRightClick();
	}		

	/* Here we insert the global vars*/
	public function get cpCmndVolume()
	{
		return movie.m_soundHandler.Volume;
	}
	public function set cpCmndVolume(aVolume)
	{
		if (aVolume > 100) 
			aVolume = 100;
		else if (aVolume < 0)
			aVolume = 0;
			
		movie.m_soundHandler.Volume = aVolume;
	}
	public function get cpInfoElapsedTimeMS()
	{
		//if(m_paused)
		//	return m_TimeAtPause;
		//return (cpInfoEpochMS - m_StartTime) + m_TimeAtPause;
		return (cpInfoEpochMS - movie.m_StartTime);
	}
	/* End of global vars*/

	public function get cpInfoCurrentDateString():String
	{
		var now:Date = new Date();
		return (now.getMonth() + 1 + "/" + now.getDate() + "/" + now.getFullYear());
	}
	public function get cpInfoCurrentDate():String
	{
		var now:Date = new Date();
		return String(now.getDate());
	}
	public function get cpInfoCurrentMonth():String
	{
		var now:Date = new Date();
		return String(now.getMonth() + 1);
	}
	public function get cpInfoCurrentYear():String
	{
		var now:Date = new Date();
		return String(now.getFullYear());
	}
	public function get cpInfoCurrentDay():String
	{
		var now:Date = new Date();
		return String(now.getDay()+ 1);
	}

	public function get cpInfoCurrentTime():String
	{
		var now:Date = new Date();
		return (now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds());
	}
	public function get cpInfoCurrentHour():String
	{
		var now:Date = new Date();
		return String(now.getHours());
	}
	public function get cpInfoCurrentMinutes():String
	{
		var now:Date = new Date();
		return String(now.getMinutes());
	}

	
	public function get cpInfoEpochMS()
	{
		var now:Date = new Date();
		return now.getTime();
	}
	public function get cpInfoCurrentSlide()
	{
		return (rdinfoCurrentSlide + 1);
	}
	public function get cpInfoCurrentSlideType()
	{
		var currSlideData;
		var rtrn : String;

		currSlideData = movie.m_currSlide;
		if(currSlideData)
		{
			if (currSlideData.m_rdSlide_mc.className == "rdRandomQSlide")
			{
				rtrn = "RandomQuestionSlide";
			}
			else if (currSlideData.m_rdSlide_mc.className == "rdQSlide")
			{
				rtrn = "QuestionSlide";
			}
			else
			{
				rtrn = "NormalSlide" ;
			}
		}
		else
			rtrn = "" ;
		return (rtrn);
	}	
	
	public function get rdcmndGotoSlide()
	{
		return cpCmndGotoSlide;
	}
	public function set rdcmndGotoSlide(aSlideNum)
	{
		cpCmndGotoSlide = aSlideNum;
	}
	public function get cpCmndGotoFrameAndResume()
	{
		return rdcmndGotoFrameAndResume;
	}
	public function set cpCmndGotoFrameAndResume(aFrameNum)
	{
		rdcmndGotoFrameAndResume = aFrameNum;
	}
	public function get rdcmndNext()
	{
		return cpCmndNext;
	}
	public function set rdcmndNext(aNext)
	{
		cpCmndNext = aNext;
	}
	public function get rdcmndPlaybarMoved()
	{
		return cpCmndPlaybarMoved;
	}
	public function set rdcmndPlaybarMoved(aMoved)
	{
		cpCmndPlaybarMoved = aMoved;
	}
	public function get rdcmndMute()
	{
		return cpCmndMute;
	}
	public function set rdcmndMute(aMute)
	{
		cpCmndMute = aMute;
	}
	
	public function get cpCmndMute()
	{
		return _cpCmndMute;
	}
	public function set cpCmndMute(aMute)
	{
		_cpCmndMute = aMute;
		var swfsound:SoundTransform = new SoundTransform();
		if(_cpCmndMute)
		{			
			swfsound.volume = 0;
		}
		else
		{
			swfsound.volume = 1;
		}
		if(movie != null)
		{
			movie.soundTransform = swfsound;
		}
		SoundMixer.soundTransform = swfsound;
	}
	
	public function get rdcmndCC()
	{
		return cpCmndCC;
	}
	public function set rdcmndCC(aCC)
	{
		cpCmndCC = aCC;
	}
	public function get rdisMainMovie()
	{
		return cpInfoIsMainMovie;
	}
	public function set rdisMainMovie(aIsMainMovie)
	{
		cpInfoIsMainMovie = aIsMainMovie;
	}
	
	function movieStartEventListener(startEvent:Event)
	{
	  trace("movie started");
	  try{
			if(ExternalInterface.available)
			{
				trace("ExternalInterface is available");
				ExternalInterface.call(FLASH_MSG_SWFINITIALIZED, "");
			}
			else
			 trace("External interface not available");
		}catch(e)
		{
			trace("Security sandbox violation error " + e);
		}
		eventDispatcher.removeEventListener("CPSlideEnterEvent", movieStartEventListener);
	}
	function frame1()
	{
		if(cpHasSkinSWF)
		{
			if(parent.parent != null)
				if(parent.parent.parent != null)
					if(parent.parent.parent.parent != null)
						if(parent.parent.parent.parent.hasOwnProperty("AggManager"))
							if(parent.parent.parent.parent.AggManager.hasOwnProperty("MakeContentMovieWaitForAggregator"))
								if(parent.parent.parent.parent.AggManager.MakeContentMovieWaitForAggregator == true)
								{
									loadedFromAggregator = true;
									incrementWait();
								}
		}
		else
		{
			if(parent.parent != null)
				if(parent.parent.hasOwnProperty("AggManager"))
					if(parent.parent.AggManager.hasOwnProperty("MakeContentMovieWaitForAggregator"))
						if(parent.parent.AggManager.MakeContentMovieWaitForAggregator == true)
						{
							loadedFromAggregator = true;
							incrementWait();
						}
		}
		
		var lSharedDefnMgr = cpSharedDefinitonsMgr.getInstance();
			
		try{
			ComboBoxAccImpl.enableAccessibility();
		}catch(e)
		{
			//ComboBoxAccImpl class wont be present if quizzing not present.
		}
		createCpContextMenu();
		var pacemaker = new rdPacemaker(movie);
    		movie.SetPacemaker(pacemaker);
		
	
	//	FIRSTFRAMEXMLSTR

	//	VARIABLESINITIALIZATIONS
		
		//AS3TODO Move to frame2() and have 2 files for with &^ w/o preloader
		SECONDFRAMEXMLSTR

		AddEICallbacks();
		//TOCSTR
		tocInitDone = true;
		

		if(tocInitDone == true)
		{
			if(NoOfTOCEntries != -1)
			{
				if(TOCManager==null)
				{
				if(Capabilities.playerType == "External")
				{
					createTOC();
				}
				else
				{
					var SO:SharedObject = SharedObject.getLocal("persistanceInfo");
					var firstDisplay = true;
					if(this["expire_mc"])
						this["expire_mc"].frame1();
					if( undefined == SO.data.swfID )
						firstDisplay = true;
					else if( SO.data.swfID == TOCSettings.SWFFileID )
					{
						firstDisplay = false;
						if( SO.data.dontAsk )
							TOCSettings.HasSelfPaced = SO.data.HasSelfPaced;
					}
				if( TOCSettings.HasSelfPaced && !firstDisplay && !SO.data.dontAsk && !loadedFromAggregator )
						{
							if(!isExpired())
							{
								TOCContainer_mc.visible = false;
								incrementWait();
								DisplayTOCConfirmationDialog();
							}
						}
						else 
						{
							createTOC();
						}
					}
				}
			}
		}
		
		m_quizPoolColl = new Object();
		
		
		cpLoaderContext = new LoaderContext();
		cpLoaderContext.applicationDomain = ApplicationDomain.currentDomain;
		cpTimeLineref = this;
		
		POOL_INIT_STR
		
		
		if(movieXML.hasOwnProperty("AccProps") )
		{
			accessibilityProperties = new AccessibilityProperties();
			accessibilityProperties.name = movieXML.AccProps.name;
			
			if(movieXML.AccProps.hasOwnProperty("description"))
				accessibilityProperties.description = movieXML.AccProps.description;
				
			if(Capabilities.hasAccessibility)
				Accessibility.updateProperties();
		}
		var projectEndXML:XMLList = XMLList(movieXML.Project.ProjectEndOptions);
		projectEndAction = Number(projectEndXML.projectEndAction);
		projectEndActionArg1 = projectEndXML.projectEndActionArg1;
		projectEndActionArg2 = projectEndXML.projectEndActionArg2;
		if(isPreviewForAudioDialog)
		{
			//Keep the movie paused when loaded. It will be resumed on user action.
			//This cant be done from the APE as it does not take EI calls soon after loading.
			rdcmndPause = 1;
			//Disable all interactions
			stage.mouseChildren	= false;
			stage.tabChildren	= false;

			stage.addEventListener(Event.RESIZE, StageResizeHandler);
		}
		decrementWait();
	}
	
	private function StageResizeHandler(event:Event):void 
	{
		var xPos:Number = 0;
		var yPos:Number = 0;
		for(var i = 0; i< numChildren; i++)
		{
			var slide = getChildAt(i);
			if(slide && slide.hasOwnProperty("className"))
			{
				if(slide.className == "rdSlide" || slide.className == "rdQSlide" || slide.className == "rdRandomQSlide" )
				{
					xPos = slide.x;
					yPos = slide.y;
					break;
				}
			}
		}
		this.mask = null;
		var mask_mc:MovieClip=new MovieClip();
		mask_mc.graphics.beginFill(0xFF0000,1);
		mask_mc.graphics.drawRect(xPos,yPos,cpMovieWidth,cpMovieHeight);
		this.mask = mask_mc;
    }
	
	function cpFrame3()
	{
		if(cpAutoPlay == false)
		{
			stopAutoPlay();
		}
		movie.m_startPlaying = true;
	}
	
	function loadStart(aEvent:Event)//OnQuizPoolLoadStart(mc)//loadStart(aEvent:Event)
	{
		trace(" @@@@@@@ POOL loadStart @@@@@@@ ");
		trace("ref  "+ cpTimeLineref);
		var targetpoolSwf_mc =  cpTimeLineref.getChildByName(aEvent.currentTarget.loader.name);//"poolSwf_Pool1_mc");//aEvent.currentTarget.loader.name)

		trace("targetpoolSwf_mc  "+ targetpoolSwf_mc);

		if (targetpoolSwf_mc && loading_mc)
		{
			loading_mc.setSWFLoadStatus(targetpoolSwf_mc, 1);
			targetpoolSwf_mc.visible = false;
		}
		incrementWait();
	}
	
	
	function loadError(aEvent:Event)
	{
		decrementWait();
		trace((">> loadListener.onLoadError()  " + loading_mc));
		trace(">> ==========================");
		throw (new Error(" ------- Could not load pool swf ----------- "));
	}
	
	function loadComplete(aEvent:Event)
	{
		
		
		trace(" @@@@@@@ POOL COMPLETE @@@@@@@ ");
		
		
		
		//trace((" cpTimeLineref " + cpTimeLineref));
		//trace(("cpTimeLineref.poolSwf_Pool1_mc  " + cpTimeLineref.poolSwf_Pool1_mc));
		///trace(("lm  " + lm));
		
		//trace("aEvent.currentTarget.loader.name  "+ aEvent.currentTarget.loader.name);
		
		trace("cpTimeLineref  "+ cpTimeLineref);
		var targetpoolSwf_mc =  cpTimeLineref.getChildByName(aEvent.currentTarget.loader.name);//"poolSwf_Pool1_mc");//aEvent.currentTarget.loader.name)
		
		
		trace("targetpoolSwf_mc  "+ targetpoolSwf_mc);
		//targetpoolSwf_mc.addChild(aEvent.currentTarget.loader.content);
		
		
		//loading_mc.setSWFLoadStatus(targetpoolSwf_mc, 3);
		decrementWait();
		trace("DONE***********");
	}
	
	public function removeAutoPlay()
	{
		cpAutoPlay = true;
		inAutoPlayState = false;
		if(autoPlay_mc != null)
			autoPlay_mc.remove();
	}
	
	function doAutoPlay()
	{
		cpAutoPlay = true;
		inAutoPlayState = false;
		autoPlay_mc.remove();
		rdcmndResume = 1;
		movie.m_slideData_array[0].m_rdSlide_mc.visible = true;
		
		var playbarRef = getSwfPlaybar();
		if(playbarRef)
			playbarRef.autoPlayStarted();
			
		//Show LMS init movie
		showLMSInit();
	}
	
	function getSwfPlaybar():MovieClip
	{
		var theParent:Object = this;
		var thePlaybar:Object = null;
		while (theParent) {
			if(theParent.hasOwnProperty("cpPbcBar_mc") && theParent.cpPbcBar_mc && theParent.cpPbcBar_mc.hasOwnProperty("pbcBar_mc"))
			{
				return theParent.cpPbcBar_mc.pbcBar_mc;
			}
			else {
				theParent = theParent.parent;
			}
		}
		return null;
	}
	
	function frame2()
	{
		//start playing movie after initialization on first frame is done
		
		//trace("=========== function frame2() ===========" + movie + "  "+ movie.m_startPlaying);
		if(preloaderPresent == false || passwordPresent == true)
		{
			if(cpAutoPlay == false)
			{
				stopAutoPlay();
			}
			trace("frame2 movie.m_startPlaying");
			movie.m_startPlaying = true;
		}

		
		try{
			var cpSkinRef = parent.root;
			if ( cpSkinRef != null && cpSkinRef.hasOwnProperty("cpCaptivateSkinSWF") && cpSkinRef.cpCaptivateSkinSWF == true)
				movie.m_cpCC =  cpSkinRef.cpCC_mc;//if parent (loader) has CC area, use it
			else
				movie.m_cpCC = getChildByName("cpCC_mc");
		}
		catch (err:Error)
		{
				movie.m_cpCC = null;
		}
		
		//trace(" cpCC_mc "+ cpCC_mc);
		trace("  done frame2 "+ movie.m_startPlaying);

		SECONDFRAMEQUIZZINGXMLSTR
		
		if(cpAutoPlay == true){
			showLMSInit();
		}
		
		// check //
		if(cpSkinBorder_mc != null)	
			cpSkinBorder_mc.visible = Boolean(isPreviewSkin);	
	}
	function showLMSInit():void{
		if(movie.m_quizPlaybackController != null && !isPreview){
			var preferredLMSType = movie.m_quizPlaybackController.preferredLMSType;
			if (preferredLMSType != "" && preferredLMSType != "email")
			{
				trace("Showing LMS init movie");
				//rdcmndPause = 1;
				showLMSInitMovie();
				//movie.doPlay();
			}
		}
	}
	

	function lastFrame()
	{
		try{
			if(ExternalInterface.available)
				ExternalInterface.call("cpAllSlidesLoaded");
		}catch(e)
		{
			//ignore if the call fails
		}
		stop();
	}
    function onenterframe(event:Event):void
    {
       
        //trace("*********** CaptivateMainTimeline::onenterframe() ********"+ movie );
        if (movie != undefined) {
            movie.movieonEnterFrame();
        }
    }
    
    //called by global level items.
    public function itemLoaded(item) 
    {
        //trace("############## itemLoaded  ##########  "+ item);
        if (typeof(item.setMovie) == "function")
        {
           // trace("calling item.setMovie");
            item.setMovie(this.movie);
        }
    }
    public function get cpQuizInfoPassFail():Number
	{
		if(quizPlaybackController)
		{
			 var quizParamsArr:Array = quizPlaybackController.quizParams;
			 if(quizParamsArr && quizParamsArr.length)
			 {
				var quizParams = quizParamsArr[0];
				if(quizParams)
				{
					var lqController = quizPlaybackController.getQuizController(quizParams.quizID);
					if(lqController)
					{
						return lqController.isPassed;
					}
				}
			 }
		}
		return false;
	}	
			
    public function getSlideIndexFromFrame(frame) {
        return(movie.getSlideIndexFromFrame(frame));
    }
    

	//For External Interface
	public function cpEISetValue(variable:String, val):void
	{
		//myTrace("cpSetValue variable1 " + variable + " ; val  " + val);
		
		var arr:Array = variable.split(".");
		var ref = this;
		
		for(var i=0; i < arr.length -1; i++)
		{
			ref = ref[arr[i]];
		}
		var nVal:Number = Number(val);
		if(isNaN(nVal))
			ref[ arr[arr.length -1] ] = val;		//For Strings
		else
			ref[ arr[arr.length -1] ] = nVal;		//For Numbers and booleans
	}
	
	public function cpEIGetValue(variable:String)
	{
		//myTrace("cpGetValue variable " + variable);
		
		var arr:Array = variable.split(".");
		var ref = this;
		
		for(var i=0; i < arr.length -1; i++)
		{
			ref = ref[arr[i]];
		}
		ref = ref[ arr[arr.length -1] ];
		return ref;	
	}

	public function cpEIXMLGetValue(variable:String)
	{
		var arr:Array = variable.split(".");
		var ref = this;
		
		for(var i=0; i < arr.length -1; i++)
		{
			ref = ref[arr[i]];
		}
		ref = ref[ arr[arr.length -1] ];
		var abc:String = ref;
		return abc;
	}

	public function cpGetValue(variable:String)
	{
		return cpEIGetValue(variable);
	}
	
	public function mycpSetValue(variable:String)
	{
		//myTrace("cpGetValue variable " + variable);
		//trace("\n rdcmndPause " + rdcmndPause);
		rdcmndResume = 0;
		rdcmndPause = 1;
		
		//trace("\n end of mycpSetValue:: rdcmndPause " + rdcmndPause);
		return variable;	
	}
	public function mycpSetValue2(variable:String)
	{
		//myTrace("cpGetValue variable " + variable);
		//trace("\n rdcmndPause " + rdcmndPause);
		rdcmndResume = 1;
		rdcmndPause = 0;
		
		//trace("\n end of mycpSetValue2:: rdcmndPause " + rdcmndPause);
		return variable;	
	}
	
	private function myTrace(str:String)
	{
		trace("CaptivateMainTimeline::"+str);
	}

	function addQuizPoolData(quizPoolData)
	{
		trace("^^^^^^^^^ addQuizPoolData  quizPoolData.poolname  "+quizPoolData.poolname );
		m_quizPoolColl[quizPoolData.poolname] = quizPoolData;
	}

    function OnQuizPoolInitialized(mc) 
    {
       targetMC = mc.parent;
       trace("-------onQuizPoolInitialized-----------  mc  "+ mc);
       
       trace("targetMC   "+ targetMC.name);
       
       trace("mc.movie   "+ mc.movie);
       
       
		trace(("mc.numChildren  " + mc.numChildren));
        for (var i = 0; i< mc.numChildren; i++) 
        {
            var achild = mc.getChildAt(i);
            if(achild)
            {
				var achildName = achild.name;
				if (achildName.lastIndexOf("__question_mc") > 0) 
				{
					achild.visible = false;
				}
			}
        }
        mc.visible = true;
        addQuizPoolData(mc.movie.m_quizPoolData);
        trace("loading_mc = " + loading_mc);
        
		if(loading_mc)
	        loading_mc.setSWFLoadStatus(targetMC, 3);
        decrementWait();
    }
 
	public function getLoadBase()
	{
		var _url:String = loaderInfo.url;
		if (loadbase == undefined){
			var q = _url.indexOf("?");
			if (q > 0){
				loadbase = _url.substring(0, (Math.max(_url.lastIndexOf("/", q), _url.lastIndexOf("\\", q)) + 1));
			} else {
				loadbase = _url.substring(0, (Math.max(_url.lastIndexOf("/"), _url.lastIndexOf("\\")) + 1));
			};
		};
		return (loadbase);
	}
	
	//Made this public as this is also used by SWF Commenting AIR app
	public function timerHandler(ae:TimerEvent)
	{
		if(movie.m_slideData_array[0].m_rdSlide_mc)
		{
			movie.setCurrSlide(0);
			movie.m_slideData_array[0].m_rdSlide_mc.visible = false;
			ae.target.removeEventListener(TimerEvent.TIMER,timerHandler);
		}
	}
	
	private function stopAutoPlay()
	{
		var timer:Timer = new Timer(10,0);
		timer.addEventListener(TimerEvent.TIMER,timerHandler);
		timer.start();
		rdcmndPause = 1;
		autoPlay_mc.initialize();
		inAutoPlayState = true;
	}
	
	function endMovieFunction()
	{
		var scriptEval = new rdScriptEval();
		scriptEval.Load(rdSlide(movie.m_slideData_array[0].m_rdSlide_mc));
		var script = projectEndActionArg1;
		trace(script);
		
		
		
		if (script != "")
			scriptEval.EvaluateScript(script);
	}
	
	public function showLMSInitMovie():void{
	
		if(lmsInit_mc == null)
		{
			lmsInit_mc = new cpLmsInitClip(lmsString,cpMovieWidth,cpMovieHeight);
			addChild(lmsInit_mc);
			lmsInit_mc.ShowInitClip();
		}
	}
	
	public function hideLMSInitMovie():void{
	
		if(lmsInit_mc != null)
		{
			lmsInit_mc.HideInitClip();
			removeChild(lmsInit_mc);
		}
	}
	
	function TocOverlayBtnInitialize()
	{
		if(TOCSettings.TOCStyle != 0)	//Not overlay mode
			return;
		if(ShowHideTocLeft_mc == null || ShowHideTocLeft_mc == undefined)
			return;
		if(ShowHideTocRight_mc == null || ShowHideTocRight_mc == undefined)
			return;
		if(TOCManager == null || TOCManager == undefined)
			return;
		if(TOCManager.TOCModel == null || TOCManager.TOCModel == undefined)
			return;
			
		ShowHideTocLeft_mc.visible = false;
		ShowHideTocRight_mc.visible = false;
		
		ShowHideTocLeft_mc.gotoAndStop(1);
		ShowHideTocRight_mc.gotoAndStop(1);
		
		if(TOCSettings.TOCPosition == 1)	//if toc is on left
		{
			ShowHideTocLeft_mc.x = TOCContainer_mc.x + TOCManager.TOCModel.getTOCWidth();
			ShowHideTocRight_mc.x = TOCContainer_mc.x ;
			if(TOCContainer_mc.visible)
				ShowHideTocLeft_mc.visible = true;
			else
				ShowHideTocRight_mc.visible = true;
		}
		else
		{
			ShowHideTocLeft_mc.x = TOCContainer_mc.x + TOCManager.TOCModel.getTOCWidth() - ShowHideTocLeft_mc.width;
			ShowHideTocRight_mc.x = TOCContainer_mc.x - ShowHideTocRight_mc.width;
			if(TOCContainer_mc.visible)
				ShowHideTocRight_mc.visible = true;
			else
				ShowHideTocLeft_mc.visible = true;
		}
		
		ShowHideTocLeft_mc.y = cpMovieYForTOC + contentTop;
		ShowHideTocRight_mc.y = cpMovieYForTOC + contentTop;
		
		ShowHideTocLeft_mc.buttonMode = true;
		ShowHideTocLeft_mc.useHandCursor = true;
		ShowHideTocLeft_mc.addEventListener(MouseEvent.MOUSE_UP,onTocOverlayButtonUp);
		ShowHideTocLeft_mc.addEventListener(MouseEvent.MOUSE_OVER,onTocOverlayButtonOver);
		ShowHideTocLeft_mc.addEventListener(MouseEvent.MOUSE_OUT,onTocOverlayButtonOut);
		ShowHideTocLeft_mc.addEventListener(KeyboardEvent.KEY_DOWN,onTocOverlayButtonkeyDown);
		ShowHideTocLeft_mc.addEventListener(FocusEvent.FOCUS_IN, focusInHandler);
		ShowHideTocLeft_mc.addEventListener(FocusEvent.FOCUS_OUT, focusOutHandler);
		ShowHideTocLeft_mc.tabEnabled = true;
		ShowHideTocLeft_mc.tabChildren = false;
		ShowHideTocLeft_mc.focusRect = true;
		
		ShowHideTocRight_mc.buttonMode = true;
		ShowHideTocRight_mc.useHandCursor = true;
		ShowHideTocRight_mc.addEventListener(MouseEvent.MOUSE_UP,onTocOverlayButtonUp);
		ShowHideTocRight_mc.addEventListener(MouseEvent.MOUSE_OVER,onTocOverlayButtonOver);
		ShowHideTocRight_mc.addEventListener(MouseEvent.MOUSE_OUT,onTocOverlayButtonOut);		
		ShowHideTocRight_mc.addEventListener(KeyboardEvent.KEY_DOWN,onTocOverlayButtonkeyDown);
		ShowHideTocRight_mc.addEventListener(FocusEvent.FOCUS_IN, focusInHandler);
		ShowHideTocRight_mc.addEventListener(FocusEvent.FOCUS_OUT, focusOutHandler);
		ShowHideTocRight_mc.tabEnabled = true;
		ShowHideTocRight_mc.tabChildren = false;
		ShowHideTocRight_mc.focusRect = true;
	}
	function onTocOverlayButtonUp(aevet:Event)
	{
		TOCManager.showTOC();
	}
	
	function onTocOverlayButtonOver(aevet:Event)
	{
		aevet.currentTarget.gotoAndStop(2);
	}
	
	function onTocOverlayButtonOut(aevet:Event)
	{
		aevet.currentTarget.gotoAndStop(1);
	}
	
	function focusInHandler(aevent:Event)
	{
		onTocOverlayButtonOver(aevent);
	}
	
	function focusOutHandler(aevent:Event)
	{
		onTocOverlayButtonOut(aevent);
	}
	
	function onTocOverlayButtonkeyDown(aevent:Event)
	{
		if((aevent.keyCode == Keyboard.ENTER) || (aevent.keyCode == Keyboard.SPACE))
		{
			onTocOverlayButtonUp(aevent);
		}
	}
	public function setLoadedFromAggregator(isMovieMute:Boolean)
	{
		loadedFromAggregator = true;
		if( errorDialog )
		{
			decrementWait();
			removeChild(errorDialog);
			errorDialog = null;
		}
		if(TOCManager!=undefined)
			TOCManager.setLoadedFromAggregator();
		if(cpInfoHasPlaybar)
		{
			var playbarRef = getSwfPlaybar();
			if(playbarRef)
			{
				if(playbarRef.IsPlaybarInitialized())
				{
					playbarRef.initPbcBtnVisibility();
					playbarRef.layOutPbcBtns();
				}
				if(isMovieMute)
				{
					playbarRef.onPBCBtnClick("audioOff");
				}
			}
		}
	}
	
	private function AddEICallbacks():void
	{
		// for External Interface	-- Needed for Preview, AGGREGATOR
		//if(( (isPreview == 1) ||(isPreviewSkin == 1) ||  (isPreviewForAudioDialog == 1 ) ) && (ExternalInterface.available == true) && (parent==stage))
		try
		{
			//Shouldn't be placed inside constructor as it always gives parent==stage as true
			if(!EICallbacksAdded && (ExternalInterface.available == true) && (parent==stage)) //Needed when cp is inserted in cp
			{
				trace("ExternalInterface is available parent==stage "  +(parent==stage));
				ExternalInterface.addCallback("cpEISetValue", cpEISetValue);
				ExternalInterface.addCallback("cpEIGetValue", cpEIGetValue);
				ExternalInterface.addCallback("cpEIXMLGetValue", cpEIXMLGetValue);
				ExternalInterface.addCallback("cpGetValue", cpGetValue);
				ExternalInterface.addCallback("mycpSetValue", mycpSetValue);
				ExternalInterface.addCallback("mycpSetValue2", mycpSetValue2);
				ExternalInterface.addCallback("SetEffectOnObject", SetEffectOnObject);
				EICallbacksAdded = true;
			}			
		}
		catch(e)
		{
			myTrace("Security sandbox violation error " + e);
		}		
	}
	
	private function DisplayTOCConfirmationDialog() : void
	{
		 errorDialog = new captivate.veela_as3.cpTOCConfirmationDialog(this);
		 addChild(errorDialog);
	}
	
	function createTOC()
	{
		if(isExpired())
		{
			if(TOCContainer_mc)
				TOCContainer_mc.visible = false;
			return;
		}
		if(NoOfTOCEntries != -1)
		{
			if(TOCManager==null)
			{
				TOCManager = new cpTOCManager();
				TOCManager.parentMovie = this;
				TOCManager.createTOC();			
				var ref = this;
				if(TOCManager.TOCModel!=null)
				{
					if(TOCManager.TOCModel.getTOCStyle() == 1)
					{
						//seperate style -> show the toc
						TOCContainer_mc.visible = true;
					}
					else
					{
						//overlay style -> default visibility false
						TOCContainer_mc.visible = false;
					}
				}
				
				TocOverlayBtnInitialize();
			}
		}
		else if(TOCContainer_mc)
		{
			TOCContainer_mc.visible=false;
			ShowHideTocLeft_mc.visible = false;
			ShowHideTocRight_mc.visible = false;
		}
	}
}

}
