/* Initializes the ajax paging of the RateCommentDisplay content group. */
function initRateCommentDisplayAjax(servletPath, siteId, locale, pageId, sec, pos, numpp, contentType, contentId, useAjax, loggedIn) {
	// init global vars
	window.siteId= siteId;
	window.locale= locale;
	window.pageId= pageId;
	window.contentType= contentType;
	window.contentId= contentId;
	window.commentsSec= sec;
	window.commentsPos= pos;

	if (numpp != null) {
		window.commentsNumPerPage= numpp;
		Event.observe(window, 'load', function() {
			addPagingLinkEvents(servletPath, loggedIn) ;
		});
	}
	if (useAjax) {
		updateCommentsListByAjax(servletPath, 0, loggedIn);
	}
	addAnswerToggleLinkEvents(servletPath, loggedIn);
	addShowAnswerFormLinkEvents(servletPath, contentId, loggedIn);
	addReportAlarmingLinkEvents(servletPath, loggedIn);
	addMarkAsHelpfulLinkEvents(servletPath, loggedIn);
}

/* Adds the onclick events for the paging links. */
function addPagingLinkEvents(servletPath, loggedIn) {
	$$('.commentsPaging .pagingLink').each(function(lnkItem) {
		var pageNum = 0;
		Element.classNames(lnkItem).each(function(className) {
			if (className.indexOf('pagingLinkNum_')==0) {
				pageNum = parseInt(className.substring('pagingLinkNum_'.length, className.length));
			}
		});
		Event.observe(lnkItem, 'click', function(event) {
			event.preventDefault();
			updateCommentsListByAjax(servletPath, pageNum, loggedIn);
		});
	});
}

/* Adds the onclick events for the toggle answers links. */
function addAnswerToggleLinkEvents(servletPath, loggedIn) {
	$$('#displayedEntries .rateCommentEntry .displayAnswers .showAnswerDisplayLink, #hiddenEntries .rateCommentEntry .displayAnswers .showAnswerDisplayLink').each(function(lnkItem) {
		var commId = getCommentIdByCSSClass(lnkItem);
		Event.observe(lnkItem, 'click', function(event) {
			event.preventDefault();
			if (!lnkItem.hasClassName('disabled')) {
				var aList = $('answer'+commId);
				if (aList) {
					lnkItem.addClassName('disabled');
					updateAnswersListByAjax(servletPath, commId, aList, lnkItem, loggedIn);
				}
			}
		});
	});

	$$('#displayedEntries .rateCommentEntry .displayAnswers .hideAnswerDisplayLink, #hiddenEntries .rateCommentEntry .displayAnswers .hideAnswerDisplayLink').each(function(lnkItem) {
		var commId = getCommentIdByCSSClass(lnkItem);
		Event.observe(lnkItem, 'click', function(event) {
			event.preventDefault();
			var aList = $('answer'+commId);
			if (aList) {
				aList.hide();
				aList.up('.rateCommentEntry').down('.showAnswerDisplayLink').show();
				aList.up('.rateCommentEntry').down('.hideAnswerDisplayLink').hide();
			}
		});
	});
}

/* Adds the onclick events for the show-answer-form links. */
function addShowAnswerFormLinkEvents(servletPath, contentId, loggedIn) {
	$$('#displayedEntries .rateCommentEntry .actionAnswer .answerComment, #hiddenEntries .rateCommentEntry .actionAnswer .answerComment').each(function(lnkItem) {
		var commId = getCommentIdByCSSClass(lnkItem);
		Event.observe(lnkItem, 'click', function(event) {
			event.preventDefault();
			var createWrapper = $('rate_comment_wrapper_answer_'+contentId);
			if (createWrapper) {
				customizeCreateAnswerWrapperHtml(createWrapper, commId, lnkItem);
				showRateCommentCreateGroup(loggedIn, window.siteId, window.locale, contentId, createWrapper, true, null);
				createWrapper.scrollTo();
			} else {
				showRateCommentCreateGroup(loggedIn, window.siteId, window.locale, contentId, null, true, commId);
			}
		});
	});
}

