var BlogRenderer = {
	ArticleListRenderer: {
		render: function() {
			if (BlogRenderer.Settings.timer3 == null && BlogRenderer.Settings.stage == null) {
				var article = new WordPress.Article();
				BlogRenderer.Settings.result3 = null;
				article.list("BlogRenderer.Settings.result3");
				BlogRenderer.Settings.timer3 = setInterval("BlogRenderer.ArticleListRenderer.render()", 500);
				$(BlogRenderer.Settings.ajaxLoaderContainerID).style.display = "block";
			}
			if (BlogRenderer.Settings.result3 === null && BlogRenderer.Settings.stage == null) {
				return;
			} else if (BlogRenderer.Settings.stage == 1) {
				var allDone = true;
				for(var i = 0; i < this.articles.length; i++) {
					if (this.articles[i].content == null) {
						allDone = false;
						break;
					}
				}
				if (allDone == false) {
					return;
				}
			}
			clearInterval(BlogRenderer.Settings.timer3);
			if (BlogRenderer.Settings.stage != 1) {
				BlogRenderer.Settings.stage = 1;
				this.articles = BlogRenderer.Settings.result3;
				for(i = 0; i < this.articles.length; i++) {
					this.articles[i].getContent(0, "BlogRenderer.ArticleListRenderer.articles[" + i + "].content");
				}
				BlogRenderer.Settings.timer3 = setInterval("BlogRenderer.ArticleListRenderer.render()", 500);
				return;
			}
			BlogRenderer.Settings.timer3 = null;
			BlogRenderer.Settings.stage = null;
			
			if ($(BlogRenderer.Settings.articlesListContainerID)) {
				var text = '<table id="topicsTable" cellpadding="0" cellspacing="0" border="0">';
				text += "<thead><tr align=\"center\"><th class=\"topicsLeftDomain\">Forum Topic</th><th>Last Post</th><th>Posts</th></tr></thead>";
				text += "<tbody>";
				var css = {td: "", tr: ""};
				for(i = 0; i < this.articles.length; i++) {
					if (i == this.articles.length - 1) {
						css["td"] = "topicsBottomDomain";
					}
					if (i % 2) {
						css["tr"] = "even";
					} else {
						css["tr"] = "";
					}
					if (this.articles[i].content["comments"] && this.articles[i].content["comments"].length > 0) {
						this.articles[i].posts += this.articles[i].content["comments"].length;
						this.articles[i].lastPost = '<a href="##" onclick="BlogRenderer.ContentRenderer.render(' + i + ', 999, 0);">' +
							'Last post</a>' + 	"<br />by " +
							this.articles[i].content["comments"][this.articles[i].content["comments"].length-1].nick +
							"<br />" +
							this.articles[i].content["comments"][this.articles[i].content["comments"].length-1].date;
					}
					if (this.articles[i].content["article"]) {
						this.articles[i].posts++;
						if (this.articles[i].lastPost == "No posts") {
							this.articles[i].lastPost = '<a href="##" onclick="BlogRenderer.ContentRenderer.render(' + i + ', 0, 0);">' +
								'Topic created</a>' + 	"<br />by " +
								this.articles[i].author + "<br />" + this.articles[i].date;
						}
					}
					text += '<tr class="' + css["tr"] + '"><td class="topicsLeftDomain ' + css["td"] + '">' +
						"<a href=\"##\" onclick=\"BlogRenderer.ContentRenderer.render(" + i + ", 0, 0);\">"
						+ this.articles[i].name + "</a>" + '</td><td>' + this.articles[i].lastPost +
						'</td><td>' + this.articles[i].posts + '</td></tr>';
				}
				text += "</tbody></table>";
				$(BlogRenderer.Settings.articlesListContainerID).innerHTML = text;

				/*$(BlogRenderer.Settings.articlesListContainerID).innerHTML = "<strong>Forum topics</strong><br />";
				for(var i = 0; i < this.articles.length; i++) {
					$(BlogRenderer.Settings.articlesListContainerID).innerHTML +=
						"<a href=\"##\" onclick=\"BlogRenderer.ContentRenderer.render(" + i + ", 0);\">"
						+ this.articles[i].name + "</a>";
					if (i < this.articles.length - 1) {
						$(BlogRenderer.Settings.articlesListContainerID).innerHTML += "<br /><br />";
					}
				}*/
			}
			$(BlogRenderer.Settings.ajaxLoaderContainerID).style.display = "none";
		}
	},
	ContentRenderer: {
		render: function(articleNumber, page, update) {
			if (BlogRenderer.Settings.timer == null) {
				$(BlogRenderer.Settings.ajaxLoaderContainerID).style.display = "block";
				$(BlogRenderer.Settings.wholeArticlesListContainerID).style.display = "none";
				BlogRenderer.ArticleListRenderer.articles[articleNumber].getContent(update, "BlogRenderer.Settings.result");
				BlogRenderer.Settings.timer = setInterval("BlogRenderer.ContentRenderer.render(0, 0, 0)", 100);
				BlogRenderer.Settings.params = {articleNumber: articleNumber, page: page, update: update};
				BlogRenderer.Settings.result = null;
			}
			if (BlogRenderer.Settings.result === null) {
				return;
			}
			clearInterval(BlogRenderer.Settings.timer);
			BlogRenderer.Settings.timer = null;

			BlogRenderer.ArticleListRenderer.currentArticle = BlogRenderer.Settings.params.articleNumber;
			if (BlogRenderer.Settings.result['article'] != null) {
				$(BlogRenderer.Settings.contentContainerID).innerHTML = BlogRenderer.Settings.result['article'];
			}
			// Parse comments
			var location = "";
			if (BlogRenderer.Settings.params.page == 0) {
				location = "articleName";
			}
			if (BlogRenderer.Settings.result['comments'].length > 0) {
				if (BlogRenderer.Settings.params.update) {
					BlogRenderer.ArticleListRenderer.render();
				}
				var text = new Array();
				var j = 0;
				text[j] = $(BlogRenderer.Settings.contentContainerID).innerHTML;
				text[j] += '<div class="page_head" style="text-align: center;">Comments</div>';
				text[j] += "<ul style=\"list-style: none; padding: 20px 0;\">";
				for(var i = 1; i <= BlogRenderer.Settings.result['comments'].length; i++) {
					text[j] += "<li class=\"forumComment\" id=\"comment-" + i + "\">\
					<table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" class=\"commentTable\"><tbody>\
						<tr>\
							<td colspan=\"2\" class=\"commentHeader\">\
								" + BlogRenderer.Settings.result['comments'][i-1]["date"] + "\
							</td>\
						</tr>";
					text[j] += "<tr>\
							<td class=\"commentInfo\">\
								" + BlogRenderer.Settings.result['comments'][i-1]["avatar"] + "\
								<br />\
								" + BlogRenderer.Settings.result['comments'][i-1]["nick"] + "\
								<br />\
								<br />\
								" + BlogRenderer.Settings.result['comments'][i-1]["info"] + "\
							</td>\
							<td class=\"commentText\">\
								" + BlogRenderer.Settings.result['comments'][i-1]["text"] + "\
							</td>\
						</tr>";
					text[j] += "</tbody></table></li>";
					if (i % BlogRenderer.Settings.contentDivision == 0) {
						text[j] += "</ul>";
						j++;
						if (i < BlogRenderer.Settings.result['comments'].length) {
							text[j] = "<ul style=\"list-style: none; padding: 0;\">";
						}
					} else if (i == BlogRenderer.Settings.result['comments'].length) {
						text[j] += "</ul>";
						j++;
					}
				}
				if (BlogRenderer.Settings.params.page >= text.length) {
					BlogRenderer.Settings.params.page = text.length - 1;
					location = "comment-" + (i-1);
				}
				$(BlogRenderer.Settings.contentContainerID).innerHTML = text[BlogRenderer.Settings.params.page];
				// Generate pages links
				BlogRenderer.Settings.currentPage = BlogRenderer.Settings.params.page;
				var pages = "Page " + (BlogRenderer.Settings.params.page+1) + " of " + j;
				pages += " (" + (i-1) + " comments) ";
				if (j >= 1) {
					if (BlogRenderer.Settings.params.page > Math.floor(BlogRenderer.Settings.pagesLinks/2)) {
						pages += "<a href=\"##\" onclick=\"BlogRenderer.ContentRenderer.render(" + 
							BlogRenderer.ArticleListRenderer.currentArticle + ", 0)\">&laquo;&nbsp;First</a> ";
						pages += "&hellip; ";
					}
					if (BlogRenderer.Settings.params.page > 0) {
						pages += "<a href=\"##\" onclick=\"BlogRenderer.ContentRenderer.render(" +
						BlogRenderer.ArticleListRenderer.currentArticle + ", " + (BlogRenderer.Settings.params.page-1) + ")\">" +
							"&lt;&nbsp;Previous</a> ";
					}
					var pageNumber = BlogRenderer.Settings.params.page - Math.floor(BlogRenderer.Settings.pagesLinks/2) + 1;
					if (pageNumber <= 0) {
						pageNumber = 1;
					}
					for (var m = 0; m < BlogRenderer.Settings.pagesLinks && m < j; m++, pageNumber++) {
						if (pageNumber == BlogRenderer.Settings.params.page + 1) {
							pages += pageNumber + " ";
							continue;
						}
						pages += "<a href=\"##\" onclick=\"BlogRenderer.ContentRenderer.render(" +
						BlogRenderer.ArticleListRenderer.currentArticle + ", " + (pageNumber-1) + ")\">" +
							pageNumber + "</a> ";
					}
					if (BlogRenderer.Settings.params.page < j - 1) {
						pages += "<a href=\"##\" onclick=\"BlogRenderer.ContentRenderer.render(" + 
						BlogRenderer.ArticleListRenderer.currentArticle + ", " + (BlogRenderer.Settings.params.page+1) + ")\">" +
							"Next&nbsp;&gt;</a> ";
					}
					if (BlogRenderer.Settings.params.page < j - Math.ceil(BlogRenderer.Settings.pagesLinks/2)) {
						pages += "&hellip; ";
						pages += "<a href=\"##\" onclick=\"BlogRenderer.ContentRenderer.render(" +
							BlogRenderer.ArticleListRenderer.currentArticle + "," + j + ")\">Last&nbsp;&raquo;</a> ";
					}

				}
				$(BlogRenderer.Settings.pagesTopContainerID).innerHTML =
					$(BlogRenderer.Settings.pagesBottomContainerID).innerHTML = pages;
			} else {
				$(BlogRenderer.Settings.pagesTopContainerID).innerHTML =
					$(BlogRenderer.Settings.pagesBottomContainerID).innerHTML = "";
			}
			$(BlogRenderer.Settings.articleNameContainerID).innerHTML =
				BlogRenderer.ArticleListRenderer.articles[BlogRenderer.Settings.params.articleNumber].name;
			$(BlogRenderer.Settings.articleContainerID).style.display = "block";
			$(BlogRenderer.Settings.wholeArticleContainerID).style.display = "block";
			$(BlogRenderer.Settings.returnToTopicsContainerID).style.display = "block";
			$(BlogRenderer.Settings.ajaxLoaderContainerID).style.display = "none";
			if (location) {
				window.location = "forum.php#" + location;
			}
		}
	},
	CommentFormRenderer: {
		render: function(comment) {
			if (BlogRenderer.Settings.timer == null) {
				$(BlogRenderer.Settings.ajaxLoaderContainerID).style.display = "block";
			  with (BlogRenderer.ArticleListRenderer)	{
					articles[currentArticle].postComment(comment, "BlogRenderer.Settings.result");
				}
				BlogRenderer.Settings.timer = setInterval("BlogRenderer.CommentFormRenderer.render('')", 100);
				BlogRenderer.Settings.result = null;
			}
			if (BlogRenderer.Settings.result === null) {
				return;
			}
			clearInterval(BlogRenderer.Settings.timer);
			BlogRenderer.Settings.timer = null;
			
			if (BlogRenderer.Settings.result == true) {
				var page = 0;
				if (BlogRenderer.Settings.currentPage) {
					page = BlogRenderer.Settings.currentPage;
				}
				BlogRenderer.ContentRenderer.render(BlogRenderer.ArticleListRenderer.currentArticle, page, 1);
			} else {
				$(BlogRenderer.Settings.ajaxLoaderContainerID).style.display = "none";
				alert("Comment was not added.");
			}
		}
	},
	ArticleCreatorRenderer: {
		render: function(title, content) {
			if (BlogRenderer.Settings.timer == null) {
				$(BlogRenderer.Settings.ajaxLoaderContainerID).style.display = "block";
			  var article = new WordPress.Article();
				article.create(title, content, "BlogRenderer.Settings.result");
				BlogRenderer.Settings.timer = setInterval("BlogRenderer.ArticleCreatorRenderer.render('', '')", 100);
				BlogRenderer.Settings.result = null;
			}
			if (BlogRenderer.Settings.result === null) {
				return;
			}
			clearInterval(BlogRenderer.Settings.timer);
			BlogRenderer.Settings.timer = null;

			$(BlogRenderer.Settings.ajaxLoaderContainerID).style.display = "none";
			if (BlogRenderer.Settings.result == false) {
				alert("An error has occured while processing data. Your topic was not created. " +
					"Maybe you have forgotten to log in or do not have a contributor role.");
			} else {
				alert("Your topic is awaiting moderation.");
			}
		}
	},
	UserCreatorRenderer: {
		render: function(password, email, nick) {
			if (BlogRenderer.Settings.timer == null) {
				$(BlogRenderer.Settings.ajaxLoaderContainerID).style.display = "block";
				WordPress.User.create(password, email, nick, "BlogRenderer.Settings.result");
				BlogRenderer.Settings.timer = setInterval("BlogRenderer.UserCreatorRenderer.render('', '', '')", 100);
				BlogRenderer.Settings.result = null;
			}
			if (BlogRenderer.Settings.result === null) {
				return;
			}
			clearInterval(BlogRenderer.Settings.timer);
			BlogRenderer.Settings.timer = null;
			$(BlogRenderer.Settings.ajaxLoaderContainerID).style.display = "none";
			if (BlogRenderer.Settings.result == '') {
				BlogRenderer.Settings.result = "<p><strong>Your request has been processed correctly. " +
					"You have been sent an email to activate your account.</strong></p>";
			}
			if ($(BlogRenderer.Settings.createAccountResultContainerID)) {
				$(BlogRenderer.Settings.createAccountResultContainerID).innerHTML = BlogRenderer.Settings.result;
			} else {
				var pattern = /<p><strong>(([^<]|<^\/|<\/[^s]|<\/s[^t]|<\/st[^r]|<\/str[^o])+)<\/strong><\/p>/ig;
				var result = "";
				while (pattern.test(BlogRenderer.Settings.result)) {
					result += RegExp.$1 + "\r\n";
				}
				alert(result);
			}
		}
	},
	UserLoginRenderer: {
		render: function(login, password) {
			if (BlogRenderer.Settings.timer == null) {
				$(BlogRenderer.Settings.ajaxLoaderContainerID).style.display = "block";
				WordPress.User.login(login, password, "BlogRenderer.Settings.result");
				BlogRenderer.Settings.timer = setInterval("BlogRenderer.UserLoginRenderer.render('', '')", 100);
				BlogRenderer.Settings.result = null;
				BlogRenderer.Settings.params = {login: login};
			}
			if (BlogRenderer.Settings.result === null) {
				return;
			}
			clearInterval(BlogRenderer.Settings.timer);
			BlogRenderer.Settings.timer = null;
			
			$(BlogRenderer.Settings.ajaxLoaderContainerID).style.display = "none";
			if (BlogRenderer.Settings.result == false) {
				alert("You have entered an invalid login/password.");
			} else {
				alert("You have been logged in");
				var login = BlogRenderer.Settings.params.login;
				//BlogRenderer.UserRoleRenderer.render(login);
				BlogRenderer.checkUserLogin(login, true);
				var page = 0;
				if (BlogRenderer.Settings.currentPage) {
					page = BlogRenderer.Settings.currentPage;
				}
				if (BlogRenderer.ArticleListRenderer.currentArticle &&
						$(BlogRenderer.Settings.wholeArticlesListContainerID).style.display == "none"
				) {
					BlogRenderer.ContentRenderer.render(BlogRenderer.ArticleListRenderer.currentArticle, page);
				}
			}
		}
	},
	UserRoleRenderer: {
		render: function(email) {
			if (BlogRenderer.Settings.timer == null) {
				$(BlogRenderer.Settings.ajaxLoaderContainerID).style.display = "block";
				WordPress.User.checkRole(email, "BlogRenderer.Settings.result");
				BlogRenderer.Settings.timer = setInterval("BlogRenderer.UserRoleRenderer.render('')", 100);
				BlogRenderer.Settings.result = null;
			}
			if (BlogRenderer.Settings.result === null) {
				return;
			}
			clearInterval(BlogRenderer.Settings.timer);
			BlogRenderer.Settings.timer = null;

			$(BlogRenderer.Settings.ajaxLoaderContainerID).style.display = "none";
			if (BlogRenderer.Settings.result == false) {
				BlogRenderer.Settings.result = "Grant role procedure failed. You can't create topics.";
			} else if(BlogRenderer.Settings.result == true){
				BlogRenderer.Settings.result = "You have become a contibutor. You can create topics now.";
			}
			
			if (BlogRenderer.Settings.result != "has role") {
				if ($(BlogRenderer.Settings.makeContributorResultContainerID)) {
					$(BlogRenderer.Settings.makeContributorResultContainerID).innerHTML = "<p>" +
						BlogRenderer.Settings.result + "</p>";
				} else {
					alert(BlogRenderer.Settings.result);
				}
			}
		}
	},
	Settings: {
		initialize: function(parameters) {
			this.timer = null;
			this.result = null;
			var params = Object.extend({
				contentDivision: 10,
				pagesLinks: 5,
				articlesListContainerID: "articlesList",
				contentContainerID: "content",
				articleContainerID: "article",
				ajaxLoaderContainerID: "ajaxLoader",
				articleNameContainerID: "articleName",
				articleCreatorContainerID: "articleCreator",
				articleBrowserContainerID: "articleBrowser",
				createAccountResultContainerID: "createAccountResult",
				makeContributorResultContainerID: "makeContributorResult",
				pagesTopContainerID: "pagesTop",
				pagesBottomContainerID: "pagesBottom",
				addCommentContainerID: "addComment",
				addTopicButtonID: "addTopicButton",
				forumControlContainerID: "forumControl",
				forumMainPartContainerID: "forumMainPart",
				loginFormContainerID: "loginForm",
				registerFormContainerID: "registerForm",
				commentLoginWarningContainerID: "commentLoginWarning",
				returnToTopicsContainerID: "returnToTopics",
				wholeArticlesListContainerID: "wholeArticlesList",
				wholeArticleContainerID: "wholeArticle"
			}, parameters || {});
			for(var i in params) {
				if ($(params[i])) {
					this[i] = params[i];
				} else {
					this[i] = "";
				}
			}
			this.params = null;
		}
	},
	checkUserLogin: function(userLogin, start) {
		if (BlogRenderer.Settings.timer2 == null) {
			WordPress.User.checkUserLogin(userLogin, "BlogRenderer.Settings.result2");
			BlogRenderer.Settings.timer2 = setInterval("BlogRenderer.checkUserLogin('', '')", 100);
			BlogRenderer.Settings.result2 = null;
			BlogRenderer.Settings.params2 = {userLogin: userLogin, start: start};
		}
		if (BlogRenderer.Settings.result2 === null) {
			return;
		}
		clearInterval(BlogRenderer.Settings.timer2);
		BlogRenderer.Settings.timer2 = null;
		if (BlogRenderer.Settings.params2.start) {
			BlogRenderer.ArticleListRenderer.render();
		}
		if (BlogRenderer.Settings.result2){
			BlogRenderer.hideForumControl(BlogRenderer.Settings.params2.userLogin);
		}
	},
	hideForumControl: function(login) {
		$(BlogRenderer.Settings.addTopicButtonID).style.display = "inline";
		$(BlogRenderer.Settings.addCommentContainerID).style.display = "block";
		$(BlogRenderer.Settings.loginFormContainerID).innerHTML = '<p style="padding: 10px 0 0 5px;"><strong>' +
			"Logged as " + login + '</strong></p>';
		$(BlogRenderer.Settings.registerFormContainerID).style.display = "none";
		$(BlogRenderer.Settings.commentLoginWarningContainerID).style.display = "none";
	}
}