/*
	printpage.js
	
	v1.14, 2007-10-23, Christian Augustin

*/
/*
	Insert DIV with javascript link to print the current page.

	JavaScript 1.3+, W3C DOM Level 1
	MSIE 5, Netscape 7, Mozilla 1.0, Firefox 1.0, Safari 1.1, Opera 7.0

	Changes
	2007-10-23 cma: Language CSS class and span added.
	2007-02-07 cma: Optionaly using window.onDomReady() for initialization.
	2006-01-20 cma: Print link changed (JavaScript url).
	2006-01-19 cma: Cosmetics.
	2006-01-18 cma: Support for pageComplete added.
	2006-01-18 cma: CSS to hide PrintPage when printing included.
	2005-11-19 cma: Honors meta tag 'printpage' with content 'hide'.
	2005-09-26 cma: All default texts consolidated.
	2005-09-14 cbl: ES, IT, PT added and modified.
	2005-08-08 cma: Forgotten test alert ...
	2005-08-05 cma: Fixed a bug with .accessCatches + window.top instead of .parent.
	2005-07-22 cma: Disabled Opera 7.x on MacOSX (print link not functional).
	                Base target detection shifted to init function.
	2005-07-18 cma: Now honors base target and presets.PrintPage.target!
	                (For printing pages in other frames.)
	2005-07-17 cma: Default text bug fixed.
	2005-06-17 cma: Presets bug fixed!
	2005-05-29 cma: Slight cosmetic changes, declared v1.00!
	2005-05-27 cma: Initial version.
	
	ToDo
	- Honor meta tag 'printpage' with 'autoprint' on load.


	External presets
	
	presets.PrintPage = new Object();
	presets.PrintPage.attachTo = 'body';	// ''|'body'|'.DivClass'|'#ElementID'; '' = cancel!
	presets.PrintPage.attachAt = 'begin';	// ''|'begin'|'end'|'before'|'after'
	presets.PrintPage.target = '_self';
	presets.PrintPage.text['defaul'] = 'Print current page' ;
	presets.PrintPage.text['de'] = 'Aktuelle Seite drucken';
	presets.PrintPage.text['en'] = 'Print current page' ;
	presets.PrintPage.title = new Object();
	presets.PrintPage.title['defaul'] = '...';
	presets.PrintPage.title['de'] = '...';
	presets.PrintPage.title['en'] = '...';
	presets.PrintPage.title['es'] = '...';
	presets.PrintPage.title['it'] = '...';
	presets.PrintPage.title['pt'] = '...';
	
	
	Further settings
	
	- Use target of BASE tag in head of page (overwrites presets.PrintPage.target):
	
	  <base target="Content" />
	  
	- Use META tag in head of page to disable creation of PrintPage link in page:
	
	  <meta name="printpage" content="hide" />
	

*/


var PrintPage = new Object();



/* =======================
   Class properties ...
======================= */

/* Default presets ... */

PrintPage.attachTo = 'body';	// ''|'body'|'.DivClass'|'#ElementID'
PrintPage.attachAt = 'end';		// ''|'begin'|'end'|'before'|'after'

PrintPage.target = '_self';

PrintPage.text = new Object();
PrintPage.text['default'] = 'Print page' ;
PrintPage.text['de'] = 'Seite drucken';
PrintPage.text['en'] = 'Print page' ;
PrintPage.text['es'] = 'Imprimir p\u00E1gina' ;
PrintPage.text['it'] = 'Stampa questa pagina';
PrintPage.text['pt'] = 'Imprimir p\u00E1gina';

