Pollarity = {
	initialize : function() {
		Pollarity.enableBackground();
		Pollarity.externalLinks();
		Pollarity.setInputFocus();
		Pollarity.selNewPollType();
		Pollarity.setBoxCloseEvent();
	},
	
    toggleBoxVisible : function(oNode, oForceVisible, oFocus) {
        if(Pollarity.Util.hasClass(oNode, 'hide')) {
            Pollarity.Util.removeClass(oNode, 'hide');
			if(oFocus == null)
				oNode.focus();
			else
				oFocus.focus();
		} else if(oForceVisible == null) {
            Pollarity.Util.addClass(oNode, 'hide');
			if(oFocus == null)
				oNode.blur();
			else
				oFocus.blur();
		}
    },

	toggleLoginType : function() {
		Pollarity.toggleIdBlockVis('login');
		Pollarity.toggleIdBlockVis('openid');
	},
    
	toggleLogin : function() {
		if ($('login').getStyle('display') == 'block') {
			Pollarity.toggleIdBlockVis('login', false, '');
			$$('#menu li.login a')[0].removeClass('selected');
			Pollarity.popupbox_open = false;
		} else {
			Pollarity.toggleIdBlockVis('login',true,'login_user');
			$$('#menu li.login a')[0].addClass('selected');
			var leftpos = parseInt($$('#top nav')[0].offsetLeft + $$('#menu li.login')[0].offsetLeft + $$('#menu li.login')[0].getSize().x / 2 - $('login').getSize().x / 2);
			$('login').setStyle('left', leftpos);
			
			setTimeout("Pollarity.popupbox_open = 'login'", 100);
		}
	},

    toggleIdBlockVis : function(sId, bForceVis, sFocusId) {
    	var oElm;
		oElm = document.getElementById(sId);
		oFocus = document.getElementById(sFocusId);		
    	if(oElm.style.display == 'block' && !bForceVis) {
    		oElm.style.display = 'none';
			if(oFocus == null)
				oElm.blur();
			else
				oFocus.blur();
    	} else {
    		oElm.style.display = 'block';
			if(oFocus == null)
				oElm.focus();
			else
				oFocus.focus();			
		}
    },
	
	toggleIdBlockVisInner : function(sId) {
    	var oElm;
		oElm = document.getElementById(sId);
		for (i=0;i<oElm.childNodes.length;i++) {
    		oChild = oElm.childNodes[i];
    		var tag = oChild.tagName;
    		if (tag && tag.toLowerCase() == 'div' && oChild.className == 'inner') {
				if(oChild.style.display == 'block')
					oChild.style.display = 'none';
				else
					oChild.style.display = 'block';
				return;
			}
		}
    },
	
    deleteConfirm : function(sURL) {
        if(confirm(Pollarity.L10n.sure_delete_message))
            window.location = sURL;
    },
    
    rateReaction : function(oNode, sRating) {
        if(sRating == 'up' || sRating == 'down' || sRating == 'super_up' || sRating == 'super_down')
        {
            iReactionId = oNode.id.replace('reaction', '');
            var oCallback =
            {
                success: function(oElm) {
                     var oNode = oElm.argument.oNode;
                     var oRatingElm = Pollarity.Util.getElementsByClassName('reactionrating', 'span', oNode)[0];
                     var aUp = Pollarity.Util.getElementsByClassName('reactionratingup', 'img', oNode);
                     aUp[0].style.display = 'none';
                     if(aUp.length == 2) aUp[1].style.display = 'none';
                     var aDown = Pollarity.Util.getElementsByClassName('reactionratingdown', 'img', oNode);
                     aDown[0].style.display = 'none';
                     if(aDown.length == 2) aDown[1].style.display = 'none';
                     Pollarity.Util.setText(oRatingElm, oElm.responseText);
                     iRating = parseInt(Pollarity.Util.getText(oRatingElm));
                     if(iRating <= -3 && !Pollarity.Util.hasClass(oNode, 'hide'))
                        Pollarity.Util.addClass(oNode, 'hide');
                },
                failure: function(oElm) { },
                argument: { oNode: oNode, sRating: sRating }
            }
            Pollarity.Util.asyncRequest('POST', Pollarity.root + "act/ratereaction", oCallback, 'reactionid=' + iReactionId + '&rating=' + sRating);
        }
    },
    submitRating : function(oNode, type, background) {        
        var oForm = oNode.parentNode;
        if (background) {
            id = oForm.id.replace('rate', '');
            var oCallback =
            {
                success: function(oElm) {
                    oElm.argument.oNode.disabled = 'disabled';
                },
                failure: function(oElm) { },
                argument: { oNode: oNode }
            }
            Pollarity.Util.asyncRequest('POST', Pollarity.root + 'act/rate', oCallback, type + 'id=' + id + '&rate=' + oNode.value);
        } else {
            oForm.submit();        
        }                
    },
    setBoxCloseEvent: function() {
		$('login').addEvent('click', function(e){
			if (Pollarity.popupbox_open) {
				if (Pollarity.popupbox_open == 'login')
					e.stopPropagation();
			}
		});
		$(document.body).addEvent('click', function(){
			if (Pollarity.popupbox_open) {
				if (Pollarity.popupbox_open == 'login')
					Pollarity.toggleLogin();
			}
		});
	},
    enableBackground: function() {
		Pollarity.updateBgHeight();
		window.addEvent('resize', function(){
			$clear(Pollarity.windowTimer);
			Pollarity.windowTimer = (function(){
				$('page_bg').setStyle('height', 'auto');
				Pollarity.updateBgHeight();
			}).delay(50);
		});
	},
	updateBgHeight: function() {
		// get doc height
		var body = document.body,
		    html = document.documentElement;

		var height = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);
		$('page_bg').setStyle('height', height);
	},
    externalLinks: function() {
        if (!document.getElementsByTagName) return;
            var anchors = document.getElementsByTagName("a");
            var browser = navigator.appName;
            for (var i=0; i<anchors.length; i++) {
                var anchor = anchors[i];
            if (anchor.getAttribute("href") && anchor.getAttribute("rel") == "external") {
            	if (browser == "Microsoft Internet Explorer" || browser == "Netscape")
            		anchor.target = "_blank";
            	else
                	anchor.onclick = "javascript:window.open('"+anchor.getAttribute("href")+"'); return false;";
            }
        }
    },
     
    sendText : function(oElm, sText) {
        oElm.value += sText
    },
	
    toggleTextBox : function(oThis, oTextBox) {
        if (oThis.checked) {
            oTextBox.disabled=false;
            Pollarity.Util.removeClass(oTextBox, 'disabled');
        } else {
            oTextBox.disabled=true;
            Pollarity.Util.addClass(oTextBox, 'disabled')
        }
    },
    
    reloadCaptcha : function(oElm) {
        oElm.src = Pollarity.root + 'randomImage.php';    
    },
    
    toggleInlineVis : function(oElm) {
        if (oElm.style.display == "none")
            oElm.style.display = "inline";
        else
            oElm.style.display = "none";
    },
    
    switchBlockVis : function(oHide, oShow) {
            oHide.style.display = "none";
            oShow.style.display = "block";
    },
    
    tabSelect : function(sTab) {
    	sActiveTab = document.getElementById('activetab').value;
    	document.getElementById('tab'+sActiveTab).className = "";
		document.getElementById(sActiveTab).style.display = "none";
    	document.getElementById('activetab').value = sTab;
    	document.getElementById('tab'+sTab).className = "selected";
		document.getElementById(sTab).style.display = "block";
    },

    tabSelectSimple : function(sTab) {
    	//deselect all tabs
		var aTabTitles = document.getElementById('fptabs').getElementsByTagName('li');
		var aTabs = Pollarity.Util.getElementsByClassName('ltab', 'div');
    	for (i=0;i<aTabTitles.length;i++) {
   			Pollarity.Util.removeClass(aTabTitles[i], 'selected');
    	}
    	for (i=0;i<aTabs.length;i++) {
    		aTabs[i].style.display = 'none';
    	}
    	//select new tab
    	Pollarity.Util.addClass(document.getElementById('tab' + sTab), 'selected');
    	document.getElementById(sTab).style.display = 'block';
    },

    urlQueryAppend : function(sUrl, sVar) {
        if(String(sUrl).indexOf('?') != -1)
            return sUrl += "&" + sVar;
        else {
            return sUrl += "?" + sVar;
        }
    },
    
    urlQueryStrip : function(sUrl) {
    	iVars = String(sUrl).indexOf('?');
    	if(iVars != -1)
    		return sUrl.substring(0,iVars);
    	return sUrl;
    },
	
	setInputFocus : function() {
		if (!document.getElementsByTagName) return;
		var inputs = document.getElementsByTagName("input");
		for (var i=0; i<inputs.length; i++) {
			var input = inputs[i];
			if (input.getAttribute("tabindex") && input.getAttribute("tabindex") == "1") {
				input.focus();
				return;
			}
		}
	},
	
    updateCatSelect : function(oTableRow, sCatId) {
    	oTable = oTableRow.parentNode;
    	for (i=0;i<oTable.childNodes.length;i++) {
    		oChild = oTable.childNodes[i];
    		var tag = oChild.tagName;
    		if (tag && tag.toLowerCase() == 'tr') {
    			oChild.className = 'catselect';
    		}
    	}
    	document.getElementById(sCatId).checked=true;
    	oTableRow.className='catselect selected';
    },
    
    numCheckChange : function(oCheck) {
    	var oNum = document.getElementById('num_option');
    	var oNonNum = document.getElementById('non-num_option');
    	if (oCheck.checked) {
    		/* Pollarity.clearChildInputs(oNonNum); */
    		Pollarity.switchBlockVis(oNonNum, oNum);
    		document.getElementById('n_option').focus();
    	} else {
    		/* Pollarity.clearChildInputs(oNum); */
    		Pollarity.switchBlockVis(oNum, oNonNum);
    		document.getElementById('option').focus();
    	}
    },
	
	subOptFocus : function(oInput, iNum, sDefault) {
		if (oInput.value == sDefault)
			oInput.value = '';
		document.getElementById('shade_'+iNum).style.display = "block";
	},
	subOptBlur : function(oInput, iNum, sDefault) {
		if (oInput.value == '')
			oInput.value = sDefault;
		document.getElementById('shade_'+iNum).style.display = "none";
	},
    
    clearChildInputs : function(oRoot) {
		var childInputs = oRoot.getElementsByTagName("input");
		for (i=0; i<childInputs.length; i++)
			childInputs[i].value = '';
    },
    openPopup : function(sUrl) {
        window.open(sUrl, "embed_poll", 'toolbar=0,scrollbars=1,location=0,statusbar=1,menubar=0,resizable=1,width=480,height=320');
    },
    setOption : function(sUrl, iGroup, iNr) {
        if (document.getElementById('req_advanced').style.display != "none")
            sAdv = "&adv=1";
        else
            sAdv = "&adv=0";
        sRdesc = encodeURIComponent(document.getElementById("req_description").value);
        window.open(sUrl+"?group="+iGroup+"&nr="+iNr+"&rdesc="+sRdesc+sAdv, "find_option", 'toolbar=0,scrollbars=1,location=0,statusbar=1,menubar=0,resizable=1,width=620,height=470');
    },
     
    editOption : function(sUrl, iGroup, iNr, sValue) {
        if (document.getElementById('req_advanced').style.display != "none")
            sAdv = "&adv=1";
        else
            sAdv = "&adv=0";
        sRdesc = encodeURIComponent(document.getElementById("req_description").value);
        window.open(sUrl+"?group="+iGroup+"&nr="+iNr+"&value="+sValue+"&rdesc="+sRdesc+sAdv, "edit_option.", 'toolbar=0,scrollbars=1,location=0,statusbar=1,menubar=0,resizable=1,width=620,height=470');
    },
     
    delOption : function(iGroup, iNr) {
        if (document.getElementById('req_advanced').style.display != "none")
            sAdv = "&adv=1";
        else
            sAdv = "&adv=0";
        sRdesc = encodeURIComponent(document.getElementById("req_description").value);
        window.location = Pollarity.urlQueryAppend(window.location, "deloptgr="+iGroup+"&deloptnr="+iNr+"&rdesc="+sRdesc+sAdv);
    },
    
    delGroup : function(iGroup) {
        if (document.getElementById('req_advanced').style.display != "none")
            sAdv = "&adv=1";
        else
            sAdv = "&adv=0";
        sRdesc = encodeURIComponent(document.getElementById("req_description").value);
        window.location = Pollarity.urlQueryAppend(window.location, "delgroup="+iGroup+"&rdesc="+sRdesc+sAdv);
    },
    
    updateReq : function() {
        if (document.getElementById("pools") != null) {
             if (document.getElementById("pools").checked) {
                 document.getElementById("req_controls").style.display="block";
                 if (document.getElementById("pool_id").value == "") {
                     //document.getElementById("req_description").disabled=false;
                 } else {
                     //document.getElementById("req_description").value = document.getElementById("req"+document.getElementById("pool_id").value).innerHTML;
                     //document.getElementById("req_description").disabled=true;
                 }
             } else {
                 document.getElementById("req_controls").style.display="none";
             }
        } 
        if (document.getElementById("pools2"))
        	document.getElementById("pools2").value = document.getElementById("pools").checked;
        document.getElementById("req_description2").value = document.getElementById("req_description").value;
    },
    
    submitAndFinish : function(sFormId) {
        var oForm = document.getElementById(sFormId);
        oForm.action = Pollarity.urlQueryAppend(document.getElementById(sFormId).action, "finish=1");
        if (oForm.onsubmit)
        	oForm.onsubmit();
       	oForm.submit();
    },
    
    submitFormStep : function(sFormId, sStep) {
        var oForm = document.getElementById(sFormId);
        oForm.action = Pollarity.urlQueryAppend(Pollarity.urlQueryStrip(document.getElementById(sFormId).action), "step="+sStep);
        if (oForm.onsubmit)
        	oForm.onsubmit();
        oForm.submit();
    },
	
	submitRestrictionSearch : function(sFormId, sStep, oSearchForm) {
		var el = oSearchForm.elements;
		var str = '';
		for(var i=0; i<el.length; i++) {
			//var str = "Type: " + el[i].type + " | ";
			if (el[i].name != '')
				str += '&'+el[i].name+'='+el[i].value;
		}
		//alert(str);
		this.submitFormStep(sFormId, sStep+str);
	},
	    
    selNewPollType : function() {
    	oPollType = document.getElementById('poll_type');
    	if (!oPollType)
    		return;
    	oTypeCell = document.getElementById('type'+oPollType.value);
    	if (oTypeCell)
    		Pollarity.selPollType(oTypeCell);
    },
    
    selPollType : function(oTypeCell) {
    	if (!oTypeCell)
    		return false;
    	var iType = oTypeCell.id.substr(4);
    	var oInput = document.getElementById('poll_type');
    	if (oInput)
    		oInput.value = iType;
    	var oTypeRow = oTypeCell.parentNode;
    	for (i=0;i<oTypeRow.childNodes.length;i++) {
    		var oChild = oTypeRow.childNodes[i];
    		var tag = oChild.tagName;
    		if (tag && tag.toLowerCase() == 'td') {
    			if (oChild.id == oTypeCell.id) {
    				oChild.className = 'selected';
    			} else {
    				oChild.className = 'faded';
    			}
    		}
    	}
    	/* min/max multiselect boxes */
    	var oMinBox = document.getElementById('min_choices');
    	var oMaxBox = document.getElementById('max_choices');
    	if (oMinBox && oMaxBox) {
    		if (iType == 1) {
    			oMinBox.disabled = false;
    			oMaxBox.disabled = false;
    			if (!oMinBox.value || oMinBox.value == '')
    				oMinBox.value = '1';
    			if (!oMaxBox.value || oMaxBox.value == '')
    				oMaxBox.value = '10';
    		} else {
    			oMinBox.disabled = true;
    			oMaxBox.disabled = true;
    		}
    	}
    },
    
    onPollType : function(oTypeCell) {
    	if (oTypeCell.className == 'faded') {
    		oTypeCell.className = '';
    	}
    },
    
	offPollType : function(oTypeCell) {
    	if (oTypeCell.className == '' && document.getElementById('poll_type').value != '') {
    		oTypeCell.className = 'faded';
    	}
    },
    
    restrictionEditor : function() {
   		Pollarity.toggleIdBlockVis('restriction_box');
    },
    
    setRestriction : function() {
    	// Input elements/values
    	var oRcSel = document.getElementById('restrict_select');
    	var rc_id = oRcSel.value;
    	var rc_desc = oRcSel.options[oRcSel.options.selectedIndex].text;
		var iNewRcOpt = document.getElementById('new_restriction').value;
		var sNewRcDesc = document.getElementById('new_restriction_desc').value;
		var iNewRcNeg = document.getElementById('new_restriction_negative').checked;
		
		// Output elements
		var oRcId = document.getElementById('restriction_id');
		var oRcDesc = document.getElementById('restriction_desc');
		var oRcDescSpan = document.getElementById('current_rc_desc');
		var oRcOption = document.getElementById('restriction_option');
		var oRcNegative = document.getElementById('restriction_negative');
		
		if (rc_id > 0 || iNewRcOpt > 0) {
			document.getElementById('rc_on_img').style.display = '';
			document.getElementById('rc_off_img').style.display = 'none';
			if (rc_id > 0) { // existing
				oRcDesc.value = rc_desc;
				oRcDescSpan.innerHTML = ' : '+rc_desc;
			} else { // new
				oRcDesc.value = sNewRcDesc;
				oRcDescSpan.innerHTML = ' : '+sNewRcDesc;
				if (iNewRcNeg)
					oRcNegative.value = 1;
				else
					oRcNegative.value = 0;
			}
		} else { // no restriction
			document.getElementById('rc_on_img').style.display = 'none';
			document.getElementById('rc_off_img').style.display = '';
			oRcDesc.value = '';
			oRcDescSpan.innerHTML = ' ';			
		}
		oRcId.value = rc_id;
		oRcOption.value = iNewRcOpt;
		//alert(oRcId.value+' | '+rc_desc);
		Pollarity.restrictionEditor();
    },
    
    restrictionSetOption : function(sId) {
    	var desc = document.getElementById('option_'+sId).title;
    	//alert('selecting option with id='+sId+' and description='+desc);
    	// Fill in selected option's info
    	document.getElementById('new_restriction').value = sId;
    	document.getElementById('new_restriction_text').innerHTML = document.getElementById('option_'+sId).innerHTML;
    	var not = '';
    	if (document.getElementById('new_restriction_negative').checked)
    		not = Pollarity.L10n.not+' ';
    	document.getElementById('new_restriction_desc').value = not+desc;
    	// Set existing restriction field to None
    	var oRcSel = document.getElementById('restrict_select');
    	oRcSel.options.selectedIndex = 0;
    	// Display the new restriction fields
    	document.getElementById('new_restriction_box').style.display = 'block';
    },
    
    restrictionSelectNew : function() {
    	var oRcSel = document.getElementById('restrict_select');
    	if (oRcSel.options.selectedIndex == 0)
    		return;
    	document.getElementById('new_restriction').value = 0;
    	document.getElementById('new_restriction_text').innerHTML = ' ';
    	document.getElementById('new_restriction_desc').value = '';
    	document.getElementById('new_restriction_box').style.display = 'none';
    },
    
    restrictionNegativeToggle : function(oBox) {
    	var oDesc = document.getElementById('new_restriction_desc');
    	var desc = oDesc.value;
    	var not = Pollarity.L10n.not+' ';
    	if (oBox.checked)
    		oDesc.value = not+desc;
    	else
    		oDesc.value = desc.substr(4);
    },
    
    // Poll admin functions
    
    deletePoll : function(sURL) {
        if(confirm(Pollarity.L10n.sure_delete_poll))
            window.location = Pollarity.root + sURL + '?preact=deletepoll';
    },
    
    savePoll : function(sInterval) {
        if(confirm(Pollarity.L10n.sure_save_poll.replace('%interval%', sInterval)))
            Pollarity.submitFormPreact('paform','editpoll');
    },
    
    // Switched the numeric option
    switchNumeric : function(oSwitch) {
    	alert(Pollarity.L10n.converting_poll_numeric_requires);
    },
    
    // Update numeric values
    pollAdminNumUpdate : function(oInput) {
    	var iOption = Pollarity.getOptionNr(oInput);
    	var minmax = oInput.id.substr(oInput.id.length-3, 3);
    	var value = oInput.value;
    	
		// Get the languages
    	var aLangs =  document.getElementById('langs').value.split(',');

		for (l in aLangs) {
			var sLang=aLangs[l];
			var oUpdate = document.getElementById('o'+iOption+'_'+sLang+'_ov'+minmax);
			oUpdate.value = value;
		}
    },
    
    // Schedule an existing option for deletion
    pollAdminDelOpt : function(oAnchor, iVotes) {
        if(iVotes==0 || confirm(Pollarity.L10n.sure_delete_option.replace('%votes%', iVotes)))
        {
    		var iOption = Pollarity.getOptionNr(oAnchor.parentNode.parentNode.parentNode);
    	
    		// Get the languages
    		var aLangs =  document.getElementById('langs').value.split(',');

			for (l in aLangs) {
				var sLang=aLangs[l];
				var sFid = 'o'+iOption+'_'+sLang;
				var oRow = document.getElementById(sFid);
            	document.getElementById(sFid+"_del-img").style.display="none";
            	document.getElementById(sFid+"_undo-img").style.display="inline";
            	document.getElementById(sFid+"_del").value = 1;
            
            	oRow.setAttribute("class", "deloption");
            	oRow.setAttribute("className", "deloption"); // For IE
            }
		}
	},
    
    // Unschedule an existing option for deletion    
    pollAdminUnDelOpt : function(oAnchor) {
    	var iOption = Pollarity.getOptionNr(oAnchor.parentNode.parentNode.parentNode);
    	
    	// Get the languages
    	var aLangs =  document.getElementById('langs').value.split(',');

		for (l in aLangs) {
			var sLang=aLangs[l];
			var sFid = 'o'+iOption+'_'+sLang;
			var oRow = document.getElementById(sFid);
           	document.getElementById(sFid+"_undo-img").style.display="none";
           	document.getElementById(sFid+"_del-img").style.display="inline";
           	document.getElementById(sFid+"_del").value = 0;
           
           	oRow.setAttribute("class", "");
           	oRow.setAttribute("className", ""); // For IE
		}
    },
    
    // Add a new option
    pollAdminNewOpt : function() {
    	
    	// Get the languages
    	var aLangs =  document.getElementById('langs').value.split(',');

		for (l in aLangs) {
			var sLang=aLangs[l];
    		var oRow = document.getElementById('o0_'+sLang);
    		var oRowLast = Pollarity.getPreviousSibling(oRow, false);
    		var oTable = oRow.parentNode;
    		var iNew = Pollarity.findMaxRowNum(oTable);
    		var oNewBak = oRow.cloneNode(true);
    		var sOld = 'o0_'+sLang;
    		var sNew = 'o'+iNew+'_'+sLang;
    		document.getElementById(sOld+'_pos').value = iNew;
    		document.getElementById(sOld+'_pos').name = 'o'+iNew+'_pos';
    		document.getElementById(sOld+'_pos').id = sNew+'_pos';
    		document.getElementById(sOld+'_key').firstChild.nodeValue = iNew;
    		document.getElementById(sOld+'_key').id = sNew+'_key';
    		document.getElementById(sOld+'_text').name = sNew+'_text';
    		document.getElementById(sOld+'_text').id = sNew+'_text';
    		document.getElementById(sOld+'_desc').name = sNew+'_desc';
    		document.getElementById(sOld+'_desc').id = sNew+'_desc';
    		document.getElementById(sOld+'_pdesc').name = sNew+'_pdesc';
    		document.getElementById(sOld+'_pdesc').id = sNew+'_pdesc';
    		var oNew = oRow.cloneNode(true);
			oTable.replaceChild(oNewBak, oRow);
    		oNew.style.display='';
    		oNew.id='o'+iNew+'_'+sLang;
    		
    		oTable.insertBefore(oNew, oRowLast);
    		// Move buttons
    		var oLastRow = document.getElementById('o'+iNew+'_'+sLang);
    		var oPrevRow = Pollarity.getPreviousSibling(oLastRow, true);
			Pollarity.swapTds(oLastRow, oPrevRow, 1);

    	}
    },
    
    // Remove a newly added option
    pollAdminDelNewOpt : function(oAnchor) {
    	var iOption = Pollarity.getOptionNr(oAnchor.parentNode.parentNode);
    	
    	// Get the languages
    	var aLangs = document.getElementById('langs').value.split(',');

		for (l in aLangs) {
			var sLang=aLangs[l];
			var oRow = document.getElementById('o'+iOption+'_'+sLang);
			var oTable = oRow.parentNode;
			var iMax = Pollarity.findMaxRowNum(oTable)-1;
			var iPos = parseInt(document.getElementById('o'+iOption+'_'+sLang+'_pos').value);
			if (iPos == iMax) { // Option is last
				// Move buttons
    			var oPrevRow = Pollarity.getPreviousSibling(oRow, true);
				Pollarity.swapTds(oRow, oPrevRow, 1);
			} else { // Not last, adjust position for the next ones
				var oNextRow = Pollarity.getNextSibling(oRow, true);
				if (iPos == 1) // First, move buttons
					Pollarity.swapTds(oRow, oNextRow, 1);
				for (var i=iPos; i<=iMax-1; i++) {
					var nr = Pollarity.getOptionNr(oNextRow);
					document.getElementById('o'+nr+'_'+sLang+'_pos').value = i;
					document.getElementById('o'+nr+'_'+sLang+'_key').firstChild.nodeValue = i;
					oNextRow = Pollarity.getNextSibling(oNextRow, true);
				}
			}
			oTable.removeChild(oRow);
		}
    },
    
    // Move an option
    pollAdminMoveOpt : function(oAnchor, iMove) {
    	var iOption = Pollarity.getOptionNr(oAnchor.parentNode.parentNode);
    	
    	// Get the languages
    	var aLangs =  document.getElementById('langs').value.split(',');

		for (l in aLangs) {
			var sLang=aLangs[l];
    		var oMoveOpt = document.getElementById('o'+iOption+'_'+sLang+'_pos');
    		var oPosKey = document.getElementById('o'+iOption+'_'+sLang+'_key');
    		var oldPos = oMoveOpt.value;
    		var newPos = parseInt(oldPos) + parseInt(iMove);
    		var oRow = document.getElementById('o'+iOption+'_'+sLang);
    		var oTable = oRow.parentNode;
    		var iMax = Pollarity.findMaxRowNum(oTable)-1;
    		
    		// Boundary check
    		if (newPos < 1 || newPos > iMax)
    			return;
    		
    		// Find out where we're moving to
    		var oToRow;
    		if (iMove < 0)
   				oToRow = Pollarity.getPreviousSibling(oRow, true);
    		else
    			oToRow = Pollarity.getNextSibling(oRow, true);
    		if (!oToRow || !oToRow.id)
    			return;
    		
    		// Move buttons check
    		if (newPos <= 2 || newPos >= iMax-1) {
				Pollarity.swapTds(oRow, oToRow, 1);
			}
			
    		// Adjust values
    		oMoveOpt.value = newPos;
    		document.getElementById(oToRow.id+'_pos').value = oldPos;
    		oPosKey.firstChild.nodeValue = newPos;
    		document.getElementById(oToRow.id+'_key').firstChild.nodeValue = oldPos;
    		
    		// Move the rows around
    		if (iMove < 0) {	// If moving up, clone&delete self and place before target
    			oMoved = oRow.cloneNode(true);
    			oTable.removeChild(oRow);
    			oTable.insertBefore(oMoved, oToRow);
    		} else {			// If moving down, clone&delete target and place before self
    			oMoved = oToRow.cloneNode(true);
    			oTable.removeChild(oToRow);
    			oTable.insertBefore(oMoved, oRow);
			}
		}
    },
    
    pollAdminToggleColor : function(checkbox, iOption) {
		var bChecked = checkbox.checked;
		var aLangs = document.getElementById('langs').value.split(',');
		for (l in aLangs) {
			var sLang=aLangs[l];
			var oColor = document.getElementById('o'+iOption+'_'+sLang+'_color');
			var oColorEnabled = document.getElementById('o'+iOption+'_'+sLang+'_enable_color');
			oColorEnabled.checked = bChecked
			if (!bChecked)
				oColor.value = '#000000';
			oColor.disabled = !bChecked;
		}
	},
    
    submitFormPreact : function(sFormId, sPreact) {
		var oForm = document.getElementById(sFormId);
		oForm.action = Pollarity.urlQueryAppend(document.getElementById(sFormId).action, "preact="+sPreact);
        if (oForm.onsubmit)
        	oForm.onsubmit();
		oForm.submit();
    },
    
    checkboxCheck : function(oInput, oForm) {
        var iMaxChoices = parseInt(oForm.getAttributeNS('http://pollarity.net/ns', 'maxchoices'));
        var iChoices = 0;
        var aInputs = oForm.getElementsByTagName('input');
        for(var n = 0; n < aInputs.length; n++)
           if(aInputs.item(n).type == 'checkbox' && aInputs.item(n).checked)
               iChoices++;
        if(iChoices > iMaxChoices)
           oInput.checked = '';
    },

    checkMinChoices : function(oForm) {
    	var skip = parseInt(document.getElementById('skip').value);
    	if (skip)
    		return true;
		var iMaxChoices = parseInt(oForm.getAttributeNS('http://pollarity.net/ns', 'maxchoices'));
		if (iMaxChoices > 1) {
			var iMinChoices = parseInt(oForm.getAttributeNS('http://pollarity.net/ns', 'minchoices'));
			var iChoices = 0;
			var aInputs = oForm.getElementsByTagName('input');
			for(var n = 0; n < aInputs.length; n++)
				if(aInputs.item(n).type == 'checkbox' && aInputs.item(n).checked)
					iChoices++;
				if(iChoices < iMinChoices) {
				alert(Pollarity.L10n.not_enough_options_selected);
				return false;
			} else {
				return true;
			}
		} else {
			return true;
		}
	},
	
	autoTranslate : function(a) {
		// The box from which the translate action is pressed
		var box = a.parentNode.parentNode;
		// The target language
		var target = box.id;
		var short_target = target.substr(0,2);
		// Find source language
		var source = document.getElementById("submit_lang").value;
		var short_source = source.substr(0,2);
		// Source box
		var src_box = document.getElementById(source);
		
		// Input and 'output' fields
		var inputs = new Array();
		var outputs = new Array();
		
		var titles = ["title", "short_title", "descrtext"];
		for (var t in titles) {
			inputs[inputs.length] = source+"_"+titles[t];
			outputs[outputs.length] = target+"_"+titles[t];
		}
		// Add option inputs
		var titles = ["text", "desc", "pdesc"];
		var on = 1;
		while (document.getElementById("o"+on+"_"+source)) {
			for (var t in titles) {
				inputs[inputs.length] = "o"+on+"_"+source+"_"+titles[t];
				outputs[outputs.length] = "o"+on+"_"+target+"_"+titles[t];
			}
			on++;
		}
		// Translate or copy empty to empty target fields
		for (var i in inputs) {
			if (document.getElementById(outputs[i]).value == "") {
				if (short_source == short_target)
					document.getElementById(outputs[i]).value = document.getElementById(inputs[i]).value;
				else
					this.gTranslate(outputs[i], document.getElementById(inputs[i]).value, short_source, short_target);
			}
		}
		
		return false;
	},
    
    gTranslate : function(element, text, source, target) {
		var el = document.getElementById(element);
		google.language.translate(text, source, target, function(result) {
			if (!result.error)
				el.value = result.translation;
		});
	},
    
    // Extracts the option_nr (int) from an option row
    getOptionNr : function(oTr) {
       	var sOption = oTr.id;
    	var iOption = parseInt(sOption.substring(1,sOption.indexOf("_")));
    	return iOption;
	},
	
    // Swap 2 TD elements from different TR's
    swapTds : function(oTr1, oTr2, iNumTd) {
    	if (!oTr1 || !oTr2)
    		return false;
    	var i = parseInt(iNumTd);
		var oTd1 = oTr1.getElementsByTagName('td')[i].cloneNode(true);
   		var oTd2 = oTr2.getElementsByTagName('td')[i].cloneNode(true);
  		oTr1.removeChild(oTr1.getElementsByTagName('td')[i]);
   		oTr2.removeChild(oTr2.getElementsByTagName('td')[i]);
		oTr1.insertBefore(oTd2, oTr1.getElementsByTagName('td')[i]);
		oTr2.insertBefore(oTd1, oTr2.getElementsByTagName('td')[i]);
    },
    
    // Polladmin number of option rows
    findMaxRowNum : function(o) {
    	var max = 0;
    	var x = o.firstChild;
		while (x) {
			if (x.nodeType==1 && x.id && (!x.firstChild.getAttributeNode("colspan") || x.firstChild.getAttributeNode("colspan").value == 1))
				max++;
			x=x.nextSibling
		}
    	return max;
    },
    
    //check if the previous sibling node is an element node
	getPreviousSibling : function(n, bParent) {
		var x=n.previousSibling;
		while (x.nodeType!=1 || (bParent && (x.firstChild.getAttributeNode("colspan") && x.firstChild.getAttributeNode("colspan").value > 1))) {
			if (!x.previousSibling)
				return false;
			x=x.previousSibling;
		}
		return x;
	},
    //check if the next sibling node is an element node
	getNextSibling : function(n, bParent) {
		var x=n.nextSibling;
		while (x.nodeType!=1 || (bParent && (x.firstChild.getAttributeNode("colspan") && x.firstChild.getAttributeNode("colspan").value > 1))) {
			if (!x.nextSibling)
				return false;
			x=x.nextSibling;
		}
		return x;
	},
	embedCodeChange : function() {
		var sWidth = document.getElementById('embed_width').value;
		var sHeight = document.getElementById('embed_height').value;
		var sCSS = document.getElementById('embed_css').value;
		var sECSSUrl = document.getElementById('embed_ecss_url').value;
		if(sCSS == '') {
			document.getElementById('embed_ecss_url').disabled = 'disabled';
			document.getElementById('embed_code').value = 
			'<iframe width="'+sWidth+'" height="'+sHeight+'" frameborder="0" src="'+Pollarity.dataURI+'?locale='+Pollarity.locale+'"></iframe>';
		} else if(sCSS == 'external') {
			document.getElementById('embed_ecss_url').disabled = '';
			document.getElementById('embed_ecss_url').focus();
			document.getElementById('embed_code').value = 
			'<iframe width="'+sWidth+'" height="'+sHeight+'" frameborder="0" src="'+Pollarity.dataURI+'?locale='+Pollarity.locale+'&ecss='+sECSSUrl+'"></iframe>';
		} else {
			document.getElementById('embed_ecss_url').disabled = 'disabled';
			document.getElementById('embed_code').value = 
			'<iframe width="'+sWidth+'" height="'+sHeight+'" frameborder="0" src="'+Pollarity.dataURI+'?locale='+Pollarity.locale+'&css='+sCSS+'"></iframe>';			
		}
	}
}

