
var IM_PLAYER_NATIVE = 1;
var IM_PLAYER_FLASH = 2;

var VIDEO_PROXY_STATE_UNINITIALIZED	= 0;
var VIDEO_PROXY_STATE_STOPPED 		= 1;
var VIDEO_PROXY_STATE_PAUSED 		= 2;
var VIDEO_PROXY_STATE_PLAYING 		= 3;
var VIDEO_PROXY_STATE_SEEKING 		= 4;
var VIDEO_PROXY_STATE_BUFFERING 	= 5;
var VIDEO_PROXY_STATE_STALLED 		= 6;
var VIDEO_PROXY_STATE_LOADED 		= 7;
var VIDEO_PROXY_STATE_LOAD_FAILED   = 8;


var VIDEO_PROXY_EVENT_START           = "VIDEO_START";
var VIDEO_PROXY_EVENT_FINISHED        = "VIDEO_FINISHED";
var VIDEO_PROXY_EVENT_ERROR_FAILED    = "VIDEO_ERROR_FAILED";
var VIDEO_PROXY_EVENT_ERROR_NOT_FOUND = "VIDEO_ERROR_NOT_FOUND";
var VIDEO_PROXY_EVENT_PAUSE           = "VIDEO_PAUSE";
var VIDEO_PROXY_EVENT_PLAY            = "VIDEO_PLAY";
var VIDEO_PROXY_EVENT_CLOSE           = "VIDEO_CLOSE";


var ROOT_NODE_ID = -1000;   	// the invisible root node at 0,0
var USER_NODE_ID = -1001;   	// the sphere+camera
var SCENEROOT_NODE_ID = -1002;
var SPHERE_NODE_ID = -1003;     // the sphere node for the current scene/frame
var UNSIGNED_ID = -2000; 	// someone didn't have an id.. for example the dummy load node.

var NODE_TYPE_GEO				= "GeoNode";  		// node without a type
var NODE_TYPE_ROOT 				= "GeoRoot";  		// the root node... invisible at 0,0.  everything else is it's child
var NODE_TYPE_USER 				= "GeoUser";  		// camera + sphere
var NODE_TYPE_IMAGE             = "GeoImage";       // plane (can be billboard)
var NODE_TYPE_TEXT              = "GeoText";        // text node
var NODE_TYPE_VIDEO             = "GeoVideo";       // video node


var playerType = IM_PLAYER_NATIVE;
var flashPlayer  = 0;
var nativePlayer = 0;
var g_usingBridge = false;

// for use with asynch load of movies from the flash player

var OldOnVideoLoadedHandler=null;
 
function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

 
function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}


function trim(str, chars) {
	return ltrim(rtrim(str, chars), chars);
}


function ProxyTestAlert(foo)
{
	alert(foo);
}


function ProxySetVideoTypeByExtension(ext)
{
	if (trim(ext).toLowerCase	()=="flv")
	{
		ProxySetMapperTargetType(IM_PLAYER_FLASH);
	}
	else
	{
		ProxySetMapperTargetType(IM_PLAYER_NATIVE);
	}
}

function ProxySetMapperTargetType(typeSet)
{
	//alert("ProxySetMapperTargetType");
	playerType = typeSet;
}


function ProxySetMapperFlashTarget(IMViewer)
{
	flashPlayer = IMViewer;		
	IMViewer.clearScene();
}

function ProxySetMapperNativeTarget(IMViewer)
{
	nativePlayer = IMViewer;		
}



function ProxyGetMovieTime()
{
		
	if (playerType==IM_PLAYER_NATIVE)
	{
		if(nativePlayer === 0)
		{
			return 0;
		}
		return nativePlayer.GetMovieSource ();
	}
	else //flash player
	{
		if(flashPlayer === 0)
		{
			return 0;
		}
		return flashPlayer.getLastVideoUrl();
	}
}


function ProxyGetZoomFieldOfView()
{

	if (playerType==IM_PLAYER_NATIVE)
	{
		if(nativePlayer === 0)
		{
			return 0;
		}
		return nativePlayer.GetZoomFieldOfView ();
	}
	else //flash player
	{
		if(flashPlayer === 0)
		{
			return 0;
		}
		return flashPlayer.getFov();
	}
}