PrintPage.title = new Object();
PrintPage.title['default'] = 'Please activate the browser setting \u201CPrint background\u201D.';
PrintPage.title['de'] = 'Bitte die Browsereinstellung \u201EHintergrund drucken\u201C aktivieren.';
PrintPage.title['en'] = 'Please activate the browser setting \u201CPrint background\u201D.';
PrintPage.title['es'] = 'Active el ajuste del browser \u201CImpresi\u00F3n en segundo plano\u201D.';
PrintPage.title['it'] = 'Per favore, attivare l\u2019impostazione browser \u201CStampare sfondo\u201D.';
PrintPage.title['pt'] = 'Activar a configura\u00E7\u00E3o do browser para \u201CImprimir em segundo plano\u201D.'

PrintPage.divClass = 'PrintPage';
PrintPage.aClass = 'print';


/* Use external presets if present ... */

if ((typeof presets != 'undefined') && presets.PrintPage) {
	if (typeof presets.PrintPage.attachTo != 'undefined') PrintPage.attachTo = presets.PrintPage.attachTo;
	if (typeof presets.PrintPage.attachAt != 'undefined') PrintPage.attachAt = presets.PrintPage.attachAt;
	if (typeof presets.PrintPage.target != 'undefined') PrintPage.target = presets.PrintPage.target;
	if (typeof presets.PrintPage.text != 'undefined') PrintPage.text = presets.PrintPage.text;
	if (typeof presets.PrintPage.title != 'undefined') PrintPage.title = presets.PrintPage.title;
	if (typeof presets.PrintPage.divClass != 'undefined') PrintPage.divClass = presets.PrintPage.divClass;
	if (typeof presets.PrintPage.aClass != 'undefined') PrintPage.aClass = presets.PrintPage.aClass;
}


/* Look out for meta with name "printpage" */

PrintPage.hide = false;

PrintPage.getMetaPresets = function() {
	var metas = document.getElementsByTagName('meta');
	if (!metas) return;
	var ppmeta = ''
	for (var m=0; m<metas.length; m++) {
		var meta = metas[m];
		var name = (meta.httpEquiv) ? meta.httpEquiv : meta.name;
		if (name.match(/printpage/i)) ppmeta = meta.content;
	}
	if (!ppmeta) return;
	PrintPage.hide = !!ppmeta.match(/hide/i);
}







/* ====================
   Class methods ...
==================== */

/* Try to catch access denied errors when accessing other frames ... */

PrintPage.accessCatches = 0;

if (document.getElementsByTagName) {
	PrintPage.accessFrame = new Function('frm', 'try{frm.location.href; return frm} catch(e){++PrintPage.accessCatches; return null}');
} else {
	PrintPage.accessFrame = new Function('frm', 'return frm');
}


PrintPage.print = function() {

	var trg = (this.target) ? this.target : PrintPage.target;
	var frm = (trg == '_self') ? window : PrintPage.accessFrame(window.top.frames[trg]);

	if (frm) {
		if (frm.focus) frm.focus();
		if (frm.parentWindow && frm.parentWindow.focus) frm.parentWindow.focus();
		frm.print();
	}
	
	//return false;
	return;
}


/* Create print link in page ... */

