/**
 * RightBoard with boxes
 *
 *
 * NOTE : BOXES INDICE
 * 
 * 0	: The top text (big)
 * 1	: The square on the left (Label and Light)
 * 2	: The square on the right (Label and Light)
 * 3	: The bottom square on the right (Label and Light)
 * 4	: The bottom label text on the left
 * 5	: The bottom label text in the middle between the square left & right
 *
 */
#Const Version			"2013-09-10"
#Const ScriptName		"RightBoard.Script.txt"
#Const C_InfoBaseDir	"file://Media/Manialinks/Shootmania/InfoPanel/"
#Const C_Background		"info-bg.dds"
#Const C_TimeTick		200
#Const C_NbBox			6
#Const C_YPos			70.

#Include "TextLib" as TextLib

declare Integer G_NbBox;
declare Integer G_TimeTick;
declare Real	G_YPos;
declare Text 	G_Background;

/**
 * Return the version number of the script
 *	@return		The version number of the script
 */
Text GetScriptVersion() {
	return Version;
}

/**
 * Return the name of the script
 *	@return		The name of the script
 */
Text GetScriptName() {
	return ScriptName;
}


/**
 * Unload the library
 */
Void Unload() {
	
	foreach(Player in AllPlayers) {
		declare UI <=> UIManager.GetUI(Player);
		if(UI == Null) continue;
		
		declare netwrite Text[Integer]		Net_BoxLabelText 	for UI;
		declare netwrite Boolean[Integer]	Net_BoxLightTurn 	for UI;
		declare netwrite Vec3[Integer] 		Net_BoxLightColor 	for UI;
		declare netwrite Boolean[Integer]	Net_BoxLightVisible for UI;
		Net_BoxLabelText.clear();
		Net_BoxLightTurn.clear();
		Net_BoxLightColor.clear();
		Net_BoxLightVisible.clear();
	}
}

Void Load()
{
	Unload();
	G_NbBox			= C_NbBox;
	G_TimeTick		= C_TimeTick;
	G_YPos 			= C_YPos;
	G_Background	= C_InfoBaseDir^C_Background;
}

Void SetYPosition(Real _YPos) {
	G_YPos = _YPos;
}

Void SetBackgroundImage(Text _Background) {
	G_Background = _Background;
}

Void SetTimeTick(Integer _TimeTick) {
	G_TimeTick = _TimeTick;
}

Void SetBoxLabelText(CSmPlayer _Player, Integer _BoxSelect, Text _Text) {
	if(_BoxSelect >= G_NbBox) {
		log("[RightBoard::SetBoxLabelText] Wrong Box Index at "^_BoxSelect);
		return;
	}
	
	declare UI <=> UIManager.GetUI(_Player);
	if(UI != Null) 
	{
		declare netwrite Integer 		Net_UpdateParam for UI;
		declare netwrite Text[Integer] 	Net_BoxLabelText for UI;
		Net_BoxLabelText[_BoxSelect] = _Text;
		Net_UpdateParam = Now;
	}
}

Void SetBoxAllParam(CSmPlayer _Player, Integer _BoxSelect, Text _Text,  Boolean _TurnOn, Vec3 _Color, Boolean _Visible) {
	if(_BoxSelect >= G_NbBox) {
		log("[RightBoard::SetBoxAllParam] Wrong Box Index at "^_BoxSelect);
		return;
	}
	
	declare UI <=> UIManager.GetUI(_Player);
	if(UI != Null)
	{
		declare netwrite Integer 			Net_UpdateParam for UI;
		declare netwrite Text[Integer] 		Net_BoxLabelText for UI;
		declare netwrite Boolean[Integer] 	Net_BoxLightTurn for UI;
		declare netwrite Vec3[Integer] 		Net_BoxLightColor for UI;
		declare netwrite Boolean[Integer] 	Net_BoxLightVisible for UI;
		Net_BoxLabelText[_BoxSelect] 	= _Text;
		Net_BoxLightTurn[_BoxSelect] 	= _TurnOn;
		Net_BoxLightColor[_BoxSelect]	= _Color;
		Net_BoxLightVisible[_BoxSelect] = _Visible;
		
		Net_UpdateParam = Now;
	}
}

