//+==========================================================================================
//|  Copyright 2000 QEDSoft, Inc.
//|  All Rights Reserved.
//+==========================================================================================

var qed_v1=1;
var qed_v2=5;
var qed_v3=2;
var qed_v4=0;

var qed_pluginPathIE = "http://www.qedsoft.com/downloads/";
var qed_pluginPathNetscape = "http://www.qedsoft.com/downloads/";

var qed_onEndData			= "";
var qed_onStartData			= "";
var qed_onStartLoad			= "";
var qed_onEndLoad			= "";
var qed_onStart				= "";
var qed_onStop				= "";
var qed_onProgress			= "";
var qed_onStartBuffering	= "";
var qed_onStopBuffering		= "";
var qed_onMouseClicObject	= "";
var qed_onMouseEnterObject	= "";
var qed_onMouseExitObject	= "";
var qed_onMouseDownObject	= "";
var qed_onMouseUpObject		= "";
var qed_onStartSound		= "";
var qed_onStopSound			= "";
var qed_onStartAnim			= "";
var qed_onEndAnim			= "";
var qed_onError				= "";
var qed_onMouseMove			= "";
var qed_onKeyDown			= "";
var qed_onKeyPress			= "";
var qed_onKeyUp				= "";
var qed_infoDelay			= -1.0;

var qed_streamerHost = null; 
var qed_streamerPort = 80;
var qed_streamerPath = null;

var bUpdatingNetscape = false;


//*******************************************************************************
//
//									EXECUTES
//
//*******************************************************************************

var QEDCurrCamId=65536;

//--------------------------------	3D PLAYER -----------------------------------

function QEDEXSetDebug(Player,DebugValue)
{
	Player.Execute("0 1 "+DebugValue);
}

function QEDEXSceneSetCurrentCamera(Player,CameraID)
{
	Player.Execute("0 2 "+CameraID);
}

function QEDEXSceneSetBackgroundColor(Player, r,g,b)
{
	Player.Execute("0 3 "+r+" "+g+" "+b);
}

function QEDEXSceneSetAmbientColor(Player, r,g,b)
{
	Player.Execute("0 4 "+r+" "+g+" "+b);
}

function QEDEXSceneForceFillMode(Player, value)		//	0 : Default(don't force), 1: Filled, 2 : WireFrame
{
	Player.Execute("0 5 "+value);
}

function QEDEXSceneForceShadingType(Player, value)	//	0 : Default(don't force), 1: Gouraud, 2 : Flat
{
	Player.Execute("0 6 "+value);
}

function QEDEXSceneSetPatchsQuality(Player, value)	//	-1 : Default, 0: Low, 1: Medium, 2 : High
{
	Player.Execute("0 7 "+value);
}

function QEDEXDeleteObject(Player,id)
{
	Player.Execute("0 8 "+id);
}

function QEDEXDeleteAllDuplicatedObject(Player)
{
	Player.Execute("0 9");
}



function QEDEXPlaySoundData(Player, Priority, NbTimes, DataID)	//	Priority 0 : Normal, 1 : High (will always be played), Times to be played (if 0 : infinite mode), Id of sound DATA
{
	Player.Execute("0 10 "+Priority+" "+NbTimes+" "+DataID);
}

function QEDEXDeleteSound(Player, SoundID)
{
	Player.Execute("0 11 "+SoundID);
}

function QEDEXPlaySound(Player, SoundID, Priority, NbTimes, DataID)
{
	if (Priority==null)
	{
		Priority=0;
		NbTimes=1;
		DataID=-1;
	}
	if (NbTimes==null)
	{
		NbTimes=1;
		DataID=-1;
	}
	if (DataID==null)
		DataID=-1;

	Player.Execute("0 12 "+SoundID+" "+Priority+" "+NbTimes+" "+DataID);
}

function QEDEXStopSound(Player, SoundID)
{
	Player.Execute("0 13 "+SoundID);
}

function QEDEXPauseSound(Player, SoundID)
{
	Player.Execute("0 14 "+SoundID);
}

function QEDEXResumeSound(Player, SoundID)
{
	Player.Execute("0 15 "+SoundID);
}

function QEDEXSetSoundVolume(Player, SoundID, Volume)		//	Volume percentage of original : 0.0 -> 1.0
{
	Player.Execute("0 16 "+SoundID+" "+Volume);
}

function QEDEXSetSoundBalance(Player, SoundID, Balance)		//	Balance : -1.0-> left, 0.0 -> center, 1.0 -> right
{
	Player.Execute("0 17 "+SoundID+" "+Balance);
}

function QEDEXSetSoundData(Player, SoundID, DataID)
{
	Player.Execute("0 18 "+SoundID+" "+DataID);
}

function QEDEXSetSoundEventStart(Player, SoundID, Action, Function)	// for Action: 0==none 1==callback 2==function (Function if Action==2 else "")
{
	Player.Execute("0 19 "+SoundID+" "+Action+" "+Function);
}

function QEDEXSetSoundEventStop(Player, SoundID, Action, Function)
{
	Player.Execute("0 20 "+SoundID+" "+Action+" "+Function);
}


function QEDEXSoundAnimNewVolume(Player,SoundID, Loop)
{
	Player.Execute("0 21 "+SoundID+" "+Loop);
}

function QEDEXSoundAnimAddKeyVolume(Player,SoundID, Time, Volume)
{
	Player.Execute("0 22 "+SoundID+" "+Time+" "+Volume);
}

function QEDEXSoundAnimAddCurKeyVolume(Player, SoundID, Time)
{
	Player.Execute("0 23 "+SoundID+" "+Time);
}



function QEDEXSoundAnimNewBalance(Player,SoundID, Loop)
{
	Player.Execute("0 24 "+SoundID+" "+Loop);
}

function QEDEXSoundAnimAddKeyBalance(Player,SoundID, Time, Balance)
{
	Player.Execute("0 25 "+SoundID+" "+Time+" "+Balance);
}

function QEDEXSoundAnimAddCurKeyBalance(Player, SoundID, Time)
{
	Player.Execute("0 26 "+SoundID+" "+Time);
}