PrintPage.create = function() {

	if (!PrintPage.attachTo) return;
	if (!window.print || !(document.body && document.body.appendChild) || !(document.body && document.body.insertBefore)) return;
	
	/* Avoid using with Safari before 1.3 and frame targeting ... */
	var ua = window.navigator.userAgent;
	if ((ua.indexOf('AppleWebKit/') != -1) && ua.match(/AppleWebKit\/1\d\d\D/) && (PrintPage.target != '_self')) return;
	if ((window.opera && ua.match(/Mac/) && ua.match(/Opera.7\./))) return;
	
	var htmlLang = (document.documentElement) ? document.documentElement.lang.toLowerCase() : '';
	var file = document.location.pathname;
	var fileLang = (file.match(/_[a-z]{2}(-[a-z]{2})?\.[^.]+$/i)) ? 
						file.replace(/^.*_([a-z]{2}(-[a-z]{2})?)\.[^.]+$/i, '$1') : '';
	var lang = (htmlLang) ? htmlLang : ((fileLang) ? fileLang : 'default');

	var toName = PrintPage.attachTo;
	var at = PrintPage.attachAt.toLowerCase();
	var atNames = ' begin end before after ';
	
	if (toName.toLowerCase() == 'body') {
		at = (at == 'begin') ? 'begin' : 'end';
	} else {
		at = (atNames.indexOf(' ' + at + ' ') != -1) ? at : 'before';
	}
	
	var to = null;
	
	if (toName.toLowerCase() == 'body') {
		to = document.body;
	} else {
		if (toName.indexOf('#') == 0) {
			to = document.getElementById(toName.substring(1));
		} else {
			var divs = document.body.getElementsByTagName('div');
			if (divs) {
				for (var i = divs.length - 1; i >= 0; i--) {
					var d = divs[i];
					if (d.className && ('.' + d.className == toName)) {
						to = d;
						break;
					}
				}
			}
		};
		if (!to) {
			to = document.body;
			at = 'end';
		};
	};
	
	if (!to) return;
	
	var div = document.createElement('div');
	if (!div) return;
	div.className = PrintPage.divClass + ' lang' + lang.toUpperCase();
	
	if (at == 'begin' ) {
		div = to.insertBefore(div, to.firstChild);
	} else if (at == 'end') {
		div = to.appendChild(div);
	} else if (at == 'before') {
		div = to.parentNode.insertBefore(div, to);
	} else if (at == 'after') {
		div = to.parentNode.insertBefore(div, to.nextSibling);
	};

	if (!div) return;
	
	var lnk = div.appendChild(document.createElement('a'));
	if (!lnk) return;
	
	lnk.className = PrintPage.aClass;

	// This solution is simple but not functional with base target and Safari 1.3:
	// lnk.href = "javascript:window.focus();window.print();";
	
	//lnk.href = "javascript:void 0;";
	//lnk.onclick = PrintPage.print;
	
	// Let's try this:
	lnk.href = "javascript:PrintPage.print();";
	lnk.appendChild(document.createElement('span'));
	
	var txt = (PrintPage.text[lang]) ? PrintPage.text[lang] : PrintPage.text['default'];
	lnk.firstChild.appendChild(document.createTextNode(txt));

	var title = (typeof PrintPage.title[lang] != 'undefined') ? PrintPage.title[lang] : PrintPage.title['default'];
	lnk.title = (title) ? title : '';
	
	lnk.onmouseover = function() {
		window.status = txt + ' (' + title + ')';
		return true;
	}
	
	lnk.onmouseout = function() {
		window.status = '';
		return true;
	}
	
}




/* =================
   Initialize ...
================= */

/* Hide PrintPage when printing ... */

if (document.write) {
	document.write('<style type="text/css">\n');
	document.write('@media print {\n');
	document.write('.' + PrintPage.divClass + ' {display: none;}\n');
	document.write('}\n');
	document.write('<\/style>\n');
}

PrintPage.initComplete = false;

PrintPage.init = function() {
	if (PrintPage.initComplete) return true;

	/* Determine target frame from base target if present ... */
	var base = (document.getElementsByTagName) ? document.getElementsByTagName('base') : ((document.all && document.all.tags) ? document.all.tags('BASE') : null);
	if (base && base[0] && base[0].target) PrintPage.target = base[0].target;

	/* Read presets from meta tags ... */
	PrintPage.getMetaPresets();

	if (!PrintPage.hide) {
		PrintPage.create();
	}
	
	PrintPage.initComplete = true;
	return true;
}

if (window.onDomReady) {
	window.onDomReady(PrintPage.init);
} else if (typeof pageComplete == 'function') {
	PrintPage.oldPageComplete = pageComplete || function(){};
	pageComplete = function() {
		PrintPage.oldPageComplete();
		PrintPage.init();
	};
} else {
	PrintPage.oldOnload = window.onload || function(){};
	window.onload = function() {
		PrintPage.oldOnload();
		PrintPage.init();
	};
};


/* End of printpage.js */