Pollarity.Editor = {    
    clickAction: function(sName)
    {   
        var oTextArea = document.getElementById('messagetext');
        if(oTextArea.cursorPos) {
            oTextArea.cursorPos.text = Pollarity.Editor.pAction(sName, oTextArea.cursorPos.text);
        } else if(oTextArea.selectionStart != undefined) {
            var sNewText = Pollarity.Editor.pAction(sName, oTextArea.value.substring(oTextArea.selectionStart, oTextArea.selectionEnd));
            oTextArea.value = 
            oTextArea.value.substring(0, oTextArea.selectionStart) + sNewText + oTextArea.value.substring(oTextArea.selectionEnd);
            oTextArea.setSelectionRange(oTextArea.selectionStart, oTextArea.selectionStart + sNewText.length);
        } else {
            oTextArea.value += Pollarity.Editor.pAction(sName, '');
        }
        oTextArea.focus();
    },
    pAction: function(sName, sText)
    {
        if(sName == 'bold')
            return '[b]' + sText + '[/b]';
        else if(sName == 'italic')
            return '[i]' + sText + '[/i]';
        else if(sName == 'underline')
            return '[u]' + sText + '[/u]';
        else if(sName == 'quote')
            return '[quote]' + sText + '[/quote]';
        else if(sName == 'insertimage')
            return '[img]' + sText + '[/img]';
        else if(sName == 'insertlist')
            return '\n[list]\n[*]' + sText + '[/*]\n[/list]';
        else
            return sName; 
    }
}

