/*
	pitptoctrl.js
	
	This file is part of the Pixeltamer Internet Toolkit. Copyright (C) 2007 pixeltamer.net	
	
	Controls specific to PTO services like chat, news, forum	
*/


function PitPTOCtrlChat(p_iX,p_iY,p_iW,p_iH,p_sTitle)
{
	PitPTOCtrlChat.BaseCtor.call(this,p_iX,p_iY,p_iW,p_iH,p_sTitle);
	this.m_sTagName="div";
	this.m_sTagClass="chat";
	if(!p_iX){p_iX=0;};
	if(!p_iY){p_iY=0;};
	if(!p_iW){p_iW=100;};
	if(!p_iH){p_iH=100;};
	this.m_iX=p_iX;
	this.m_iY=p_iY;
	this.m_iW=p_iW;
	this.m_iH=p_iH;

//	this.AddTopLevelBehaviour(true,true);
	
	this.m_xSubsTab=null;
	this.m_xOutput=null;
	this.m_xInput=null;
	
	this.m_axRooms=new Array();
	this.m_asRoomList=new Array();
	this.m_asIgnoreList=-1;
	
	this.m_sRPCURL="";

	this.m_iUpdateTimeoutRL=100;
	this.m_iUpdateTimeoutML=100;
	this.m_iTimer=-1;
	
	this.m_iChatUpdateTime=2000;
	this.m_xLastSecondary=new Date();
	
	this.m_bEditAtTop=false;
	this.m_bReverseMessages=true;
	this.m_bTabsVisible=true;
	
	this.m_bUserInfo=true;
	this.m_sRoomListTextColor="#ffffff";
	
	this.m_xScrollBox=null;
	
	this.AddStyles(g_xPitStyleDef.PitPTOCtrlChat);
};

// function PitCtrlScrollPanel(p_sBarStyle,p_iX,p_iY,p_iW,p_iH,p_sFrameStyle,p_iFrameOffset,p_sFrameBGColor,p_fFrameTransparency)
Inherit(PitPTOCtrlChat,PitCtrlTopLevel,"PitPTOCtrlChat");

PitPTOCtrlChat.prototype.Destruct=function()
{
	pit_ClearFnc(this.m_xOutput);
	this.m_xOutput=null;
	this.m_xSubsTab=null;
	this.m_xInput=null;
	this.m_xScrollBox=null;
	if(this.m_iTimer!=-1)
	{
		window.clearTimeout(this.m_iTimer);
	};
	pit_Purge(this.m_axRooms);
	pit_Purge(this.m_axRoomList);
	PitPTOCtrlChat.Super.Destruct.call(this);
};

PitPTOCtrlChat.prototype.OnResize=function()
{
	this.GetCurRect();
	this.UpdateLayout();
	PitPTOCtrlChat.Super.OnResize.call(this);
	this.RefreshFrame();
};

PitPTOCtrlChat.prototype.UpdateLayout=function()
{
	var xR=this.GetContentRect();
	xR.m_iX+=2;xR.m_iY+=2;xR.m_iW-=4;xR.m_iH-=4;
	this.m_xScrollBox.UpdateRect();
	this.m_xScrollBox.SetSize(xR.m_iW-22,this.m_xScrollBox.m_iH);
	var iTH=0;
	var iIH=this.m_xInput.m_iH;
	var iTY=0;
	if(this.m_bTabsVisible)
	{
		iTH=this.m_xSubsTab.m_iH;
		this.m_xSubsTab.SetRect(xR.m_iX,xR.m_iY,xR.m_iW,iTH);
	}
	else
	{
		iTH=0;
		this.m_xSubsTab.SetRect(xR.m_iX,-this.m_xSubsTab.m_iH*2,xR.m_iW,this.m_xSubsTab.m_iH);
	};
	if(this.m_bEditAtTop)
	{
		
		this.m_xOutput.SetRect(xR.m_iX,xR.m_iY+iTH+4+iIH,xR.m_iW,xR.m_iH-iTH-iIH-4);
		this.m_xInput.SetRect(xR.m_iX,xR.m_iY+iTH+2,xR.m_iW,iIH);
	}
	else
	{
		this.m_xOutput.SetRect(xR.m_iX,xR.m_iY+iTH+2,xR.m_iW,xR.m_iH-iTH-iIH-4);
		this.m_xInput.SetRect(xR.m_iX,xR.m_iY+xR.m_iH-iIH,xR.m_iW,iIH);
	};
};

PitPTOCtrlChat.prototype.RefreshAttributes=function()
{
	if(!this.m_xSubsTab)
	{
		var hThis=this.m_hHnd;
		this.m_xSubsTab=new PitCtrlTab(10,30,300,this.m_xStyleDef.TabStyle);
		this.m_xOutput=new PitCtrlScrollPanel(this.m_xStyleDef.ScrollStyle,10,60,200,200,"",0,"",1);
		this.m_xInput=new PitCtrlEdit(10,10,200,20);
		this.m_xSubsTab.m_iCloseTabs=1;

		this.m_xSubsTab.m_xOnTabActivate=function(p_sTab)
		{
			var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.SwitchTab(p_sTab);};
		};
		this.m_xSubsTab.m_xOnTabClose=function(p_sTab)
		{
			var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.CloseRoom(p_sTab);};
		};
		
		this.m_xOutput.m_bAutoArrange=true;
		this.m_xOutput.m_bOverlapPages=false;
		this.m_xOutput.m_iVSpacing=0;
		
		this.m_xScrollBox=new PitCtrlPanel(0,0,this.m_iW-32-0,2);
		this.m_xOutput.AddChild(this.m_xScrollBox);
		var xScrD=this.m_xScrollBox.MakeEl();
		xScrD.style.fontSize=this.m_xStyleDef.ScrollFontSize+"px";
		
		this.m_xOutput.OnSetScrollPos=function(p_iPos,p_iRange)
		{
		};
		
		this.AddChild(this.m_xSubsTab);
		this.AddChild(this.m_xOutput);
		this.AddChild(this.m_xInput);
		
		this.m_xInput.GetEl().maxLength=256;
		this.m_xInput.SetKeyCmdID(1);
		this.m_xInput.OnCmd=function(p_iCmd,p_xE)
		{
			if(p_xE.m_iKeyCode!=13) {return true;};
			var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){
				var sVal=xThis.m_xInput.GetEl().value;
				xThis.m_xInput.GetEl().value="";
				xThis.SendChatCommand(sVal);
			};
			return false;
		};
	};

	this.UpdateLayout();
	
	this.m_xSubsTab.RefreshAttributes();
	this.m_xOutput.RefreshAttributes();
	this.m_xInput.RefreshAttributes();
	PitPTOCtrlChat.Super.RefreshAttributes.call(this);
	this.UpdateLayout();
};

PitPTOCtrlChat.prototype.EscapeText=function(p_sText)
{
	var sOrg=p_sText;
	p_sText=p_sText.replace(/&/g,"&amp;");
	p_sText=p_sText.replace(/</g,"&lt;");
	p_sText=p_sText.replace(/>/g,"&gt;");
	if(p_sText.match(/\uA025;\uA025/))
	{
		p_sText=p_sText.replace(/\uA025;\uA025/, '<span style="white-space:nowrap;">');
		p_sText=p_sText.replace(/\uA025;\uA025/g, '</span> <span style="white-space:nowrap;">');
		p_sText=p_sText+"</span>";
	};
	p_sText=p_sText.replace(/\uA025afk\uA025/g, '<img src="images/hourglass.gif" style="position: relative; top: 2px;" title="AFK">');
	p_sText=p_sText.replace(/\uA025adm\uA025/g, '<img src="images/star_gold.gif" style="position: relative; top: 2px;" title="Administrator">');
	p_sText=p_sText.replace(/\uA025op\uA025/g, '<img src="images/star_silver.gif" style="position: relative; top: 2px;" title="Moderator">');
	p_sText=p_sText.replace(/(http:\/\/\S*)/g, '<a href="$1" target="_blank">$1<\/a>');
	return p_sText;
};

PitPTOCtrlChat.prototype.SwitchTab=function(p_sTab)
{
	var xThis=this;
	if(this.m_iTimer!=-1)
	{
		window.clearTimeout(this.m_iTimer);
	};
	this.m_iChatUpdateTime=2000;
	this.UpdateTick();	
	if(p_sTab=="@")
	{
		pit_SetIH(this.m_xScrollBox.MakeEl(),"");
		this.UpdateRoomListDisplay();
	}
	else if(p_sTab=="@i")
	{
		pit_SetIH(this.m_xScrollBox.MakeEl(),"");
		this.UpdateIgnoreListDisplay();
	}
	else
	{
		var iIdx=this.FindRoom(p_sTab);
		if(iIdx!=-1)
		{
			pit_SetIH(this.m_xScrollBox.MakeEl(),"");
			this.UpdateRoomMsgDisplay(this.m_axRooms[iIdx]);
		};
		if(this.m_bReverseMessages)
		{
			this.m_xOutput.SetScrollPos(0);
		}
		else
		{
			this.m_xOutput.SetScrollPos(this.m_xOutput.GetScrollRange());
		};
	};
};

PitPTOCtrlChat.prototype.QueryIgnoreList=function()
{
	if((!this.m_sRPCURL)||(this.m_sRPCURL.length==0)){return;};
	var xRPC=new PitRPC();
	xRPC.SetURL(this.m_sRPCURL);
	xRPC.SetFunction("chat");
	xRPC.SetParams("room",this.m_xSubsTab.GetActiveTab());
	xRPC.SetParams("cmd","/ignored");
	xRPC.SetParams("time","0");
	xRPC.m_sCmd="/ignored";
	xRPC.m_bQuiet=true;
	xRPC.SetComplex(true);
	var hThis=this.m_hHnd;
	
	xRPC.OnSucceed=function(){
		var xThis=g_xPitBoxes.GetBox(hThis);
		if(xThis&&xRPC.m_xResults.ign){
			xThis.m_asIgnoreList=xRPC.m_xResults.ign;
		};
	};
	
	xRPC.Send();
};

PitPTOCtrlChat.prototype.QueryRoomList=function()
{
	if((!this.m_sRPCURL)||(this.m_sRPCURL.length==0)){return;};
	var xRPC=new PitRPC();
	xRPC.SetURL(this.m_sRPCURL);
	xRPC.SetFunction("chat");
	xRPC.SetParams("room",this.m_xSubsTab.GetActiveTab());
	xRPC.SetParams("cmd","/list");
	xRPC.SetParams("time","0");
	xRPC.m_sCmd="/list";
	xRPC.m_bQuiet=true;
	xRPC.SetComplex(true);
	var hThis=this.m_hHnd;
	xRPC.OnSucceed=function(){
		var xD=xRPC.m_xResults;
		if(xD.status && xD.status=="ok")
		{
			var asNewList=new Array();
			var i,iC=xD.count;
			for(i=0;i<iC;i++)
			{
				asNewList.push(xD["E_"+i]);
			};
			asNewList.sort();
			var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){
				if(xThis.m_sAutoRoom)
				{
					xThis.m_asRoomList=asNewList;
					var sR=xThis.m_sAutoRoom;
					xThis.m_sAutoRoom=null;
					xThis.GotoRoom(sR);
				}
				else
				{
					if(!asNewList.equal(xThis.m_asRoomList))
					{
						xThis.m_asRoomList=asNewList;
						if(xThis.m_xSubsTab.GetActiveTab()=="@")
						{
							xThis.UpdateRoomListDisplay();
						};
					};
				};
			};
		};
		var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){
			xThis.ScheduleUpdate(10000);
		};
	};
	xRPC.OnFail=function(){
		var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){
			xThis.ScheduleUpdate(10000);
		};
	};
	xRPC.Send();
};

PitPTOCtrlChat.prototype.SecondaryUpdate=function()
{
	if((!this.m_sRPCURL)||(this.m_sRPCURL.length==0)){return;};
	var i,iC=this.m_axRooms.length;
	if(iC==0){return;};
	var xRPC=new PitRPC();
	var sCmd="/#";
	for(i=0;i<iC;i++)
	{
		sCmd+=" \"#"+this.m_axRooms[i].m_sName+"\"";
	};
//	pit_LogT("QCM ",p_sRoom);
	xRPC.SetURL(this.m_sRPCURL);
	xRPC.SetFunction("chat");
	xRPC.SetParams("cmd",sCmd);
	xRPC.SetComplex(true);
	var hThis=this.m_hHnd;
	xRPC.OnSucceed=function(){
		var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.UpdateRoomMessages(xRPC);};
	};
	xRPC.OnFail=function(){
	};
	xRPC.Send();
};

PitPTOCtrlChat.prototype.QueryCurrentMessages=function(p_sRoom)
{
	if((!this.m_sRPCURL)||(this.m_sRPCURL.length==0)){return;};
	var xRPC=new PitRPC();
	var iIdx=this.FindRoom(p_sRoom);
	if(iIdx==-1){return;};
	var iTime=this.m_axRooms[iIdx].m_iLastTime;
//	pit_LogT("QCM ",p_sRoom);
	xRPC.SetURL(this.m_sRPCURL);
	xRPC.SetFunction("chat");
	xRPC.SetParams("room",p_sRoom);
	xRPC.SetParams("cmd","/?");
	xRPC.SetParams("time",iTime);
	xRPC.SetComplex(true);
	var hThis=this.m_hHnd;
	xRPC.OnSucceed=function(){
		var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){
			xThis.UpdateRoomMessages(xRPC);
			xThis.ScheduleUpdate(xThis.m_iChatUpdateTime);
		};
	};
	xRPC.OnFail=function(){
		pit_Log("Fail:",xRPC.m_iStatus);
		var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){
			xThis.ScheduleUpdate(5000);
		};
	};
	xRPC.Send();
};

PitPTOCtrlChat.prototype.ScheduleUpdate=function(p_iTime)
{
	var hThis=this.m_hHnd;
	if(this.m_iTimer!=-1)
	{
		window.clearTimeout(this.m_iTimer);
	};
	this.m_iTimer=window.setTimeout(function(){
		var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.UpdateTick();};
		},p_iTime);
};

PitPTOCtrlChat.prototype.UpdateTick=function()
{
	this.m_iTimer=-1;
	if(!this.m_xSubsTab){return;};
	var xNow=new Date();
	if(xNow-this.m_xLastSecondary>50000)
	{
		this.m_xLastSecondary=xNow;
		this.SecondaryUpdate();
		if(this.m_asIgnoreList!=-1) {this.QueryIgnoreList();};
	};
	if(this.m_asIgnoreList==-1) {this.QueryIgnoreList();};
	var sCurrentRoom=this.m_xSubsTab.GetActiveTab();
	if(sCurrentRoom=="@")
	{
		this.QueryRoomList();
	}
	else if(sCurrentRoom.length>0)
	{
		this.QueryCurrentMessages(sCurrentRoom);
	};
};

PitPTOCtrlChat.prototype.CreateUserElement=function(p_sUser)
{
	if(this.m_bUserInfo) {
		return "<a href='/main.html?page=Userinfo&user="+p_sUser+"'>"+p_sUser+"</a>";
	} else {
		return p_sUser;
	};
};

PitPTOCtrlChat.prototype.CreateMessageDiv=function(p_xM,p_iLastTime)
{
	var xD=document.createElement("div");
	p_xM.m_xDiv=xD;
	var iType=p_xM.X;
	var bAdm=(iType&(1<<30))!=0;
	var bMod=(iType&(1<<31))!=0;
	iType&=~((1<<31)|(1<<30));
		
	if(this.m_asIgnoreList!=-1&&this.m_asIgnoreList.length>0)
	{
		if((!bAdm)&&(!bMod)&&(this.m_asIgnoreList.indexOf(p_xM.N)!=-1)) {return;};
	};
	
	if(iType==0)
	{
		xD.className=(bAdm&&this.m_xStyleDef.ChatLineClassAdm)?this.m_xStyleDef.ChatLineClassAdm:(bMod&&this.m_xStyleDef.ChatLineClassOp)?this.m_xStyleDef.ChatLineClassOp:this.m_xStyleDef.ChatLineClass;
		if((p_iLastTime)&&(p_xM.T-p_iLastTime>32*60*5))
		{
			var iT=Number(p_xM.T);
			var xDS=new Date();
			xDS.setTime((iT/32)*1000);
			if(!this.m_bReverseMessages)
			{
				pit_SetIH(xD,this.CreateUserElement(p_xM.N)+":&nbsp;"+this.EscapeText(p_xM.M)+"<br><span class='"+this.m_xStyleDef.ChatLineTimeSepClass+"'>["+pit_LeadZero2(""+xDS.getHours())+":"+pit_LeadZero2(""+xDS.getMinutes())+"]</span>");
			}
			else
			{
				pit_SetIH(xD,this.CreateUserElement(p_xM.N)+":&nbsp;"+this.EscapeText(p_xM.M)+"<br><span class='"+this.m_xStyleDef.ChatLineTimeSepClass+"'>["+pit_LeadZero2(""+xDS.getHours())+":"+pit_LeadZero2(""+xDS.getMinutes())+"]</span>");
			};
		}
		else
		{
			pit_SetIH(xD,this.CreateUserElement(p_xM.N)+":&nbsp;"+this.EscapeText(p_xM.M));
		};
	}
	else if(iType==1)
	{
		var iT=Number(p_xM.T);
		var xDS=new Date();
		xDS.setTime((iT/32)*1000);

		
		xD.className=this.m_xStyleDef.ChatLineSysClass;
		pit_SetIH(xD,"["+pit_LeadZero2(""+xDS.getHours())+":"+pit_LeadZero2(""+xDS.getMinutes())+"] "+p_xM.N+"&nbsp;"+this.EscapeText(p_xM.M));
	}
	else if(iType==2)
	{
		xD.className=this.m_xStyleDef.ChatLineUsrClass;
		pit_SetIH(xD,"* "+p_xM.N+"&nbsp;"+this.EscapeText(p_xM.M));
	}
	else if(iType==3)
	{
		xD.className=this.m_xStyleDef.ChatLineUsrClassMsg?this.m_xStyleDef.ChatLineUsrClassMsg:this.m_xStyleDef.ChatLineUsrClass;
		pit_SetIH(xD," "+p_xM.N+":&nbsp;"+this.EscapeText(p_xM.M));
	}
};

