// Add a fix for code stuff?
if ((is_ie && !is_ie4) || is_webkit || is_ff)
	addLoadEvent(smf_codeBoxFix);

// The purpose of this code is to fix the height of overflow: auto blocks, because some browsers can't figure it out for themselves.
function smf_codeBoxFix()
{
	var codeFix = document.getElementsByTagName('code');
	for (var i = codeFix.length - 1; i >= 0; i--)
	{
		if (is_webkit && codeFix[i].offsetHeight < 20)
			codeFix[i].style.height = (codeFix[i].offsetHeight + 20) + 'px';

		else if (is_ff && (codeFix[i].scrollWidth > codeFix[i].clientWidth || codeFix[i].clientWidth == 0))
			codeFix[i].style.overflow = 'scroll';

		else if ('currentStyle' in codeFix[i] && codeFix[i].currentStyle.overflow == 'auto' && (codeFix[i].currentStyle.height == '' || codeFix[i].currentStyle.height == 'auto') && (codeFix[i].scrollWidth > codeFix[i].clientWidth || codeFix[i].clientWidth == 0) && (codeFix[i].offsetHeight != 0))
			codeFix[i].style.height = (codeFix[i].offsetHeight + 24) + 'px';
	}
}

// Adds a button to a certain button strip.
function smf_addButton(sButtonStripId, bUseImage, oOptions)
{
	var oButtonStrip = document.getElementById(sButtonStripId);
	var aItems = oButtonStrip.getElementsByTagName('li');

	// Remove the 'last' class from the last item.
	if (aItems.length > 0)
	{
		var oLastItem = aItems[aItems.length - 1];
		oLastItem.className = oLastItem.className.replace(/\s*last/, 'position_holder');
	}

	// Add the button.
	var oButtonStripList = oButtonStrip.getElementsByTagName('ul')[0];
	var oNewButton = document.createElement('li');
	oNewButton.className = 'last';
	setInnerHTML(oNewButton, '<a href="' + oOptions.sUrl + '" ' + ('sCustom' in oOptions ? oOptions.sCustom : '') + '><span' + ('sId' in oOptions ? ' id="' + oOptions.sId + '"': '') + '>' + oOptions.sText + '</span></a>');

	oButtonStripList.appendChild(oNewButton);
}

// Adds hover events to list items. Used for a versions of IE that don't support this by default.
var smf_addListItemHoverEvents = function()
{
	var cssRule, newSelector;

	// Add a rule for the list item hover event to every stylesheet.
	for (var iStyleSheet = 0; iStyleSheet <  document.styleSheets.length; iStyleSheet ++)
		for (var iRule = 0; iRule < document.styleSheets[iStyleSheet].rules.length; iRule ++)
		{
			oCssRule = document.styleSheets[iStyleSheet].rules[iRule];
			if (oCssRule.selectorText.indexOf('LI:hover') != -1)
			{
				sNewSelector = oCssRule.selectorText.replace(/LI:hover/gi, 'LI.iehover');
				document.styleSheets[iStyleSheet].addRule(sNewSelector, oCssRule.style.cssText);
			}
		}

	// Now add handling for these hover events.
	var oListItems = document.getElementsByTagName('LI');
	for (oListItem in oListItems)
	{
		oListItems[oListItem].onmouseover = function() {
			this.className += ' iehover';
		};

		oListItems[oListItem].onmouseout = function() {
			this.className = this.className.replace(new RegExp(' iehover\\b'), '');
		};
	}
}

// Add hover events to list items if the browser requires it.
if (is_ie6down && 'attachEvent' in window)
	window.attachEvent('onload', smf_addListItemHoverEvents);
	

var disappeardelay = 30 * 1000; // karma box hide display time, in milliseconds
var vertical_offset = "0px"; // vertical offset of karma box from image
var horizontal_offset = "-3px"; // horizontal offset of karma box from image

function getposOffset(what, offsettype)
{
	var totaloffset = (offsettype=="left") ? what.offsetLeft : what.offsetTop;
	var parentEl = what.offsetParent;

	while (parentEl!=null)
	{
		totaloffset = (offsettype == "left") ? totaloffset + parentEl.offsetLeft : totaloffset + parentEl.offsetTop;
		parentEl = parentEl.offsetParent;
	}

	return totaloffset;
}