Pollarity.Messages = {
    readMessage : function(oNode) {
        if(Pollarity.Util.hasClass(oNode, 'newmsg'))
        {
            iMessageId = oNode.id.replace('message', '');
            var oCallback =
            {
                success: function(oElm) { Pollarity.Util.removeClass(oElm.argument, 'newmsg'); },
                failure: function(oElm) { },
                argument: oNode
            }
            Pollarity.Util.asyncRequest('POST', Pollarity.root + "act/readpm", oCallback, 'pmid=' + iMessageId);
        }
        Pollarity.toggleBoxVisible(oNode);
    },
    
    deleteMessage : function(oNode, sFolder) {
        if(confirm(Pollarity.L10n.sure_delete_message))
        {
            iMessageId = oNode.id.replace('message', '');
            var oCallback =
            {
                success: function(oElm)
                {
                	oElm.argument.oNode.parentNode.removeChild(oElm.argument.oNode);
                	var oCount = document.getElementById(oElm.argument.sFolder + '_count');
                	Pollarity.Util.setText(oCount, parseInt(Pollarity.Util.getText(oCount)) - 1);
                },
                failure: function(oElm) { },
                argument: { oNode : oNode, sFolder : sFolder }
            }
            Pollarity.Util.asyncRequest('POST', Pollarity.root + "act/delpm", oCallback, 'pmid=' + iMessageId);
        }
    },
    
    reportMessage : function(oNode) {
        var sReason = prompt(Pollarity.L10n.reason_reporting_message, '');
        if(sReason != null && sReason != '')
        {
            iMessageId = oNode.id.replace('message', '');
            var oCallback =
            {
                success: function(oElm) { alert(oElm.responseText); },
                failure: function(oElm) { },
                argument: oNode
            }
            Pollarity.Util.asyncRequest('POST', Pollarity.root + "act/reportpm", oCallback, 'pmid=' + iMessageId + '&reason=' + sReason);
        }
    },
    
    replyMessage : function(sTo) {
        document.getElementById('postto').value = sTo;
        Pollarity.Messages.showFolder('send');
        document.getElementById('messagetext').focus();
    },
    
    showFolder : function(sName) {
        Pollarity.Messages.hideFolders();
        if(sName == 'inbox') {
            document.getElementById('messages_inbox').style.display = 'block';
            Pollarity.Util.setText(document.getElementById('messages_title'), Pollarity.L10n.messages + ' - ' + Pollarity.L10n.inbox);
        } else if(sName == 'sent') {
            document.getElementById('messages_sent').style.display = 'block';
            Pollarity.Util.setText(document.getElementById('messages_title'), Pollarity.L10n.messages + ' - ' + Pollarity.L10n.sent_messages);
        } else if(sName == 'targeted') {
            document.getElementById('messages_targeted').style.display = 'block';
            Pollarity.Util.setText(document.getElementById('messages_title'), Pollarity.L10n.messages + ' - ' + Pollarity.L10n.targeted_messages);
        } else if(sName == 'suggestion') {
            document.getElementById('messages_suggestion').style.display = 'block';
            Pollarity.Util.setText(document.getElementById('messages_title'), Pollarity.L10n.messages + ' - ' + Pollarity.L10n.suggestions);
        } else if(sName == 'bugreport') {
            document.getElementById('messages_bugreport').style.display = 'block';
            Pollarity.Util.setText(document.getElementById('messages_title'), Pollarity.L10n.messages + ' - ' + Pollarity.L10n.bugreports);
        } else if(sName == 'send') {
            document.getElementById('messages_send').style.display = 'block';
            Pollarity.Util.setText(document.getElementById('messages_title'), Pollarity.L10n.messages + ' - ' + Pollarity.L10n.send_message);
        }
    },
    hideFolders : function() {
        document.getElementById('messages_inbox').style.display = 'none';
        document.getElementById('messages_sent').style.display = 'none';
        document.getElementById('messages_targeted').style.display = 'none';
        var oSuggestion = document.getElementById('messages_suggestion');
        if(oSuggestion) oSuggestion.style.display = 'none';
        var oBugreport = document.getElementById('messages_bugreport');
        if(oBugreport) oBugreport.style.display = 'none';
        document.getElementById('messages_send').style.display = 'none';
    }
}