PitPTOCtrlChat.prototype.UpdateRoomMessages=function(p_xRPC)
{
	var xD=p_xRPC.m_xResults;
	if(!xD){pit_Log("JSON-Error:",p_xRPC.m_sResultText);return;};
	if(xD.cmd!="/?"){return;};
	var iR,iRC=xD.count;
	var bActivity=false;
	for(iR=0;iR<iRC;iR++)
	{
		var xRm=xD["E_"+iR];
		if(xRm)
		{
			if(xRm.status=="ok")
			{
				var iRIdx=this.FindRoom(xRm.room);
				if(iRIdx!=-1)
				{
					var xRoom=this.m_axRooms[iRIdx];
					if(xRoom.m_iLastTime==0)
					{
						var xB=this.m_xScrollBox;
						var xD=xB.MakeEl();

						for(var iM=0;iM<xRoom.m_axLines.length;iM++)
						{
							if(!xRoom.m_axLines[iM].m_xDiv) {continue;};
							xD.removeChild(xRoom.m_axLines[iM].m_xDiv);
							xRoom.m_axLines[iM].m_xDiv=null;
						};
					};
					
					var iM,iMC=xRm.count;
					if(iMC>0)
					{
						for(iM=0;iM<iMC;iM++)
						{
							var xMSrc=xRm["M_"+iM];
							xMSrc.m_xDiv=null;
							if(xMSrc.T<=xRoom.m_iLastTime) {continue;}; //dup
							xRoom.m_axLines.push(xMSrc);
							xRoom.m_iLastTime=xMSrc.T;
						};
						if(xRm.room==this.m_xSubsTab.GetActiveTab())
						{
							this.UpdateRoomMsgDisplay(xRoom);
							bActivity=true;
						};
					};
					if(xRm.version!=xRoom.m_iVersion)
					{
						if(xRoom.m_iVersion!=-1) {xRoom.m_iLastTime=0;};
						xRoom.m_iVersion=xRm.version;
					};
				};
			}
			else if(xRm.status=="no_auth")
			{
				this.CloseRoom(xRm.room);
			};
		};
	};
	if(bActivity)
	{
		this.m_iChatUpdateTime=2000;
	}
	else
	{
		if(this.m_iChatUpdateTime<=10000)
		{
			this.m_iChatUpdateTime=this.m_iChatUpdateTime+200;
		};
	};
};

PitPTOCtrlChat.prototype.UpdateRoomMsgDisplay=function(p_xRoom)
{
	var xB=this.m_xScrollBox;
	var xD=xB.MakeEl();
	var bFullRefresh=false;
	if(!xD.firstChild){
		bFullRefresh=true;
	};
	var iOldScroll=this.m_xOutput.GetScrollPos();
	var iScrollRange=this.m_xOutput.GetScrollRange();
	var hThis=this.m_hHnd;
	var iM,iMC;
	if(this.m_bReverseMessages)
	{
		iMC=p_xRoom.m_axLines.length;
		while(iMC>128)
		{
			if(!bFullRefresh)
			{
				var xLast=xD.lastChild;
				xD.removeChild(xLast);
				pit_Purge(xLast);
				xLast=null;
			};
			p_xRoom.m_axLines.splice(0,1);
			iMC=p_xRoom.m_axLines.length;
		};
		if(bFullRefresh)
		{
			for(iM=0;iM<iMC;iM++)
			{
				p_xRoom.m_axLines[iM].m_xDiv=null;
			};
		};
		var iLastT=0;
		for(iM=0;iM<iMC;iM++)
		{
			var xL=p_xRoom.m_axLines[iM];
			if(!xL.m_xDiv)
			{
				this.CreateMessageDiv(xL,iLastT);
				xD.insertBefore(xL.m_xDiv,xD.firstChild);
			}
			else if(bFullRefresh)
			{
				xD.insertBefore(xL.m_xDiv,xD.firstChild);
			};
			iLastT=xL.T;
		};
		xB.SetAutoHeight();
		xB.UpdateRect();
		this.m_xOutput.RefreshAttributes();
		var iNewScroll=iOldScroll;
		if((iOldScroll>iScrollRange/2)&&(iScrollRange>1))
		{
			iOldScroll=iScrollRange-iOldScroll;
			iScrollRange=this.m_xOutput.GetScrollRange();
			iOldScroll=iScrollRange-iOldScroll;
			if(iOldScroll>iScrollRange){iOldScroll=iScrollRange;};
			this.m_xOutput.SetScrollPos(iOldScroll-1,false);
			this.m_xOutput.SetScrollPos(iOldScroll,true);
		}
		else
		{
			iScrollRange=this.m_xOutput.GetScrollRange();
			if(iOldScroll>iScrollRange){iOldScroll=iScrollRange;};
			this.m_xOutput.SetScrollPos(iOldScroll+1,false);
			this.m_xOutput.SetScrollPos(iOldScroll,true);
		};
	}
	else
	{
		iMC=p_xRoom.m_axLines.length;
		while(iMC>128)
		{
			if(!bFullRefresh)
			{
				var xLast=xD.firstChild;
				xD.removeChild(xLast);
				pit_Purge(xLast);
				xLast=null;
			};
			p_xRoom.m_axLines.splice(0,1);
			iMC=p_xRoom.m_axLines.length;
		};
		if(bFullRefresh)
		{
			for(iM=0;iM<iMC;iM++)
			{
				p_xRoom.m_axLines[iM].m_xDiv=null;
			};
		};
		var iLastT=0;
		for(iM=0;iM<iMC;iM++)
		{
			var xL=p_xRoom.m_axLines[iM];
			if(!xL.m_xDiv)
			{
				this.CreateMessageDiv(xL,iLastT);
				xD.appendChild(xL.m_xDiv);
			}
			else if(bFullRefresh)
			{
				xD.appendChild(xL.m_xDiv);
			};
			iLastT=xL.T;
		};
		xB.SetAutoHeight();
		xB.UpdateRect();
		this.m_xOutput.RefreshAttributes();
		var iNewScroll=iOldScroll;
		if(iOldScroll>iScrollRange/2)
		{
			iOldScroll=iScrollRange-iOldScroll;
			iScrollRange=this.m_xOutput.GetScrollRange();
			iOldScroll=iScrollRange-iOldScroll;
			if(iOldScroll>iScrollRange){iOldScroll=iScrollRange;};
			this.m_xOutput.SetScrollPos(iOldScroll-1,false);
			this.m_xOutput.SetScrollPos(iOldScroll,true);
		}
		else
		{
			iScrollRange=this.m_xOutput.GetScrollRange();
			if(iOldScroll>iScrollRange){iOldScroll=iScrollRange;};
			this.m_xOutput.SetScrollPos(iOldScroll+1,false);
			this.m_xOutput.SetScrollPos(iOldScroll,true);
		};
	};
};

PitPTOCtrlChat.prototype.UpdateRoomListDisplay=function()
{
	var xNewBox=this.m_xScrollBox;
	var xD=xNewBox.MakeEl();
	xD.className="chatpnl";
	pit_SetIH(xD,"");
	var i,iC=this.m_asRoomList.length;
	var hThis=this.m_hHnd;
	for(i=0;i<iC;i++)
	{
		var sRoom=this.m_asRoomList[i];
		var xS=document.createElement("a");
		xS.className="chatbtn";
		xS.style.color=this.m_sRoomListTextColor;
		xS.href="javascript:/**/";
		xS.onmouseup=function(sR){
			return function(){
				var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.GotoRoom(sR);};
			}}(sRoom);
		pit_SetIH(xS,this.EscapeText(sRoom));
		xD.appendChild(xS);
		xD.appendChild(document.createElement("br"));
	};
	xNewBox.SetAutoHeight();
	this.m_xOutput.SetScrollPos(0,true);
	this.m_xOutput.RefreshAttributes();
};

PitPTOCtrlChat.prototype.UpdateIgnoreListDisplay=function()
{
	var xNewBox=this.m_xScrollBox;
	var xD=xNewBox.MakeEl();
	xD.className="chatpnl";
	pit_SetIH(xD,"");
	var i,iC=this.m_asIgnoreList.length;
	var hThis=this.m_hHnd;
	for(i=0;i<iC;i++)
	{
		var sIgnore=this.m_asIgnoreList[i];
		var xS=document.createElement("a");
		xS.className="chatbtn";
		xS.style.color=this.m_sRoomListTextColor;
		xS.href="javascript:/**/";
		xS.onmouseup=function(sR){
			return function(){
				var xThis=g_xPitBoxes.GetBox(hThis);
				if(xThis){xThis.SendChatCommand("/unignore "+sR);};
			}}(sIgnore);
		pit_SetIH(xS,this.EscapeText(sIgnore));
		xD.appendChild(xS);
		xD.appendChild(document.createElement("br"));
	};
	xNewBox.SetAutoHeight();
	this.m_xOutput.SetScrollPos(0,true);
	this.m_xOutput.RefreshAttributes();
};

PitPTOCtrlChat.prototype.FindRoom=function(p_sRoom)
{
	var i,iC=this.m_axRooms.length;
	for(i=0;i<iC;i++)
	{
		if(this.m_axRooms[i].m_sName==p_sRoom){return i;};
	};
	return -1;
};

PitPTOCtrlChat.prototype.CreateRoomTab=function(p_sRoom)
{
	var iIdx=this.FindRoom(p_sRoom);
	if(iIdx!=-1){return;};
	var xR=new Object();
	xR.m_sName=p_sRoom;
	xR.m_axLines=new Array();
	xR.m_iLastTime=0;
	xR.m_iVersion=-1;
	this.m_axRooms.push(xR);
	this.m_xSubsTab.AddSingleTab(p_sRoom);
	this.m_xSubsTab.MoveTab("@");
	this.m_xSubsTab.SetActiveTab(p_sRoom);
	this.ScheduleUpdate(100);
};

PitPTOCtrlChat.prototype.CloseRoom=function(p_sRoom)
{
	var iIdx=this.FindRoom(p_sRoom);
	if(iIdx==-1){return;};
	this.m_xSubsTab.CloseTab(p_sRoom);
	this.m_axRooms.splice(iIdx,1);
	var xRPC=new PitRPC();
	xRPC.SetURL(this.m_sRPCURL);
	xRPC.SetFunction("chat");
	xRPC.SetParams("room",this.m_xSubsTab.GetActiveTab());
	xRPC.SetParams("cmd","/leave \"#"+p_sRoom+"\"");
	xRPC.SetParams("time","0");
	xRPC.SetComplex(false);
	xRPC.Send();
};

PitPTOCtrlChat.prototype.GotoRoom=function(p_sRoom)
{
	if((!this.m_sRPCURL)||(this.m_sRPCURL.length==0)){return;};
	if(this.FindRoom(p_sRoom)==-1)
	{
		this.JoinRoom(p_sRoom);
		return;
	};
};

PitPTOCtrlChat.prototype.JoinRoom=function(p_sRoom)
{
	if((!this.m_sRPCURL)||(this.m_sRPCURL.length==0)){return;};
	var xRPC=new PitRPC();
	xRPC.SetURL(this.m_sRPCURL);
	xRPC.SetFunction("chat");
	xRPC.SetParams("room",this.m_xSubsTab.GetActiveTab());
	xRPC.SetParams("cmd","/join \"#"+p_sRoom+"\"");
	xRPC.SetParams("time","0");
	xRPC.SetComplex(true);
	xRPC.m_bQuiet=true;
	var hThis=this.m_hHnd;
	xRPC.OnSucceed=function(){
		var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.DoneChatCommand(xRPC);};
	};
	xRPC.OnFail=function(){
	};
	xRPC.Send();
};

PitPTOCtrlChat.prototype.DoneChatCommand=function(p_xRPC)
{
	var xD=p_xRPC.m_xResults;
	if(!xD)
	{
		pit_Log("JSON-Error:",p_xRPC.m_sResultText);
		return;
	};
//	pit_Log("Done: ",p_xRPC.m_sResultText);
	if(xD.cmd=="/join")
	{
		var i,iC=xD.count;
		for(i=0;i<iC;i++)
		{
			if(xD["E_"+i].status=="ok")
			{
				this.CreateRoomTab(xD["E_"+i].room);
			};
		};
	};
	if(xD.cmd=="/ignore"||xD.cmd=="/unignore"||xD.cmd=="/ignored")
	{
		if(xD.ign)
		{
			this.m_asIgnoreList=xD.ign;
			if(this.m_xSubsTab.GetActiveTab()=="@i")
			{
				this.UpdateIgnoreListDisplay();
			};
		};
	};
	if(xD.cmd=="/ignored")
	{
		if(this.m_xSubsTab.FindTab("@i")==-1)
		{
			this.m_xSubsTab.AddSingleTab("@i",0,false,"Ignore");
		};
	};
};

PitPTOCtrlChat.prototype.SendChatCommand=function(p_sCmd)
{
	if((!this.m_sRPCURL)||(this.m_sRPCURL.length==0)){return;};
	
	if(this.m_xSubsTab.GetActiveTab()=="@i")
	{
		if(p_sCmd.slice(0,1)!="/") {p_sCmd="/ignore "+p_sCmd;};
	};
	
	var xRPC=new PitRPC();
	xRPC.SetURL(this.m_sRPCURL);
	xRPC.SetFunction("chat");
	xRPC.SetParams("room",this.m_xSubsTab.GetActiveTab());
	xRPC.SetParams("cmd",p_sCmd);
	xRPC.SetParams("time","0");
	xRPC.m_sCmd="/?";
	xRPC.m_bQuiet=true;
	xRPC.SetComplex(true);
	var hThis=this.m_hHnd;
	xRPC.OnSucceed=function(){
		var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.DoneChatCommand(xRPC);};
	};
	xRPC.OnFail=function(){
	};
	xRPC.Send();
	this.m_iChatUpdateTime=2000;
	this.ScheduleUpdate(100);
};


PitPTOCtrlChat.prototype.OpenChat=function(p_sURL,p_sAutoRoom)
{
	this.m_sAutoRoom=p_sAutoRoom;
	this.m_axRooms=new Array();
	this.m_xSubsTab.CloseAllTabs();
	this.m_xSubsTab.AddSingleTab("@",0,true,"Rooms");
	this.m_xSubsTab.SetActiveTab("@");
	this.m_sRPCURL=p_sURL;
	this.ScheduleUpdate(100);
//	this.SendChatCommand("/list",true,"roomlist");
//	this.SwitchTab("Rooms");
};


////
////
//// mailer
////
////


function PitPTOCtrlMessaging(p_iX,p_iY,p_iW,p_iH,p_sTitle)
{
	PitPTOCtrlMessaging.BaseCtor.call(this,p_iX,p_iY,p_iW,p_iH,p_sTitle);
	this.m_sTagName="div";
	if(!p_iX){p_iX=0;};
	if(!p_iY){p_iY=0;};
	if(!p_iW){p_iW=100;};
	if(!p_iH){p_iH=100;};
	this.m_iX=p_iX;
	this.m_iY=p_iY;
	this.m_iW=p_iW;
	this.m_iH=p_iH;
	this.m_iTimer=-1;

//	this.AddTopLevelBehaviour(true,true);
	
	this.m_xSubsTab=null;
	this.m_iCurMode=0;		// 0=new, 1=inbox, 2=archive, 3=sent, 4=readmsg, 5=writemsg
	this.m_iNextTabID=1;
	this.m_sCurSubSys="";

//	pit_Log("Style ",this.m_xStyleDef.ToJSONString());

	this.m_xStyleDef.TabStyle="tabSimple";
	this.m_xStyleDef.ScrollStyle="scrSimple";
	this.m_xStyleDef.FontSize=12;
	this.m_xStyleDef.MsgListEvenBG="#ffffff";
	this.m_xStyleDef.MsgListOddBG="#f8f8f8";
	this.m_xStyleDef.MsgListHoverBG="#f0f0f0";
	this.m_xStyleDef.MsgListSelBG="#e0e0ff";
	
	this.AddStyles(g_xPitStyleDef.PitPTOCtrlMessaging);
	
	this.m_xRPCQueue=new PitRPCQueue();
	this.m_sRPCURL="/message.xrq";
	
	this.m_axTabs=new Array();
	this.m_asSubSystems=new Array();
	
	this.m_iLastClickedMsgID=0;
	
	this.UpdateSubSysList();
};

Inherit(PitPTOCtrlMessaging,PitCtrlTopLevel,"PitPTOCtrlMessaging");

PitPTOCtrlMessaging.prototype.Destruct=function()
{
	this.m_xRPCQueue.Clear();
	if(this.m_iTimer!=-1)
	{
		window.clearTimeout(this.m_iTimer);
	};
	pit_Purge(this.m_axTabs);
	pit_Purge(this.m_asSubSystems);
	PitPTOCtrlMessaging.Super.Destruct.call(this);
};

PitPTOCtrlMessaging.prototype.NewMailTo=function(p_sTo,p_sSubject)
{
	var xNewTabID=this.CreateNewTab(p_sSubject,5,0);
	var iTabIdx=this.FindTabByID(xNewTabID);
	if(iTabIdx==-1){return;};
	var xNewTab=this.m_axTabs[iTabIdx];
	xNewTab.m_xB.m_xEditTo.MakeEl().value=p_sTo;
	xNewTab.m_xB.m_xEditSubject.MakeEl().value=p_sSubject;
	this.m_xSubsTab.SetActiveTab(xNewTabID);
//	this.SwitchTab(xNewTabID);
}