function showhiderep(obj, e)
{
	rep_box.style.left = rep_box.style.top = -500;
	rep_box.widthobj = rep_box.style;
	rep_box.widthobj.width = '300px';

	if (obj.visibility == "visible"){
		obj.visibility = "hidden";
		obj.display = "none";
	}
	else
	{
		obj.visibility = "visible";
		obj.display = "block";
	}
}

function reputationForm(rep_contents, member_name, obj, e)
{
	if(window.event)
		event.cancelBubble = true;
	else if(e.stopPropagation)
		e.stopPropagation();

	clearhidebox();

	rep_box = document.getElementById("reputation_menu");
	rep_fields = document.getElementById("reputation_fields");
	rep_name = document.getElementById("reputation_name");
	setInnerHTML(rep_fields, getInnerHTML(document.getElementById(rep_contents)));
	setInnerHTML(rep_name, member_name);

	showhiderep(rep_box.style, e);

	rep_box.x = getposOffset(obj, "left");
	rep_box.y = getposOffset(obj, "top");
	rep_box.style.left = rep_box.x + "px";
	rep_box.style.top = rep_box.y + obj.offsetHeight + "px";

	delayhidebox();
}

function hidebox(e)
{
	if(typeof rep_box != "undefined")
		rep_box.style.visibility = "hidden";
}

function delayhidebox()
{
	delayhide = setTimeout("hidebox()", disappeardelay);
}

function clearhidebox()
{
	if(typeof delayhide != "undefined")
		clearTimeout(delayhide);
}

var aReputation = new Array();

// *** Reputation object.
function Reputation(oOptions)
{
	if (!this.isXmlHttpCapable())
		return;

	this.opt = oOptions;
	this.funcParent = this;
}

// Determine whether the quick modify can actually be used.
Reputation.prototype.isXmlHttpCapable = function ()
{
	if (typeof(window.XMLHttpRequest) == 'undefined')
		return false;

	// Opera didn't always support POST requests. So test it first.
	if (typeof(window.opera) != 'undefined')
	{
		var test = new XMLHttpRequest();
		if (typeof(test.setRequestHeader) != 'function')
			return false;
	}

	return true;
}

// The function called after a user wants to save his precious message.
Reputation.prototype.sendRep = function (sSessionId)
{
	var i, x = new Array();
	var form = document.forms.reputation_form.elements;
	x[x.length] = 'reputation_comment=' + escape(form['reputation_comment'].value.replace(/&#/g, "&#38;#").php_to8bit()).replace(/\+/g, "%2B");
	x[x.length] = 'topic=' + parseInt(form['topic'].value);
	x[x.length] = 'uid=' + parseInt(form['uid'].value);
	x[x.length] = 'm=' + parseInt(form['m'].value);
	x[x.length] = 'type=' + (form['type'][0].checked ? form['type'][0].value : form['type'][1].value);
	x[x.length] = document.getElementById('sessionid').name + '=' + document.getElementById('sessionid').value;

	// Happy Easter!
	if(form['reputation_comment'].value == "about:reputation"){
		alert("Version 1.7, for SMF 2.0 RC1. Code by Fustrate (http://www.fustrate.com/), who is pretty awesome.");
		return;
	}

	// Send in the XMLhttp request and let's hope for the best.
	ajax_indicator(true);
	sendXMLDocument.call(this, smf_prepareScriptUrl(this.opt.sScriptUrl) + "action=xmlhttp;sa=reputation;xml", x.join("&"), this.onRepDone);

	return false;
}

// Callback function of the XMLhttp request sending the modified message.
Reputation.prototype.onRepDone = function (XMLDoc)
{
	// We've finished the loading stuff.
	ajax_indicator(false);
	hidebox();

	// If we didn't get a valid document, just cancel.
	if (!XMLDoc || !XMLDoc.getElementsByTagName('smf')[0])
		return;

	var result = XMLDoc.getElementsByTagName('smf')[0].getElementsByTagName('result')[0];
	var error = XMLDoc.getElementsByTagName('smf')[0].getElementsByTagName('error')[0];

	if (result)
	{
		alert(result.childNodes[0].nodeValue);
		document.getElementById('repicon').style.display = 'none';
		document.getElementById('repicon').style.visibility = 'hidden';
	}
	else if (error)
		alert(error.childNodes[0].nodeValue);
}