//	TextureID : -1 -> remove texture
//	Preset : 0 -> LeftTop, 1 -> CenterTop, 2 -> RightTop, 3 -> LeftCenter ... 8 -> RightBottom
function QEDEXSetBackgroundTexture(Player, TextureID, Preset)
{
	Player.Execute("0 40 "+TextureID+" "+Preset);
}

function QEDEXSetForegroundTexture(Player, TextureID, Preset)
{
	Player.Execute("0 41 "+TextureID+" "+Preset);
}

//	HotSpotX : 0 -> left, 1 -> right, 2 -> center
//	HotSpotY : 0 -> top, 1 -> bottom, 2 -> center
//	Fixed (Pos & Size): 0 -> percentage of plugin size, 1 -> pixel size
//	SizeX, SizeY : 0 -> Texture size
//	Transparency : 0 -> not transparent, 1 -> fully transparent

function QEDEXSetBackgroundTextureEx(Player, TextureID, HotSpotX, HotSpotY, PosX, PosY, FixedPos, SizeX, SizeY, FixedSize, R, G, B, Transparency)
{
	Player.Execute("0 42 "+TextureID+" "+HotSpotX+" "+HotSpotY+" "+PosX+" "+PosY+" "+FixedPos+" "+SizeX+" "+SizeY+" "+FixedSize+" "+R+" "+G+" "+B+" "+Transparency);
}

function QEDEXSetForegroundTextureEx(Player, TextureID, HotSpotX, HotSpotY, PosX, PosY, FixedPos, SizeX, SizeY, FixedSize, R, G, B, Transparency)
{
	Player.Execute("0 43 "+TextureID+" "+HotSpotX+" "+HotSpotY+" "+PosX+" "+PosY+" "+FixedPos+" "+SizeX+" "+SizeY+" "+FixedSize+" "+R+" "+G+" "+B+" "+Transparency);
}

//--------------------------------	3D OBJECTS -----------------------------------

function QEDEXObject3DShow(Player,Object3DID,ShowValue)
{
	Player.Execute(Object3DID+" 301 "+ShowValue);
}

function QEDEXObject3DSetPosition(Player,Object3DID,x,y,z)
{
	Player.Execute(Object3DID+" 302 "+x+" "+y+" "+z);
}

function QEDEXObject3DAddPosition(Player,Object3DID,x,y,z)
{
	Player.Execute(Object3DID+" 303 "+x+" "+y+" "+z);
}

function QEDEXObject3DSetRotation(Player,Object3DID,x,y,z,cam)
{
	if (cam==null)
		cam=0;
	Player.Execute(Object3DID+" 304 "+x+" "+y+" "+z+" "+cam);
}

function QEDEXObject3DAddRotation(Player,Object3DID,x,y,z,cam)
{
	if (cam==null)
		cam=0;
	Player.Execute(Object3DID+" 305 "+x+" "+y+" "+z+" "+cam);
}

function QEDEXObject3DSetScale(Player,Object3DID,x,y,z)
{
	Player.Execute(Object3DID+" 306 "+x+" "+y+" "+z);
}

function QEDEXObject3DAddScale(Player,Object3DID,x,y,z)
{
	Player.Execute(Object3DID+" 307 "+x+" "+y+" "+z);
}

function QEDEXObject3DAnimNewPosition(Player,Object3DID, Loop)
{
	Player.Execute(Object3DID+" 308 "+Loop);
}

function QEDEXObject3DAnimAddKeyPosition(Player,Object3DID, Time,x,y,z)
{
	Player.Execute(Object3DID+" 309 "+Time+" "+x+" "+y+" "+z);
}

function QEDEXObject3DAnimAddCurKeyPosition(Player,Object3DID, Time)
{
	Player.Execute(Object3DID+" 315 "+Time);
}

function QEDEXObject3DAnimNewRotation(Player,Object3DID, Loop)
{
	Player.Execute(Object3DID+" 310 "+Loop);
}

function QEDEXObject3DAnimAddKeyRotationAdd(Player,Object3DID, Time,x,y,z,cam)
{
	if (cam==null)
		cam=0;
	Player.Execute(Object3DID+" 311 "+Time+" "+x+" "+y+" "+z+" "+cam);
}

function QEDEXObject3DAnimAddCurKeyRotationAdd(Player,Object3DID, Time)
{
	Player.Execute(Object3DID+" 316 "+Time);
}

function QEDEXObject3DAnimNewScale(Player,Object3DID, Loop)
{
	Player.Execute(Object3DID+" 312 "+Loop);
}

function QEDEXObject3DAnimAddKeyScale(Player,Object3DID, Time,x,y,z)
{
	Player.Execute(Object3DID+" 313 "+Time+" "+x+" "+y+" "+z);
}
function QEDEXObject3DAnimAddCurKeyScale(Player,Object3DID, Time)
{
	Player.Execute(Object3DID+" 317 "+Time);
}

function QEDEXObject3DSetTarget(Player,CameraIDorDirLightID,TargetObject3DID)		//	Meaningfull for Spot, Directional Light and Camera only
{
	Player.Execute(CameraIDorDirLightID+" 314 "+TargetObject3DID);
}

//--------------------------------	CAMERA -----------------------------------

function QEDEXCameraSetDegFOV(Player,CameraID,DegFOV)
{
	Player.Execute(CameraID+" 601 "+DegFOV);
}

function QEDEXCameraAddDegFOV(Player,CameraID,DegFOVToAdd)
{
	Player.Execute(CameraID+" 602 "+DegFOVToAdd);
}

//--------------------------------	LIGHT -----------------------------------

function QEDEXLightEnable(Player,LightID, EnableValue)
{
	Player.Execute(LightID+" 901 "+EnableValue);
}

function QEDEXLightSetColor(Player,LightID,r,g,b)
{
	Player.Execute(LightID+" 902 "+r+" "+g+" "+b);
}

function QEDEXLightSetIntensity(Player,LightID,IntensityValue)
{
	Player.Execute(LightID+" 903 "+IntensityValue);
}

function QEDEXLightAnimNewIntensity(Player,LightID, Loop)
{
	Player.Execute(LightID+" 904 "+Loop);
}

function QEDEXLightAnimAddKeyIntensity(Player,LightID, Time,IntensityValue)
{
	Player.Execute(LightID+" 905 "+Time+" "+IntensityValue);
}