PitPTOCtrlMessaging.prototype.CreateNewTab=function(p_sTitle,p_iMode,p_iMsgID,p_sFolder)
{
	var xTab={};
	xTab.m_sTitle=p_sTitle;
	if(p_sFolder)
	{
		xTab.m_sFromFolder=p_sFolder;
	}
	else
	{
		xTab.m_sFromFolder=p_sTitle;
	};
	if(p_iMode<4)
	{
		var xOld=this.GetActiveTab();
		if(xOld)
		{
			xTab.m_sFromFolder=xTab.m_sFromFolder;
		};
	};
	xTab.m_iID=this.m_iNextTabID;
	this.m_iNextTabID++;
	xTab.m_iMode=p_iMode;
	xTab.m_iMsgID=0;
	if(p_iMsgID)
	{
		xTab.m_iMsgID=p_iMsgID;
	};
	this.m_xSubsTab.AddSingleTab(xTab.m_iID,0,p_iMode<4,p_sTitle);
//	this.m_axTabs.m_xB=new PitBox(0+xTab.m_iID*20,0,100,100);
//	xTab.m_xB=new PitCtrlStatic(20,40,400,400,p_sTitle+" "+xTab.m_iID);
	xTab.m_xB=new PitCtrlPanel(10,50,400,400);
	this.AddChild(xTab.m_xB);
	xTab.m_xB.SetVisible(false);
	xTab.m_xB.MakeEl().style.fontSize=this.m_xStyleDef.FontSize+"px";
	var iFS=this.m_xStyleDef.FontSize;
	var iFD=this.m_xStyleDef.FontSize+4;
	var xThis=this;
	if((p_iMode==1)||(p_iMode==2)||(p_iMode==3))
	{
		xTab.m_xB.m_xStatListScroll=new PitCtrlScrollPanel(this.m_xStyleDef.ScrollStyle,10,60,200,200,"",0,"",1);
		xTab.m_xB.m_xBtnRead=new PitCtrlGfxButton(10,10,10,10,"Read",this.m_xStyleDef.BtnStyle);
//		xTab.m_xB.m_xBtnReply=new PitCtrlGfxButton(10,10,10,10,"Reply",this.m_xStyleDef.BtnStyle);
		xTab.m_xB.m_xBtnArchive=new PitCtrlGfxButton(10,10,10,10,"Archive",this.m_xStyleDef.BtnStyle);
		xTab.m_xB.m_xBtnDelete=new PitCtrlGfxButton(10,10,10,10,"Delete",this.m_xStyleDef.BtnStyle);
		xTab.m_xB.m_xStatList=new PitCtrlStatic(80,40,140,20,"???");
		xTab.m_xB.m_xBtnDelAll=new PitCtrlGfxButton(10,10,80,10,"Delete&nbsp;All",this.m_xStyleDef.BtnStyle);
		xTab.m_xB.m_xStatListScroll.AddChild(xTab.m_xB.m_xStatList);
		xTab.m_xB.AddChild(xTab.m_xB.m_xStatListScroll);
//		xTab.m_xB.AddChild(xTab.m_xB.m_xBtnReply);
		xTab.m_xB.AddChild(xTab.m_xB.m_xBtnArchive);
		xTab.m_xB.AddChild(xTab.m_xB.m_xBtnDelete);
		xTab.m_xB.AddChild(xTab.m_xB.m_xBtnRead);
		xTab.m_xB.AddChild(xTab.m_xB.m_xBtnDelAll);
		xTab.m_xB.m_xBtnDelete.SetCmdID(1);
		xTab.m_xB.m_xBtnDelete.OnCmd=function()
		{
			xThis.TryMsgDel(xTab);
		};
		xTab.m_xB.m_xBtnArchive.SetCmdID(1);
		if(p_iMode==2)
		{
			xTab.m_xB.m_xBtnArchive.OnCmd=function()
			{
				xThis.TryMsgMove(xTab,"Inbox");
			};
		}
		else
		{
			xTab.m_xB.m_xBtnArchive.OnCmd=function()
			{
				xThis.TryMsgMove(xTab,"Archive");
			};
		};
		xTab.m_xB.m_xBtnDelAll.SetCmdID(1);
		xTab.m_xB.m_xBtnDelAll.OnCmd=function()
		{
			var xMenu=new PitPopupMenu();
			xMenu.AddItem("Ok");
			xMenu.Show(this.GetParent().GetEl(),85,this.m_iY);
			xMenu.OnOK=function(p_iID){
				xThis.TryMsgDelAll(xTab);
			};
		};
		
		xTab.m_xB.m_xBtnRead.SetCmdID(1);
		xTab.m_xB.m_xBtnRead.OnCmd=function()
		{
			xThis.MarkRead(xTab);
		};
		xTab.m_xB.m_xStatListScroll.MakeEl().style.background=this.m_xStyleDef.TextBG;
		xTab.m_axMsgSel=new Array();
		xTab.m_axMsgs=new Array();
		xTab.m_sTitle=p_sTitle;
	}
	else if(p_iMode==4)
	{
		xTab.m_xB.AddChild(new PitCtrlStatic(0,0,70,iFD,"From:"));
		xTab.m_xB.AddChild(new PitCtrlStatic(0,iFD+2,80,iFD,"Subject:"));
		xTab.m_xB.m_xStatFrom=new PitCtrlStatic(80,0,140,this.m_xStyleDef.FontSize+2,"???");
		xTab.m_xB.m_xStatSubject=new PitCtrlStatic(80,20,140,this.m_xStyleDef.FontSize+2,"???");
//		xTab.m_xB.m_xStatText=new PitCtrlStatic(80,40,140,20,"???");
		xTab.m_xB.m_xStatText=new PitCtrlBBCode(80,40,140,20,"???");
		xTab.m_xB.m_xBtnReply=new PitCtrlGfxButton(10,10,10,10,"Reply",this.m_xStyleDef.BtnStyle);
		xTab.m_xB.m_xBtnArchive=new PitCtrlGfxButton(10,10,10,10,"Archive",this.m_xStyleDef.BtnStyle);
		xTab.m_xB.m_xBtnDelete=new PitCtrlGfxButton(10,10,10,10,"Delete",this.m_xStyleDef.BtnStyle);
		xTab.m_xB.m_xBtnClose=new PitCtrlGfxButton(10,10,10,10,"Close",this.m_xStyleDef.BtnStyle);
		xTab.m_xB.AddChild(xTab.m_xB.m_xStatFrom);
		xTab.m_xB.AddChild(xTab.m_xB.m_xStatSubject);
		xTab.m_xB.AddChild(xTab.m_xB.m_xStatText);
		xTab.m_xB.AddChild(xTab.m_xB.m_xBtnReply);
		xTab.m_xB.AddChild(xTab.m_xB.m_xBtnArchive);
		xTab.m_xB.AddChild(xTab.m_xB.m_xBtnDelete);
		xTab.m_xB.AddChild(xTab.m_xB.m_xBtnClose);
		xTab.m_xB.m_xStatFrom.MakeEl().style.background=this.m_xStyleDef.TextBG;
		xTab.m_xB.m_xStatSubject.MakeEl().style.background=this.m_xStyleDef.TextBG;
		xTab.m_xB.m_xStatText.MakeEl().style.background=this.m_xStyleDef.TextBG;
		xTab.m_xB.m_xStatText.MakeEl().style.color=this.m_xStyleDef.TextColor;
		xTab.m_xB.m_xStatFrom.MakeEl().style.color=this.m_xStyleDef.TextColor;
		xTab.m_xB.m_xStatSubject.MakeEl().style.color=this.m_xStyleDef.TextColor;

		xTab.m_xB.m_xBtnClose.SetCmdID(1);
		xTab.m_xB.m_xBtnClose.OnCmd=function()
		{
			xThis.m_xSubsTab.SetActiveTab(2);
			xThis.m_xSubsTab.CloseTab(xTab.m_iID);
		};
		xTab.m_xB.m_xBtnDelete.SetCmdID(1);
		xTab.m_xB.m_xBtnDelete.OnCmd=function()
		{
			xThis.TryMsgDel(xTab);
			xThis.m_xSubsTab.SetActiveTab(2);
			xThis.m_xSubsTab.CloseTab(xTab.m_iID);
		};
		xTab.m_xB.m_xBtnArchive.SetCmdID(1);
		xTab.m_xB.m_xBtnArchive.OnCmd=function()
		{
			xThis.TryMsgMove(xTab,"Archive");
			xThis.m_xSubsTab.CloseTab(xTab.m_iID);
		};
		xTab.m_xB.m_xBtnReply.SetCmdID(1);
		xTab.m_xB.m_xBtnReply.OnCmd=function()
		{
			var xNew=xThis.MsgReply(xTab);
			xThis.m_xSubsTab.CloseTab(xTab.m_iID);
			xThis.SwitchTab(xNew);
		};
//		xTab.m_xB.m_xStatText.MakeEl().innerHTML="";
	}
	else if(p_iMode==5)
	{
		xTab.m_xB.AddChild(new PitCtrlStatic(0,0,40,iFD,"To:"));
		xTab.m_xB.AddChild(new PitCtrlStatic(0,20,80,iFD,"Subject:"));
		xTab.m_xB.AddChild(new PitCtrlStatic(0,40,40,iFD,"Text:"));
		xTab.m_xB.m_xEditTo=new PitCtrlEdit(80,0,140,this.m_xStyleDef.FontSize+2);
		xTab.m_xB.m_xEditSubject=new PitCtrlEdit(80,20,140,this.m_xStyleDef.FontSize+2);
		xTab.m_xB.m_xEditText=new PitCtrlEdit(80,40,140,200,false,true,false);
		xTab.m_xB.m_xBtnSend=new PitCtrlGfxButton(10,10,10,10,"Send",this.m_xStyleDef.BtnStyle);
		xTab.m_xB.m_xBtnClose=new PitCtrlGfxButton(10,10,10,10,"Close",this.m_xStyleDef.BtnStyle);
		xTab.m_xB.m_xStatResult=new PitCtrlStatic(80,0,140,this.m_xStyleDef.FontSize+2,"");
		xTab.m_xB.AddChild(xTab.m_xB.m_xEditTo);
		xTab.m_xB.AddChild(xTab.m_xB.m_xEditSubject);
		xTab.m_xB.AddChild(xTab.m_xB.m_xEditText);
		xTab.m_xB.AddChild(xTab.m_xB.m_xBtnSend);
		xTab.m_xB.AddChild(xTab.m_xB.m_xBtnClose);
		xTab.m_xB.AddChild(xTab.m_xB.m_xStatResult);
		xTab.m_xB.m_xBtnClose.SetCmdID(1);
		xTab.m_xB.m_xBtnClose.OnCmd=function()
		{
			xThis.m_xSubsTab.SetActiveTab(2);
			xThis.m_xSubsTab.CloseTab(xTab.m_iID);
		};
		xTab.m_xB.m_xBtnSend.SetCmdID(1);
		xTab.m_xB.m_xBtnSend.OnCmd=function()
		{
			xThis.TrySendMsg(xTab)
		};
		xTab.m_xB.m_xEditTo.MakeEl().style.fontSize=this.m_xStyleDef.FontSize+"px";
		xTab.m_xB.m_xEditSubject.MakeEl().style.fontSize=this.m_xStyleDef.FontSize+"px";
		xTab.m_xB.m_xEditText.MakeEl().style.fontSize=this.m_xStyleDef.FontSize+"px";

		xTab.m_xB.m_xEditText.MakeEl().style.background=this.m_xStyleDef.TextBG;
		xTab.m_xB.m_xEditText.MakeEl().style.color=this.m_xStyleDef.TextColor;
		xTab.m_xB.m_xEditTo.MakeEl().style.background=this.m_xStyleDef.TextBG;
		xTab.m_xB.m_xEditTo.MakeEl().style.color=this.m_xStyleDef.TextColor;
		xTab.m_xB.m_xEditSubject.MakeEl().style.background=this.m_xStyleDef.TextBG;
		xTab.m_xB.m_xEditSubject.MakeEl().style.color=this.m_xStyleDef.TextColor;

		xTab.m_xB.m_xStatResult.MakeEl().style.fontSize=this.m_xStyleDef.FontSize+"px";
		xTab.m_xB.m_xStatResult.MakeEl().style.color="#ff0000";
		xTab.m_xB.m_xStatResult.MakeEl().style.fontWeight="bold";
	};
	this.m_axTabs.push(xTab);
	return xTab.m_iID;
};

PitPTOCtrlMessaging.prototype.SetSubsystem=function(p_sSubsys)
{
	this.m_sCurSubSys=p_sSubsys;
};

PitPTOCtrlMessaging.prototype.TryMsgDelAll=function(p_xTab)
{
	var sL="";
	var sFolder;
	if(p_xTab.m_axMsgs)
	{
		sFolder=p_xTab.m_sFromFolder;
		var i,iC=p_xTab.m_axMsgs.length;
		for(i=0;i<iC;i++)
		{
			sL+=p_xTab.m_axMsgs[i].ID+",";
		};
	}
	else
	{
		sL+=p_xTab.m_iMsgID;
		sFolder=p_xTab.m_sFromFolder;
	};
	var xThis=this;
	var xRPC=new PitRPC();
	xRPC.SetURL(this.m_sRPCURL);
	xRPC.SetFunction("DeleteMessages");
	xRPC.SetParams("MessageIDs",sL);
	xRPC.SetParams("Folder",sFolder);
	xRPC.SetComplex(true);
	xRPC.OnSucceed=function(){
		p_xTab.m_axMsgSel=[];
		xThis.UpdateInbox(p_xTab.m_sFromFolder);
//		pit_Log("OK:",xRPC.m_sResultText);
	};
	xRPC.OnFail=function(){
		pit_Log("Fail:",xRPC.m_sResultText);
	};
	
	this.m_xRPCQueue.Add(xRPC);
};

PitPTOCtrlMessaging.prototype.TryMsgDel=function(p_xTab)
{
	var sL="";
	var sFolder;
	if(p_xTab.m_axMsgs)
	{
		sFolder=p_xTab.m_sFromFolder;
		var i,iC=p_xTab.m_axMsgs.length;
		for(i=0;i<iC;i++)
		{
			if(p_xTab.m_axMsgSel.indexOf(p_xTab.m_axMsgs[i].ID)!=-1)
			{
				sL+=p_xTab.m_axMsgs[i].ID+",";
			};
		};
	}
	else
	{
		sL+=p_xTab.m_iMsgID;
		sFolder=p_xTab.m_sFromFolder;
	};
	var xThis=this;
	var xRPC=new PitRPC();
	xRPC.SetURL(this.m_sRPCURL);
	xRPC.SetFunction("DeleteMessages");
	xRPC.SetParams("MessageIDs",sL);
	xRPC.SetParams("Folder",sFolder);
	xRPC.SetComplex(true);
	xRPC.OnSucceed=function(){
		p_xTab.m_axMsgSel=[];
		xThis.UpdateInbox(p_xTab.m_sFromFolder);
//		pit_Log("OK:",xRPC.m_sResultText);
	};
	xRPC.OnFail=function(){
		pit_Log("Fail:",xRPC.m_sResultText);
	};
	this.m_xRPCQueue.Add(xRPC);
};

PitPTOCtrlMessaging.prototype.TryMsgMove=function(p_xTab,p_sFolder)
{
	var sL="";
	var sFolder;
	if(p_xTab.m_axMsgs)
	{
		sFolder=p_xTab.m_sFromFolder;
		var i,iC=p_xTab.m_axMsgs.length;
		for(i=0;i<iC;i++)
		{
			if(p_xTab.m_axMsgSel.indexOf(p_xTab.m_axMsgs[i].ID)!=-1)
			{
				sL+=p_xTab.m_axMsgs[i].ID+",";
			};
		};
	}
	else
	{
		sL+=p_xTab.m_iMsgID;
		sFolder=p_xTab.m_sFromFolder;
	};
	var xThis=this;
	var xRPC=new PitRPC();
	xRPC.SetURL(this.m_sRPCURL);
	xRPC.SetFunction("MoveMessages");
	xRPC.SetParams("MessageIDs",sL);
	xRPC.SetParams("FromFolder",sFolder);
	xRPC.SetParams("ToFolder",p_sFolder);
	xRPC.SetComplex(true);
	xRPC.OnSucceed=function(){
		p_xTab.m_axMsgSel=[];
		xThis.UpdateInbox(p_xTab.m_sFromFolder);
//		pit_Log("OK:",xRPC.m_sResultText);
	};
	xRPC.OnFail=function(){
		pit_Log("Fail:",xRPC.m_sResultText);
	};
	this.m_xRPCQueue.Add(xRPC);
};

PitPTOCtrlMessaging.prototype.MsgToFilter=function(p_sTo)
{
	return p_sTo;
};

PitPTOCtrlMessaging.prototype.TrySendMsg=function(p_xTab)
{
	var xThis=this;
	var xRPC=new PitRPC();
	xRPC.SetURL(this.m_sRPCURL);
	xRPC.SetFunction("PostMessage");
	//xRPC.m_bNoJSONResult=true;
	xRPC.SetParams("SubSystem",this.m_sCurSubSys);
	xRPC.SetParams("To",this.MsgToFilter(p_xTab.m_xB.m_xEditTo.GetEl().value));
	xRPC.SetParams("Subject",p_xTab.m_xB.m_xEditSubject.GetEl().value);
	xRPC.SetParams("Text",p_xTab.m_xB.m_xEditText.GetEl().value);
	if(this.m_sStdSendFolder)
	{
		xRPC.SetParams("Folder",this.m_sStdSendFolder);
	}
	xRPC.SetComplex(true);
	xRPC.OnSucceed=function(){
		var xD=xRPC.m_xResults;
		
		if(!xD)
		{
			p_xTab.m_xB.m_xStatResult.SetText("Error: network");
		}
		else
		{
			if(xD.status=="ok")
			{
				p_xTab.m_xB.m_xStatResult.SetText("ok");
			}
			else
			{
				p_xTab.m_xB.m_xStatResult.SetText(xD.Error);
			};
		};

		xThis.UpdateInbox("Inbox");
		xThis.UpdateInbox("Sent");
		if(xD.status=="ok")
		{
			xThis.m_xSubsTab.SetActiveTab(2);
			xThis.m_xSubsTab.CloseTab(p_xTab.m_iID);
		};
	};
	xRPC.OnFail=function(){
//		pit_Log("Fail:",xRPC.m_sResultText);
		p_xTab.m_xB.m_xStatResult.SetText(xRPC.m_iStatus+":"+xRPC.m_sResultText);
	};
	this.m_xRPCQueue.Add(xRPC);
};