/*
 * Updates the comments list of the RateCommentDisplay content group.
 * PRECON:
 * The global variables siteId, locale, pageId, commentsSec and commentsPos must be set
 * (e.g. by the initCommentsAjaxPaging function).
 * If you want to use paging the global variable commentsNumPerPage must be set. If it is not,
 * the pageNum will be ignored and all comments are returned.
 * 
 * If you want to update with all comments (no paging), set pageNum=-1.
 */
function updateCommentsListByAjax(servletPath, pageNum, loggedIn) {
	var url = servletPath+ '/servlet/AjaxActionServlet?';
	url += 'siteid='+window.siteId;
	url += '&locale='+window.locale;
	url += '&action=commentAndRate';
	url += '&func=ratingsCommentsDisplay';
	url += '&id='+window.contentId;
	url += '&contentType='+window.contentType;
	url += '&sec='+window.commentsSec;
	url += '&pos='+window.commentsPos;
	url += '&pageId='+window.pageId;
	if (window.commentsNumPerPage && pageNum > -1) {
		url += '&npp='+window.commentsNumPerPage;
		url += '&page='+pageNum;
	} else if ( !window.commentsNumPerPage && pageNum == -1) {
		url += '&showAll=true';
	}

	showAjaxWaitingScreen('ratings_comments_waiting');
	new Ajax.Request(url, {
		method: 'post',
		onComplete: function() {
			hideAjaxWaitingScreen('ratings_comments_waiting');
		},
		onSuccess: function(response) {
			var xmlDoc = response.responseXML;
			if(xmlDoc) {
				var elem = xmlDoc.firstChild;
				if(elem) {
					var code = elem.getAttribute("code");
					if (code == '0') {
						if (!window.commentsNumPerPage && pageNum == -1 && $('hiddenEntries')) {
							$('hiddenEntries').replace(elem.firstChild.data);
							$('hiddenEntries').appear();
						} else if($('displayedEntries')) {
							$('displayedEntries').replace(elem.firstChild.data);
						}
						
						addPagingLinkEvents(servletPath, loggedIn);
						addAnswerToggleLinkEvents(servletPath, loggedIn);
						addShowAnswerFormLinkEvents(servletPath, window.contentId, loggedIn);
						addReportAlarmingLinkEvents(servletPath, loggedIn);
						addMarkAsHelpfulLinkEvents(servletPath, loggedIn);
					} else {
						if (code != '-1') {
							alert('Error [' + code + ']');
						}
					}
				}
			}
		}
	});	
}

/* Updates the answers of a comment. Always catches all answers (no paging/limit). */
function updateAnswersListByAjax(servletPath, id, aList, lnkItem, loggedIn) {
	var url = servletPath+ '/servlet/AjaxActionServlet?';
	url += 'siteid='+window.siteId;
	url += '&locale='+window.locale;
	url += '&action=commentAndRate';
	url += '&func=ratingsCommentsDisplay';
	url += '&id='+window.contentId;
	url += '&contentType='+window.contentType;
	url += '&sec='+window.commentsSec;
	url += '&pos='+window.commentsPos;
	url += '&pageId='+window.pageId;
	url += '&parentId='+id;

	new Ajax.Request(url, {
		method: 'post',
		onComplete: function() {
			if (lnkItem) lnkItem.removeClassName('disabled');
			aList.show();
			aList.up('.rateCommentEntry').down('.showAnswerDisplayLink').hide();
			aList.up('.rateCommentEntry').down('.hideAnswerDisplayLink').show();
		},
		onSuccess: function(response) {
			var xmlDoc = response.responseXML;
			if(xmlDoc) {
				var elem = xmlDoc.firstChild;
				if(elem) {
					var code = elem.getAttribute("code");
					if (code == '0') {
						if($('answer'+id)) { $('answer'+id).update(elem.firstChild.data); }
						addPagingLinkEvents(servletPath, loggedIn);
						addAnswerToggleLinkEvents(servletPath, loggedIn);
						addReportAlarmingLinkEvents(servletPath, loggedIn);
						addMarkAsHelpfulLinkEvents(servletPath, loggedIn);
					} else {
						if (code != '-1') {
							alert('Error [' + code + ']');
						}
					}
				}
			}
		}
	});	
}