function ProxyGetMovieDuration()
{

		
	if (playerType==IM_PLAYER_NATIVE)
	{
		if(nativePlayer === 0)
		{
			return 0;
		}
		return nativePlayer.GetMovieDuration ();
	}
	else //flash player
	{
		if(flashPlayer === 0)
		{
			return 0;
		}
		return flashPlayer.getMediaDuration();
	}
	
}


function ProxyGetMovieTime()
{

	
	if (playerType==IM_PLAYER_NATIVE)
	{
		if(nativePlayer === 0)
		{
			return 0;
		}
		return nativePlayer.GetMovieTime ();
	}
	else //flash player
	{
		if(flashPlayer === 0)
		{
			return 0;
		}
		return flashPlayer.getMediaTime();
	}
}


function ProxyGetViewYaw()
{

	if (playerType==IM_PLAYER_NATIVE)
	{
		if(nativePlayer === 0)
		{
			return 0;
		}
		return nativePlayer.GetViewYaw();
	}
	else //flash player
	{
		if(flashPlayer === 0)
		{
			return 0;
		}
		return flashPlayer.getYaw(USER_NODE_ID);
	}
}


function ProxyUnloadMovie()
{

	if (playerType==IM_PLAYER_NATIVE)
	{
		if(nativePlayer === 0)
		{
			return 0;
		}
		var ret = nativePlayer.OpenMovie("",0.0,false);	
		var dte = new Date();
		var timeout = dte.getSeconds() + 4; 
		while(dte.getSeconds() < timeout)
		{
			dte = new Date();
	
			if(nativePlayer.GetMovieDuration() > 0.0)
			{
				
				return 1;
			}
		}
	}
	else //flash player
	{
		if(flashPlayer === 0)
		{
			return 0;
		}
		
		clearMovie();
		
		return 1;
	}
	return 0;
}


function ProxyPause()
{

		
	if (playerType==IM_PLAYER_NATIVE)
	{
		if(nativePlayer === 0)
		{
			return 0;
		}
		nativePlayer.Pause();
	}
	else //flash player
	{
		if(flashPlayer === 0)
		{
			return 0;
		}
		flashPlayer.pauseVideo();
	}

}






function OnVideoLoaded()
{
	
	//alert("OnVideoLoad(): PickupStartTime=" + PickupStartTime);
	flashPlayer.onVideoLoaded= OldOnVideoLoadedHandler;
	
	ret = flashPlayer.setMediaTime(PickupStartTime);
	
	//ret = flashPlayer.pauseVideo();
	
	
	if (OldOnVideoLoadedHandler)
	{
		OldOnVideoLoadedHandler();
	}
	
	OldOnVideoLoadedHandler=null;
}



function setUsingBridge(isUsing)
{
	g_usingBridge=isUsing;
}

function ProxySetMovieSource(url,starttime)
{
	
	//ProxyUnloadMovie();
	//alert("ProxySetMovieSource(): " + url + ", " + starttime);  
	var ret =0;
	//var ret = viewer.OpenMovie("",0,true);	

	
	if (playerType==IM_PLAYER_NATIVE)
	{
		if(nativePlayer === 0)
		{
			//alert("ProxySetMovieSource(): nativePlayer=0.  returning"); 
			return 0;
		}
		//alert("IM_PLAYER_NATIVE: ProxySetMovieSource(): " + url + ", " + starttime);  
		// The return value of OpenMovie is invalid so we need to poll for the load state.
		ret = nativePlayer.OpenMovie(url,starttime,true);
		
		var dte = new Date();
		
		var nativePlayer = dte.getSeconds() + 4; 
		
	
		while(dte.getSeconds() < timeout)
		{
			dte = new Date();
			
			if(nativePlayer.GetMovieDuration() > 0.0)
			{
				nativePlayer.Play () ;
			
				nativePlayer.Pause () ;
				return 1;
			}
		}
	}
	else //flash player
	{
		if(flashPlayer === 0)
		{
			//alert("ProxySetMovieSource(): flashPlayer=0.  returning"); 
			return 0;
		}
		if (g_usingBridge)
		{
			SetFlashMovieSourceBridge(url, starttime);
		}
		else
		{
			SetFlashMovieSourceNonBridge(url, starttime);
		}
		

		
				
	}
	//alert("failed to load movie");
	return 0;
} 