PitPTOCtrlMessaging.prototype.LocalizeMessageContent=function(p_xContent, p_sFrom)
{
	if(!p_xContent) {return;};
	if(typeof(p_xContent)=="object")
	{
		if(p_xContent.length)
		{
			var i,iC=p_xContent.length;
			for(i=0;i<iC;i++)
			{
				var sRet=this.LocalizeMessageContent(p_xContent[i], p_sFrom);
				if(sRet!=null) {p_xContent[i]=sRet;}; //no call by ref
			};
		}
		else
		{
			if(p_xContent.content) {this.LocalizeMessageContent(p_xContent.content,p_sFrom);};
		};
		return null;
	};
	
	var bFound=false;

	if(p_sFrom=="Administrator"&&p_xContent.match(/%username%/))
	{
		p_xContent=p_xContent.replace(/%username%/g,g_sCurUser);
		bFound=true;
	};

	while(true)
	{
		var sTxtTmp;
		var sTxt=p_xContent.match(/\uA025ptomsg_.+\uA025/);
		
		if(!sTxt) {break;};sTxt=String(sTxt);
		bFound=true;
		sTxt=sTxt.slice(1,sTxt.length-1);
		var sArgs=sTxt.match(/\uA125.+/);
		if(sArgs) {sTxt=sTxt.slice(0,sTxt.search(/\uA125/));};
		sTxt=g_L[sTxt];if(!sTxt) {sTxt="";};
		var sTxt = sTxt.split("<br>")
		var xBr={};
		for(var i=0;i<sTxt.length;i++)
		{
			if(sTxt[i]=="")
			{
				xBr.type = "br";
				sTxt[i]=xBr;
			}
		}
		if(sArgs)
		{
			var axArgs=String(sArgs).split("\uA125")
			
			for(var i=1;i<axArgs.length;i++)
			{
				var sStr = "%"+(i);
				var xPat = RegExp(sStr);
				if(typeof(sTxt)=="object")
				{
					for(var j=0;j<sTxt.length;j++)
					{
						if(typeof(sTxt[j])=="object"){continue;}
						var sTxtTmp=String(sTxt[j]);
						while(sTxtTmp.match(xPat))
						{
							sTxtTmp=sTxtTmp.replace(xPat,axArgs[i]);
						}
						sTxt[j] = sTxtTmp;
					}
				}
				else
				{
					while(sTxt.match(xPat))
					{
						sTxt=sTxt.replace(xPat,axArgs[i]);
					}
				}
			};
		};
		if(typeof(sTxt)=="object")
		{
			return sTxt;
		}
		else
		{
			p_xContent=p_xContent.replace(/\uA025ptomsg_.+\uA025/,sTxt);
		}
	};
	return bFound?p_xContent:null;
};

PitPTOCtrlMessaging.prototype.UpdateMessageContent=function(p_xRPC,p_xTabID)
{
	var xData=p_xRPC.m_xResults;
	if(!xData){return;};
	if((!xData.status)||(xData.status!="ok")){return;};
	var iTabIdx=this.FindTabByID(p_xTabID);
	if(iTabIdx==-1){
//		pit_Log("no such tab ",p_xTabID);
		return;};
	
	this.LocalizeMessageContent(xData.Content,xData.From);

	this.m_xSubsTab.SetActiveTab(p_xTabID);
	var xTab=this.m_axTabs[iTabIdx];
	pit_SetIH(xTab.m_xB.m_xStatFrom.MakeEl(),xData.From);
	pit_SetIH(xTab.m_xB.m_xStatSubject.MakeEl(),xData.Title);
	xTab.m_xB.m_xStatText.SetBBCode(xData.Content);
	xTab.m_xB.m_xStatText.SetAutoHeight();
	//xTab.m_xB.m_xStatText.UpdateRect();
	xTab.m_xMsgSrc=xData.Content;
	this.UpdateLayout();
};

PitPTOCtrlMessaging.prototype.MsgReply=function(p_xTab)
{
	var sFrom=p_xTab.m_xB.m_xStatFrom.GetEl().innerHTML;
	var xMsgSrc=p_xTab.m_xMsgSrc;
	var sTitle=p_xTab.m_xB.m_xStatSubject.GetEl().innerHTML;
	if(!xMsgSrc){return;};
	if(sTitle.substr(0,3)!="Re:"){sTitle="Re: "+sTitle;};
	var xNewTabID=this.CreateNewTab(sTitle,5,0);
	var iTabIdx=this.FindTabByID(xNewTabID);
	if(iTabIdx==-1){return;};
	var xNewTab=this.m_axTabs[iTabIdx];
	xNewTab.m_xB.m_xEditTo.MakeEl().value=sFrom;
	xNewTab.m_xB.m_xEditSubject.MakeEl().value=sTitle;
	var xMsgText = xNewTab.m_xB.m_xEditText.MakeEl();
	xMsgText.value="\n\n------------------------\n";
	for(var i=0;i<xMsgSrc.length;i++)
	{
		if(xMsgSrc[i].type=="br")
		{
			xMsgText.value+="\n";
		}
		else
		{
			xMsgText.value+=xMsgSrc[i];
		}
	}
	this.SwitchTab(xNewTabID);
	return xNewTabID;
	
};

PitPTOCtrlMessaging.prototype.MarkRead=function(p_xTab)
{
	var sL="";
	var sFolder;
	if(p_xTab.m_axMsgs)
	{
		sFolder=p_xTab.m_sFromFolder;
		var i,iC=p_xTab.m_axMsgs.length;
		for(i=0;i<iC;i++)
		{
			if(p_xTab.m_axMsgSel.indexOf(p_xTab.m_axMsgs[i].ID)!=-1)
			{
				sL+=p_xTab.m_axMsgs[i].ID+",";
			};
		};
	}
	else
	{
		sL+=p_xTab.m_iMsgID;
		sFolder=p_xTab.m_sFromFolder;
	};
	var xThis=this;
	var xRPC=new PitRPC();
	xRPC.SetURL(this.m_sRPCURL);
	xRPC.SetFunction("MarkRead");
	xRPC.SetParams("MessageIDs",sL);
	xRPC.SetParams("Folder",sFolder);
	xRPC.SetComplex(true);
	xRPC.OnSucceed=function(){
		xThis.UpdateInbox(p_xTab.m_sFromFolder);
//		pit_Log("OK:",xRPC.m_sResultText);
	};
	xRPC.OnFail=function(){
		pit_Log("Fail:",xRPC.m_sResultText);
	};
	this.m_xRPCQueue.Add(xRPC);
};

PitPTOCtrlMessaging.prototype.ShowMessage=function(p_xMsgID,p_sTitle)
{
	if(p_sTitle.length>20) {p_sTitle=p_sTitle.substr(0,18)+"...";};
	var xTabID=this.CreateNewTab(p_sTitle,4,p_xMsgID);
	var xThis=this;
	var xRPC=new PitRPC();
	xRPC.SetURL(this.m_sRPCURL);
	xRPC.SetFunction("RenderMessage");
	xRPC.SetParams("MessageID",p_xMsgID);
	xRPC.SetComplex(false);
	xRPC.OnSucceed=function(){
		xThis.UpdateMessageContent(xRPC,xTabID);
//		pit_Log("OK:",xRPC.m_sResultText);
	};
	xRPC.OnFail=function(){
		pit_Log("Fail:",xRPC.m_sResultText);
	};
	this.m_xRPCQueue.Add(xRPC);
};

PitPTOCtrlMessaging.prototype.UpdateSubSysList=function()
{
	var xThis=this;
	var xRPC=new PitRPC();
	xRPC.SetURL(this.m_sRPCURL);
	xRPC.SetFunction("ListSubSystems");
	xRPC.SetComplex(false);
	xRPC.OnSucceed=function(){
		var xD=xRPC.m_xResults;
		if((xD)&&(xD.status=="ok"))
		{
			//pit_Log("ok ",xD.EntryCount);
			xThis.m_asSubSystems=new Array();
			var i,iC;
			iC=xD.EntryCount;
			for(i=0;i<iC;i++)
			{
//				pit_Log(xD["E_"+i]);
				xThis.m_asSubSystems.push(xD["E_"+i]);
			};
		};
//		pit_Log("OK:",xRPC.m_sResultText);
	};
	xRPC.OnFail=function(){
		pit_Log("Fail:",xRPC.m_sResultText);
	};
	this.m_xRPCQueue.Add(xRPC);
};

PitPTOCtrlMessaging.prototype.FindMsgIndexByID=function(p_xTab,p_xMsgID)
{
	var i,iC=p_xTab.m_axMsgs.length;
	for(i=0;i<iC;i++)
	{
		if(p_xTab.m_axMsgs[i].ID==p_xMsgID){return i;};
	};
	return -1;
};

PitPTOCtrlMessaging.prototype.MessageSelOn=function(p_xTab,p_xMsgID)
{
	var sRowElID="msglst_"+p_xTab.m_iID+"_"+p_xMsgID;
	var iSelIdx=p_xTab.m_axMsgSel.indexOf(p_xMsgID);
	if(iSelIdx==-1)
	{
		p_xTab.m_axMsgSel.push(p_xMsgID);
	};
	var xEl=document.getElementById(sRowElID);
	if(xEl)
	{
		xEl.style.backgroundColor=this.m_xStyleDef.MsgListSelBG;
	};
};

PitPTOCtrlMessaging.prototype.MessageSelOff=function(p_xTab,p_xMsgID)
{
	var sRowElID="msglst_"+p_xTab.m_iID+"_"+p_xMsgID;
	var iSelIdx=p_xTab.m_axMsgSel.indexOf(p_xMsgID);
	if(iSelIdx!=-1)
	{
		p_xTab.m_axMsgSel.splice(iSelIdx,1);
	};
	var xEl=document.getElementById(sRowElID);
	if(xEl)
	{
		xEl.style.backgroundColor=xEl.orgbgcolor;
	};
};

PitPTOCtrlMessaging.prototype.ToggleMessageSel=function(p_sElID,p_xTab,p_xMsgID,p_xE)
{
	if(!p_xE){var p_xE=window.event;};
//	pit_Log("Toggle ",p_sElID," ",p_xTab.m_sTitle," ",p_xMsgID);
	if(p_xE.shiftKey===true)
	{
		var iStart=this.FindMsgIndexByID(p_xTab,p_xMsgID);
		var iEnd=this.FindMsgIndexByID(p_xTab,this.m_iLastClickedMsgID);
		if(iEnd==-1)
		{
			this.MessageSelOn(p_xTab,p_xMsgID);
		}
		else
		{
			var i;
			if(iStart>iEnd)
			{
				i=iStart;iStart=iEnd;iEnd=i;
			};
			while(p_xTab.m_axMsgSel.length>0)
			{
				this.MessageSelOff(p_xTab,p_xTab.m_axMsgSel[0]);
			};
			for(i=iStart;i<=iEnd;i++)
			{
				this.MessageSelOn(p_xTab,p_xTab.m_axMsgs[i].ID);
			};
		};
	}
	else if(p_xE.ctrlKey===true)
	{
		if(p_xTab.m_axMsgSel.indexOf(p_xMsgID)==-1)
		{
			this.MessageSelOn(p_xTab,p_xMsgID);
		}
		else
		{
			this.MessageSelOff(p_xTab,p_xMsgID);
		};
	}
	else
	{
		while(p_xTab.m_axMsgSel.length>0)
		{
			this.MessageSelOff(p_xTab,p_xTab.m_axMsgSel[0]);
		};
		this.MessageSelOn(p_xTab,p_xMsgID);
		this.m_iLastClickedMsgID=p_xMsgID;
	};
	pit_ClearSelection();
//	this.GetEl().firstChild.select();
//	alert("Sel: "+p_xMsgID);
};

PitPTOCtrlMessaging.prototype.RefreshFolderMsgList=function(p_xRPC,p_sFolder)
{
	var iTabIdx=this.FindFolderTab(p_sFolder);
	if(iTabIdx==-1){return;};
	var xTab=this.m_axTabs[iTabIdx];
	if(!xTab.m_xB.m_xStatList){return;};
	var xD=p_xRPC.m_xResults;
	
	var xEl=xTab.m_xB.m_xStatList.MakeEl();
	pit_SetIHs(xEl,"");
	var xStruct=new Array();
	var xRowList=new Array();
	xTab.m_axMsgs=new Array();
	xTab.m_axMsgSel=[];

	var hThis=this.m_hHnd;
	var i,iC=xD.EntryCount;
	var sTextColor=this.m_xStyleDef.MsgListFG;
	for(i=0;i<iC;i++)
	{
		var xMsg=xD["E_"+i];
		xTab.m_axMsgs.push(xMsg);
		var xDS=new Date();
		xDS.setTime(xMsg.Time*1000);
//		xSB.Add("<tr><td>",xMsg.Title,"</td><td>",xMsg.From,"</td><td>",pit_FormatDateTime(xDS),"</td></tr>");
//	pit_Log(i,"/",iC,":",xMsg.Title,"/",xMsg.From,"/",pit_FormatDateTime(xDS));
		var sColor="#800000";
		if((i%2)==0){sColor=this.m_xStyleDef.MsgListEvenBG;}else{sColor=this.m_xStyleDef.MsgListOddBG;};
		var sRowElID="msglst_"+xTab.m_iID+"_"+xMsg.ID;
		var sWeight="normal";
		if(xMsg.Status==1){sWeight="bold";};
		xRowList.push(
			{"tr":{"className":"","subs":[
				{"td":{"subs":[{"nobr":{"text":xMsg.Title}}],"style.fontWeight":sWeight,"style.overflow":"hidden","onmouseup":function(){return false;}}},{"td":{"text":xMsg.From}},{"td":{"text":pit_FormatDateTime(xDS),"width":"120px"}},
			],
			"style.cursor":"pointer","style.backgroundColor":sColor,"style.color":sTextColor,
			"id":sRowElID,
			"msgid":xMsg.ID,
			"orgbgcolor":sColor,
			"onmouseover":function(sElID,xMsgID){
				return function(p_xE){
					var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){
						if(!g_xPitBoxes.m_bLMBDown){return false;};xThis.ToggleMessageSel(sElID,xTab,xMsgID,p_xE);return false;
					};
				};
			}(sRowElID,xMsg.ID),
			"onmousedown":function(sElID,xMsgID){
				return function(p_xE){
					var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){
						xThis.ToggleMessageSel(sElID,xTab,xMsgID,p_xE);return false;
					};
				};
			}(sRowElID,xMsg.ID),
			"ondblclick":function(xMsgID,sTitle){
				return function(){
					var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){
						xThis.ShowMessage(xMsgID,sTitle);return false;
					};
					};
			}(xMsg.ID,xMsg.Title),
			"onmouseup":function(){pit_ClearSelection();return false;}
			
			}}
		);
	};

	xStruct.push(
		{
			"table":{"left":"0px","top":"0px","width":"100%","height":"auto","style.tableLayout":"fixed","style.fontSize":this.m_xStyleDef.FontSize+"px",
				"subs":[
					{"th":{"height":"1px"}},
					{"th":{"width":"120px","height":"1px"}},
					{"th":{"width":"120px","height":"1px"}},
					{"tbody":{"subs":xRowList}}
					]}
		}
	);
	pit_BuildEls(xStruct,xEl);
	xEl.style.overflow="visible";
	
	xTab.m_xB.m_xStatList.SetSize(xTab.m_xB.m_xStatList.m_iW,(iC*18)+4);
	xTab.m_xB.m_xStatList.UpdateRect();
	xTab.m_xB.m_xStatList.m_bComplexDtor=true;
	xTab.m_xB.m_xStatListScroll.RefreshAttributes();
};

PitPTOCtrlMessaging.prototype.UpdateInbox=function(p_sFolder)
{
//	pit_Log("Update... ",p_sFolder,":",this.m_sCurSubSys);
	var xThis=this;
	var xRPC=new PitRPC();
	xRPC.SetURL(this.m_sRPCURL);
	xRPC.SetFunction("ListInbox");
	xRPC.SetParams("Folder",p_sFolder);
	xRPC.SetParams("SubSystem",this.m_sCurSubSys);
	xRPC.SetComplex(false);
	xRPC.OnSucceed=function(){
		xThis.RefreshFolderMsgList(xRPC,p_sFolder);
//		pit_Log("OK:",xRPC.m_sResultText);
	};
	xRPC.OnFail=function(){
		pit_Log("Fail:",xRPC.m_sResultText);
	};
	this.m_xRPCQueue.Add(xRPC);
};

PitPTOCtrlMessaging.prototype.SwitchTab=function(p_sTabID)
{
	var i,iC=this.m_axTabs.length;
	for(i=0;i<iC;i++)
	{
		var xT=this.m_axTabs[i];
		if(xT.m_iID==p_sTabID)
		{
			if(xT.m_iMode==0)
			{
				this.m_xSubsTab.SetActiveTab(this.CreateNewTab("New Msg",5,0));
				this.m_iCurMode=5;
			}
			else
			{
				xT.m_xB.SetVisible(true);
				this.m_iCurMode=xT.m_iMode;
				this.UpdateLayout();
				this.UpdateInbox(xT.m_sFromFolder);
			};
		}
		else
		{
			xT.m_xB.SetVisible(false);
		};
	};
};

PitPTOCtrlMessaging.prototype.FindTabByID=function(p_sID)
{
	var i,iC=this.m_axTabs.length;
	for(i=0;i<iC;i++)
	{
		var xT=this.m_axTabs[i];
		if(xT.m_iID==p_sID)
		{
			return i;
		};
	};
	return -1;
};

PitPTOCtrlMessaging.prototype.FindTabByMsgID=function(p_sMsgID)
{
	var i,iC=this.m_axTabs.length;
	for(i=0;i<iC;i++)
	{
		var xT=this.m_axTabs[i];
		if(xT.m_sMsgID==p_sMsgID)
		{
			return i;
		};
	};
	return -1;
};

