function PrintObj(url, successFunction, errorFunction, wobj)
// url: URL del servicio web de impresión
// wobj: referencia (si se pasa) del objeto de mensaje de espera
{
	var me = this; 	
	me.url = url;
	me.successFunction = successFunction;
	me.errorFunction = errorFunction;
	me.wobj = wobj;
	PrintObj.prototype.print = function(template, meta)
	{
		var xmlhttp;

		if (window.XMLHttpRequest) {
			// code for Firefox, Mozilla, IE7, etc.
			xmlhttp=new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			// code for IE6, IE5
			xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
		} else {
			if (me.wobj) me.wobj.hide();
			me.errorFunction(_('Su navegador no soporta peticiones HTTP. Actualícelo a una versión que sí lo haga.'));
			return;
		}
	
		try {
			xmlhttp.open("POST", me.url, true);
		} catch(e) {
			if (me.wobj) me.wobj.hide();
			me.errorFunction(_('Error en')+' xmlhttp.open():\n\n' + e);
			return;
		}
		
		// tratamiento asíncrono de la llamada
		xmlhttp.onreadystatechange = function() {
			if (xmlhttp.readyState == 4) {
				if (xmlhttp.status == 200) {
					if (me.wobj) me.wobj.hide();
					me.successFunction(xmlhttp.responseXML.xml?xmlhttp.responseXML:xmlhttp.responseText);
				} else {
					if (me.wobj) me.wobj.hide();
					me.errorFunction(xmlhttp.status + ": " + xmlhttp.statusText + "\n" + xmlhttp.responseText);
				}
			}
		}
		var params = 'TEMPLATE='+template;
		for (var i=0;i<meta.length;i++) {
			var id = String(i).length<2?'0'+i:i;
			params += '&META'+id+'='+meta[i];
		}
		xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		xmlhttp.setRequestHeader("Content-length", params.length);
		xmlhttp.setRequestHeader("Connection", "close");
		xmlhttp.send(params);
	}
	PrintObj.prototype.printByForm = function(template, meta, target)
	{
		var newData = function (name, value, type, id) {
			if (!type) type='hidden';
			var data = document.createElement('INPUT');
			data.type = type;
			if (id) data.id = id;
			data.name = name;
			data.value = value;
			return data;
		}
		var frm = document.createElement('FORM');
		frm.appendChild(newData('TEMPLATE', template));
		for (var i=0;i<meta.length;i++) {
			var id = String(i).length<2?'0'+i:i;
			frm.appendChild(newData('META'+id, meta[i]));
		}
		frm.action = me.url;
		frm.method = 'post';
		frm.target = target?target:'_blank';
		document.body.appendChild(frm);
		frm.submit();
		document.body.removeChild(frm);
		if (me.wobj) me.wobj.hide();
	}
}