function QEDEXLightAnimAddCurKeyIntensity(Player,LightID, Time)
{
	Player.Execute(LightID+" 906 "+Time);
}

//--------------------------------	MATERIAL -----------------------------------

function QEDEXMaterialSetAmbient(Player,MaterialID, r,g,b)
{
	Player.Execute(MaterialID+" 1201 "+r+" "+g+" "+b);
}

function QEDEXMaterialSetDiffuse(Player,MaterialID, r,g,b)
{
	Player.Execute(MaterialID+" 1202 "+r+" "+g+" "+b);
}

function QEDEXMaterialSetEmissive(Player,MaterialID, r,g,b)
{
	Player.Execute(MaterialID+" 1203 "+r+" "+g+" "+b);
}

function QEDEXMaterialSetSpecular(Player,MaterialID, r,g,b)
{
	Player.Execute(MaterialID+" 1204 "+r+" "+g+" "+b);
}

function QEDEXMaterialSetSpecularDensity(Player,MaterialID, SpecularDensity)
{
	Player.Execute(MaterialID+" 1205 "+SpecularDensity);
}

function QEDEXMaterialSetTransparency(Player,MaterialID, TransparencyValue)	//	Transparency value (0.0 : Opaque ... 1.0 : Transparent)
{
	Player.Execute(MaterialID+" 1206 "+TransparencyValue);
}

function QEDEXMaterialAnimNewTransparency(Player,MaterialID, Loop)
{
	Player.Execute(MaterialID+" 1207 "+Loop);
}

function QEDEXMaterialAnimAddKeyTransparency(Player,MaterialID, Time,TransparencyValue)
{
	Player.Execute(MaterialID+" 1208 "+Time+" "+TransparencyValue);
}

function QEDEXMaterialAnimAddCurKeyTransparency(Player,MaterialID, Time)
{
	Player.Execute(MaterialID+" 1212 "+Time);
}

function QEDEXMaterialSetSpecularLevel(Player,MaterialID, Level)		//	Multiplier between 0.0 & 10.0
{
	Player.Execute(MaterialID+" 1209 "+Level);
}

function QEDEXMaterialSetFillMode(Player,MaterialID, FillMode)
{
	Player.Execute(MaterialID+" 1211 "+FillMode);						//	0 : Filled, 1 : WireFrame
}


function QEDEXMaterialSetShadingType(Player,MaterialID, ShadingType)
{	
	Player.Execute(MaterialID+" 1210 "+ShadingType);					//	0 : Gouraud, 1 : Flat
}

function QEDEXMaterialSetTwoSided(Player,MaterialID, b)
{	
	Player.Execute(MaterialID+" 1213 "+b);					//	0 : false, 1 : true
}

//--------------------------------	SHAPE -----------------------------------

function QEDEXShapeSetPercent(Player,ShapeID, PercentValue)
{
	Player.Execute(ShapeID+" 1501 "+ PercentValue);
}
function QEDEXShapeAddPercent(Player,ShapeID, PercentValue)
{
	Player.Execute(ShapeID+" 1502 "+ PercentValue);
}

function QEDEXShapeAnimNewPercent(Player,ShapeID, Loop)
{
	Player.Execute(ShapeID+" 1503 "+Loop);
}

function QEDEXShapeAnimKeyPercent(Player,ShapeID, Time,PercentValue)
{
	Player.Execute(ShapeID+" 1504 "+Time+" "+ PercentValue);
}

function QEDEXShapeAnimCurKeyPercent(Player,ShapeID, Time)
{
	Player.Execute(ShapeID+" 1505 "+Time);
}

//--------------------------------	TEXTURE -----------------------------------

function QEDEXTextureSetOffset(Player,TextureID, x,y)
{
	Player.Execute(TextureID+" 1801 "+x+" "+y);
}

function QEDEXTextureAddOffset(Player,TextureID, x,y)
{
	Player.Execute(TextureID+" 1804 "+x+" "+y);
}

function QEDEXTextureAnimNewOffset(Player,TextureID, Loop)
{
	Player.Execute(TextureID+" 1802 "+Loop);
}

function QEDEXTextureAnimAddKeyOffset(Player,TextureID, Time,x,y)
{
	Player.Execute(TextureID+" 1803 "+Time+" "+x+" "+y);
}

function QEDEXTextureAnimAddCurKeyOffset(Player,TextureID, Time)
{
	Player.Execute(TextureID+" 1805 "+Time);
}

//--------------------------------	STREAM PLAYER -----------------------------------

function QEDEXBeginBloc(Player)
{
	Player.Execute("RS 2101");
}

function QEDEXEndBloc(Player)
{
	Player.Execute("RS 2102");
}

function QEDEXStart(Player)
{
	Player.Execute("RS 2109");
}

function QEDEXStop(Player)
{
	Player.Execute("RS 2110");
}

function QEDEXPause(Player)
{
	Player.Execute("RS 2115");
}

function QEDEXResume(Player)
{
	Player.Execute("RS 2116");
}

function QEDEXSetSoftware(Player,val)	// 0=>Hardware renderer mode  1=>Software renderer mode
{
	Player.Execute("RS 2117 "+val);
}

//arrow==0;hand==1
function QEDEXSetCursor(Player,cursorid)
{
	Player.Execute("RS 2111 "+cursorid);
}


function QEDEXSetStream(Player,url)
{
	Player.Execute("RS 2112 "+url);	
}

function QEDEXAddStream(Player,url)
{
	Player.Execute("RS 2113 "+url);	
}

function QEDEXPreloadStream(Player,url)
{
	Player.Execute("RS 2114 "+url);	
}

function QEDEXSetStreamEx(Player,url,id,loop,merge)
{
	Player.Execute("RS 2112 "+url+" "+id+" "+loop+" "+merge);	
}

function QEDEXAddStreamEx(Player,url,id,loop,merge)
{
	Player.Execute("RS 2113 "+url+" "+id+" "+loop+" "+merge);	
}

function QEDEXPreloadStreamEx(Player,url,id,loop,merge)
{
	Player.Execute("RS 2114 "+url+" "+id+" "+loop+" "+merge);	
}

