﻿function Forum(forumId,header,forumStatus,userAuthorizedRead,userAuthorizedWrite,admin) {
	var t=this;

	this.ForumId=forumId;
	this.Header=header;
	this.ForumStatus=forumStatus;
	this.UserAuthorizedRead=userAuthorizedRead;
	this.UserAuthorizedWrite=userAuthorizedWrite;
	this.Admin=admin;

	this.Messages=[];
	this.Messages.Add=function (fm) {
		fm.Forum=t;
		this.push(fm);
		t.ById[fm.MessageId]=fm;
		t.Texts[fm.MessageId]=fm.Body;
	};
	this.ById={};
	this.Elements={};
	this.Texts={};
}
function ForumMessage(messageId,rootMessageId,parentMessageId,messageDate,subject,body,username/*,email*/,active) {
	this.MessageId=messageId;
	this.RootMessageId=rootMessageId;
	this.ParentMessageId=parentMessageId;
	this.MessageDate=messageDate || new Date();
	this.Subject=subject;
	this.Body=body;
	this.UserName=username;
	//this.Email=email;
	this.Active=active;
	this.Elements={};
	this.Forum=ForumMessage.Forum;

	this.Messages=[];
}
ForumMessage.prototype.IsParentMessage=function () {
	return this.ParentMessageId==0;
};
ForumMessage.prototype.CreateElement=function () {
	var t=this;

	var msg=_("div",null,{ className:"msg" }),
		cont=_("div",msg,{ className:"cont" }),
		details=_("div",cont,{ className:"details" });

	//.setStyle({"border":"1px solid #000"});
	if (!t.IsParentMessage()) msg.hide();

	// date	
	_("div",details,{ className:"date" }).innerHTML=this.MessageDate.Format(Mantis.Reut.Client.Language.Definitions["clientdateformat"]+" h:I");
	// username
	_("div",details,{ className:"user" }).innerHTML=this.UserName || "&nbsp;";
	// replies
	this._repliesElement=_("div",details,{ className:"replies" });

	if (this.Forum.Admin) {
		// delete
		var del=_("div",details,{ className:"action delete" });
		del.innerHTML="["+Mantis.Reut.Client.Language.GetString("forum_msg_delete")+"]";
		del.onclick=function () {
			if (confirm("Are you sure?")) t.Delete();
		};
		// active
		var active=_("div",details,{ className:"action active" });
		if (!this.Active) msg.addClassName("inactive");
		active.innerHTML="["+(this.Active ? Mantis.Reut.Client.Language.GetString("forum_msg_deactivate") : Mantis.Reut.Client.Language.GetString("forum_msg_activate"))+"]";
		active.onclick=function () {
			t.SetActive(!t.Active);
		};
		
		del.makeLink();
		active.makeLink();
	}
	
	// subject
	var subject=_("a",_("div",details,{ className:"subject" }));
	subject.innerHTML=this.Subject;
	subject.makeLink();
	subject.onclick=function () {
		t.Toggle();
	};

	var body=_("div",details,{ className:"body" });
	body.hide();
	_("div",body).innerHTML=addLinks(this.Body);

	this.Elements.Msg=msg;
	this.Elements.Details=details;
	this.Elements.Body=body;
	this.Element=msg;

	this.Forum.Elements[this.MessageId]=msg;
};
ForumMessage.prototype.SetActive=function (active) {
	var t=this;
	Mantis.Reut.Code.DAL.AjaxForumSetMessageActive(
		this.MessageId,
		active,
		function () {
			t.Forum.LoadMessages(t.Forum.PagedSetData.PageIndex);
		}
	);
};
ForumMessage.prototype.Delete=function () {
	var t=this;
	Mantis.Reut.Code.DAL.AjaxForumDelMessage(
		this.MessageId,
		function () {
			t.Forum.LoadMessages(t.Forum.PagedSetData.PageIndex);
		}
	);
};
ForumMessage.prototype.Toggle=function () {
	if (!this.Clicked) {
		this.CreateLinks();
		this.Elements.Body.appendChild(this.Elements.Links);
		this.Clicked=true;
	}
	this.Elements.Body.toggle();
	var visible=this.Elements.Body.visible();
	this.Elements.Msg[(visible ? "add" : "remove")+"ClassName"]("opened");
	this.Element.getElementsByClassName("msg").each(function (sub) { if (visible) sub.show(); else sub.hide(); });
};
ForumMessage.prototype.CreateLinks=function () {
	var t=this;

	var links=_("div",null,{ className:"links" });

	var close=_("a",links,{ className:"close" });
	close.innerHTML=Mantis.Reut.Client.Language.GetString("forum_msg_close");
	close.makeLink();
	close.onclick=function () { t.Toggle(); };

	var add=_("a",links,{ className:"add" });
	add.innerHTML=Mantis.Reut.Client.Language.GetString("forum_msg_add");
	add.makeLink();
	add.onclick=function () { t.Reply(); };

	/*var print=_("a",links,{ className:"print" });
	print.innerHTML=Mantis.Reut.Client.Language.GetString("forum_msg_print");
	print.makeLink();
	print.onclick=function () { t.OpenPrint(); };*/

	this.Elements.Links=links;
};
ForumMessage.prototype.Reply=function () {
	this.Forum.AddMessage(this.MessageId);
};
ForumMessage.prototype.OpenPrint=function () {
	var printWin=open("Print.aspx","printMessage_"+this.MessageId,"width=400,height=400");
	printWin.document.onload=function () {
		printWin.$("forumName").innerHTML=this.Forum.Header;
		printWin.$("date").innerHTML=this.MessageDate.Format(Mantis.Reut.Client.Language.Definitions["clientdateformat"]+" h:I");
		printWin.$("user").innerHTML=this.User;
		printWin.$("subject").innerHTML=this.Subject;
		printWin.$("body").innerHTML=this.Body;
		printWin.print();
	}
};
ForumMessage.prototype.SetRepliesNumber=function () {
	if (this.IsParentMessage()) {
		var replies=this.Element.getElementsByClassName("msg").length;
		this._repliesElement.innerHTML="("+replies+" "+Mantis.Reut.Client.Language.GetString("forum_msg_replies")+")";
	}
};
Forum.prototype.Init=function () {
	var t=this;

	if ($("forumMessageHeader")) $("forumMessageHeader").innerHTML=this.Header;
	if ($("forumAddMessage")) {
		$("forumAddMessage").makeLink();
		$("forumAddMessage").onclick=function () { t.AddMessage(); };
	}
};
Forum.prototype.Print=function () {
	$("forum").innerHTML="";
	
	var t=this;

	var elements=this.Elements;
	this.Messages.each(function (fm) { fm.CreateElement(); });

	elements[0]=$("forum");

	t.Messages.each(function (fm) {
		elements[fm.ParentMessageId || 0].appendChild(elements[fm.MessageId]);
	});

	this.Messages.each(function (fm) { fm.SetRepliesNumber(); });

	this.PrintPaging();
};
Forum.prototype.AddMessage=function (messageId) {
	var notAuthReason="";
	switch (this.ForumStatus) {
		case Mantis.Reut.Components.ForumStatus.OpenToAll:
			break;
	
		case Mantis.Reut.Components.ForumStatus.OnlyMembers:
			break;
	
		case Mantis.Reut.Components.ForumStatus.OnlyInvited:
			break;
	}

	if (!this.UserAuthorizedWrite) return Site.ProtectAnonymous(true,"Forum");

	if (!this.AddMessageInitiated) this.AddMessageInit();
	var t=this;
	$("forumMessageSend").onclick=function () {
		t.AddMessageSend(messageId);
	}
	$("addMessage").style.top=(document.documentElement.scrollTop+100)+"px";
	setTimeout(function () { $("addMessage").removeClassName("hidden"); },1);
	setTimeout(function () { $("addMessage").addClassName("hidden"); },2);
	setTimeout(function () { $("addMessage").removeClassName("hidden"); },3);
	$("addMessage").removeClassName("hidden");
	$("forumMessageSubject").onkeydown=function sendOnEnter(e) {
		e=e || event;
		if (e.keyCode==Event.KEY_RETURN) Event.stop(e);
	}
};
Forum.prototype.AddMessageInit=function () {
	var t=this;

	$("forumMessageClose").onclick=function () {
		$("addMessage").addClassName("hidden");
	};

	//$("forumMessageSend").makeLink();
};
Forum.prototype.AddMessageValidate=function () {
	if (!$("forumMessageSubject").value) {
		alert(Mantis.Reut.Client.Language.GetString("forum_msg_valid_subject"));
		return false;
	}
	return true;
};
Forum.prototype.AddMessageSend=function (messageId) {
	if (!this.AddMessageValidate()) return;
	
	if (this.CurrentlySending) return;
	
	this.CurrentlySending=true;

	var t=this;
	
	//$("forumMessageSend").innerHTML=Mantis.Reut.Client.Language.GetString("forum_msg_sending")+"...";
	
	var username=$("forumMessageUserName") ? $("forumMessageUserName").value : "",
		email=$("forumMessageEmail") ? $("forumMessageEmail").value : "";

	Mantis.Reut.Code.DAL.AjaxForumInsertMessage(
		this.ForumId,
		messageId || 0,
		$("forumMessageSubject").value,
		$("forumMessageBody").value,
		username,
		email,
		function (res) {
			t.LoadMessages();

			$("addMessage").addClassName("hidden");
			$("forumMessageSubject").value="";
			$("forumMessageBody").value="";
			//$("forumMessageSend").innerHTML=Mantis.Reut.Client.Language.GetString("forum_msg_send");

			t.CurrentlySending=false;
		}
	);
};
Forum.prototype.LoadMessages=function (page) {
	this.Messages.length=0;
	var script=document.createElement("script");
	script.defer=true;
	script.type="text/javascript";
	script.src="ForumMessages.ashx?ForumId="+this.ForumId+"&Page="+(page || 1)+"&Rnd="+new Date().getTime();
	//location.href="ForumMessages.ashx?ForumId="+this.ForumId+"&Page="+(page || 1);
	document.getElementsByTagName("head")[0].appendChild(script);
};
Forum.prototype.PrintPaging=function () {
	if (!this.UserAuthorizedRead) return;

	var psd=this.PagedSetData;

	var t=this;

	var paging=new Paging(
		psd.TotalPages || 1,
		psd.PageIndex,
		function loadFunction(newPage) {
			t.LoadMessages(newPage);
		},
		"#ForumId="+this.ForumId+"&Page="
	);

	$("paging").innerHTML="";
	paging.Print($("paging"));
};

var loaded=false;

Forum.prototype.Load=function (firstLoad) {
	var t=this;

	if (loaded) {
		if (firstLoad) this.Init();
		this.Print();
	}
};
$dl(function () {
	if ($("mapflash")) $("rules").setStyle({"margin-top":"270px"});
	loaded=true;
	if (window.forum instanceof Forum) forum.Load(true);

	new Draggable("addMessage",{handle:$("addMessage").getElementsByTagName("h3")[0]});
});
function addLinks(s) {
	return (s||"").replace(/(?:^|\b)(http:\/\/|www\.)([^\s<>]+)/g,"<a target=\"_blank\" href=\"http://$2\">$1$2</a>");
};