/* Adds the onclick events for the reportCommentAsAlarming links. */
function addReportAlarmingLinkEvents(servletPath, loggedIn) {
	$$('#displayedEntries .rateCommentEntry a.reportCommentAsAlarming, #hiddenEntries .rateCommentEntry a.reportCommentAsAlarming').each(function(lnkItem) {
		var commId = getCommentIdByCSSClass(lnkItem);
		lnkItem.observe('click', function(event) {
			event.preventDefault();
			if (!lnkItem.hasClassName('disabled')) {
				showSimpleModalDialog('reportCommentModalDialog', function(){
					reportCommentAsAlarming(servletPath, commId, loggedIn, lnkItem);
				}, true);
			}
		});
	});
}

function reportCommentAsAlarming(servletPath, commId, loggedIn, lnkItem) {
	lnkItem.addClassName('disabled');
	var url = servletPath+ '/servlet/AjaxActionServlet?';
	url += 'siteid='+window.siteId;
	url += '&locale='+window.locale;
	url += '&action=commentAndRate';
	url += '&func=reportCommentAsAlarming';
	url += '&id='+window.contentId;
	url += '&contentType='+window.contentType;
	url += '&commId='+commId;
	url += '&sec='+window.commentsSec;
	url += '&pos='+window.commentsPos;
	url += '&pageId='+window.pageId;

	new Ajax.Request(url, {
		method: 'post',
		onComplete: function() {
		},
		onSuccess: function(response) {
			var xmlDoc = response.responseXML;
			if(xmlDoc) {
				var elem = xmlDoc.firstChild;
				if(elem) {
					var code = elem.getAttribute("code");
					if (code == '0' || code=='-4') { //OK or ALREADY_RATED=already reported
						lnkItem.hide();
						lnkItem.up('.actionReportAsAlarming').down('.reportedCommentAsAlarming').show();
					} else {
						if (code != '-1') {
							alert('Error [' + code + ']');
						}
					}
				}
			}
		}
	});	
}

/* Adds the onclick events for the markAsHelpfulLinkEvents links. */
function addMarkAsHelpfulLinkEvents(servletPath, loggedIn) {
	$$('#displayedEntries .rateCommentEntry a.markCommentAsHelpful, #hiddenEntries .rateCommentEntry a.markCommentAsHelpful').each(function(lnkItem) {
		var commId = getCommentIdByCSSClass(lnkItem);
		Event.observe(lnkItem, 'click', function(event) {
			event.preventDefault();
			if (!lnkItem.hasClassName('disabled')) {
				lnkItem.addClassName('disabled');
				markAsHelpful(servletPath, commId, loggedIn, lnkItem);
			}
		});
	});
}

function markAsHelpful(servletPath, commId, loggedIn, lnkItem) {
	var url = servletPath+ '/servlet/AjaxActionServlet?';
	url += 'siteid='+window.siteId;
	url += '&locale='+window.locale;
	url += '&action=commentAndRate';
	url += '&func=markCommentAsHelpful';
	url += '&id='+window.contentId;
	url += '&contentType='+window.contentType;
	url += '&commId='+commId;

	new Ajax.Request(url, {
		method: 'post',
		onComplete: function() {
		},
		onSuccess: function(response) {
			var xmlDoc = response.responseXML;
			if(xmlDoc) {
				var elem = xmlDoc.firstChild;
				if(elem) {
					var code = elem.getAttribute("code");
					if (code == '0' || code=='-4') { //OK or ALREADY_RATED=already marked
						// update count
						var spanCount = lnkItem.up('.actionMarkAsHelpful').down('.markCommentAsHelpfulStats span.count');
						spanCount.update(elem.firstChild.data);
						// show count
						spanCount.up('div.markCommentAsHelpfulStats').show();
					} else {
						if (code != '-1') {
							alert('Error [' + code + ']');
						}
					}
				}
			}
		}
	});	
}



// HELPER

function getCommentIdByCSSClass(item) {
	var commId = 0;
	Element.classNames(item).each(function(className) {
		if (className.indexOf('answer')==0) {
			commId = parseInt(className.substring('answer'.length, className.length));
		}
	});
	return commId;
}
