Greasemungo Star Mean

By kenmooda Last update Sep 22, 2008 — Installed 523 times. Daily Installs: 0, 1, 2, 0, 0, 3, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 3, 2, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1

There are 5 previous versions of this script.

// ==UserScript==
// @name           Greasemungo Star Mean
// @namespace      kenmooda@gmail.com
// @description    Popmundo: Shows number of skills and arithmetic mean of the skills stars (2009-09-22)
// @include        http://www*.popmundo.com/Common/CharacterDetails.asp?action=MySkills*
// ==/UserScript==
////////////////////////////////////////////////////////////////////////////////
//    
//    Copyright (c) 2008 Tommi Rautava
//    
//    Permission is hereby granted, free of charge, to any person
//    obtaining a copy of this software and associated documentation
//    files (the "Software"), to deal in the Software without
//    restriction, including without limitation the rights to use,
//    copy, modify, merge, publish, distribute, sublicense, and/or sell
//    copies of the Software, and to permit persons to whom the
//    Software is furnished to do so, subject to the following
//    conditions:
//    
//    The above copyright notice and this permission notice shall be
//    included in all copies or substantial portions of the Software.
//    
//    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
//    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
//    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
//    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
//    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
//    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
//    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
//    OTHER DEALINGS IN THE SOFTWARE.
//    
////////////////////////////////////////////////////////////////////////////////

const SKILLS_COUNT_TITLE_TEXT = 'Skills count';
const STARS_MEAN_TITLE_TEXT = 'Stars mean';

////////////////////////////////////////////////////////////////////////////////

const STAR_IMG_URL = 'graphics/Default/Miscellaneous/star1.gif';
const WHITE_BAR_IMG_URL = 'graphics/Default/progressbar/stapel_vit.gif';
const GREEN_BAR_IMG_URL = 'graphics/Default/progressbar/stapel_gron.gif';
const LTBLUE_BAR_IMG_URL = 'graphics/Default/progressbar/stapel_ljusbla.gif';

////////////////////////////////////////////////////////////////////////////////

const PROGRESS_IMG_XPATH = '/html/body/table[3]/tbody/tr/td[1]/div[2]/form/div/table/tbody/tr/td[2]/img[last()-1]';
const RESULT_XPATH = '/html/body/table[3]/tbody/tr/td/div[2]/form/table[3]';
const EXTRACT_PATTERN = /(\d+).*?(\d+)\%/; // #6 star 0% complete.

////////////////////////////////////////////////////////////////////////////////

function xpathNode(xpath) {
	return document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}


function xpathNodes(xpath) {
	return document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
}


function countMean(imgNodes) {
	var count = 0;
	var sum = 0;
	
	for (var i = imgNodes.snapshotLength - 1; i >= 0; i--) {
		var imgNode = imgNodes.snapshotItem(i);		
		var res = imgNode.title.match(EXTRACT_PATTERN);
		
		if (res) {
			count++;
			var stars = (res[1] - 1) + (res[2] / 100);
			sum = sum + stars;
			//GM_log(i +"="+ stars);
		}
	}
	
	//GM_log('skills='+ count +', stars='+ sum);
	
	return {
		count: count,
		sum: sum,
		mean: (sum / count)
	};
}


function createStar() {
	// <img width="8" hspace="1" height="8" alt="*" src="graphics/Default/Miscellaneous/star1.gif"/>
	var img1 = document.createElement('img');
	img1.width = 8;
	img1.height = 8;
	img1.hspace = 1;
	img1.alt = '*';
	img1.src = STAR_IMG_URL;
	
	return img1;
}

function createProgressBarImage(imgUrl) {
	var img1 = document.createElement('img');
	img1.width = 1;
	img1.height = 10;
	img1.border = 0;
	img1.src = imgUrl;
	
	return img1;
}

