// ==UserScript==
// @name          Print Friendly
// @namespace     http://www.arantius.com/misc/greasemonkey/
// @description	  Find the print friendly version automatically for any site, based on heuristics.
// @include       *
// ==/UserScript==

var console=unsafeWindow.console;
///console.info('Start running Print Friendly ... '+document.location);

var link;

var links=document.evaluate(
	"//a[@href]//img[contains(@src, 'print') or contains(@src, 'Print')] | " +
	"//a[contains(@href, 'printable') or contains(@href, 'Printable')] | " +
	// "//a[@href]/.[contains(@class, 'print') or contains(@class, 'Print')] | " +
	"//a[@href]//.[contains(., 'single') or contains(., 'Single')] | " +
	"//a[@href]//.[contains(., 'print') or contains(., 'Print') or contains(., 'PRINT')]",
	document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null
);
for (var i=0, el=null; el=links.snapshotItem(i); i++) {
	///console.info('PF examine el:', el);
	try {
		link=el;
		while (link && 'A'!=link.tagName) link=link.parentNode;
		///console.info('PF found link:', link);
		if (!link) continue;

		//if (0==link.href.indexOf('javascript:')) continue;

		if ('PRINT'==link.textContent.toUpperCase() ||
			link.textContent.match(/print(er|able)?.*(article|friendly|this|version)/i) ||
			link.textContent.match(/single.*page/i) ||
			link.href.match(/print(able|friendly|page|story)/i) ||
			(el.src && el.src.match(/print/i))
		) {
			console.log("Print friendly link candidate: ", link);
			link.style.outline='2px dashed purple';
			link.focus();
			return;
		}
	} catch (e) { console.error(e); }
}

var buttons=document.evaluate(
	"//input[@type='image' and (contains(@src, 'print') or contains(@src, 'Print')) ] | " +
	"//input[@type='submit' and (contains(@value, 'print') or contains(@value, 'Print')) ] | " +
	"//button/.[contains(., 'print') or contains(., 'Print')]",
	document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null
);
var form;
for (var i=0, el=null; el=buttons.snapshotItem(i); i++) {
	//try {
		form=el.form || el;
		while (form && 'FORM'!=form.tagName) form=form.parentNode;
		if (!form) continue;

		console.log("Print friendly form candidate: ", form, el);
		form.style.outline='2px dashed pink';
		el.style.outline='2px dashed pink';
		return;
	//} catch (e) { console.error(e); }
}

///console.info('...Finish running Print Friendly.');
