var idMap = {};

function initContestTool(siteId, locale, pageId, sec, pos, refrComm, multiple, dsblRatingOwn, allowRatingOnlyOnceInGroup, cntGrp, numPerPage, currPage, limit, useAjax, promoId, sort, addParam, sortOtherGroupIds, filterOtherGroupIds, label_btn_close, rtngAvgDecPlaces, noMoreRatingMsg, msgRatedToday, msgDsbleRtngOwn) {
	Event.observe(window, 'load', function() {

		// init global vars
		window.siteId= siteId;
		window.locale= locale;
		window.pageId= pageId;
		if (!window.groupParams) {
			window.groupParams = new Array();
		}
		
		window.groupParams[cntGrp] = new Object();
		window.groupParams[cntGrp]['filter'] = new Object();
		window.groupParams[cntGrp]['addParam'] = addParam;
		window.groupParams[cntGrp]['allowMultiple'] = multiple;
		window.groupParams[cntGrp]['disableRatingOwnEntries'] = dsblRatingOwn;
		window.groupParams[cntGrp]['allowRatingOnlyOnceInGroup'] = allowRatingOnlyOnceInGroup;
		window.groupParams[cntGrp]['promoId'] = promoId;
		window.groupParams[cntGrp]['limit'] = limit;
		window.groupParams[cntGrp]['numPerPage'] = numPerPage;
		window.groupParams[cntGrp]['sec'] = sec;
		window.groupParams[cntGrp]['pos'] = pos;
		window.groupParams[cntGrp]['refrComm'] = refrComm;
		window.groupParams[cntGrp]['label_btn_close'] = label_btn_close;
		window.groupParams[cntGrp]['rtngAvgDecPlaces'] = rtngAvgDecPlaces;
		window.groupParams[cntGrp]['noMoreRatingMsg'] = noMoreRatingMsg;
		window.groupParams[cntGrp]['msgRatedToday'] = msgRatedToday;
		window.groupParams[cntGrp]['msgDsbleRtngOwn'] = msgDsbleRtngOwn;
				
		initSortVarForGroup(cntGrp, sort);
		initFilterVarsForGroup(cntGrp);
		initSortOtherGroupIds(cntGrp, sortOtherGroupIds);
		initFilterOtherGroupIds(cntGrp, filterOtherGroupIds);
		
		var contestToolDiv = $('contestTool_'+cntGrp);
		
		// Add onclick for 'write comment' links
		addContestToolCommentEvents(contestToolDiv, cntGrp);
		
		// Add onclick for 'open entry layer' links
		addOpenEntryLayerEvents(contestToolDiv);
		
		// add "jump to"-links
		addJumpToLinks(contestToolDiv, cntGrp);
		
		// add "increase counter"-links
		addIncreaseCounterLinks(contestToolDiv, cntGrp);
		
		initGenericRating(siteId, locale, pageId, contestToolDiv);

		initSortingElements(useAjax, cntGrp, contestToolDiv);

		initFilterElements(useAjax, cntGrp, contestToolDiv);

		if(useAjax)
			addContestToolPagingEvents(cntGrp, currPage, 'true');
	});
}

/* inits the global group-param "sort_other" with the given ids (after a check, if the contest tool is really existing on the page) */
function initSortOtherGroupIds(cntGrp, ids) {
	if (ids && ids != '') {
		var idList = ids.split(",");
		window.groupParams[cntGrp]['sort_other'] = new Array();
		for(var i = 0; i < idList.length; i++) {
			if ($('contestTool_'+idList[i])) {
				window.groupParams[cntGrp]['sort_other'].push(idList[i]); 
			}
		}
	}
}

/* inits the global group-param "filter_other" with the given ids (after a check, if the contest tool is really existing on the page) */
function initFilterOtherGroupIds(cntGrp, ids) {
	if (ids && ids != '') {
		var idList = ids.split(",");
		window.groupParams[cntGrp]['filter_other'] = new Array();
		for(var i = 0; i < idList.length; i++) {
			if ($('contestTool_'+idList[i])) {
				window.groupParams[cntGrp]['filter_other'].push(idList[i]); 
			}
		}
	}
}