function SetFlashMovieSourceNonBridge(url,starttime)
{
	//alert("IM_PLAYER_FLASH: ProxySetMovieSource(): " + url + ", " + starttime);  
	// The return value of OpenMovie is invalid so we need to poll for the load state.
	//if (isNaN(starttime))
	//{
	//	starttime=0.0;
	//}
	//PickupStartTime = starttime;
	fret = flashPlayer.clearScene();
	
	// save out the old handler if there is one, and put ours in.
	//OldOnVideoLoadedHandler = flashPlayer.onVideoLoaded;
	//flashPlayer.onVideoLoaded = OnVideoLoaded;
	
	ret = flashPlayer.loadVideo(trim(url));
}


function SetFlashMovieSourceBridge(url,starttime)
{
	
	//ProxyUnloadMovie();
	//alert("ProxySetMovieSource(): " + url + ", " + starttime);  
	var ret =0;

	if(flashPlayer === 0)
	{
		//alert("ProxySetMovieSource(): flashPlayer=0.  returning"); 
		return 0;
	}
	
	ret = flashPlayer.loadVideo(trim(url), 0, false);

	//alert("failed to load movie");
	return 0;
} 

function clearMovie()
{
	//if (flashPlayer.isVideoLoaded())
	//{
		//alert("clear movie");
		flashPlayer.clearScene();
		flashPlayer.loadStill("AttractImage.jpg",0);
	//}
}

function ProxyGotoTime(atTime)
{

	//Viewer.Pause () ;
	var ret = 0;
	if (playerType==IM_PLAYER_NATIVE)
	{
		if(nativePlayer === 0)
		{
			return 0;
		}
		ret = nativePlayer.SetMovieTime(atTime);
		return ret == 1;
	}
	else //flash player
	{
		if(flashPlayer === 0)
		{
			return 0;
		}
		ret = flashPlayer.setMediaTime(atTime);
		return 1;
	}
}


function ProxyBrowserAlert(message)
{
	alert(message);
}


// TODO:  fix this to work with flash player
function GetMoviePlayState()
{
	
	if (playerType==IM_PLAYER_NATIVE)
	{
		if(nativePlayer === 0)
		{
			return "STATE_ERROR";
		}
		return nativePlayer.GetMoviePlayState();
	}
	else
	{
		if(flashPlayer === 0)
		{
			return "STATE_ERROR";
		}
		return "STATE_PLAYING";
	}
}

// TODO:  fix this to work with native player
function IsVideoPlaying()
{
	
	if (playerType==IM_PLAYER_NATIVE)
	{
		return false;
	}
	else
	{
		if(flashPlayer === 0)
		{
			return false;
		}
		return flashPlayer.isVideoPlaying();
	}
}

function OnBrowserLinkRequest(InputString)
{
	BrowseTo(InputString,true);
}

function OnDropAnchor(anchorNumber)
{
	if (window.OnSceneBridge)
	{
		window.OnSceneBridge.onDropAnchor(anchorNumber);
	}
}

function BrowseTo(URL,newWindow)
{
	//alert("IMC_MapperViewerProxy.js::BrowseTo: " + URL);
	var teststr = URL.toLowerCase().substr(1,7);
	//alert("IMC_MapperViewerProxy.js::BrowseTo: teststr=" + teststr);
	if (teststr!="http://")
	{
		URL = "http://"+URL;
	}
	
	if (newWindow)
	{	
		window.open(URL,'IMOnScene',"status=1,toolbar=1, scrollbars=1, resizable=1, left=20, top=20, width=500, height=500");
	}
	else
	{
		window.document.location = URL;
	}
	
}