//	CALLBACKS

	// MOUSE EVENT CALLBACKS
	// prototype: function funcname(boneId,subobjId,KeyModifier)

function QEDEXSetCallBkOnMouseClicObject(Player,funcname)
{
	Player.Execute("RS 2105 1 "+funcname);	
}
function QEDEXSetCallBkOnMouseDownObject(Player,funcname)
{
	Player.Execute("RS 2105 2 "+funcname);	
}
function QEDEXSetCallBkOnMouseUpObject(Player,funcname)
{
	Player.Execute("RS 2105 3 "+funcname);	
}
function QEDEXSetCallBkOnMouseEnterObject(Player,funcname)
{
	Player.Execute("RS 2105 4 "+funcname);	
}
function QEDEXSetCallBkOnMouseExitObject(Player,funcname)
{
	Player.Execute("RS 2105 5 "+funcname);	
}

function QEDEXSetCallBkOnMouseMove(Player,funcname)
{
	Player.Execute("RS 2105 15 "+funcname);	
}

	// KEY EVENT CALLBACKS
	// prototype: function funcname(key,modifier)

function QEDEXSetCallBkOnKeyDown(Player,funcname)
{
	Player.Execute("RS 2105 16 "+funcname);	
}
function QEDEXSetCallBkOnKeyUp(Player,funcname)
{
	Player.Execute("RS 2105 17 "+funcname);	
}
function QEDEXSetCallBkOnKeyPress(Player,funcname)
{
	Player.Execute("RS 2105 18 "+funcname);	
}

	// STREAM EVENTS CALLBACKS
	// prototype: function funcname(streamName,streamId)

function QEDEXSetCallBkOnStartData(Player,funcname)
{
	Player.Execute("RS 2105 6 "+funcname);	
}
function QEDEXSetCallBkOnEndData(Player,funcname)
{
	Player.Execute("RS 2105 7 "+funcname);	
}
function QEDEXSetCallBkOnStartAnim(Player,funcname)
{
	Player.Execute("RS 2105 8 "+funcname);	
}
function QEDEXSetCallBkOnEndAnim(Player,funcname)
{
	Player.Execute("RS 2105 9 "+funcname);	
}
function QEDEXSetCallBkOnError(Player,funcname)
{
	Player.Execute("RS 2105 10 "+funcname);	
}

function QEDEXSetCallBkOnStartLoad(Player,funcname)
{
	Player.Execute("RS 2105 12 "+funcname);	
}
function QEDEXSetCallBkOnEndLoad(Player,funcname)
{
	Player.Execute("RS 2105 13 "+funcname);	
}

function QEDEXSetCallBkOnLoadProgress(Player,funcname)
{
	Player.Execute("RS 2105 14 "+funcname);	
}

// for Netscape/Windows in Transparent mode (to call in <BODY onLoad='...'>)

function QEDEXOnBrowserLoaded(Player)
{
	Player.Execute("RS 2106");	
}


//--------------------------------	MESH -----------------------------------

function QEDEXMeshSetTexture(Player,MeshID,SubObjectID, TextureID)
{
	Player.Execute(MeshID+" 2401 "+SubObjectID+" "+ TextureID);
}

function QEDEXMeshSetMaterial(Player,MeshID,SubObjectID, MaterialID)
{
	Player.Execute(MeshID+" 2408 "+SubObjectID+" "+ MaterialID);
}

function QEDEXMeshSetMaskMode(Player,MeshID,SubObjectID, mode)	//	0: Normal, 1: Mask only (no render), 2: Render only (no mask)
{
	Player.Execute(MeshID+" 2409 "+SubObjectID+" "+ mode);
}

function QEDEXMeshMouseEventGhost(Player,MeshID,SubObjectID, val)
{
	Player.Execute(MeshID+" 2402 "+SubObjectID+" "+ val);
}

// for action: 0==none 1==callback 2==function (funcname if action==2 else "")
function QEDEXMeshMouseEventSetEnter(Player,MeshID,SubObjectID, action,funcname)
{
	Player.Execute(MeshID+" 2403 "+SubObjectID+" "+ action +" "+funcname);
}

function QEDEXMeshMouseEventSetLeave(Player,MeshID,SubObjectID, action,funcname)
{
	Player.Execute(MeshID+" 2404 "+SubObjectID+" "+ action +" "+funcname);
}

function QEDEXMeshMouseEventSetClic(Player,MeshID,SubObjectID, action,funcname)
{
	Player.Execute(MeshID+" 2405 "+SubObjectID+" "+ action +" "+funcname);
}

function QEDEXMeshMouseEventSetDown(Player,MeshID,SubObjectID, action,funcname)
{
	Player.Execute(MeshID+" 2406 "+SubObjectID+" "+ action +" "+funcname);
}

function QEDEXMeshMouseEventSetUp(Player,MeshID,SubObjectID, action,funcname)
{
	Player.Execute(MeshID+" 2407 "+SubObjectID+" "+ action +" "+funcname);
}


//--------------------------------	PATCHS -----------------------------------

function QEDEXPatchSetQuality(Player,PatchID, value)	//	0: Low, 1: Medium, 2 : High
{
	Player.Execute(PatchID+" 2501 "+value);
}

//*******************************************************************************
//
//									REQUESTS
//
//*******************************************************************************

function QEDGetSubString(string,num)
{
	compteur=0;
	while (compteur < num) 
	{
		compteur++;
		string=string.substring(string.indexOf(':')+1);
	}
	return string;
}

//--------------------------------	3D PLAYER -----------------------------------

function QEDRQSceneTime(Player)
{
	req = Player.Request('0 1501');
	return parseFloat(QEDGetSubString(req,1));
}

function QEDRQSceneBackgroundColor(Player)
{
	ret = new Array();
 
	req = Player.Request('0 1503');

	ret[0] = parseFloat(QEDGetSubString(req,1));
	ret[1] = parseFloat(QEDGetSubString(req,2));
	ret[2] = parseFloat(QEDGetSubString(req,3));

	return ret;
}

function QEDRQSceneCurrentCamera(Player)
{
	req = Player.Request('0 1504');
	return parseFloat(QEDGetSubString(req,1));
}