PitPTOCtrlMessaging.prototype.FindFolderTab=function(p_sFolder)
{
	var i,iC=this.m_axTabs.length;
	for(i=0;i<iC;i++)
	{
		var xT=this.m_axTabs[i];
		if(xT.m_sFromFolder==p_sFolder)
		{
			return i;
		};
	};
	return -1;
};

PitPTOCtrlMessaging.prototype.CloseTab=function(p_sTabID)
{
	var i,iC=this.m_axTabs.length;
	for(i=0;i<iC;i++)
	{
		var xT=this.m_axTabs[i];
		if(xT.m_iID==p_sTabID)
		{
			if(xT.m_iMode>3)
			{
				if(this.m_xSubsTab.GetActiveTab()==p_sTabID)
				{
					this.m_xSubsTab.SetActiveTab(2);
				};
				this.m_axTabs.splice(i,1);
				return;
			};
		};
	};
};

PitPTOCtrlMessaging.prototype.OptionsMenu=function()
{
	xM=new PitPopupMenu();
	if(!this.m_sCurSubSys)
	{
		xM.AddItem("> General",-1);
	}
	else
	{
		xM.AddItem("General",-1);
	};
	var i,iC=this.m_asSubSystems.length;
	for(i=0;i<iC;i++)
	{
		var sT=this.m_asSubSystems[i];
		if(sT==this.m_sCurSubSys)
		{
			xM.AddItem("> "+sT,i);
		}
		else
		{
			xM.AddItem(sT,i);
		};
	};
	var xThis=this;
	xM.OnOK=function(p_iID)
	{
		xThis.m_sCurSubSys=xThis.m_asSubSystems[p_iID];
		xThis.UpdateInbox("Inbox");
	};
	xM.Show(this.GetEl(),this.m_iW+this.m_iX,20+this.m_iY);
};

PitPTOCtrlMessaging.prototype.TimedUpdate=function()
{
	var xThis=this;
	xThis.UpdateInbox("Inbox");
	if(this.m_iTimer!=-1){window.clearTimeout(this.m_iTimer);this.m_iTimer-1;};
	this.m_iTimer=window.setTimeout(function(){xThis.TimedUpdate();},60000*10);
};

PitPTOCtrlMessaging.prototype.InitialUpdate=function()
{
	var xThis=this;
	this.m_xSubsTab=new PitCtrlTab(10,30,300,this.m_xStyleDef.TabStyle);
	this.m_xSubsTab.m_iCloseTabs=1;

	this.m_xSubsTab.m_xOnTabActivate=function(p_sTab)
	{
		xThis.SwitchTab(p_sTab);
	};
	this.m_xSubsTab.m_xOnTabClose=function(p_sTab)
	{
		xThis.CloseTab(p_sTab);
	};
	this.m_xOptionsBtn=new PitCtrlButton(0,0,20,20,"?");
	this.AddChild(this.m_xOptionsBtn);
	this.m_xOptionsBtn.SetCmdID(1);
	this.m_xOptionsBtn.OnCmd=function()
	{
		xThis.OptionsMenu();
	};
	
	this.AddChild(this.m_xSubsTab);
	this.CreateNewTab("New",0);
	this.CreateNewTab("Inbox",1);
	this.CreateNewTab("Archive",2);
	this.CreateNewTab("Sent",3);
	

	this.m_xSubsTab.SetActiveTab(2);
	
	if(this.m_iTimer!=-1){window.clearTimeout(this.m_iTimer);this.m_iTimer-1;};
	this.m_iTimer=window.setTimeout(function(){xThis.TimedUpdate();},60000*10);
//	this.UpdateInbox("Inbox");
};

PitPTOCtrlMessaging.prototype.RefreshAttributes=function()
{
	if(this.m_xContainer)
	{
		if(!this.m_xSubsTab)
		{
			this.InitialUpdate();
		};
		this.UpdateLayout();
		this.m_xSubsTab.RefreshAttributes();
	};
	PitPTOCtrlMessaging.Super.RefreshAttributes.call(this);
};

PitPTOCtrlMessaging.prototype.GetActiveTab=function()
{
	var sTabID=this.m_xSubsTab.GetActiveTab();
	var i,iC=this.m_axTabs.length;
	for(i=0;i<iC;i++)
	{
		var xT=this.m_axTabs[i];
		if(xT.m_iID==sTabID)
		{
			return xT;
		};
	};	
	return null;
};

PitPTOCtrlMessaging.prototype.UpdateLayout=function()
{
	var xR=this.GetContentRect();
	xR.m_iX+=2;xR.m_iY+=2;xR.m_iW-=4;xR.m_iH-=4;
	var iTH=22;
	this.m_xSubsTab.SetRect(xR.m_iX,xR.m_iY,xR.m_iW-25,iTH);
	this.m_xOptionsBtn.SetRect(xR.m_iX+xR.m_iW-20,xR.m_iY,20,iTH);
	var xTCur=this.GetActiveTab();
	xTCur.m_xB.SetRect(xR.m_iX,xR.m_iY+iTH+4,xR.m_iW,xR.m_iH-iTH-4);
	var xThis=this;
	var iFS=this.m_xStyleDef.FontSize;
	var iFD=this.m_xStyleDef.FontSize+4;
	if(xTCur.m_iMode==4)
	{
		var iBW=60;
		var iBH=22;
		var iBWD=8;
		xTCur.m_xB.m_xStatFrom.SetRect(80,0,xR.m_iW-120,iFD)
		xTCur.m_xB.m_xStatSubject.SetRect(80,iFD+2,xR.m_iW-80,iFD)
		xTCur.m_xB.m_xStatText.SetRect(80,iFD*2+4,xR.m_iW-80,xR.m_iH-iFD*2-10-22-iBH)
		xTCur.m_xB.m_xStatText.UpdateRect();
		xTCur.m_xB.m_xBtnReply.SetRect(xR.m_iW-iBW*4-iBWD*3,xR.m_iH-iTH-iBH,iBW,iBH)
		xTCur.m_xB.m_xBtnArchive.SetRect(xR.m_iW-iBW*3-iBWD*2,xR.m_iH-iTH-iBH,iBW,iBH)
		xTCur.m_xB.m_xBtnDelete.SetRect(xR.m_iW-iBW*2-iBWD*1,xR.m_iH-iTH-iBH,iBW,iBH)
		xTCur.m_xB.m_xBtnClose.SetRect(xR.m_iW-iBW*1,xR.m_iH-iTH-iBH,iBW,iBH)
		xTCur.m_xB.m_xBtnReply.RefreshAttributes();
		xTCur.m_xB.m_xBtnArchive.RefreshAttributes();
		xTCur.m_xB.m_xBtnDelete.RefreshAttributes();
		xTCur.m_xB.m_xBtnClose.RefreshAttributes();
		xTCur.m_xB.m_xStatText.RefreshAttributes();
	}
	if(xTCur.m_iMode==5)
	{
		var iBW=60;
		var iBH=22;
		var iBWD=8;
		xTCur.m_xB.m_xEditTo.SetRect(80,0,xR.m_iW-80,iFD);
		xTCur.m_xB.m_xEditSubject.SetRect(80,iFD+2,xR.m_iW-80,iFD);
		xTCur.m_xB.m_xEditText.SetRect(80,iFD*2+4,xR.m_iW-80,xR.m_iH-iFD*2-10-22-iBH)
		xTCur.m_xB.m_xBtnSend.SetRect(xR.m_iW-iBW*2-iBWD*1,xR.m_iH-iTH-iBH,iBW,iBH)
		xTCur.m_xB.m_xBtnClose.SetRect(xR.m_iW-iBW*1,xR.m_iH-iTH-iBH,iBW,iBH)
		xTCur.m_xB.m_xStatResult.SetRect(80,xR.m_iH-iTH-iBH,xR.m_iW-80-iBW*2,iBH);
		xTCur.m_xB.m_xBtnSend.RefreshAttributes();
		xTCur.m_xB.m_xBtnClose.RefreshAttributes();
	}
	else if(xTCur.m_iMode<4)
	{
		var iBW=60;
		var iBH=22;
		var iBWD=8;
		xTCur.m_xB.m_xStatListScroll.SetRect(0,0,xR.m_iW,xR.m_iH-6-22-iBH)
//		xTCur.m_xB.m_xBtnReply.SetRect(xR.m_iW-iBW*4-iBWD*3,xR.m_iH-iTH-iBH,iBW,iBH)
		xTCur.m_xB.m_xBtnArchive.SetRect(xR.m_iW-iBW*3-iBWD*2,xR.m_iH-iTH-iBH,iBW,iBH)
		xTCur.m_xB.m_xBtnDelete.SetRect(xR.m_iW-iBW*2-iBWD*1,xR.m_iH-iTH-iBH,iBW,iBH)
		xTCur.m_xB.m_xBtnDelAll.SetRect(0,xR.m_iH-iTH-iBH,80,iBH)
		xTCur.m_xB.m_xBtnRead.SetRect(xR.m_iW-iBW*1,xR.m_iH-iTH-iBH,iBW,iBH)
		xTCur.m_xB.m_xStatList.SetRect(0,0,xR.m_iW-20,1);
		xTCur.m_xB.m_xStatList.SetAutoHeight();
		xTCur.m_xB.m_xStatList.UpdateRect();

//		xTCur.m_xB.m_xBtnReply.RefreshAttributes();
		xTCur.m_xB.m_xBtnArchive.RefreshAttributes();
		xTCur.m_xB.m_xBtnDelete.RefreshAttributes();
		xTCur.m_xB.m_xBtnRead.RefreshAttributes();
		xTCur.m_xB.m_xStatListScroll.RefreshAttributes();
	};
};


function PitPTOCtrlForum(p_iX,p_iY,p_iW,p_iH,p_sTitle)
{
	PitPTOCtrlForum.BaseCtor.call(this,p_iX,p_iY,p_iW,p_iH,p_sTitle);
	this.m_sTagName="div";
	if(!p_iX){p_iX=0;};
	if(!p_iY){p_iY=0;};
	if(!p_iW){p_iW=100;};
	if(!p_iH){p_iH=100;};
	this.m_iX=p_iX;
	this.m_iY=p_iY;
	this.m_iW=p_iW;
	this.m_iH=p_iH;

//	this.AddTopLevelBehaviour(true,true);
	
	this.AddStyles(g_xPitStyleDef.PitPTOCtrlForum);

	this.m_sUserName="";
	
	this.m_xTabCtrl=null;
	this.m_xCtrlScroller=null;

	this.m_xRPCQueue=new PitRPCQueue();
	this.m_xRPCQueue.m_iDelay=50;
	this.m_sRPCURL="/forum.xrq";
	this.m_iRootRoom=1;
	this.m_sTitle="";
	this.m_iEdtTabID=1;

	this.m_xStyleDef.TabStyle="tabSimple";
	this.m_xStyleDef.ScrollStyle="scrSimple";
	this.m_xStyleDef.FontSize=12;
	
	this.m_axTabs=new Array();

	this.m_axRoomList=new Array();
	
	this.m_iLastGetRoomTopicsR=-1;
	this.m_iLastGetRoomTopicsT=-1;
	this.m_iLastGetRoomSiteMapR=-1;
	this.m_iLastGetRoomSiteMapT=-1;
	
	this.AddStyles(g_xPitStyleDef.PitPTOCtrlForum);
};

Inherit(PitPTOCtrlForum,PitCtrlTopLevel,"PitPTOCtrlForum");

function forum_FmtDT(p_xD)
{
	var xDS=new Date(Date.parse(p_xD));
	return pit_LeadZero2(""+xDS.getDate())+"."+pit_LeadZero2(""+(1+xDS.getMonth()))+"."+(""+xDS.getFullYear()).substr(2)+"\u00a0"+pit_LeadZero2(""+xDS.getHours())+":"+pit_LeadZero2(""+xDS.getMinutes());
};
function forum_FmtD(p_xD)
{
	var xDS=new Date(Date.parse(p_xD));
	return pit_LeadZero2(""+xDS.getDate())+"."+pit_LeadZero2(""+(1+xDS.getMonth()))+"."+(""+xDS.getFullYear()).substr(2);
};
function forum_FmtDDiff(p_xD)
{
	var xDS=new Date(Date.parse(p_xD));
	var xNow=new Date();
	var iDiff=xNow-xDS;
	iDiff=iDiff/(60*60);
	if(iDiff<120)
	{
		return Math.ceil(iDiff)+" Minutes";
	};
	iDiff/=60;
	if(iDiff<28)
	{
		return Math.ceil(iDiff)+" Hours";
	};
	iDiff/=24;
	if(iDiff<10)
	{
		return Math.ceil(iDiff)+" Days";
	};
	return ""+xDS.getDate()+"."+pit_LeadZero2(""+(1+xDS.getMonth()))+"."+(""+xDS.getFullYear()).substr(2);
};

PitPTOCtrlForum.prototype.Destruct=function()
{
	this.m_xRPCQueue.Clear();
	PitPTOCtrlForum.Super.Destruct.call(this);
};

PitPTOCtrlForum.prototype.OnResize=function()
{
	this.GetCurRect();
	this.UpdateLayout();
	PitPTOCtrlForum.Super.OnResize.call(this);
	this.RefreshFrame();
};

PitPTOCtrlForum.prototype.UpdateLayout=function()
{
	var xR=this.GetContentRect();
	xR.m_iX+=2;xR.m_iY+=2;xR.m_iW-=4;xR.m_iH-=4;
	var iTH=22;
	this.m_xTabCtrl.SetRect(xR.m_iX,xR.m_iY,xR.m_iW,iTH);
	this.m_xCtrlScroller.SetRect(0,iTH+2,xR.m_iW,xR.m_iH-6-22)
	this.m_xCtrlScroller.RefreshAttributes();
	
	/*
	var xTCur=this.GetActiveTab();
	if(xTCur)
	{
		xTCur.m_xB.SetRect(xR.m_iX,xR.m_iY+iTH+4,xR.m_iW,xR.m_iH-iTH-4);
	};
	*/
};

PitPTOCtrlForum.prototype.RefreshAttributes=function()
{
	if(!this.m_xTabCtrl)
	{
		this.InitialUpdate();
	};
	PitPTOCtrlForum.Super.RefreshAttributes.call(this);
//	this.m_xTabs.RefreshAttributes();
};

PitPTOCtrlForum.prototype.SiteMap_AddRoomDivs=function(p_xDiv,p_xRoom,p_iLevel)
{
	var xD=document.createElement("div");
	xD.style.width="100%";
	var xL=document.createElement("a");
	xL.style.width="100%";
	var sTitle="";
	var i,iC;
	for(i=0;i<p_iLevel;i++){sTitle+="&nbsp;&nbsp;&nbsp;"};
	var sRoomTitle=p_xRoom.Title;
	if(sRoomTitle.substr(0,1)=="_")
	{
		var sLocaTitle=g_L[sRoomTitle];
		if(sLocaTitle)
		{
			sRoomTitle=sLocaTitle;
		};
	};
	sTitle+=sRoomTitle;
	xL.href="javascript:/**/";
	pit_SetIH(xL,sTitle);
	var xThis=this;
	this.m_axRoomList.push({"ID":p_xRoom.ID,"Title":sRoomTitle});
	xL.onmouseup=function()
	{
		xThis.OpenRoom(p_xRoom.ID);
	};
	xD.onmouseup=function()
	{
		xThis.OpenRoom(p_xRoom.ID);
	};
	if(p_iLevel==0)
	{
		xL.style.fontSize="120%";
		xD.style.marginBotton="4px";
	};
	if(p_iLevel==1)
	{		
		xD.style.borderTop="solid 1px";
		xD.style.marginBottom="1px";
		xD.style.marginTop="5px";
	};
	if(p_iLevel==2)
	{
		xD.style.marginBottom="2px";
	};
	if(p_xRoom.NewData==1)
	{
		xD.style.fontWeight="bold";
	};
	xD.appendChild(xL);
	p_xDiv.appendChild(xD);
	iC=p_xRoom.SubRooms.length;
	for(i=0;i<iC;i++)
	{
		this.SiteMap_AddRoomDivs(p_xDiv,p_xRoom.SubRooms[i],p_iLevel+1);
	};
};

PitPTOCtrlForum.prototype.UpdateTitle=function()
{
	var sCur=this.m_xTabCtrl.GetActiveTab();
	var iT=this.FindTab(sCur);
	if(iT!=-1)
	{
		var sNewTitle=this.m_axTabs[iT].m_sTitle;
		if(sNewTitle.substr(0,1)=="_")
		{
			var sLocaTitle=g_L[sNewTitle];
			if(sLocaTitle)
			{
				sNewTitle=sLocaTitle;
			};
		};
		if(sNewTitle!=this.m_sTitle)
		{
			this.m_sTitle=sNewTitle;
			this.SetText(sNewTitle);
		};
	};
};

PitPTOCtrlForum.prototype.UpdateSiteMap=function(p_xRPC)
{
	var xD=p_xRPC.m_xResults;
	if(!xD){return;};
	var iSI=this.FindTab("sm");
	var xCtrl=this.m_axTabs[iSI].m_xCtrl;
	var xEl=xCtrl.MakeEl();
	xCtrl.m_bComplexDtor=true;
	pit_SetIH(xEl,"");
	xEl.style.width="100%";

	var sRoomTitle=xD.Title;
	if(sRoomTitle.substr(0,1)=="_")
	{
		var sLocaTitle=g_L[sRoomTitle];
		if(sLocaTitle)
		{
			sRoomTitle=sLocaTitle;
		};
	};

	this.m_axTabs[iSI].m_sTitle=sRoomTitle;
	this.m_axRoomList=new Array();
	this.SiteMap_AddRoomDivs(xEl,xD,0);
	xCtrl.SetAutoHeight();
	xCtrl.UpdateRect();
	this.m_xCtrlScroller.RefreshAttributes();
	this.UpdateTitle();
};