Pollarity.Util = {
    /*
     * removeChildren: removes all childnodes from the element
     * Parameter oElm: (Object) the object
     */
    removeChildren : function(oElm) {
        var aResult = new Array();
        while(oElm.firstChild != null) {
            var oChild = oElm.firstChild;
            oElm.removeChild(oChild);
            aResult.push(oChild);
        }
        return aResult;
    },
    
    /*
     * getText: tries to get the text content using text or textContent (IE hack)
     * Parameter oElm: (Object) the element
     * Returns (String): the text
     */
    getText : function(oElm) {
        if(oElm.textContent) return oElm.textContent;
        else if(oElm.text)   return oElm.text;
        else return '';
    },

    /*
     * setText: sets the text of a element to the specified text (IE hack)
     * Parameter oElm: (Object) the element
     * Parameter sText: (String) the text
     */
    setText : function(oElm, sText) {
        Pollarity.Util.removeChildren(oElm);
        oElm.appendChild(document.createTextNode(sText));
    },
    
    /*
     * hasClass: checks if the given class is applied to a given element
     * Parameter oElm: (Object) the element
     * Parameter sClass: (String) the class
     * Returns (Boolean): true if the class is applied
     */
    hasClass : function(oElm, sClass) {
        aClasses = oElm.className.split(' ');
        for(n in aClasses) {
            if(aClasses[n] == sClass)
                return true;
        }
        return false
    },
    
    /*
     * addClass: adds the given class to a given element
     * Parameter oElm: (Object) the element
     * Parameter sClass: (String) the class
     */
    addClass : function(oElm, sClass) {
        if(!Pollarity.Util.hasClass(oElm, sClass))
        {
            aClasses = oElm.className.split(' ');
            aClasses.push(sClass);
            oElm.className = aClasses.join(' ');
        }
    },
    
    /*
     * removeClass: removes the given class from to a given element
     * Parameter oElm: (Object) the element
     * Parameter sClass: (String) the class
     */
    removeClass : function(oElm, sClass) {
        if(Pollarity.Util.hasClass(oElm, sClass))
        {
            aClasses = oElm.className.split(' ');
            var iIndex = -1;
            for(n in aClasses) {
                if(aClasses[n] == sClass)
                    iIndex = n;
            }
            aClasses.splice(iIndex, 1);
            oElm.className = aClasses.join(' ');
        }
    },
    
    /*
     * replaceClass: replaces the given class from to a given element
     * Parameter oElm: (Object) the element
     * Parameter sClassOld: (String) the class to be removed
     * Parameter sClassNew: (String) the class to be added
     */
    replaceClass : function(oElm, sClassOld, sClassNew) {
        if(Pollarity.Util.hasClass(oElm, sClassOld))
        {
            aClasses = oElm.className.split(' ');
            for(n in aClasses) {
                if(aClasses[n] == sClassOld)
                    aClasses[n] = sClassNew;
            }
            oElm.className = aClasses.join(' ');
        }
    },
    
    /*
     * getElementsByClassName: finds all elements with the given class and tag
     * Parameter sClass: (String) class to look for
     * Parameter sTagName: (String) tags to check (Optional, otherwise all tags)
     * Parameter oElm: (Object) element to start from (Optional, otherwise the document element)
     * Returns (Array): the elements with the class
     */
    getElementsByClassName : function(sClass, sTagName, oElm) {
        var aResults = new Array();
        if(sTagName == null)
            sTagName = '*';
        if(oElm == null)
            oElm = document;
        var aElms = oElm.getElementsByTagName(sTagName);
        for (var n = 0; n < aElms.length; n++) 
        {
            if(Pollarity.Util.hasClass(aElms[n], sClass))
                aResults.push(aElms[n]);
        }
    	return aResults;
    },
    
    /*
     * asyncRequest: performs an async/AJAX-request
     * Parameter sMethod: (String) HTTP method to perform (GET, POST, PUT, DELETE, ...)
     * Parameter sURI: (String) URI to request
     * Parameter oCaalback: (Object) element handle the callback upon success or failure of the request
     * Parameter sPostData: (String) URL-encoded (GET-like: foo=bar&foo2=bar2) POST variables to send
     */
    asyncRequest : function(sMethod, sURI, oCallback, sPostData) {
        var oXMLHTTP = null;
        try {
            oXMLHTTP = new XMLHttpRequest();
        } catch(e) {
            //IE
            try {
                oXMLHTTP = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                oXMLHTTP = new ActiveXObject("Microsoft.XMLHTTP");
            }
        }
        oXMLHTTP.onreadystatechange = function() {
            oXMLHTTP.argument = oCallback.argument;
            if(oXMLHTTP.readyState == 4) {
                if(oXMLHTTP.status >= 200 && oXMLHTTP.status < 300)
                    oCallback.success(oXMLHTTP);
                else
                    oCallback.failure(oXMLHTTP);
            }
        }
        oXMLHTTP.open(sMethod.toUpperCase(), sURI, true);
        if(sPostData != null) {
			oXMLHTTP.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
            oXMLHTTP.send(sPostData)
        } else {
            oXMLHTTP.send(null);
        }
    }
}
Pollarity.windowTimer = null;

