// ==UserScript==
// @name           Ars Technica WoW Players v2.0
// @namespace      http://everynothing.net/arswow/
// @description    Displays WoW characters for posters in Ars Technica's World of Warcraft threads
// @include        http://arstechnica.com/civis/viewtopic.php?*
// ==/UserScript==

//
//
// Stuff you can change:
//


// Number of characters to show at maximum. 
// 0 means no limit. 
// Will sort by level and show highest-levelled first.
var numOfCharsShown = 4; 


// Will not show characters below this level.
var ignoreBelowLevel = 1;

//
//
// User-modifiable stuff ends here.
//

var arsnames = new Array();

if (typeof(GM_xmlhttpRequest) == "undefined") {
    GM_xmlhttpRequest = function(parm) {
        var request = new XMLHttpRequest();
        request.onreadystatechange = function(evt) {
            if (request.readyState == 4) {
                parm['onload'](request);
            }
        };
        request.open(parm['method'], parm['url'], true);
        for (var header in parm['headers']) {
            request.setRequestHeader(header, parm['headers'][header]);
        }
        request.send();
    };
}

function starthere() {
	var divs = document.getElementsByClassName("post-author-name")
	var gotname,x,y;
	for (x = 0; x < divs.length; x++) 
		if (divs[x].getElementsByTagName('a')[0]) {
			theirname = divs[x].getElementsByTagName('a')[0].innerHTML.replace(/,/g,'\\,');
			gotname = false;
			for (y = 0; (y < arsnames.length)&&(!gotname); y++)
				gotname |= (arsnames[y] == theirname);
			if (!gotname) arsnames.push(theirname);
		}
	
	if (arsnames.length > 0) loadplayers(encodeURIComponent(arsnames.join(',')));
}

function loadplayers(arsnames) {
	GM_xmlhttpRequest({
	    method: 'GET',
	    url: 'http://www.everynothing.net/arswow/xml.php?arsusers='+arsnames,
	    headers: {
	        'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey/0.3',
	        'Accept': 'application/atom+xml,application/xml,text/xml',
	    },
	    onload: function(responseDetails) {
	        var parser = new DOMParser();
	        var dom = parser.parseFromString(responseDetails.responseText,"application/xml");
	        var entries = dom.getElementsByTagName('character');
			var alldata='', curname = '', shownsofar=0, addedscroll = 0;

			for (var i = 0; i < entries.length; i++) {
				if (entries[i].getElementsByTagName('arsname')[0].textContent != curname) {
					if (curname != '') addedscroll += updatetable(curname, alldata);
					shownsofar = 0;
					curname = entries[i].getElementsByTagName('arsname')[0].textContent;
					alldata = '';
				}
				if ((shownsofar < numOfCharsShown) && (parseInt(entries[i].getElementsByTagName('level')[0].textContent) >= ignoreBelowLevel)) {
					shownsofar++;
					alldata += '<br><abbr title="';
					if (entries[i].getElementsByTagName('guildname').length > 0) alldata += '&lt;' +
						entries[i].getElementsByTagName('guildname')[0].textContent + '&gt; ';					
					alldata += 'on ' +
						entries[i].getElementsByTagName('realmname')[0].textContent + ' (' +
						entries[i].getElementsByTagName('servertype')[0].textContent + ')">' + '<a href="' + entries[i].getElementsByTagName('wowname')[0].getAttribute("quickarmoryurl") + '" target="_blank">' +					
						entries[i].getElementsByTagName('wowname')[0].textContent + '</a></abbr> ' +
						entries[i].getElementsByTagName('level')[0].textContent + '&nbsp;';
					alldata += entries[i].getElementsByTagName('racename')[0].textContent.replace(' ','&nbsp;')+'&nbsp;';
					alldata += entries[i].getElementsByTagName('classname')[0].textContent.replace(' ','&nbsp;');
				}
			}
			if (curname != '') addedscroll += updatetable(curname, alldata);
			addWindowScroll(addedscroll);
	    } 
	}); 
}
function updatetable(arsname, alldata) {
	var scrollret = 0;
	var tds = document.getElementsByClassName('post-author');
	for (var x = 0; x < tds.length; x++) 
		if (n = tds[x].getElementsByClassName('post-author-name')[0].getElementsByTagName('a')[0].innerHTML) 
			if (n == arsname) {
				scrolldiff = document.body.scrollHeight;
				tds[x].innerHTML += '<div class="post-author-title">'+alldata+'</div>';
				scrolldiff = document.body.scrollHeight - scrolldiff;
				if (geteleoffset(tds[x]) < getWindowScroll()) scrollret += scrolldiff;
			}
	
	return scrollret;
}
function geteleoffset(ele) {
	if (ele == document.body) return 0;
	if (ele == undefined) return 0;
	return ele.offsetTop + geteleoffset(ele.offsetParent);
}
function getWindowScroll() {
	if (window.scrollMaxY) return window.scrollY;
	return document.body.scrollTop;
}
function addWindowScroll(s) {
	if (window.scrollMaxY) window.scrollBy(0,s); else document.body.scrollTop += s;
}

if (document.title.toLowerCase().indexOf('world of warcraft') >= 0) starthere();