function QEDRQVersion(Player)
{
	req = Player.Request('0 1505');

	ret = QEDGetSubString(req,1).substring(0,7);

	if (ret!="VERSION")
		return "0.0.0.0";

	return QEDGetSubString(req,2);
}

function QEDRQSceneGetPatchsQuality(Player)	//return	-1 : Default, 0: Low, 1: Medium, 2 : High
{
	req = Player.Request('0 1506');
	return parseInt(QEDGetSubString(req,1));
}

function QEDRQSceneDuplicateObject(Player,objid)	//return	-1 : if error
{
	req = Player.Request('0 1600 '+objid);
	return parseInt(QEDGetSubString(req,1));
}

function QEDRQSceneCreateSphere(Player,radius,nbsegment,matID,parentID)	//return	-1 : if error
{
	req = Player.Request('0 1601 '+radius+' '+nbsegment+' '+matID+' '+parentID);
	return parseInt(QEDGetSubString(req,1));
}
function QEDRQSceneCreateBox(Player,nbLengthSegment,nbWidthSegment,nbHeightSegment,length,width,heigth,matID,parentID)	//return	-1 : if error
{
	req = Player.Request('0 1602 '+nbLengthSegment+' '+nbWidthSegment+' '+nbHeightSegment+' '+length+' '+width+' '+heigth+' '+matID+' '+parentID);
	return parseInt(QEDGetSubString(req,1));
}
function QEDRQSceneCreatePlane(Player,nbLengthSegment,nbWidthSegment,length,width,matID,parentID)	//return	-1 : if error
{
	req = Player.Request('0 1603 '+nbLengthSegment+' '+nbWidthSegment+' '+length+' '+width+' '+matID+' '+parentID);
	return parseInt(QEDGetSubString(req,1));
}

function QEDRQCreateSound(Player)
{
	req = Player.Request('0 1605 ');
	return parseInt(QEDGetSubString(req,1));
}

function QEDRQIsObjectValid(Player,objectid) //return	1=true 0=false
{
	req = Player.Request('0 1701 '+objectid);
	return parseInt(QEDGetSubString(req,1));
}


//--------------------------------	3D OBJECTS -----------------------------------

function QEDRQObject3DPosition(Player,Object3D)
{
	ret = new Array();
 
	req = Player.Request(Object3D+' 302');

	ret[0] = parseFloat(QEDGetSubString(req,1));
	ret[1] = parseFloat(QEDGetSubString(req,2));
	ret[2] = parseFloat(QEDGetSubString(req,3));

	return ret;
}

function QEDRQObject3DRotation(Player,Object3D)
{
	ret = new Array();

	req = Player.Request(Object3D+' 303');

	ret[0] = parseFloat(QEDGetSubString(req,1));
	ret[1] = parseFloat(QEDGetSubString(req,2));
	ret[2] = parseFloat(QEDGetSubString(req,3));

	return ret;
}

function QEDRQObject3DScale(Player,Object3D)
{
	ret = new Array();
 
	req = Player.Request(Object3D+' 304');

	ret[0] = parseFloat(QEDGetSubString(req,1));
	ret[1] = parseFloat(QEDGetSubString(req,2));
	ret[2] = parseFloat(QEDGetSubString(req,3));

	return ret;
}

function QEDRQObject3DShow(Player,Object3D)
{
	req = Player.Request(Object3D +' 301');
	return parseFloat(QEDGetSubString(req,1));
}


function QEDRQObject3DTarget(Player,Object3D)	//	Meaningfull for Spot, Directional Light and Camera only
{
	req = Player.Request(Object3D+' 305');

	return parseFloat(QEDGetSubString(req,1));
}

function QEDRQObject3DPositionGlobal(Player,Object3D)
{
	ret = new Array();
 
	req = Player.Request(Object3D+' 306');

	ret[0] = parseFloat(QEDGetSubString(req,1));
	ret[1] = parseFloat(QEDGetSubString(req,2));
	ret[2] = parseFloat(QEDGetSubString(req,3));

	return ret;
}

//--------------------------------	CAMERA -----------------------------------

function QEDRQCameraDegFOV(Player,CameraID)
{
	req = Player.Request(CameraID+' 601');
	return parseFloat(QEDGetSubString(req,1));
}

//--------------------------------	LIGHT -----------------------------------

function QEDRQLightColor(Player,LightID)
{
	ret = new Array();
 
	req = Player.Request(LightID+' 901');

	ret[0] = parseFloat(QEDGetSubString(req,1));
	ret[1] = parseFloat(QEDGetSubString(req,2));
	ret[2] = parseFloat(QEDGetSubString(req,3));

	return ret;
}

function QEDRQLightEnable(Player,LightID)
{
	req = Player.Request(LightID +' 902');
	return parseFloat(QEDGetSubString(req,1));
}

function QEDRQLightIntensity(Player,LightID)
{
	req = Player.Request(LightID +' 903');
	return parseFloat(QEDGetSubString(req,1));
}

//--------------------------------	MATERIAL -----------------------------------

function QEDRQMaterialTransparency(Player,MaterialID)
{
	req = Player.Request(MaterialID+' 1206');
	return parseFloat(QEDGetSubString(req,1));
}

function QEDRQMaterialAmbient(Player,MaterialID)
{
	ret = new Array();
 
	req = Player.Request(MaterialID+' 1201');

	ret[0] = parseFloat(QEDGetSubString(req,1));
	ret[1] = parseFloat(QEDGetSubString(req,2));
	ret[2] = parseFloat(QEDGetSubString(req,3));

	return ret;
}
function QEDRQMaterialDiffuse(Player,MaterialID)
{
	ret = new Array();
 
	req = Player.Request(MaterialID+' 1202');

	ret[0] = parseFloat(QEDGetSubString(req,1));
	ret[1] = parseFloat(QEDGetSubString(req,2));
	ret[2] = parseFloat(QEDGetSubString(req,3));

	return ret;
}

function QEDRQMaterialEmissive(Player,MaterialID)
{
	ret = new Array();
 
	req = Player.Request(MaterialID+' 1203');

	ret[0] = parseFloat(QEDGetSubString(req,1));
	ret[1] = parseFloat(QEDGetSubString(req,2));
	ret[2] = parseFloat(QEDGetSubString(req,3));

	return ret;
}