function initFilterVarsForGroup(cntGrp) {
	var url = window.location.href;
	var re = new RegExp("(&|\\?)ct"+cntGrp+"[^=]*=([^&]*)","g");
	var filterParams = url.match(re);
	if (filterParams != null) {
		for(var i = 0; i < filterParams.length; i++) {
			var filterName = filterParams[i].substring(3+(cntGrp+"").length, filterParams[i].indexOf("="));
			var filterValue = filterParams[i].substring(filterParams[i].indexOf("=")+1, filterParams[i].length);
			if (filterName && filterName != '') {
				window.groupParams[cntGrp]['filter'][filterName] = filterValue;
			}
		}
	}
}

function initSortVarForGroup(cntGrp, clSort) {
	// init with the content loaded sorting
	window.groupParams[cntGrp]['sort'] = clSort.replace(/##$/g, '$$$$');
	// overwrite with request param value
	var url = window.location.href;
	var re = new RegExp("(&|\\?)ct_sort"+cntGrp+"=([^&]*)","g");
	var sortParam = url.match(re);
	var sortValue = null;
	if (sortParam != null && sortParam.length > 0) {
		sortValue = sortParam[0].substring(sortParam[0].indexOf('=')+1, sortParam[0].length);
	}
	if (sortValue!=null) {
		window.groupParams[cntGrp]['sort'] = sortValue;
	}
}

function initFilterElements(useAjax, cntGrp, contestToolDiv) {
	var selects = Element.select(contestToolDiv, 'select');
	if (selects) {
		selects.each(function (s) {
			if (s.id.indexOf("ct_filter_") == 0) {
				var field = s.id.substring("ct_filter_".length, s.id.length);
				for (var i = 0; i < s.options.length; i++) {
					var o = s.options[i];
					if (o.value != null &&
						window.groupParams[cntGrp]['filter'][field] != null &&
						window.groupParams[cntGrp]['filter'][field].toLowerCase() == o.value.toLowerCase()) {
						o.setAttribute("selected", "selected");
					}
				}
				if (useAjax) {
					s.observe('change', function(event){
						event.preventDefault();
						var filterVal = $F(s);
						window.groupParams[cntGrp]['filter'][field] = filterVal;
						getContestToolItems(cntGrp, 0);
						// filter other contesttool groups
						if (window.groupParams[cntGrp]['filter_other'] && window.groupParams[cntGrp]['filter_other'].length > 0) {
							for(var i = 0; i < window.groupParams[cntGrp]['filter_other'].length; i++) {
								var otherId = window.groupParams[cntGrp]['filter_other'][i];
								window.groupParams[otherId]['filter'][field] = filterVal;
								getContestToolItems(otherId, 0);
							}
						}
					});
				} else {
					s.observe('change', function(event){
						event.preventDefault();
						var sortVal = $F(s);
						// take current url
						var newUrl = window.location.href;
						// remove old sort-param if existing
						var re = new RegExp("(&|\\?)ct"+cntGrp+field+"=([^&]*)","g");
						var oldParam = newUrl.match(re);
						if (oldParam != null && oldParam.length > 0) {
							var i = newUrl.indexOf(oldParam[0]); 
							var tmp = newUrl.substring(0, i+1);
							tmp += newUrl.substring(i+1+oldParam[0].length, newUrl.length);
							newUrl = tmp;
							if (newUrl.lastIndexOf('&') == newUrl.length-1) {
								newUrl = newUrl.substring(0, newUrl.length-1);
							}
						}
						// add current sort-value
						newUrl += "&ct"+cntGrp+field+"="+sortVal;
						// load new url
						window.location.href= newUrl;
					});
				}
			}
		});
	}
}

function initSortingElements(useAjax, cntGrp, contestToolDiv) {
	var selects = Element.select(contestToolDiv, 'select');
	if (selects) {
		selects.each(function (s) {
			if (s.id.indexOf("ct_sorting_") == 0) {
				for (var i = 0; i < s.options.length; i++) {
					var o = s.options[i];
					if (o.value == window.groupParams[cntGrp]['sort']) {
						o.setAttribute("selected", "selected");
					}
				}
				if (useAjax) {
					s.observe('change', function(event){
						event.preventDefault();
						var sortVal = $F(s)
						window.groupParams[cntGrp]['sort'] = sortVal;
						getContestToolItems(cntGrp, 0);
						// sort other contesttool groups
						if (window.groupParams[cntGrp]['sort_other'] && window.groupParams[cntGrp]['sort_other'].length > 0) {
							for(var i = 0; i < window.groupParams[cntGrp]['sort_other'].length; i++) {
								var otherId = window.groupParams[cntGrp]['sort_other'][i];
								window.groupParams[otherId]['sort'] = sortVal;
								getContestToolItems(otherId, 0);
							}
						}
					});
				} else {
					s.observe('change', function(event){
						event.preventDefault();
						var sortVal = $F(s);
						// take current url
						var newUrl = window.location.href;
						// remove old sort-param if existing
						var re = new RegExp("(&|\\?)ct_sort"+cntGrp+"=([^&]*)","g");
						var oldParam = newUrl.match(re);
						if (oldParam != null && oldParam.length > 0) {
							var i = newUrl.indexOf(oldParam[0]); 
							var tmp = newUrl.substring(0, i+1);
							tmp += newUrl.substring(i+1+oldParam[0].length, newUrl.length);
							newUrl = tmp;
							if (newUrl.lastIndexOf('&') == newUrl.length-1) {
								newUrl = newUrl.substring(0, newUrl.length-1);
							}
						}
						// add current sort-value
						newUrl += "&ct_sort"+cntGrp+"="+sortVal;
						// load new url
						window.location.href= newUrl;
					});
				}
			}
		});
	}
}

function getContestToolItems(cntGrp, currPage, jumpToId) {
	var url = 'servlet/AjaxActionServlet?';
	
	if (useERU) {
		url = doc_root + '/servlet/AjaxActionServlet?';
	}
	
	url += 'siteid='+window.siteId;
	url += '&locale='+window.locale;
	url += '&pageId='+window.pageId;
	url += '&action=contestTool';
	url += '&func=list';
	url += '&cg='+cntGrp;
	url += '&numPerPage='+window.groupParams[cntGrp]['numPerPage'];
	url += '&currPage='+currPage;
	url += '&limit='+window.groupParams[cntGrp]['limit'];
	url += '&promoId='+window.groupParams[cntGrp]['promoId'];
	url += '&sort='+window.groupParams[cntGrp]['sort'];
	if (window.groupParams[cntGrp]['addParam'] && window.groupParams[cntGrp]['addParam'] != '') {
		url += '&'+window.groupParams[cntGrp]['addParam'];
	}
	if (window.groupParams[cntGrp]['filter']) {
		for (var f in window.groupParams[cntGrp]['filter']) {
			var value = window.groupParams[cntGrp]['filter'][f];
			if (value && value != '') {
				url += '&filter'+f+"="+value;
			}
		}
	}
	if(jumpToId && jumpToId!='') {
		url += '&jumpTo='+jumpToId;
	}

	showAjaxWaitingScreen('contestTool_waiting_'+cntGrp);
	new Ajax.Request(url, {
		method: 'post',
		onComplete: function() {
			hideAjaxWaitingScreen('contestTool_waiting_'+cntGrp);
		},
		onSuccess: function(r) {
			showContestToolItems(r);
		}
	});
}

function increaseCounter(cntGrp, counterId, id) {
	var url = 'servlet/AjaxActionServlet?';
	
	if (useERU) {
		url = doc_root + '/servlet/AjaxActionServlet?';
	}

	url += 'siteid='+window.siteId;
	url += '&locale='+window.locale;
	url += '&pageId='+window.pageId;
	url += '&action=contestTool';
	url += '&func=incCnt';
	url += '&id='+id;
	url += '&cg='+cntGrp;
	url += '&cntId='+counterId;
	url += '&promoId='+window.groupParams[cntGrp]['promoId'];
		
	if (window.groupParams[cntGrp]['addParam'] && window.groupParams[cntGrp]['addParam'] != '') {
		url += '&'+window.groupParams[cntGrp]['addParam'];
	}
	
	var counterCmnt = "";
	var counterCmntElem = $('increaseCounterComment_'+counterId);
	if (counterCmntElem) {
		counterCmnt = $(counterCmntElem).getValue();
		url += '&cntCmnt='+counterCmnt;
	}	
	
	showAjaxWaitingScreen('contestTool_waiting_'+cntGrp);
	new Ajax.Request(url, {
		method: 'post',
		onComplete: function() {
			hideAjaxWaitingScreen('contestTool_waiting_'+cntGrp);
		},
		onSuccess: function(r) {
			handleIncreaseCounterResult(r, counterId);
		}
	});
}

function handleIncreaseCounterResult(response, counterId) {
	var xmlDoc = response.responseXML;
	if(xmlDoc) {
		var elem = xmlDoc.firstChild;
		if(elem) {
			var code = elem.getAttribute("code");
			if (code != '0') {
				var errorMsg;
				var nodeText;
				if(navigator.appName == "Microsoft Internet Explorer"){
					nodeText = elem.text;
				}
				else{
					nodeText = elem.textContent;
				}
				if (nodeText) {
					errorMsg = nodeText;
				} else {
					errorMsg = 'Error [' + code + '] ';
				}
				alert(errorMsg);
			} else {
				var aDiv = $('cont_increaseCounterLink_'+counterId);
				var aReplacement = elem.getElementsByTagName('icl');
				if (aDiv && aReplacement && aReplacement[0] && aReplacement[0].firstChild) {
					aDiv.update(aReplacement[0].firstChild.data);
					var counterCmnDiv = $('cont_increaseCounterComment_'+counterId);
					counterCmnDiv.setStyle({display: 'none'});
				}
				
			}
		}
	}
}

function showContestToolItems(response) {
	var xmlDoc = response.responseXML;
	if(xmlDoc) {
		var elem = xmlDoc.firstChild;
		if(elem) {
			var code = elem.getAttribute("code");
			if (code != '0') {
				alert('Error [' + code + ']');
			} else {

				var promoId;
				var cg;
				var numPerPage;
				var current;

				if(elem.getElementsByTagName('qs').length > 0) {
					var qs = elem.getElementsByTagName('qs')[0];
					promoId = getQsValueFromResponse(qs, 'promoId');
					cg = getQsValueFromResponse(qs, 'cg');
					numPerPage = getQsValueFromResponse(qs, 'numPerPage');
				}

				var contestToolDiv = $('contestTool_'+cg);

				// Fill idMap array
				if(elem.getElementsByTagName('idmap').length > 0) {
					var mapList = elem.getElementsByTagName('idmap')[0];
					fillIdMap(cg ,mapList);
				}

				// Paging
				if(elem.getElementsByTagName('pagings').length > 0) {
					var pagings 	= elem.getElementsByTagName('pagings')[0];
					var hasNextPage = pagings.getAttribute('hasNextPage');
					current = pagings.getAttribute('current');

					var pagingList = pagings.getElementsByTagName('paging');
					for(var i = 0; i < pagingList.length; i++) {
						var paging = pagingList[i];
						var pagingId = paging.getAttribute('id');
						var pagingContent = paging.firstChild.nodeValue;
						if ($(pagingId)) {
							Element.replace($(pagingId), pagingContent);
						}
					}
					addContestToolPagingEvents(cg, current, hasNextPage);
				}
				// Item list
				if(elem.getElementsByTagName('list').length > 0) {
					var list = elem.getElementsByTagName('list')[0].firstChild.nodeValue;
					var listDiv = $('contestTool_'+cg).down('div.list');
					Element.replace(listDiv, list);
					addOpenEntryLayerEvents(contestToolDiv);
					addContestToolCommentEvents(contestToolDiv, cg);
					addJumpToLinks(contestToolDiv, cg);
					addInreaseCounterLinks(contestToolDiv, cg);
				}
				
				// Detail layer
				var layerList = elem.getElementsByTagName('layer');
				if(layerList) {

					$$('#contestTool_'+cg+' div.contest_entry_layer').each(function(item){
						var id = item.id;
						var lightBoxItem = $(id+'_lightbox');
						$(id).remove();
						lightBoxItem.remove();
					});						
					
					var layerDiv = $('layer');
					for(var i = 0; i < layerList.length; i++) {
						var layer = layerList[i];
						var layerId = layer.getAttribute('id');
						var layerContent = layer.firstChild.nodeValue;						
						Element.insert(contestToolDiv, layerContent);
					}
				}
				
				// Rating
				initGenericRating(window.siteId, window.locale, window.pageId, contestToolDiv);

				// thumbnail popups
				initIBoxLinks();
			}
		}
		
	}
}

function initIBoxLinks() {
	var els = document.getElementsByTagName("a");
	for (var i=0; i<els.length; i++)
	{
	  if (els[i].getAttribute(iBox.attribute_name))
	  {
	    var t = els[i].getAttribute(iBox.attribute_name);
	    if ((t.indexOf("ibox") != -1) || t.toLowerCase() == "ibox")
	    { // check if this element is an iBox element
	      els[i].onclick = iBox.handleTag;
	    }
	  }
	}
}

function addContestToolPagingEvents(cntGrp, current, hasNextPage) {

	// The infamous 'previous' link
	$$('#contestTool_'+cntGrp+' div.paging div.previous a').each(function(item){
		item.observe('click', function(event){
			event.preventDefault();
			if(current > 0)
				getContestToolItems(cntGrp, (Number(current)-1));
		});
	});
	
	// add onclick for paging links
	$$('#contestTool_'+cntGrp+' a.cotPageLinkNum').each(function(item){
		var pageNum = getValueFromClassName(item, 'cotPageLinkNum_');
		item.observe('click', function(event){
			event.preventDefault();
			if(!item.up('div').hasClassName('inactive')) {
				getContestToolItems(cntGrp, pageNum);
			}
		});
	});

	// The magnificent 'next' link
	$$('#contestTool_'+cntGrp+' div.paging div.next a').each(function(item){
		item.observe('click', function(event){
			event.preventDefault();
			if(hasNextPage == 'true')
				getContestToolItems(cntGrp, (Number(current)+1));
		});
	});

}

function addContestToolCommentEvents(contestToolDiv, cntGrp) {
	Element.select(contestToolDiv, '.addCommentLnk').each(function(item) {
		var statNode = item.up('div');
		var liveStat = getValueFromClassName(statNode, 'cont_lnk_comment_stat_');
		var needsLogin = getValueFromClassName(statNode, 'cont_lnk_comment_login_');
		var node = item.up('div.contest_entry');
		var idx = getValueFromClassName(node, 'contest_entry_id_');
		var id = idMap[cntGrp][idx];
		item.observe('click', function(event){
			event.preventDefault();
			var useLoginPopup = Element.hasClassName(statNode, 'cont_lnk_comment_lgn_popup');
			if (useLoginPopup) {
				// just show login box, do reload the page after that (to update the header)
				executeActionAfterLogin(window.siteId, window.locale, false, 
										function() {}, 
										function(){showContestEntryCommentLayer(id, liveStat, needsLogin, cntGrp, true);},
										'CtCmmt');
			} else {
				showContestEntryCommentLayer(id, liveStat, needsLogin, cntGrp, false);
			}
		});
	});	
}

function addJumpToLinks(contestToolDiv, cntGrp) {
	Element.select(contestToolDiv, '.cont_linkDisplayInOtherCT a').each(function(item) {
		var input = Element.select(item.up(), 'input[name="groupId"]')[0];
		var otherId = $F(input);
		var node = item.up('div.contest_entry');
		var idx = getValueFromClassName(node, 'contest_entry_id_');
		var id = idMap[cntGrp][idx];
		item.observe('click', function(event){
			event.preventDefault();
			if (otherId != '') {
				getContestToolItems(otherId, 0, id);
			}
		});
	});	
}

function addIncreaseCounterLinks(contestToolDiv, cntGrp) {
	Element.select(contestToolDiv, '.cont_increaseCounterLink a').each(function(item) {
		var input = Element.select(item.up(), 'input[name="counterNo"]')[0];
		var counterId = $F(input);
		var node = item.up('div.contest_entry');
		var idx = getValueFromClassName(node, 'contest_entry_id_');
		var id = idMap[cntGrp][idx];
		
		item.observe('click', function(event){
			event.preventDefault();
			increaseCounter(cntGrp, counterId, id);
		});
	});	
}

function addOpenEntryLayerEvents(contestToolDiv) {
	Element.select(contestToolDiv, '.cont_layerDetailLink').each(function(item) {
		var node = item.up('div.contest_entry');
		var layerId = 'layer_'+node.id;
		item.observe('click', function(event){
			event.preventDefault();
			showContestEntryLayer(layerId);
		});
	});
}

function getValueFromClassName(node, prefix) {
	var id;
	Element.classNames(node).each(function(className) {
		if (className.indexOf(prefix)==0) {
			id = className.substring(prefix.length, className.length);
		}
	});
	return id;
}

function showContestEntryCommentLayer(id, liveStat, needsLogin, cntGrp, reloadAfterClose) {
	// create layer
	var layerId = 'contestToolWriteCommentLayer';
	layerObj = new Layer(layerId, '400', '250', 1, 1, 1, 1, '', '', '', 'false', '', '');
	// onclick for cancel btn
	var btnCancel = $(layerId).select('[id="'+layerId+'BtnCancel"]')[0];
	Event.stopObserving(btnCancel, 'click');
	btnCancel.observe('click', function(event) {
		layerObj.HideLayer();
		if (reloadAfterClose) location.reload();
	});
	// onclick for submit btn
	var btnOk = $(layerId).select('[id="'+layerId+'BtnSubmit"]')[0];
	Event.stopObserving(btnOk, 'click');
	btnOk.observe('click', function(event) {
		var comment = Form.Element.getValue('contToolCommentInp');
		var headline = Form.Element.getValue('contToolHeadlineInp');
		saveContestEntryComment(layerId, id, comment, headline, liveStat, needsLogin, cntGrp);
	});
	// onclick for close button
	var btnClose = $(layerId).select('[id="'+layerId+'BtnClose"]')[0];
	Event.stopObserving(btnClose, 'click');
	btnClose.observe('click', function(event) {
		layerObj.HideLayer();
		if (reloadAfterClose) location.reload();
	});
	
	// only show content
	hideAjaxWaitingScreen(layerId+'_waiting');
	Element.show($(layerId+'_content'));
	Element.hide($(layerId+'_sucess'));
	Element.hide($(layerId+'_err_emptyComment'));

	$('contToolCommentInp').value = '';
	
	// show layer
	layerObj.ShowLayer();
}

function saveContestEntryComment(layerId, id, comment, headline, stat, needsLogin, cntGrp) {
	var url = 'servlet/AjaxActionServlet?';
	
	if (useERU) {
		url = doc_root + '/servlet/AjaxActionServlet?';
	}

	url += 'siteid='+window.siteId;
	url += '&locale='+window.locale;
	url += '&action=commentAndRate';
	url += '&func=addCmnt';
	url += '&type=promo';
	url += '&id='+id;
	url += '&cmnt='+encodeURIComponent(comment);
	url += '&headline='+encodeURIComponent(headline);
	url += '&stat='+stat;
	url += '&cmntLogIn='+needsLogin;

	showAjaxWaitingScreen(layerId+'_waiting');

	new Ajax.Request(url, {
		method: 'post',
		onComplete: function() {
			hideAjaxWaitingScreen(layerId+'_waiting');
		},
		onSuccess: function(r) {
			saveContestEntryCommentCallback(r, layerId, id, cntGrp);

		}
	});	
}

function saveContestEntryCommentCallback(r, layerId, id, cntGrp) {
	var xmlDoc = r.responseXML;
	if(xmlDoc) {
		var elem = xmlDoc.firstChild;
		if(elem) {
			var code = elem.getAttribute("code");
			if (code != '0') {
				if(code == '-1') {
					Element.show($(layerId+'_err_emptyComment'));
				} else {
					showContestToolError(elem, cntGrp);
				}
			} else {
				Element.hide($(layerId+'_content'));
				Element.show($(layerId+'_sucess'));
				if (window.groupParams[cntGrp]['refrComm']) {
					updateCommentsList(id, cntGrp);
				}
			}
		}
	}
}

function updateCommentsList(id, cntGrp) {
	var url = 'servlet/AjaxActionServlet?';
	
	if (useERU) {
		url = doc_root + '/servlet/AjaxActionServlet?';
	}
	
	url += 'siteid='+window.siteId;
	url += '&locale='+window.locale;
	url += '&action=commentAndRate';
	url += '&pageId='+window.pageId;
	url += '&func=listCmnts';
	url += '&type=promo';
	url += '&id='+id;
	url += '&sec='+window.groupParams[cntGrp]['sec'];
	url += '&pos='+window.groupParams[cntGrp]['pos'];

	var idx = getIdxById(id, cntGrp);

	showAjaxWaitingScreen('cont_commentswrapper_waiting'+idx);
	showAjaxWaitingScreen('lyr_cont_commentswrapper_waiting'+idx);
	new Ajax.Request(url, {
		method: 'post',
		onComplete: function() {
			hideAjaxWaitingScreen('cont_commentswrapper_waiting'+idx);
			hideAjaxWaitingScreen('lyr_cont_commentswrapper_waiting'+idx);
		},
		onSuccess: function(r) {
			updateCommentsListCallback(r, idx, cntGrp);
		}
	});	
}

function updateCommentsListCallback(r, idx, cntGrp) {
	var xmlDoc = r.responseXML;
	if(xmlDoc) {
		var elem = xmlDoc.firstChild;
		if(elem) {
			var code = elem.getAttribute("code");
			if (code != '0') {
				showContestToolError(elem, cntGrp);
			} else {
				if (idx != null) {
					// update entry
					$$('div.contest_entry_id_'+idx+' div.cont_commentswrapper').each(function(item) {
						replaceComments(item, elem);
					});
					// update entry layer
					$$('div.contest_entry_layer_id_'+idx+' div.cont_commentswrapper').each(function(item) {
						replaceComments(item, elem);
					});
				}
			}
		}
	}
}

function replaceComments(item, elem) {
	var commentsDivs = Element.select(item, '.cont_comments');
	var commentsDiv = null;
	if (commentsDivs.length == 0) {
		commentsDiv = new Element('div', { 'class': 'cont_comments'});
		item.insert(commentsDiv);
	} else {
		commentsDiv = commentsDivs[0];
	}
	commentsDiv.update(elem.firstChild.data);
}

function execRating(containerId, rating, allowMultiple, disableOwn, allowInGroupOnce, aroili, arooad, allowRatingsOnlyOnceADay, elemUsrRatToday, contextElem) {
	var cntGrp = contextElem.id.replace(/contestTool_/g, '');
	var hasUsrRatedToday = elemUsrRatToday.getValue()=='true';
	if (allowRatingsOnlyOnceADay && hasUsrRatedToday) {
		simpleAlert(window.groupParams[cntGrp]['msgRatedToday'],window.groupParams[cntGrp]['label_btn_close'],'300px','100px');	
	} else {
		var prefix = 'genericRatingForm_';
		var idx;
		
		if (containerId.indexOf(prefix)==0) {
			idx = containerId.substring(prefix.length, containerId.length);
		}
		if(idx) {
			var id = idMap[cntGrp][idx];
			rateEntry(idx, id, rating, allowMultiple, disableOwn, allowInGroupOnce, aroili, arooad, contextElem, cntGrp);
		}
	}
}

function rateEntry(idx, id, rating, allowMultiple, disableOwn, allowInGroupOnce, aroili, arooad, contextElem, cntGrp) {
	var url = 'servlet/AjaxActionServlet?';
	
	if (useERU) {
		url = doc_root + '/servlet/AjaxActionServlet?';
	}

	
	url += 'siteid='+window.siteId;
	url += '&locale='+window.locale;
	url += '&action=commentAndRate';
	url += '&func=addRtng';
	url += '&type=promo';
	url += '&idx='+idx;
	url += '&id='+id;
	url += '&rtng='+rating;
	url += '&mltplRate='+allowMultiple;
	url += '&dsbleRtOwn='+disableOwn;
	url += '&aroili='+aroili;
	url += '&arooad='+arooad;
	url += '&onceInGrpRate='+allowInGroupOnce;
	url += '&cg='+cntGrp;
	url += '&promoId='+window.groupParams[cntGrp]['promoId'];
	
	new Ajax.Request(url, {
		method: 'post',
		onSuccess: function(r) {
			var xmlDoc = r.responseXML;
			if(xmlDoc) {
				var elem = xmlDoc.firstChild;
				if(elem) {
					var code = elem.getAttribute("code");
					if (code != '0') {
						if (code == '-7') {
							showSimpleContestToolError(window.groupParams[cntGrp]['msgDsbleRtngOwn'], cntGrp);
						} else {
							showContestToolError(elem, cntGrp);
						}
					} else {
						rateEntryComplete(elem, rating, contextElem);
					}
				}
			}

		}
	});	
}

function roundNumber(num, dec) {
	var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
	return result;
}

function rateEntryComplete(res, ratedpersonal, contextElem) {
	var idx = res.getElementsByTagName('idx')[0].firstChild.data;
	var itemId = res.getElementsByTagName('id')[0].firstChild.data;
	var avg = res.getElementsByTagName('rating')[0].attributes.getNamedItem('avg').value;
	var count = res.getElementsByTagName('rating')[0].attributes.getNamedItem('count').value;
	var avgRound2Int = res.getElementsByTagName('rating')[0].attributes.getNamedItem('avgRound').value;

	var cntGrp = contextElem.id.replace(/contestTool_/g, '');

	if(window.groupParams[cntGrp]['rtngAvgDecPlaces']) {
		avg = roundNumber(parseFloat(avg), window.groupParams[cntGrp]['rtngAvgDecPlaces']);
	}
	
	var entryElems = Element.select(contextElem, 'div.contest_entry_id_'+idx);
	
	var entryHTMLId = null;
	entryElems.each(function(item) {
		entryHTMLId = item.id;
		var countElem = item.down('div.cont_rating_count div.value');
		if (countElem) {
			countElem.update(count);
		}
		var avgElem = item.down('div.cont_rating_avg div.value');
		if (avgElem) {
			avgElem.update(avg);
		}
		
		if(window.groupParams[cntGrp]['allowMultiple'] && !window.groupParams[cntGrp]['allowRatingOnlyOnceInGroup']) {
			item.down('form.genericRatingForm').down('input.currRating').value=avgRound2Int;
			ratingSet(item.down('form.genericRatingForm'));			
			
		} else {
			item.down('form.genericRatingForm').replace('<div class="ratedpersonal ratedpersonal_'+ratedpersonal+'"></div><div class="ratedPersonal_Msg">'+genRatingMsg[ratedpersonal]+'</div>');
		}
	});
	
	// if you are allowed to rate only once in the group, disable the other items
	if (window.groupParams[cntGrp]['allowRatingOnlyOnceInGroup']) {
		var allEntryElems = Element.select(contextElem, 'div.contest_entry');
		allEntryElems.each(function(item) {
			if (item.id != entryHTMLId) {
				var formElem = item.down('form.genericRatingForm');
				if (formElem) {
					formElem.replace('<div class="noMoreRatingInGroup">'+window.groupParams[cntGrp]['noMoreRatingMsg']+'</div>');
				}
			}
		});
	}
	$$('form.genericRatingForm input.hasUserRatedToday').each(function(item) {
		item.value='true';
	})
}

function showContestToolError(elem, cntGrp) {
	var errText = '';
	if(elem.firstChild) {
		errText = elem.firstChild.data;
	}
	simpleAlert(errText,window.groupParams[cntGrp]['label_btn_close'],'300px','100px');
}


function showContestToolError(elem, cntGrp) {
	var errText = '';
	if(elem.firstChild) {
		errText = elem.firstChild.data;
	}
	showSimpleContestToolError(errText, cntGrp);
}

function showSimpleContestToolError(errText, cntGrp) {
	simpleAlert(errText,window.groupParams[cntGrp]['label_btn_close'],'300px','100px');	
}

// show entry layer for a context entry
function showContestEntryLayer(layerId) {
	var layerObj = new Layer(layerId, '400', '250', 1, 1, 1, 1, '', '', '', 'false', '', '');
	Element.select($('layerId'), '.cont_closeLink a').each(function(item) {
		Event.observe(item, 'click', function(event) {
			event.preventDefault();
			layerObj.HideLayer();
		});
	});
	layerObj.ShowLayer();
	$$('div#'+layerId+' .cont_commentswrapper .ajax_box_waiting').each(function(w){
		w.setStyle({height: w.up().getDimensions().height + 'px'});
	});
}

function fillIdMap(cntGrp, list) {
	var arr = list.getElementsByTagName('id');
	for(var i =0; i < arr.length; i++) {
		elem = arr[i];
		idMap[cntGrp][elem.getAttribute('index')] = elem.firstChild.data;
	}
}

function getIdxById(id, cntGrp) {
	for (var idx in idMap[cntGrp]) {
		if (id == idMap[cntGrp][idx])
			return idx;
	}
	return null;
}

/**
 * Gets the value for the given key out of the querystring item list.
 * @param elem the <code>qs</code> element from the ajax response
 * @param key the key of the param element, to get the value from
 */
function getQsValueFromResponse(elem, key) {
	var val;
	var items = elem.getElementsByTagName('param');
	for(var i=0; i<items.length; i++) {
		if(items[i].getAttribute('key') == key) {
			val = items[i].getElementsByTagName('v')[0].firstChild.nodeValue;
			break;
		}		
	}
	return val;
}