function createProgressBar(barValue, titleText, targetNode) {
	//<img width="1" height="10" border="0" src="graphics/Default/progressbar/stapel_vit.gif"/>
	//<img width="2" height="10" border="0" title="#2 star 5% complete." alt="#2 star 5% complete." src="graphics/Default/progressbar/stapel_gron.gif"/>

	var overlayText = document.createElement('span');
	overlayText.appendChild(document.createTextNode(barValue + '%'));
	overlayText.setAttribute('style', 'position: absolute; text-align: right; color: #000000; width: 2px; line-height: 9px; font-size: 10px; font-weight: normal; z-index: 2;');
	targetNode.appendChild(overlayText);

	var img1 = createProgressBarImage(WHITE_BAR_IMG_URL);
	targetNode.appendChild(img1);

	var width2 = parseInt((barValue / 100) * 40);
	if (width2 > 0) {
		var img2 = createProgressBarImage(GREEN_BAR_IMG_URL);
		img2.width = width2;
		img2.title = titleText;
		targetNode.appendChild(img2);
	}

	var width3 = 40 - width2;
	if (width3 > 0) {
		var img3 = createProgressBarImage(LTBLUE_BAR_IMG_URL);
		img3.width = width3;
		img3.title = titleText;
		targetNode.appendChild(img3);
	}

	var img4 = createProgressBarImage(WHITE_BAR_IMG_URL);
	targetNode.appendChild(img4);
}


function createRow(titleText) {
	var keyNode = document.createElement('b');
	keyNode.appendChild(document.createTextNode(titleText));
	
	var td1 = document.createElement('td');
	td1.appendChild(keyNode);

	var td2 = document.createElement('td');
	td2.align = 'right';
		
	var tr1 = document.createElement('tr');
	tr1.appendChild(td1);
	tr1.appendChild(td2);
	
	return tr1;
}


function createCountRow(count) {
	var tr1 = createRow(SKILLS_COUNT_TITLE_TEXT);
	var td2 = tr1.cells.item(1);
	
	var b = document.createElement('b');
	b.appendChild(document.createTextNode(count));

	td2.appendChild(b);
	td2.appendChild(document.createTextNode('\u00a0'));
	
	return tr1;
}
	

function createMeanRow(stars, progress, titleText) {
	var tr1 = createRow(STARS_MEAN_TITLE_TEXT);
	var td2 = tr1.cells.item(1);
	
	for (var i = stars; i > 0; i--) {
		var starNode = createStar();
		td2.appendChild(starNode);
	}
	
	td2.appendChild(document.createTextNode('\u00a0\n\t\t'));
	createProgressBar(progress, titleText, td2);
	td2.appendChild(document.createTextNode('\u00a0'));
	
	return tr1;
}
	

function showResult(count, stars, progress, titleText) {
	var targetNode = xpathNode(RESULT_XPATH);
	
	if (targetNode) {
		var tr1 = createCountRow(count);
		var tr2 = createMeanRow(stars, progress, titleText);

		tr1.className = 'DarkColumnHL';

		var tbody1 = targetNode.tBodies.item(0);
		tbody1.appendChild(tr1);
		tbody1.appendChild(tr2);
	}
}


function createTitleText(titleTemplate, stars, progress) {
	var titleText = titleTemplate;
	titleText = titleText.replace(/(\#\d+)/, '#'+ (stars+1));
	titleText = titleText.replace(/(\d+\.)/, (stars+1) + '.');
	titleText = titleText.replace(/(\d+\%)/, progress + '%');
	
	return titleText;
}


var imgNodes = xpathNodes(PROGRESS_IMG_XPATH);

if (imgNodes && imgNodes.snapshotLength > 0) {
	var res = countMean(imgNodes);

	var stars = parseInt(res.mean);
	var progress = parseInt((res.mean - stars) * 100);	
	var titleText = createTitleText(imgNodes.snapshotItem(0).title, stars, progress);
	
	showResult(res.count, stars, progress, titleText);
}

// EOF