PitPTOCtrlForum.prototype.ReqUpdateSiteMap=function()
{
	var iRoomID=parseInt(this.m_iRootRoom);
	if(!isFinite(iRoomID))
	{
		var xThis=this;
		var xRPC2=new PitRPC();
		xRPC2.SetURL(this.m_sRPCURL);
		xRPC2.SetFunction("FindRoom");
		xRPC2.SetParams("RoomName",this.m_iRootRoom);
		xRPC2.OnFail=function(){
			if(this.m_iTimer!=-1){window.clearTimeout(this.m_iTimer);this.m_iTimer-1;};
			this.m_iTimer=window.setTimeout(function(){xThis.ReqUpdateSiteMap();},10000);
		};
		xRPC2.OnSucceed=function(){
			xThis.m_iRootRoom=xRPC2.m_xResults.RoomID;
			xThis.ReqUpdateSiteMap();
		};
		this.m_xRPCQueue.Add(xRPC2);	
		return;
	};

	var xD=new Date();
	var iT=xD.getTime();
	if(this.m_iLastGetRoomSiteMapR==iRoomID)
	{
		if(Math.abs(this.m_iLastGetRoomSiteMapT-iT)<1000)
		{
			return;
		};
	};
	this.m_iLastGetRoomSiteMapR=iRoomID;
	this.m_iLastGetRoomSiteMapT=iT;

	
	var xThis=this;
	var xRPC2=new PitRPC();
	xRPC2.SetURL(this.m_sRPCURL);
	xRPC2.SetFunction("GetRoomSiteMap");
	xRPC2.SetParams("RoomID",this.m_iRootRoom);
	xRPC2.OnFail=function(){
		if(this.m_iTimer!=-1){window.clearTimeout(this.m_iTimer);this.m_iTimer-1;};
		this.m_iTimer=window.setTimeout(function(){xThis.ReqUpdateSiteMap();},10000);
	};
	xRPC2.OnSucceed=function(){
		xThis.UpdateSiteMap(xRPC2);
	};
	this.m_xRPCQueue.Add(xRPC2);	
};

PitPTOCtrlForum.prototype.ShowNewMsg=function(p_iRoom,p_iTopic,p_iMsg,p_sTitle,p_sQuotTitle,p_sQuotUser)
{
//	pit_Log("New Msg ",p_iRoom," ",p_iTopic," ",p_iMsg," ",p_sTitle);

	var xThis=this;
	this.m_iEdtTabID=1+this.m_iEdtTabID;
	var sTabID="e"+this.m_iEdtTabID;
	var sTabTitle;
	if(p_sTitle)
	{
		sTabTitle=p_sTitle;
	}
	else
	{
		sTabTitle="New Thread";
		p_sTitle="";
	};
	
	if(sTabTitle.length>12)
	{
		sTabTitle=sTabTitle.substr(0,10)+"...";
	};
	this.m_xTabCtrl.AddSingleTab(sTabID,0,false,sTabTitle);
	var xR={};
	xR.m_iType=3;
	xR.m_iRoom=p_iRoom;
	xR.m_iTopicID=p_iTopic;
	xR.m_iMsgID=p_iMsg;
	xR.m_sTabID=sTabID;
	xR.m_sTitle=p_sTitle;
	xR.m_iScroll=0;

	var iW=this.m_iW-30;
	var iH=this.m_iH-64;
	if(iH<200){iH=200;};
	var xPanel=new PitCtrlPanel(0,0,iW,iH);
	xR.m_xEdtSubject=new PitCtrlEdit(0,0,iW,20,false,false,false);
	xPanel.AddChild(xR.m_xEdtSubject);
	xR.m_xEdtText=new PitCtrlEdit(0,24,iW,iH-24-20-4,false,true,false);
	xPanel.AddChild(xR.m_xEdtText);
	xR.m_xStatResult=new PitCtrlStatic(0,iH-20,iW-300,20);
	xPanel.AddChild(xR.m_xStatResult);
	var xB=new PitCtrlGfxButton(iW-210,iH-22,100,20,"Post",this.m_xStyleDef.ButtonStyle);
	xPanel.AddChild(xB);
	xB.SetCmdID(1);
	xB.OnCmd=function()
	{
		var xRPC2=new PitRPC();
		xRPC2.SetURL("/forum.xrq");
		if((p_sQuotUser)||(p_iMsg==-1))
		{
			xRPC2.SetFunction("PostMsg");
			xRPC2.SetParams("ReplyTo",""+p_iMsg);
		}
		else
		{
			xRPC2.SetFunction("EditMsg");
			xRPC2.SetParams("MsgID",""+p_iMsg);
		};
		xRPC2.SetParams("RoomID",""+p_iRoom);
		xRPC2.SetParams("TopicID",""+p_iTopic);
		xRPC2.SetParams("MsgTitle",xR.m_xEdtSubject.GetEl().value);
		xRPC2.SetParams("MsgText",xR.m_xEdtText.GetEl().value);
		xRPC2.SetComplex(1);
		xRPC2.OnFail=function(){
			xR.m_xStatResult.SetText("Error posting message");
		}
		xRPC2.OnSucceed=function(){
			if(xRPC2.m_sResultText=="ok")
			{
				xThis.m_xTabCtrl.CloseTab(sTabID);
				xThis.ReqUpdateRoom(p_iRoom);
				if(p_iTopic!=-1)
				{
					xThis.ReqUpdateTopic(p_iRoom,p_iTopic,p_sTitle);
				};
			}
			else
			{
				xR.m_xStatResult.SetText("Error:"+xRPC2.m_sResultText);
			};
		}
		xThis.m_xRPCQueue.Add(xRPC2);
	};

	var xB=new PitCtrlGfxButton(iW-100,iH-22,100,20,"Close",this.m_xStyleDef.ButtonStyle);
	xB.SetCmdID(1);
	xB.OnCmd=function()
	{
		xThis.m_xTabCtrl.CloseTab(sTabID);
	};
	xPanel.AddChild(xB);

	var xB=new PitCtrlGfxButton(iW-320,iH-22,100,20,"Help",this.m_xStyleDef.ButtonStyle);
	xB.SetCmdID(1);
	xB.OnCmd=function()
	{
		xThis.ShowHelp();
	};
	xPanel.AddChild(xB);

	this.m_xCtrlScroller.AddChild(xPanel);

	var sSubject="";	
	if(p_sQuotTitle)
	{
		sSubject=p_sQuotTitle;
	}
	else if(p_sTitle)
	{
		sSubject=p_sTitle;
	};
	if(sSubject.length>0&&sSubject.substr(0,3)!="Re:")
	{
		sSubject="Re: "+sSubject;
	};
	xR.m_xEdtSubject.MakeEl().value=sSubject;
	
	var xCtrl=xR.m_xEdtText;
	if(p_iMsg!=-1)
	{
		xCtrl.MakeEl().value="Loading...";
		var xRPC2=new PitRPC();
		xRPC2.m_sMethod="GET";
		xRPC2.m_bNoID=true;
		xRPC2.SetURL("/forum.xrq");
		xRPC2.SetFunction("GetMsgSource");
		xRPC2.SetParams("MsgIDs",""+p_iMsg);
		xRPC2.m_iUMsg=p_iMsg;
		xRPC2.m_sUTitle=p_sTitle;
		xRPC2.OnFail=function(){
		}
		xRPC2.OnSucceed=function(){
			if(p_sQuotUser)
			{
				xCtrl.MakeEl().value="[quot="+p_sQuotUser+"]\r\n"+xRPC2.m_sResultText+"\r\n[/quot]\r\n";
			}
			else
			{
				xCtrl.MakeEl().value=xRPC2.m_sResultText;
			};
		}
		this.m_xRPCQueue.Add(xRPC2);
	};
	
//	xB.SetVisible(false);
//	xB.MakeEl().style.fontSize=this.m_xStyleDef.FontSize+"px";
	xR.m_xCtrl=xPanel;
	this.m_axTabs.push(xR);
	this.m_xTabCtrl.SetActiveTab(sTabID,false);
};

PitPTOCtrlForum.prototype.ModAdminThread=function(p_xDiv,p_iRoom,p_iTopic,p_iMsg)
{
	var xThis=this;
	var xMenu=new PitPopupMenu();
	xMenu.AddItem("Delete",-1);
	xMenu.AddItem("Set Closed",-2);
	xMenu.AddItem("Unset Closed",-3);
	xMenu.AddItem("Set Sticky",-4);
	xMenu.AddItem("Unset Sticky",-5);
	xMenu.AddItem("Set Important",-6);
	xMenu.AddItem("Unset Important",-7);
	var i,iC=this.m_axRoomList.length;
	for(i=0;i<iC;i++)
	{
		var xR=this.m_axRoomList[i];
		xMenu.AddItem("Move to "+xR.Title,xR.ID);
	};
	xMenu.OnOK=function(p_iID)
	{
		var xRPC2=new PitRPC();
		xRPC2.SetURL("/forum.xrq");
		xRPC2.SetFunction("Admin");
		if(p_iID==-1)
		{
			xRPC2.SetFunction("DeleteTopic");
		}
		else if(p_iID==-2)
		{
			xRPC2.SetFunction("ModTopicSetState");
			xRPC2.SetParams("StateClosed",1);
		}
		else if(p_iID==-3)
		{
			xRPC2.SetFunction("ModTopicSetState");
			xRPC2.SetParams("StateClosed","0");
		}
		else if(p_iID==-4)
		{
			xRPC2.SetFunction("ModTopicSetState");
			xRPC2.SetParams("StateSticky",1);
		}
		else if(p_iID==-5)
		{
			xRPC2.SetFunction("ModTopicSetState");
			xRPC2.SetParams("StateSticky","0");
		}
		else if(p_iID==-6)
		{
			xRPC2.SetFunction("ModTopicSetState");
			xRPC2.SetParams("StateImportant",1);
		}
		else if(p_iID==-7)
		{
			xRPC2.SetFunction("ModTopicSetState");
			xRPC2.SetParams("StateImportant","0");
		}
		else
		{
			xRPC2.SetFunction("MoveTopic");
			xRPC2.SetParams("ToRoomID",""+p_iID);
		};
		xRPC2.SetParams("RoomID",""+p_iRoom);
		xRPC2.SetParams("TopicID",""+p_iTopic);
		xRPC2.SetParams("MsgID",""+p_iMsg);
		xRPC2.SetComplex(1);
		xRPC2.OnFail=function(){
		}
		xRPC2.OnSucceed=function(){
			xThis.ReqUpdateRoom(p_iRoom);
			if(p_iTopic!=-1)
			{
				xThis.ReqUpdateTopic(p_iRoom,p_iTopic,"Topic");
			};
		}
		xThis.m_xRPCQueue.Add(xRPC2);
	};	
	xMenu.Show(this.GetEl(),0,0);
};

PitPTOCtrlForum.prototype.ModAdminDelMsg=function(p_xDiv,p_iRoom,p_iTopic,p_iMsg)
{
	var xThis=this;
	var xMenu=new PitPopupMenu();
	xMenu.AddItem("Delete",-1);
	xMenu.AddItem("Cancel",0);
	xMenu.OnOK=function(p_iID)
	{
		if(p_iID==-1)
		{
			var xRPC2=new PitRPC();
			xRPC2.SetURL("/forum.xrq");
			xRPC2.SetFunction("DeleteMsg");
			xRPC2.SetParams("RoomID",""+p_iRoom);
			xRPC2.SetParams("TopicID",""+p_iTopic);
			xRPC2.SetParams("MsgID",""+p_iMsg);
			xRPC2.SetComplex(1);
			xRPC2.OnFail=function(){
			}
			xRPC2.OnSucceed=function(){
				xThis.ReqUpdateRoom(p_iRoom);
				if(p_iTopic!=-1)
				{
					xThis.ReqUpdateTopic(p_iRoom,p_iTopic,"Topic");
				};
			}
			xThis.m_xRPCQueue.Add(xRPC2);
		};
	};
	xMenu.Show(this.GetEl(),0,0);
};

PitPTOCtrlForum.prototype.ShowHelp=function()
{
	var iTI=this.FindTab("help");
	if(iTI!=-1){this.m_xTabCtrl.SetActiveTab("help",true);return;};
	var sTabTitle="Help";
	this.m_xTabCtrl.AddSingleTab("help",0,false,sTabTitle);
	var xR={};
	xR.m_iType=3;
	xR.m_iTopicID=-1;
	xR.m_sTabID="help";
	xR.m_sTitle=sTabTitle;
	xR.m_iScroll=0;

	var xB;
	xB=new PitCtrlStatic(0,0,this.m_iW-40,20,"");
	this.m_xCtrlScroller.AddChild(xB);
//	xB.SetVisible(false);
	xB.MakeEl().style.fontSize=this.m_xStyleDef.FontSize+"px";

	var sHelpText="<br>BBCode:<br>[b]<b>BOLD</b>[/b] &nbsp; [i]<i>ITALIC</i>[/i] &nbsp; [u]<u>UNDERLINE</u>[/u] &nbsp; [sub]<sub>SUBTEXT</sub>[/sub] &nbsp; [sup]<sup>SUPER</sup>[/sup]<br>"+
	"[quot]QUOTE[/quot] &nbsp; [quot=AUTHOR]QUOTE[/quot] &nbsp; [img=SRC/] &nbsp; [url=SRC]TEXT[/url] &nbsp; [code]<code>CODE</code>[/code]<br><br>"+
	"Numbered List: [nl]&nbsp;[li]LISTITEM[/li]&nbsp;[/nl]"+
	"Unnumbered List: [ul]&nbsp;[li]LISTITEM[/li]&nbsp;[/ul]<br>"+
	"Table: [tbl]&nbsp;[tr]&nbsp;[td]TABLECELL[/td]&nbsp;[/tr]&nbsp;[/tbl]<br><br>"+
	"<img src='/images/icnSWink.png'>&nbsp;:wink:&nbsp;&nbsp;<img src='/images/icnSCry.png'>&nbsp;:cry:&nbsp;&nbsp;<img src='/images/icnSAngry.png'>&nbsp;:angry:&nbsp;&nbsp;<img src='/images/icnSGeek.png'>&nbsp;:geek:&nbsp;&nbsp;<img src='/images/icnSImpish.png'>&nbsp;:imp:&nbsp;&nbsp;"+
	"<img src='/images/icnSKiss.png'>&nbsp;:kiss:&nbsp;&nbsp;<img src='/images/icnSLaugh.png'>&nbsp;:lol:&nbsp;&nbsp;<img src='/images/icnSSceptic.png'>&nbsp;:sceptic:&nbsp;&nbsp;<img src='/images/icnSNoOpinion.png'>&nbsp;:noop:";

	pit_SetIH(xB.MakeEl(),sHelpText);

	xR.m_xCtrl=xB;
	xR.m_xCtrl.SetAutoHeight();
	xR.m_xCtrl.UpdateRect();
	
	this.m_axTabs.push(xR);
	this.m_xTabCtrl.SetActiveTab("help",false);

};

PitPTOCtrlForum_CBUpdateMsgBody=function(p_xRPC)
{
	var xData=p_xRPC.m_xResults;
	if((!xData)||(!xData.MsgCount))
	{
		pit_Log("Error decoding ",p_xRPC.m_sID);
		return;
	};	
	var iM,iMCnt=xData.MsgCount;
	var xSBC=new PitStringBuilder();
	for(iM=0;iM<iMCnt;iM++)
	{
		var xM=xData["Msg_"+iM];
		if(xM)
		{
			var xID=xM.ID;
			var xEl=document.getElementById("msgbody_"+p_xRPC.m_iRoomID+"_"+p_xRPC.m_iTopicID+"_"+xID);
			if(xEl)
			{
				xSBC.Clear();
				if(xM.Title&&xM.Title.length&&xM.Title.length>0)
				{
					xSBC.Add("<b><u>",xM.Title,"</u></b><br><br>");
				};
				var axM=xM.BodyLines;
				if(axM&&axM.length)
				{
					var iMLines=axM.length;
					var iMLine;
					for(iMLine=0;iMLine<iMLines;iMLine++)
					{
						xSBC.Add(axM[iMLine],"<br>");
					};
				};
		
				xSBC.Add("<img src='/userimage/s_",pit_Dword2HexString(xM.UserID),".img'>");
				pit_SetIH(xEl,xSBC.GetString());
//				xEl.innerHTML="Loaded";
			}
			else
			{
				pit_Log("NoEl ",iM," ",xID);
			};
		};
	};

	var hThis=p_xRPC.m_hCtrlThis;
	var hScrl=p_xRPC.m_hCtrlScrl;
//	var xCtrl=p_xRPC.m_xCtrl;
	window.setTimeout(
	function()
	{
		var xThis=g_xPitBoxes.GetBox(hThis);
		var xCtrl=g_xPitBoxes.GetBox(hScrl);
		xCtrl.SetAutoHeight();
		xCtrl.UpdateRect();
		xThis.m_xCtrlScroller.RefreshAttributes();
	},100);
};