Void SetBoxLight(CSmPlayer _Player, Integer _BoxSelect, Boolean _TurnOn) {
	if(_BoxSelect >= G_NbBox) {
		log("[RightBoard::SetBoxLight] Wrong Box Index at "^_BoxSelect);
		return;
	}
	
	declare UI <=> UIManager.GetUI(_Player);
	if(UI != Null) 
	{
	
		declare netwrite Integer 			Net_UpdateParam for UI;
		declare netwrite Boolean[Integer] 	Net_BoxLightTurn for UI;
		Net_BoxLightTurn[_BoxSelect] = _TurnOn;
		
		Net_UpdateParam = Now;
	}
}

Void SetBoxLightColor(CSmPlayer _Player, Integer _BoxSelect, Vec3 _Color) {
	if(_BoxSelect >= G_NbBox) {
		log("[RightBoard::SetBoxLightColor] Wrong Box Index at "^_BoxSelect);
		return;
	}
		
	declare UI <=> UIManager.GetUI(_Player);
	if(UI != Null) 
	{
		declare netwrite Integer 		Net_UpdateParam for UI;
		
		declare netwrite Vec3[Integer]	Net_BoxLightColor for UI;
		Net_BoxLightColor[_BoxSelect] = _Color;
		
		Net_UpdateParam = Now;
	}
}

Void SetBoxLightVisible(CSmPlayer _Player, Integer _BoxSelect, Boolean _Visible) {
	if(_BoxSelect >= G_NbBox) {
		log("[RightBoard::SetBoxLightVisible] Wrong Box Index at "^_BoxSelect);
		return;
	}
	
	declare UI <=> UIManager.GetUI(_Player);
	if(UI != Null) 
	{
		declare netwrite Integer			Net_UpdateParam for UI;
		declare netwrite Boolean[Integer] 	Net_BoxLightVisible for UI;
		Net_BoxLightVisible[_BoxSelect] = _Visible;
		
		Net_UpdateParam = Now;
	}
}