function QEDRQMaterialSpecular(Player,MaterialID)
{
	ret = new Array();
 
	req = Player.Request(MaterialID+' 1204');

	ret[0] = parseFloat(QEDGetSubString(req,1));
	ret[1] = parseFloat(QEDGetSubString(req,2));
	ret[2] = parseFloat(QEDGetSubString(req,3));

	return ret;
}

function QEDRQMaterialPower(Player,MaterialID)
{
	req = Player.Request(MaterialID+' 1205');
	return parseFloat(QEDGetSubString(req,1));
}

//--------------------------------	SHAPE -----------------------------------

function QEDRQShapePercent(Player,ShapeID)
{
	req = Player.Request(ShapeID+' 2401');
	return parseFloat(QEDGetSubString(req,1));
}

//--------------------------------	TEXTURE -----------------------------------

function QEDRQTextureOffset(Player,TextureID)
{
	ret = new Array();
 
	req = Player.Request(TextureID+' 2101');

	ret[0] = parseFloat(QEDGetSubString(req,1));
	ret[1] = parseFloat(QEDGetSubString(req,2));

	return ret;
}

//--------------------------------	MESH -----------------------------------

function QEDRQMeshTexture(Player,MeshID,SubObjectID)
{
	req = Player.Request(MeshID+' 2701 '+SubObjectID);

	return parseFloat(QEDGetSubString(req,1));
}

//--------------------------------	PATCHS -----------------------------------

function QEDRQPatchGetQuality(Player,PatchID) //return 	0: Low, 1: Medium, 2 : High
{
	req = Player.Request(PatchID+' 2801');
	return parseInt(QEDGetSubString(req,1));
}

//----------------------------------------------------------------------------

function QedReplaceSpace(str)
{
	_res="";

	len=str.length;
	for (i=0;i<len;i++)
	{
		kar=str.charAt(i);
		if (kar==" ")
			_res+="%20";
		else
			_res+=kar;
	}
	return _res;
}
function QED_onBrowserResized()
{
    var isNN = (navigator.appName.indexOf("Netscape") != -1);
    var agt = navigator.userAgent.toLowerCase();
    var isMac = agt.indexOf('mac') != -1;

    if (isMac && isNN)
        history.go(0);
}

function QED_mySetStream(player,filename)
{
	s1 = QED_GenerateURL(filename);
	QEDEXSetStream(player,s1);
}

function QED_myAddStream(player,filename)
{
	s1 = QED_GenerateURL(filename);
	QEDEXAddStream(player,s1);
}

function QED_myPreloadStream(player,filename)
{
	s1 = QED_GenerateURL(filename);
	QEDEXPreloadStream(player,s1);
}

function QED_mySetStreamEx(player,filename,id,loop,merge)
{
	s1 = QED_GenerateURL(filename);
	QEDEXSetStreamEx(player,s1,id,loop,merge);
}

function QED_myAddStreamEx(player,filename,id,loop,merge)
{
	s1 = QED_GenerateURL(filename);
	QEDEXAddStreamEx(player,s1,id,loop,merge);
}

function QED_myPreloadStreamEx(player,filename,id,loop,merge)
{
	s1 = QED_GenerateURL(filename);
	QEDEXPreloadStreamEx(player,s1,id,loop,merge);
}

function QED_check(silent)
{
var pocketpc=false;
	if (navigator.appName == "Netscape") // 4.5 min
	{
		var ver = navigator.appVersion.substring(0,1);
		if (ver<4)
		{
			if (silent<=0)
				alert("QEDPlayer needs Netscape Navigator 4.5 or later (not 6.x).");
			return false;
		}
		else if (ver==4)
		{
			if (navigator.appVersion.substring(2,3)<5)
			{
				if (silent<=0)
					alert("QEDPlayer needs Netscape Navigator 4.5 or later (not 6.x).");
				return false;
			}
		}
		else if (ver>4)
		{
			if (silent<=0)
				alert("QEDPlayer needs Netscape Navigator 4.5 or later (not 6.x).");
			return false;
		}
	}
	else if (navigator.appName == "Microsoft Internet Explorer") // 4.01 min
	{
		var version = navigator.appVersion;
		var i = version.indexOf('MSIE');
		if (i<0)
		{
			if (silent<=0)
				alert("QEDPlayer needs Microsoft Internet Explorer 4.01 or later.");
			return false;
		}
		var major = version.substring(i+5,i+6);
		var minor = version.substring(i+7,i+9);
		if (major<4)
		{
			if (silent<=0)
				alert("QEDPlayer needs Microsoft Internet Explorer 4.01 or later.");
			return false;
		}
		else if (major==4)
		{
			if (minor<1)
			{
				if (silent<=0)
					alert("QEDPlayer needs Microsoft Internet Explorer 4.01 or later.");
				return false;
			}
		}
	}
	else if (navigator.appName == "Microsoft Pocket Internet Explorer") // 3.02 min
	{
		pocketpc=true;
		var version = navigator.appVersion;
		var i = version.indexOf('MSIE');
		if (i<0)
		{
			if (silent<=0)
				alert("QEDPlayer needs Microsoft Pocket Internet Explorer 3.02 or later.");
			return false;
		}
		var major = version.substring(i+5,i+6);
		var minor = version.substring(i+7,i+9);
		if (major<3)
		{
			if (silent<=0)
				alert("QEDPlayer needs Microsoft Pocket Internet Explorer 3.02 or later.");
			return false;
		}
		else if (major==3)
		{
			if (minor<2)
			{
				if (silent<=0)
					alert("QEDPlayer needs Microsoft Pocket Internet Explorer 3.02 or later.");
				return false;
			}
		}
	}
	else // unknown navigator
	{
		if (silent<=0)
			alert("QEDPlayer needs either Netscape Navigator or Microsoft Internet Explorer.");
		return false; 
	}

	if (navigator.appName == "Microsoft Internet Explorer" && (navigator.platform == "MacPPC" || navigator.platform == "Mac68k")) 
	{
		if (silent<=0)
			alert("QEDPlayer doesn't runs on Microsoft Internet Explorer for Macintosh.\nTry on Netscape Navigator 4.5 or later (not 6.x).");
		return false;
	}

	if (navigator.platform != "Win32" && navigator.platform != "MacPPC" && pocketpc!=true)
	{
		if (silent<=0)
			alert("QEDPlayer runs on Macintosh PPC MacOS 9 or later, and on Microsoft Windows 95 or later.\nnavigator.platform = " + navigator.platform);
		return false;
	}

	if (!navigator.javaEnabled() && (navigator.appName == "Netscape"))
	{
		if (silent<=0)
			alert("QEDPlayer needs java to be enabled in your browser.");
		return false;
	}

	return true;
}