PitPTOCtrlForum.prototype.UpdateTopic=function(p_xRPC)
{
//	pit_Log(p_xRPC.m_sResultText);
	var xData=p_xRPC.m_xResults;
	var sTabID="t"+p_xRPC.m_iTopicID;
	var iSI=this.FindTab(sTabID);
	var xTab=this.m_axTabs[iSI];
	var xCtrl=xTab.m_xCtrl;
	var xEl=xCtrl.MakeEl();
	if(!xData){
		pit_SetIH(xEl,"Server error");
		xCtrl.SetAutoHeight();
		xCtrl.UpdateRect();
		this.m_xCtrlScroller.RefreshAttributes();
		return;
	};
	xCtrl.m_bComplexDtor=true;
	var bMayPost=xData.MayPost==1;
	var bModerator=xData.Moderator==1;
	
	var hThis=this.m_hHnd;

	var xStruct=new Array();

	var xRowList=new Array();
	var iTopicID=p_xRPC.m_iTopicID;
	var iRoomID=p_xRPC.m_iRoomID;

		var xHeader=document.createElement("div");
		xHeader.style.width="100%";
		xHeader.style.height="28px";
	var xBtnBottom=g_xPitTiles.BuildTextGButton("Last",this.m_xStyleDef.ButtonStyle,0,6,100,20,
	function(){
		var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.m_xCtrlScroller.SetScrollPos(1000000);};
		});
	
	xHeader.appendChild(xBtnBottom);

	if(this.m_sCurUser.length>0)
	{

		var xBtnNewReply=g_xPitTiles.BuildTextGButton("Reply",this.m_xStyleDef.ButtonStyle,110,6,100,20,
		function(){
			var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.ShowNewMsg(iRoomID,iTopicID,-1,p_xRPC.m_sTopicTitle);};
			});

		xHeader.appendChild(xBtnNewReply);
	};
	if(bModerator)
	{
		var xBtnAdmin=g_xPitTiles.BuildTextGButton("Admin",this.m_xStyleDef.ButtonStyle,220,6,100,20,
		function(){
			var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.ModAdminThread(xThis.GetEl(),iRoomID,iTopicID);};
			});
	
		xHeader.appendChild(xBtnAdmin);
	};	

	xStruct.push(
		{"prenode":xHeader}
	);
	
	xRowList.push(
		{"tr":{"className":"forum_MLh","height":"0px","subs":[
			{"th":{"width":"150px"}},
			{"th":{}}
		]}}
	);

	var sRClass="forum_MLrowe";
	var iMsg=0;
	var iMsgStart=Number(xData.Start);
	var iMsgEnd=Number(xData.End);
	var iMsgTotal=xData.TotalMsgCount;
//	pit_Log("Msg: ",iMsgStart," ",iMsgEnd," Total:",iMsgTotal);
	var axFetchList=new Array();

	function ShowCB1(idx,p_xD){
		return function(){
			var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.ShowNewMsg(iRoomID,iTopicID,-1,p_xD.Title,p_xD.Title);};
			return false;};
	};
	function ShowCB2(idx,p_xD){
		return function(){
			var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.ShowNewMsg(iRoomID,iTopicID,idx,p_xD.Title,p_xD.Title,p_xD.UserNick);};
			return false;};
	};
	function ShowCB3(idx,p_xD){
		return function(){
			var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.ShowNewMsg(iRoomID,iTopicID,idx,p_xD.Title);return false;};
			};
	};
	
	for(iMsg=iMsgStart;iMsg<iMsgEnd;iMsg++)
	{
		var xD=xData["Msg_"+iMsg];
		var xText=document.createElement("td");
		xText.className="forum_MLtext";
		xText.id="msgbody_"+p_xRPC.m_iRoomID+"_"+p_xRPC.m_iTopicID+"_"+xD.ID;
		var axM=xD.BodyLines;
		var xSBC=new PitStringBuilder();
		if(axM&&axM.length)
		{
			xSBC.Add("<b><u>",xD.Title,"</u></b><br><br>");
			var iMLines=axM.length;
			var iM;
			for(iM=0;iM<iMLines;iM++)
			{
				xSBC.Add(axM[iM],"<br>");
			};
			xSBC.Add("<img src='/userimage/s_",pit_Dword2HexString(xD.UserID),".img'>");
		}
		else
		{
			xSBC.Add("Loading... ");
			axFetchList.push(xD.ID);
		};
		pit_SetIH(xText,xSBC.GetString());
		var xInfo=document.createElement("td");
	
		var xRBtn={};
		var xQBtn={};
		var xEBtn={};
		var xDBtn={};

		if(bMayPost)
		{
			xRBtn={"prenode":
					g_xPitTiles.BuildTextSButton("\u00a0Reply\u00a0",this.m_xStyleDef.ButtonStyle,-1,-1,55,20,
						ShowCB1(xD.ID,xD)
					)
				};
			xQBtn={"prenode":
					g_xPitTiles.BuildTextSButton("\u00a0Quote\u00a0",this.m_xStyleDef.ButtonStyle,-1,-1,55,20,
						ShowCB2(xD.ID,xD)
					)
				};
			if((this.m_sCurUser==xD.UserNick)||(bModerator))
			{
				xEBtn={"prenode":
						g_xPitTiles.BuildTextSButton("\u00a0Edit\u00a0",this.m_xStyleDef.ButtonStyle,-1,-1,55,20,
							ShowCB3(xD.ID,xD)
						)
					};
			};
			if(bModerator)
			{
				xDBtn={"prenode":
						g_xPitTiles.BuildTextSButton("\u00a0Admin\u00a0",this.m_xStyleDef.ButtonStyle,-1,-1,55,20,
							function(idx,p_xD,xInf){return function(){
								var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.ModAdminDelMsg(xInf,iRoomID,iTopicID,idx);};
									return false;
							};}(xD.ID,xD,xInfo)
						)
					};
			};
		};
	
		pit_BuildEls(
			[
				{"a":{
					"text":xD.UserNick,
					"href":"?page=Userinfo&user="+xD.UserNick
					}
				},
				{"br":{}},
				{"text":forum_FmtDT(xD.TPost)},
				{"br":{}},
				{"img":{
					"src":"/userimage/a_"+pit_Dword2HexString(xD.UserID)+".img"
					}
				},
				{"br":""},
				{"text":((Number(iMsg)+1)+"/"+iMsgTotal)},
				{"br":{}},{"br":{}},
//				{"div":{
//				subs:[
					xRBtn,
//					{"text":"\u00a0"},
					xQBtn,
					{"br":""},
					xEBtn,
//					{"text":"\u00a0"},
					xDBtn
//				]}}
				
			]
		,xInfo);
		xInfo.className="forum_MLinfo";
		
		xRowList.push(
			{tr:{
				subs:[
					{prenode:xInfo},
					{prenode:xText}
				]
			}},
			{tr:{
				"className":"forum_MLsep",
				subs:[
					{"td":{}},{"td":{}}
				]
			}}

		);		
	};
	
	xStruct.push(
		{"table":{"left":"0px","top":"32px","className":"forum_MLtable","subs":[{"tbody":{"subs":xRowList}}] }}
	);
	pit_SetIH(xEl,"");
	xEl.style.width="100%";
	pit_BuildEls(xStruct,xEl);
	xEl.style.width="100%";

	var xThis=this;
	function FetchBodies(p_xIDs,h1,h2)
	{
		var sList=p_xIDs.join(",");
		var xRPC2=new PitRPC();
		xRPC2.m_iRoomID=iRoomID;
		xRPC2.m_iTopicID=iTopicID;
		xRPC2.m_hCtrlThis=h1;
		xRPC2.m_hCtrlScrl=h2;
//		xRPC2.m_xCtrl=xCtrl;
		xRPC2.m_sMethod="GET";
		xRPC2.m_bNoID=true;
		xRPC2.SetURL("/forum.xrq");
		xRPC2.SetFunction("GetMsgBody");
		xRPC2.SetParams("MsgIDs",""+sList);
		xRPC2.SetComplex(true);
		xRPC2.OnFail=function(){
		};
		xRPC2.OnSucceed=function(){
			PitPTOCtrlForum_CBUpdateMsgBody(xRPC2);
//			xThis.CBUpdateMsgBody(xRPC2);
		};
		xThis.m_xRPCQueue.Add(xRPC2);
	};
	xCtrl.SetAutoHeight();
	xCtrl.UpdateRect();
	this.m_xCtrlScroller.RefreshAttributes();

	var i,iC=axFetchList.length;
	for(i=0;i<iC;i+=500)
	{
		var xSubList=axFetchList.slice(i,i+500);
		FetchBodies(xSubList,this.m_hHnd,xCtrl.m_hHnd);
	};
	pit_Log("Msgs: ",axFetchList.length);
};

PitPTOCtrlForum.prototype.ReqUpdateTopic=function(p_iRoom,p_iTopicID,p_sTitle)
{
	var hThis=this.m_hHnd;
	var xRPC2=new PitRPC();

	var sTabID="t"+p_iTopicID;
	var iSI=this.FindTab(sTabID);
	var xTab=this.m_axTabs[iSI];
	var xCtrl=xTab.m_xCtrl;
	var xEl=xCtrl.MakeEl();
	pit_SetIH(xEl,"Loading...");
	
	xRPC2.m_iTopicID=p_iTopicID;
	xRPC2.m_sTopicTitle=p_sTitle;
	xRPC2.m_iRoomID=p_iRoom;
	xRPC2.SetURL("/forum.xrq");
	xRPC2.SetFunction("GetTopicMsgList");
	xRPC2.SetParams("TopicID",""+p_iTopicID);
	xRPC2.SetParams("Page","0");
	xRPC2.SetParams("PageLen","-1");
	xRPC2.SetParams("Bodies","0");
	xRPC2.OnFail=function(){
	}
	xRPC2.OnSucceed=function(){
		var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.UpdateTopic(xRPC2);};
	}
	this.m_xRPCQueue.Add(xRPC2);	
};

PitPTOCtrlForum.prototype.ShowTopic=function(p_iRoom,p_sID,p_sTitle)
{
	var sTabID="t"+p_sID;
	var iIdx=this.FindTab(sTabID);
	if(iIdx!=-1)
	{
		this.m_xTabCtrl.SetActiveTab(sTabID,false);
	}
	else
	{
		var sTabTitle=p_sTitle;
		if(sTabTitle.length>12)
		{
			sTabTitle=sTabTitle.substr(0,10)+"...";
		};
		this.m_xTabCtrl.AddSingleTab(sTabID,0,false,sTabTitle);
		var xR={};
		xR.m_iType=2;
		xR.m_iTopicID=p_sID;
		xR.m_sTabID=sTabID;
		xR.m_sTitle=p_sTitle;
		xR.m_iScroll=0;

		var xB;
		xB=new PitCtrlStatic(0,0,140,20,"");
		this.m_xCtrlScroller.AddChild(xB);
	//	xB.SetVisible(false);
		xB.MakeEl().style.fontSize=this.m_xStyleDef.FontSize+"px";
		xR.m_xCtrl=xB;
		
		this.m_axTabs.push(xR);
		this.m_xTabCtrl.SetActiveTab(sTabID,false);
		this.ReqUpdateTopic(p_iRoom,p_sID,p_sTitle);
	};
};

PitPTOCtrlForum.prototype.ShowUser=function(p_sNick)
{
};

PitPTOCtrlForum.prototype.MarkRead=function(p_iID)
{
	var hThis=this.m_hHnd;
	var xRPC2=new PitRPC();
	xRPC2.SetURL("/forum.xrq");
	xRPC2.SetFunction("MarkRoomAllRead");
	xRPC2.SetParams("RoomID",""+p_iID);
	xRPC2.OnFail=function(){
	}
	xRPC2.OnSucceed=function(){
		var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.ReqUpdateRoom(p_iID);};
	}
	this.m_xRPCQueue.Add(xRPC2);
};

PitPTOCtrlForum.prototype.UpdateRoom=function(p_xRPC)
{
//	pit_Log("Room update:",p_xRPC.m_sResultText);	
	var xD=p_xRPC.m_xResults;
	if(!xD){return;};
	var iSI=this.FindTab("r"+p_xRPC.m_iRoomID);
	var xTab=this.m_axTabs[iSI];
	var xCtrl=xTab.m_xCtrl;
	var xEl=xCtrl.MakeEl();
	var sTabTitle=xD.Title;
	xCtrl.m_bComplexDtor=true;
	if(sTabTitle.substr(0,1)=="_")
	{
		var sLocaTitle=g_L[sTabTitle];
		if(sLocaTitle)
		{
			sTabTitle=sLocaTitle;
		};
	};

	if(sTabTitle.length>12)
	{
		sTabTitle=sTabTitle.substr(0,10)+"...";
	};
	xTab.m_sTitle=xD.Title;
	this.m_xTabCtrl.SetTabText(xTab.m_sTabID,sTabTitle);
	this.UpdateTitle();
	var hThis=this.m_hHnd;
	pit_SetIH(xEl,"");

	var xStruct=new Array();

	if(this.m_sCurUser.length>0)
	{

		var xHeader=document.createElement("div");
		xHeader.style.width="100%";
		xHeader.style.height="28px";
	
		var xBtnNewThread=g_xPitTiles.BuildTextGButton("New Thread",this.m_xStyleDef.ButtonStyle,0,6,100,20,
		function(){
			var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.ShowNewMsg(p_xRPC.m_iRoomID,-1,-1);};
			});

		var xBtnMarkRead=g_xPitTiles.BuildTextGButton("Mark Read",this.m_xStyleDef.ButtonStyle,110,6,100,20,
		function(){
			var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.MarkRead(p_xRPC.m_iRoomID);};
			});

		xHeader.appendChild(xBtnNewThread);
		xHeader.appendChild(xBtnMarkRead);
	
		xStruct.push(
			{"prenode":xHeader}
		);
	};

	var xRowList=new Array();
	xRowList.push(
		{"tr":{"className":"cforum_TLh","subs":[
			{"th":{"text":"Title","className":"cforum_TLt"}},{"th":{"text":"#","width":"35px"}},
			{"th":{"text":"Last Post","width":"100px"}}
		]}}
	);
	var i,iC;
	var xInf;
	var sRClass="cforum_TLrowe";
	iC=Number(xD.TopicCount);
	var iStart=Number(xD.Start);
//	pit_Log("PageCnt ",iPageCnt," (",xData.TotalTopicCount," ",g_iForumTopicsPerPage,")");
//	pit_Log("Topics ",iStart," to ",iStart+iC);
	var xThis=this;
	var iRoom=p_xRPC.m_iRoomID;
	for(i=iStart;i<iStart+iC;i++)
	{
		xInf=xD["Topic_"+i];
		var xDS=new Date(Date.parse(xInf.TStart));
		var xDL=new Date(Date.parse(xInf.TLast));
		var axCont=new Array();
		
		var asIcons=new Array();
		if(xInf.Sticky)
		{
			asIcons.push("/images/icnFSticky.png");
		};
		if(xInf.Important)
		{
			asIcons.push("/images/icnFImportant.png");
		};
		if(xInf.Closed)
		{
			asIcons.push("/images/icnFLocked.png");
		};
		if(xInf.Read==0)
		{
			asIcons.push("/images/icnFUnread.png");
		};
		if(asIcons.length==0)
		{
			asIcons.push("/images/icnFStd.png");
		};
		for(iIcn in asIcons)
		{
			axCont.push({"iicon":asIcons[iIcn]});
		};
		
		/*
		if(Math.random()>0.7){sIcon="icnFHot";};
		if(Math.random()>0.7){sIcon="icnFVoting";};
		if(Math.random()>0.7){sIcon="icnFImportant";};
		if(Math.random()>0.7){sIcon="icnFMoved";};
		if(Math.random()>0.7){sIcon="icnFSticky";};
		if(Math.random()>0.7){sIcon="icnFLocked";};
		*/
		axCont.push(
					{a:{"text":"\u00a0"+xInf.Title,"href":"javascript:/**/",
						"onmouseup":function(id,title){return function(){
							var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.ShowTopic(iRoom,id,title);};
							return false;};}(xInf.ID,xInf.Title)
					}});
		xRowList.push(
			{"tr":{"className":sRClass,
				"subs":[
				{"td":{"className":"cforum_TLt",subs:axCont,
					"onmouseup":function(id,title){return function(){
						var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.ShowTopic(iRoom,id,title);};
						return false;};}(xInf.ID,xInf.Title)}},
				{"td":""+xInf.MsgCnt},
				{"td":{"className":"cforum_TLts",
					"subs":[
						{"a":{
						"text":xInf.LastBy,
						"href":"javascript:/**/",
						"onmouseup":function(nick){return function(){
							var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.ShowUser(nick);};
							return false;};}(xInf.LastBy)
						}},
						{"br":{}},
						{
							"text":" "+forum_FmtDT(xDL)
						}
					]
				}}
			]}}
		);
		if(sRClass=="cforum_TLrowe"){sRClass="cforum_TLrowo";}else{sRClass="cforum_TLrowe";};
	};
	xStruct.push(
		{"table":{"left":"0px","top":"26px","className":"cforum_TLtable","subs":[{"tbody":{"subs":xRowList}}] }}
	);
	pit_BuildEls(xStruct,xEl);	
	xEl.style.width="100%";
	xCtrl.SetAutoHeight();
	xCtrl.UpdateRect();
	this.m_xCtrlScroller.RefreshAttributes();
	this.ReqUpdateSiteMap();
};

PitPTOCtrlForum.prototype.ReqUpdateRoom=function(p_iRoomID)
{
	var xD=new Date();
	var iT=xD.getTime();
	if(this.m_iLastGetRoomTopicsR==p_iRoomID)
	{
		if(Math.abs(this.m_iLastGetRoomTopicsT-iT)<1000)
		{
			return;
		};
	};
	this.m_iLastGetRoomTopicsR=p_iRoomID;
	this.m_iLastGetRoomTopicsT=iT;

	var hThis=this.m_hHnd;
	var xRPC2=new PitRPC();
	xRPC2.SetURL(this.m_sRPCURL);
	xRPC2.SetFunction("GetRoomTopics");
	xRPC2.SetParams("RoomID",p_iRoomID);
	xRPC2.SetParams("Page",""+0);
	xRPC2.SetParams("PageLen",""+2000);
	xRPC2.m_sMethod="get";
	xRPC2.m_bNoID=true;
	xRPC2.m_iRoomID=p_iRoomID;
	xRPC2.OnFail=function(){
	};
	xRPC2.OnSucceed=function(){
		var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.UpdateRoom(xRPC2);};
	};
	this.m_xRPCQueue.Add(xRPC2);	
};

PitPTOCtrlForum.prototype.FindTab=function(p_sTabID)
{
	var i,iC=this.m_axTabs.length;
	for(i=0;i<iC;i++)
	{
		if(this.m_axTabs[i].m_sTabID==p_sTabID)
		{
			return i;
		};
	};
	return -1;
};

PitPTOCtrlForum.prototype.CloseRoom=function(p_iRoomID)
{
};