Text BuildLayer() {
	declare Text BgImg 			= G_Background;
	declare Text LightOffLeft	= C_InfoBaseDir^"info-light-off.dds";
	declare Text LightOffRight	= C_InfoBaseDir^"info-light-off-rev.dds";
	declare Text LightLeft		= C_InfoBaseDir^"info-light-on.dds";
	declare Text LightRight		= C_InfoBaseDir^"info-light-on-rev.dds";
		
	
	declare Text ML = """
<script><!--	
	main()
	{
		while(InputPlayer == Null) yield;
		
		declare netread Integer			 Net_UpdateParam for UI;
		declare netread Text[Integer] 	 Net_BoxLabelText for UI;
		declare netread Boolean[Integer] Net_BoxLightTurn for UI;
		declare netread Vec3[Integer]	 Net_BoxLightColor for UI;
		declare netread Boolean[Integer] Net_BoxLightVisible for UI;
		
		declare CMlLabel[Integer] ArrayLabelBox;
		declare CMlQuad[Integer]  ArrayQuadBoxLeft;
		declare CMlQuad[Integer]  ArrayQuadBoxRight;
		
		for(I, 0, {{{G_NbBox-1}}})
		{
			declare CMlQuad QuadLeft  <=> (Page.GetFirstChild("Quad_BL"^I^"_Left") as CMlQuad);
			declare CMlQuad QuadRight <=> (Page.GetFirstChild("Quad_BL"^I^"_Right") as CMlQuad);
	
			if(QuadLeft == Null) continue;
			ArrayQuadBoxLeft[I]  = QuadLeft;
			ArrayQuadBoxRight[I] = QuadRight;
		}
			
		
		for(I, 0, {{{G_NbBox-1}}})
		{
			declare CMlLabel Label_BoxText <=> (Page.GetFirstChild("Label_Box"^I^"Text") as CMlLabel);
			
			if(Label_BoxText == Null) continue; 
			ArrayLabelBox[I] = Label_BoxText;
		}
		
		declare Integer PrevUpdate = -1;
		
		while(True) {
			sleep({{{G_TimeTick}}});
			
			if(PrevUpdate == Net_UpdateParam) continue;
			PrevUpdate = Net_UpdateParam;
			
			//Box SetText
			for(I, 0, {{{G_NbBox-1}}})
			{
				if(Net_BoxLabelText.existskey(I))
				{
					declare CMlLabel TheLabel <=> ArrayLabelBox[I];
					if( TheLabel != Null) {
						TheLabel.SetText(Net_BoxLabelText[I]);
					}
				}
			}
			
			foreach(Index => Quad in ArrayQuadBoxRight)
			{
				//Turn on-off the light
				if(Net_BoxLightTurn.existskey(Index))
				{
					if(Net_BoxLightTurn[Index])
					{
						ArrayQuadBoxLeft[Index].ImageUrl 	= "{{{LightLeft}}}";
						ArrayQuadBoxRight[Index].ImageUrl 	= "{{{LightRight}}}";
					}
					else
					{
						ArrayQuadBoxLeft[Index].ImageUrl	= "{{{LightOffLeft}}}";
						ArrayQuadBoxRight[Index].ImageUrl 	= "{{{LightOffRight}}}";
					}
				}
				
				//Light Color
				if(Net_BoxLightColor.existskey(Index))
				{
					ArrayQuadBoxLeft[Index].Colorize	= Net_BoxLightColor[Index];
					ArrayQuadBoxRight[Index].Colorize	= Net_BoxLightColor[Index];
				}
				
				//Light Visiblility
				if(!Net_BoxLightVisible.existskey(Index)) continue;
				
				if(Net_BoxLightVisible [Index])
				{
					ArrayQuadBoxLeft[Index].Show();
					ArrayQuadBoxRight[Index].Show();
				}
				else
				{
					ArrayQuadBoxRight[Index].Hide();
					ArrayQuadBoxLeft[Index].Hide();
				}
			}
		}
	}
--></script>

<frame posn="160 {{{G_YPos}}} 0">
	<quad sizen="50 25" posn="0 0 -2" bgcolor="0007" halign="right" valign="top" image="{{{BgImg}}}"/>
	<label id="Label_Box0Text" sizen="47.5" style="TextTitle3" posn="-24.3 -6" halign="center" valign="center" textsize="3" textcolor="fff8"/>
	<frame posn="-31 -12.5 -1" hidden="0" id="Frame_LightBox1">
		<quad id="Quad_BL1_Left" sizen="8 3.5"  				halign="right" valign="top" image="{{{LightOffLeft}}}" colorize="000"/>
		<quad id="Quad_BL1_Right" sizen="8 3.5" posn="-8 -0.3" 	halign="right" valign="top" image="{{{LightOffRight}}}" colorize="000"/>
	</frame>
	<label id="Label_Box1Text" posn="-39. -14.2 6" halign="center" valign="center" textsize="1" textcolor="fff8" sizen="14"/>
	<frame posn="-1 -12.5 -1" hidden="0" id="Frame_LightBox2">
		<quad id="Quad_BL2_Left" sizen="8 3.5"  				halign="right" valign="top" image="{{{LightOffLeft}}}" colorize="000"/>
		<quad id="Quad_BL2_Right" sizen="8 3.5" posn="-8 -0.3" 	halign="right" valign="top" image="{{{LightOffRight}}}" colorize="000"/>
	</frame>
	<label id="Label_Box2Text" posn="-9. -14.2 6" halign="center" valign="center" textsize="1" textcolor="fff8" sizen="14"/>
	<label id="Label_Box4Text" sizen="17" posn="-37 -20" textsize="1" halign="center" valign="center" textcolor="666" style="TextTitle3" scale="0.8"/>
	<label id="Label_Box3Text" sizen="15" posn="-12.2 -19.5 1" textsize="2" halign="center" valign="center" style="TextTitle3"/>
	<frame posn="-1 -17 2" id="Frame_LightBox3">
		<quad id="Quad_BL3_Left" sizen="11 5.5"  					halign="right" valign="top" image="{{{LightOffLeft}}}" colorize="000"/>
		<quad id="Quad_BL3_Right" sizen="11 5.5" posn="-11.5 -0.3" 	halign="right" valign="top" image="{{{LightOffRight}}}" colorize="000"/>
	</frame>
	<label id="Label_Box5Text" sizen="14" posn="-24.0 -14.0" textsize="1" halign="center" valign="center" textcolor="fff" opacity="0.9"/>
</frame>

""";
	
	
	return ML;
}