function QED_Installation()
{
	if (navigator.appName == "Netscape")
	{
		var trigger = netscape.softupdate.Trigger;
		if ( trigger.UpdateEnabled() )
		{
			var vi = new netscape.softupdate.VersionInfo(qed_v1, qed_v2, qed_v3, qed_v4);
			var jarNameFile = "";
			if (navigator.platform == "Win32")
				jarNameFile = "qedstreamplayer.jar";
			if (navigator.platform == "MacPPC")
				jarNameFile = "qedplayermac.jar";
				
			bUpdatingNetscape = trigger.ConditionalSoftwareUpdate(qed_pluginPathNetscape+jarNameFile,"plugins/qedsoft/QEDStreamPI",vi,trigger.DEFAULT_MODE);
		}
		else
		{
			alert("SmartUpdate is not enabled; enable it and try again.");
		}
	}
}

function ___reloadTimer()
{
		var trigger = netscape.softupdate.Trigger;
		if (trigger.CompareVersion("plugins/qedsoft/QEDStreamPI",qed_v1, qed_v2, qed_v3, qed_v4)>=0)
		{	
			document.location.reload();
		}
		else
			setTimeout("___reloadTimer()",1000);
}

function ___createQEDTag(name,stream1,stream2,width,height,mode,posx,posy)
{
	if (mode=="TRANSPARENT")
	{
		widthIE  = 1;
		heightIE = 1;
		widthNS  = 2;
		heightNS = 2;

		width3D  = width;
		height3D = height;

		if (posx==null)
			posx=0;
		if (posy==null)
			posy=0;

	}
	else
	{
		widthIE  = width;
		heightIE = height;
		widthNS  = width;
		heightNS = height;

		width3D = null;
		height3D = null;
	}

	var output = '<OBJECT'+
	             ' WIDTH='+widthIE+
				 ' HEIGHT='+heightIE+
				 ' ID="'+name+'"'+
				 ' CLASSID="CLSID:F33BE3CD-C9E1-11D4-BDB0-004854669880"'+
				 ' CODEBASE="'+qed_pluginPathIE+'QEDPlayer.cab#Version='+qed_v1+','+qed_v2+','+qed_v3+','+qed_v4+'"'+
				 ' STANDBY="Initializing the QEDPlayer. Please Wait...">'+
				 ' <param name="STREAMURL1" value="'+stream1+'">'+
				 ' <param name="STREAMURL2" value="'+stream2+'">'+
				 ' <param name="MODE" value="'+mode+'">'+
				 ' <param name="ONENDDATA" value="'+qed_onEndData+'">'+
				 ' <param name="ONSTARTDATA" value="'+qed_onStartData+'">'+
				 ' <param name="ONSTARTLOAD" value="'+qed_onStartLoad+'">'+
				 ' <param name="ONENDLOAD" value="'+qed_onEndLoad+'">'+
				 ' <param name="ONSTART" value="'+qed_onStart+'">'+
				 ' <param name="ONSTOP" value="'+qed_onStop+'">'+
				 ' <param name="ONLOADPROGRESS" value="'+qed_onProgress+'">'+
				 ' <param name="ONSTARTBUFFERING" value="'+qed_onStartBuffering+'">'+
				 ' <param name="ONSTOPBUFFERING" value="'+qed_onStopBuffering+'">'+
				 ' <param name="ONMOUSECLICOBJECT" value="'+qed_onMouseClicObject+'">'+
				 ' <param name="ONMOUSEENTEROBJECT" value="'+qed_onMouseEnterObject+'">'+
				 ' <param name="ONMOUSEEXITOBJECT" value="'+qed_onMouseExitObject+'">'+
				 ' <param name="ONMOUSEDOWNOBJECT" value="'+qed_onMouseDownObject+'">'+
				 ' <param name="ONMOUSEUPOBJECT" value="'+qed_onMouseUpObject+'">'+
				 ' <param name="ONSTARTSOUND" value="'+qed_onStartSound+'">'+
				 ' <param name="ONSTOPSOUND" value="'+qed_onStopSound+'">'+
				 ' <param name="ONSTARTANIM" value="'+qed_onStartAnim+'">'+
				 ' <param name="ONENDANIM" value="'+qed_onEndAnim+'">'+		 
				 ' <param name="ONERROR" value="'+qed_onError+'">'+
				 ' <param name="ONMOUSEMOVE" value="'+qed_onMouseMove+'">'+
				 ' <param name="ONKEYDOWN" value="'+qed_onKeyDown+'">'+
				 ' <param name="ONKEYPRESSED" value="'+qed_onKeyPress+'">'+
				 ' <param name="ONKEYUP" value="'+qed_onKeyUp+'">'+
				 ' <param name="INFODELAY" value="'+qed_infoDelay+'">';


	if (width3D!=null)
		output +=' <param name="WIDTH3D" value="'+width3D+'">';

	if (height3D!=null)
		output +=' <param name="HEIGHT3D" value="'+height3D+'">';

	if (posx!=null)
		output +=' <param name="POSX" value="'+posx+'">';

	if (posy!=null)
		output +=' <param name="POSY" value="'+posy+'">';

	if (navigator.appName != "Microsoft Pocket Internet Explorer")
	{
	output +=		'<EMBED STREAMURL1="'+stream1+'"'+
					 ' STREAMURL2="'+stream2+'"'+
					 ' TYPE="application/x-qedstream"'+
					 ' WIDTH='+widthNS+
					 ' HEIGHT='+heightNS+
					 ' MODE="'+mode+'"'+
					 ' NAME="'+name+'"'+
					 ' ONENDDATA="'+qed_onEndData+'"'+
					 ' ONSTARTDATA="'+qed_onStartData+'"'+
					 ' ONSTARTLOAD="'+qed_onStartLoad+'"'+
					 ' ONENDLOAD="'+qed_onEndLoad+'"'+
					 ' ONSTART="'+qed_onStart+'"'+
					 ' ONSTOP="'+qed_onStop+'"'+
					 ' ONLOADPROGRESS="'+qed_onProgress+'"'+
					 ' ONSTARTBUFFERING="'+qed_onStartBuffering+'"'+
					 ' ONSTOPBUFFERING="'+qed_onStopBuffering+'"'+
					 ' ONMOUSECLICOBJECT="'+qed_onMouseClicObject+'"'+
					 ' ONMOUSEENTEROBJECT="'+qed_onMouseEnterObject+'"'+
					 ' ONMOUSEEXITOBJECT="'+qed_onMouseExitObject+'"'+
					 ' ONMOUSEDOWNOBJECT="'+qed_onMouseDownObject+'"'+
					 ' ONMOUSEUPOBJECT="'+qed_onMouseUpObject+'"'+
					 ' ONSTARTSOUND="'+qed_onStartSound+'"'+
					 ' ONSTOPSOUND="'+qed_onStopSound+'"'+
					 ' ONSTARTANIM="'+qed_onStartAnim+'"'+
					 ' ONENDANIM="'+qed_onEndAnim+'"'+
					 ' ONERROR="'+qed_onError+'"'+
					 ' ONMOUSEMOVE="'+qed_onMouseMove+'"'+
					 ' ONKEYDOWN="'+qed_onKeyDown+'"'+
					 ' ONKEYPRESSED="'+qed_onKeyPress+'"'+
				     ' ONKEYUP="'+qed_onKeyUp+'"'+
				     ' INFODELAY="'+qed_infoDelay+'"';

	if (width3D!=null)
		output +=	  ' WIDTH3D='+width3D;

	if (height3D!=null)
		output +=	  ' HEIGHT3D='+height3D;

	if (posx!=null)
		output +=	  ' POSX='+posx;

	if (posy!=null)
		output +=	  ' POSY='+posy;
		
	// Mac Only (privates properties)
	if (navigator.platform == "MacPPC")
	{
		if (navigator.appName == "Netscape") // Netscape Only
		{
			if (self!=null)
			{
				output +=	  ' POSXMAC='+(self.outerWidth - self.innerWidth - 13);
				output +=	  ' POSYMAC='+(self.outerHeight - self.innerHeight - 45);
				output +=	  ' WIDTHMAC='+self.innerWidth;
				output +=	  ' HEIGHTMAC='+self.innerHeight;
			}
		}
	}

	output +=		 '><\/EMBED>';
	}
	
	output +=		 ' <\/OBJECT>';
	if (navigator.appName == "Microsoft Pocket Internet Explorer")
	{
		output +='<SCRIPT FOR="'+name+'" EVENT="OnGlobalEvent( eventmessage)">';
		output +='eval(eventmessage);';
		output +='<\/SCRIPT>';
	}
	return output;
}