PitPTOCtrlForum.prototype.OpenRoom=function(p_iRoomID)
{
//	pit_Log("Open room ",p_iRoomID);
	var iIdx=this.FindTab("r"+p_iRoomID);
	if(iIdx!=-1)
	{
		this.m_xTabCtrl.SetActiveTab("r"+p_iRoomID,true);
	}
	else
	{
		this.m_xTabCtrl.AddSingleTab("r"+p_iRoomID,0,false,"Room "+p_iRoomID);
		var xR={};
		xR.m_iType=1;
		xR.m_iRoomID=p_iRoomID;
		xR.m_sTabID="r"+p_iRoomID;
		xR.m_sTitle="Room "+p_iRoomID;
		xR.m_iScroll=0;

		var xB;
		xB=new PitCtrlStatic(0,0,140,20,"");
		this.m_xCtrlScroller.AddChild(xB);
	//	xB.SetVisible(false);
		xB.MakeEl().style.fontSize=this.m_xStyleDef.FontSize+"px";
		xR.m_xCtrl=xB;
		
		this.m_axTabs.push(xR);
		this.m_xTabCtrl.SetActiveTab("r"+p_iRoomID,false);
		this.ReqUpdateRoom(p_iRoomID);
	};
};

PitPTOCtrlForum.prototype.CloseTab=function(p_sTabID)
{
	var iIdx=this.FindTab(p_sTabID);
	if(iIdx==-1){return;};
//		alert("Close Tab "+p_sTabID+" "+this.m_axTabs[iIdx].m_iType);
	if(this.m_axTabs[iIdx].m_iType==2)
	{
		var xE=this.m_axTabs[iIdx].m_xCtrl.GetEl();
		if(xE)
		{
			var xLast=xE.lastChild;
			if(xLast)
			{
				if(xLast.className=="forum_MLtable")
				{
					xLast.parentNode.removeChild(xLast);
				};
			};
		};
//		this.m_axTabs[iIdx].m_xCtrl.GetEl().innerHTML="";
	};
	this.m_axTabs[iIdx].m_xCtrl.DelFromParent();
	pit_Purge(this.m_axTabs[iIdx]);
	this.m_axTabs.splice(iIdx,1);
};

PitPTOCtrlForum.prototype.SwitchTab=function(p_sTabID)
{
	var i,iC;
//	pit_Log("ST ",p_sTabID);
	iC=this.m_axTabs.length;
	for(i=0;i<iC;i++)
	{
		var xT=this.m_axTabs[i];
		if(xT.m_sTabID!=p_sTabID)
		{
			xT.m_xCtrl.SetVisible(false);
		};
	};
	var bFound=false;
	for(i=0;i<iC;i++)
	{
		var xT=this.m_axTabs[i];
		if(xT.m_sTabID==p_sTabID)
		{
			xT.m_xCtrl.SetVisible(true);
			this.m_xCtrlScroller.RefreshAttributes();
			this.m_xCtrlScroller.SetScrollPos(xT.m_iScroll,true);		
			bFound=true;
			if(xT.m_iType==1)
			{
				this.ReqUpdateRoom(xT.m_iRoomID);
			};
		};
	};
	if(!bFound){
		var sK="";
		for(i=0;i<iC;i++)
		{
			sK+=" "+this.m_axTabs[i].m_sTabID;
		};
		pit_Log("Unknown tab ",p_sTabID,":",sK);
	};
	this.UpdateTitle();
};

PitPTOCtrlForum.prototype.InitialUpdate=function()
{
	this.m_xTabCtrl=new PitCtrlTab(10,10,500,this.m_xStyleDef.TabStyle);
	this.m_xTabCtrl.m_iCloseTabs=1;
	this.AddChild(this.m_xTabCtrl);
	this.m_xTabCtrl.AddSingleTab("sm",0,true,"Rooms");	

	var xThis=this;

	this.m_xTabCtrl.m_xOnTabClose=function(p_sID){xThis.CloseTab(p_sID);};
	this.m_xTabCtrl.m_xOnTabActivate=function(p_sID){xThis.SwitchTab(p_sID);};
	this.m_xTabCtrl.m_xOnTabDeactivate=function(p_sID){
		var iIdx=xThis.FindTab(p_sID);
		if(iIdx!=-1){xThis.m_axTabs[iIdx].m_iScroll=xThis.m_xCtrlScroller.GetScrollPos();};
	};

	this.m_xCtrlScroller=new PitCtrlScrollPanel(this.m_xStyleDef.ScrollStyle,10,60,200,200,"",0,"",1);
	
	this.AddChild(this.m_xCtrlScroller);

	var xR={};
	xR.m_iType=0;
	xR.m_sTabID="sm";
	xR.m_sTitle="Rooms";
	xR.m_iScroll=0;

	var xB;
	xB=new PitCtrlStatic(0,0,140,20,"Rooms");
	this.m_xCtrlScroller.AddChild(xB);
//	xB.SetVisible(false);
	xB.MakeEl().style.fontSize=this.m_xStyleDef.FontSize+"px";
	xR.m_xCtrl=xB;
	this.m_axTabs.push(xR);
	
	this.UpdateLayout();
	this.ReqUpdateSiteMap();
	this.UpdateTitle();
	this.m_xTabCtrl.SetActiveTab("sm");

	var xThis=this;
	var xUser=new PitRPC();
	xUser.SetURL("/userauth.xrq");
	xUser.SetFunction("getuser");
	xUser.OnSucceed=function() {
		var p_sUserName=xUser.m_xResults.Name;		
		xThis.m_iCurUserType=-1;
		if(p_sUserName&&p_sUserName.length)
		{
			xThis.m_iCurUserType=xUser.m_xResults.Type;
		}
		else
		{
			p_sUserName="";
		};
		xThis.m_sCurUser=p_sUserName;
	};
	this.m_xRPCQueue.Add(xUser);
};


function PitPTOCtrlNews(p_iX,p_iY,p_iW,p_iH,p_sTitle)
{
	PitPTOCtrlNews.BaseCtor.call(this,p_iX,p_iY,p_iW,p_iH,p_sTitle);
	this.m_sTagName="div";
	if(!p_iX){p_iX=0;};
	if(!p_iY){p_iY=0;};
	if(!p_iW){p_iW=100;};
	if(!p_iH){p_iH=100;};
	this.m_iX=p_iX;
	this.m_iY=p_iY;
	this.m_iW=p_iW;
	this.m_iH=p_iH;

//	this.AddTopLevelBehaviour(true,true);
	this.m_sBaseDir="/news/";
	this.m_sIndexFile="/news/index.txt";
	
	this.m_xCtrlScroller=null;
	this.m_xContent=null;

	this.m_sTitle="";
	this.m_sCurrentFile="_";
	
	this.m_xStyleDef.TabStyle="tabSimple";
	this.m_xStyleDef.ScrollStyle="scrSimple";
	this.m_xStyleDef.FontSize=12;
	this.AddStyles(g_xPitStyleDef.PitPTOCtrlNews);

	this.m_axArticles=[];
	this.m_asArticles=[];
	this.m_iIdxStart=0;
	this.m_iNumVisArticles=20;
};
Inherit(PitPTOCtrlNews,PitCtrlTopLevel,"PitPTOCtrlNews");

PitPTOCtrlNews.prototype.OnResize=function()
{
	this.GetCurRect();
	this.UpdateLayout();
	PitPTOCtrlNews.Super.OnResize.call(this);
	this.RefreshFrame();
};

PitPTOCtrlNews.prototype.UpdateLayout=function()
{
	var xR=this.GetContentRect();
	xR.m_iX+=2;xR.m_iY+=2;xR.m_iW-=4;xR.m_iH-=4;
	var iTH=24;
	this.m_xContent.SetSize(this.m_iW-42,this.m_xContent.m_iH);
	this.m_xContent.RefreshAttributes();
	
	this.m_xCtrlScroller.SetRect(4,iTH+2,xR.m_iW,xR.m_iH-6-24)
	this.m_xCtrlScroller.RefreshAttributes();
};

PitPTOCtrlNews.prototype.RefreshAttributes=function()
{
	PitPTOCtrlNews.Super.RefreshAttributes.call(this);
	if(!this.m_xCtrlScroller)
	{
		this.InitialUpdate();
	};
//	this.m_xTabs.RefreshAttributes();
};

PitPTOCtrlNews.prototype.RefreshArticleList=function()
{
	var hThis=this.m_hHnd;
	var xRPC=new PitRPC();
	xRPC.m_sMethod="get";
	xRPC.m_bNoJSONResult=true;
	xRPC.SetURL(this.m_sIndexFile);
	xRPC.OnSucceed=function() {
		var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){
			xThis.m_axArticles=[];
			xThis.m_asArticles=[];
			var sText=xRPC.m_sResultText;
			var asLines=sText.split("\r\n");
			xThis.m_asArticles=asLines;
			var i,iC=asLines.length;
			var sLine;
			var asFields;
			var xAInfo;
			var axRPCs=[];

			var iMax=Math.floor(asLines.length/xThis.m_iNumVisArticles)*xThis.m_iNumVisArticles;			
			if(xThis.m_iIdxStart<0) {xThis.m_iIdxStart=0;};
			if(xThis.m_iIdxStart>iMax) {xThis.m_iIdxStart=iMax;};
			
			if(xThis.m_iIdxStart==iMax) {xThis.m_xBtnNext.style.visibility="hidden";} else {xThis.m_xBtnNext.style.visibility="";};
			if(xThis.m_iIdxStart==0) {xThis.m_xBtnPrev.style.visibility="hidden";} else {xThis.m_xBtnPrev.style.visibility="";};
			
			var iS=xThis.m_iIdxStart;
			iC=xThis.m_iNumVisArticles;
			
			for(i=0;i<iC;i++)
			{
				if(iS+i>=asLines.length) {break;};
				sLine=asLines[iS+i];
				asFields=sLine.split(",");
				if(asFields.length==3)
				{
					xAInfo={"Date":asFields[0],"Author":asFields[1],"File":asFields[2],"Short":0,"Long":0};
					xThis.m_axArticles.push(xAInfo);
					var xRPC2=new PitRPC();
					xRPC2.m_bNoJSONResult=true;
					xRPC2.m_bNoID=true;
					xRPC2.m_sMethod="get";
					xRPC2.SetURL(xThis.m_sBaseDir+"$"+g_L._LID+"$"+xAInfo.File+"_s.bbc");
					xRPC2.m_sNewsFile=xAInfo.File;
					xRPC2.OnFail=function()
					{
						var xNBox=g_xPitBoxes.GetBox(hThis);
						if(xNBox)
						{
							var j,jC=xNBox.m_axArticles.length;
							for(j=0;j<jC;j++)
							{
								if(xNBox.m_axArticles[j].File==this.m_sNewsFile)
								{
									xNBox.m_axArticles[j].Short="Article missing";
									xNBox.OnShortFetchDone();
									j=jC;
								};
							};
						};
					};
					xRPC2.OnSucceed=function()
					{
						var xNBox=g_xPitBoxes.GetBox(hThis);
						if(xNBox)
						{
							var j,jC=xNBox.m_axArticles.length;
							for(j=0;j<jC;j++)
							{
								if(xNBox.m_axArticles[j].File==this.m_sNewsFile)
								{
									xNBox.m_axArticles[j].Short=this.m_sResultText;
									xNBox.OnShortFetchDone();
									j=jC;
								};
							};
						};
					};
					axRPCs.push(xRPC2);
				};
			};
			iC=axRPCs.length;
			for(i=0;i<iC;i++)
			{
				axRPCs[i].Send();
			};
		};
	};
	xRPC.Send();
};

PitPTOCtrlNews.prototype.OnShortFetchDone=function()
{
	var i,iC=this.m_axArticles.length;
	for(i=0;i<iC;i++)
	{
		if(this.m_axArticles[i].Short===0)
		{
			return;
		};
	};
	if(this.m_sCurrentFile=="_")
	{
		this.GotoArticle("");
	};
};

PitPTOCtrlNews.prototype.InitialUpdate=function()
{
	this.m_xCtrlScroller=new PitCtrlScrollPanel(this.m_xStyleDef.ScrollStyle,10,40,this.m_iW-30,this.m_iH-70,"",0,"",1);
	this.AddChild(this.m_xCtrlScroller);
	this.m_xContent=new PitCtrlPanel(0,0,this.m_iW-42,2);	
	this.m_xContent.m_sTagClass="ptonews";
	this.m_xCtrlScroller.AddChild(this.m_xContent);
	this.UpdateLayout();

	var hThis=this.m_hHnd;
	var xEl=this.MakeEl();
	xEl.appendChild(g_xPitTiles.BuildTextGButton(g_L.pto_lbl_news_index,this.m_xStyleDef.ButtonStyle,10,30,160,20,
		function(){
			var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){
					xThis.m_sCurrentFile="_";
					xThis.m_iIdxStart=0;
					xThis.RefreshArticleList();
				};
			}));

	this.m_xBtnPrev=xEl.appendChild(g_xPitTiles.BuildTextGButton("&lt;"+g_L.pto_lbl_news_prev,this.m_xStyleDef.ButtonStyle,180,30,70,20,
		function(){
			var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){
					xThis.m_sCurrentFile="_";
					xThis.m_iIdxStart-=xThis.m_iNumVisArticles;
					xThis.RefreshArticleList();
				};
			}));
	this.m_xBtnNext=xEl.appendChild(g_xPitTiles.BuildTextGButton(g_L.pto_lbl_news_next+"&gt;",this.m_xStyleDef.ButtonStyle,250,30,70,20,
		function(){
			var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){
					xThis.m_sCurrentFile="_";
					xThis.m_iIdxStart+=xThis.m_iNumVisArticles;
					xThis.RefreshArticleList();
				};
			}));

	this.RefreshArticleList();
	this.UpdateTick();
	
	if(g_xURLParameters.HasParam("article"))
	{
		var sArt=g_xURLParameters.GetParamValue("article");
		this.GotoArticle(sArt);
	};
};

PitPTOCtrlNews.prototype.UpdateTick=function()
{
	var xE=this.m_xContent.GetEl();
	if(xE)
	{
		var iH=xE.offsetHeight;
		if(iH!=this.m_xContent.m_iH)
		{
			this.m_xContent.m_iH=iH;
			this.m_xCtrlScroller.RefreshAttributes();
		};
	};
	var hThis=this.m_hHnd;
	window.setTimeout(function(){var xThis=g_xPitBoxes.GetBox(hThis);if(xThis){xThis.UpdateTick();};},200);
};


PitPTOCtrlNews.prototype.SetContentText=function(p_sText)
{
	this.m_xContent.SetSize(this.m_xContent.m_iW,0);
	this.m_xContent.MakeEl().innerHTML=p_sText;
	//this.m_xContent.SetAutoHeight();
	this.m_xContent.MakeEl().style.height="auto";
	this.m_xContent.UpdateRect();
	this.m_xCtrlScroller.SetScrollPos(0);
	this.m_xCtrlScroller.RefreshAttributes();
	var hThis=this.m_hHnd;
};

function PitPTOCtrlNews_HelperFnc(p_hHnd,p_sFile)
{
	var xThis=g_xPitBoxes.GetBox(p_hHnd);
	if(xThis)
	{
		xThis.GotoArticle(p_sFile);
	};	
};

PitPTOCtrlNews.prototype.GotoArticle=function(p_sFile)
{
	pit_Log("goto:"+p_sFile);
	if(p_sFile==this.m_sCurrentFile){return;};
	if(!this.m_xCtrlScroller){
		var hThis=this.m_hHnd;
		window.setTimeout(function(){
			var xThis=g_xPitBoxes.GetBox(hThis);
			if(xThis)
			{
				xThis.GotoArticle(p_sFile);
			};
		},5);
		return;
	};
	this.m_sCurrentFile=p_sFile;
	if(this.m_sCurrentFile!="")
	{
		var hThis=this.m_hHnd;
		var xRPC=new PitRPC();
		xRPC.m_sMethod="get";
		xRPC.m_bNoID=true;
		xRPC.m_bNoJSONResult=true;
		xRPC.m_sNewsFile=this.m_sCurrentFile;
		xRPC.SetURL(this.m_sBaseDir+"$"+g_L._LID+"$"+this.m_sCurrentFile+"_l.bbc");
		xRPC.OnSucceed=function() {
			var xThis=g_xPitBoxes.GetBox(hThis);
			if(xThis)
			{
				var sPrefix="";
				var i,iC=xThis.m_axArticles.length;
				for(i=0;i<iC;i++)
				{
					if(xThis.m_axArticles[i].File==xRPC.m_sNewsFile)
					{
						sPrefix=xThis.m_axArticles[i].Date+" "+xThis.m_axArticles[i].Author+"<br><br>";
					};
				};
				xThis.SetContentText(sPrefix+xRPC.m_sResultText);
			};
		};
		xRPC.Send();
	}
	else
	{
		var xSB=new PitStringBuilder();
		var i,iC=this.m_axArticles.length;
		var sDivClass="ptonews_short";
		var sCntClass="ptonews_shortc";
		for(i=0;i<iC;i++)
		{
			var xA=this.m_axArticles[i];
			var sCol=this.m_xStyleDef.IndexEvenBG;
			if(i&1){sCol=this.m_xStyleDef.IndexOddBG;};
			if(i==8){sDivClass="ptonews_short2";sCntClass="ptonews_shortc2";};
			xSB.Add("<div class='",sCntClass,"' style='background-color:",sCol,"'>",xA.Author," ",xA.Date,"<br><div class='",sDivClass,"'>",xA.Short,"</div>",
			"<a class='ptonews_shortmore' href=\"javascript:PitPTOCtrlNews_HelperFnc(",this.m_hHnd,",'",xA.File,"')\">",g_L.pto_lbl_news_more,"</a></div>");
			if(i<iC-1)
			{
		//		xSB.Add("<div class='ptonews_delim'></div>");
			};
		};
		this.SetContentText(xSB.GetString());
	};
};

pit_ScriptDone("/pit/pitptoctrl.js");