function QED_createFull3DURL(name,stream1,stream2,width,height)
{
	if (!QED_check(0))
		return;

	QED_Installation();

	if (!bUpdatingNetscape)
	{
		var output = ___createQEDTag(name,stream1,stream2,width,height,"NORMAL");

		document.write(output);
	}
	else
	{
		setTimeout("___reloadTimer()",1000);
	}
}

function QED_createTransparentURL(name,stream1,stream2,width3D,height3D,posx,posy)
{
	if (!QED_check(0))
		return;

	QED_Installation();

	if (!bUpdatingNetscape)
	{
		var output = ___createQEDTag(name,stream1,stream2,width3D,height3D,"TRANSPARENT",posx,posy);

		document.write(output);
	}
	else
	{
		setTimeout("___reloadTimer()",1000);
	}

}


function QED_GetCurrentdocUrl()
{
	currentdoc = document.location.href;
	QedReplaceSpace(currentdoc);
	idx = currentdoc.length-1;
	while ((currentdoc.substr(idx,1)!='\\') && (currentdoc.substr(idx,1)!='/')) 
	{
		idx--;
	}

	return currentdoc.substr(0,idx+1);
}

function QED_GenerateURL(str,forceNoStreamer)
{
	if (str=="") return str;

	curpath = QED_GetCurrentdocUrl();

	res     = "";
	
	if (str.substr(0,1)=='/') 
	{
		// same protocol but root
		idx=0;
		if (curpath.substr(0,7)=="file://") 
		{
		 alert("Absolute path ["+str+"] is forbidden with file:// protocol!");
		 return str;
		}
		if (curpath.substr(0,7)=="http://") idx=7;
		res = curpath.substr(0,idx);
		while (curpath.substr(idx,1)!='/') 
		{
			res+=curpath.substr(idx,1);
			idx++;
		}
		res+=str;
	}
	else if (str.substr(0,7)=='http://') 
	{
		res = str;
	}
	else if (str.substr(0,7)=='file://') 
	{
		res = str;
	}
	else
	{
		if (qed_streamerHost!=null && (forceNoStreamer==null || forceNoStreamer==0))
		{
			var path = qed_streamerPath;

			if (str.substr(0,2)=="..")
				str = str.substr(3,str.length-3);

			res = "http://"+qed_streamerHost+":"+qed_streamerPort+"/"+path+"/"+str;
		}
		else
			res = curpath+str;
	}


	res2 = QedReplaceSpace(res);

	return res2;
}

function QED_createFull3D(name,stream1,stream2,width,height)
{
	s1 = QED_GenerateURL(stream1);
	s2 = QED_GenerateURL(stream2);
	QED_createFull3DURL(name,s1,s2,width,height);
}

function QED_createTransparent(name,stream1,stream2,width3D,height3D,posx,posy)
{
	s1 = QED_GenerateURL(stream1);
	s2 = QED_GenerateURL(stream2);
	QED_createTransparentURL(name,s1,s2,width3D,height3D,posx,posy);
}
