//self.DEBUG=1;

	if (php_root==null)	php_root='';
	var loc = self.location.href;
	var serverAddress = loc.substring(0, loc.lastIndexOf('/'))
	var inputscript = "/"+php_root+'genericInput.php'

	if (typeof(langid)=='undefined')	langid = 'en';
	var servicioURL = serverAddress+inputscript+'?method=XMLRPC&langid='+langid;
	var servicioXMLRPC = XMLRPC.getService(servicioURL);
	servicioXMLRPC.add("Agenda.input", "input");
	XMLRPC.onerror = function(){
	
		alert('Error:'+arguments[0]);
		return true;
	}

	function doXMLRPCCall( entrada )	{
		window.status='Realizando llamada al servidor...'
		document.body.style.cursor = 'Wait'
		hideMessage();
		var salida = servicioXMLRPC.input(entrada)
		routeOutput( salida );
	}
	
	function routeOutput( salida )	{
		// la respuesta es un array XMLRPC (objeto en JavaScript) de tipo output, según lo documentado para CInput::Execute
		window.status='Procesando la respuesta...'		
		// error general
		if (salida.Error)	{
			window.status='Terminado'
			document.body.style.cursor = ''
			responseError(salida.Error)
			return;
		}
		res=''
		var obj
		for(objName in salida)	{
			if (objName!='toXMLRPC')	{
				res+='Objeto: '+objName+', id='
				obj=eval('salida.'+objName)
				id = obj.id
				res+=id+"\n"
				for(methName in obj)	{
					jsCall = methName.replace('::','_')
					if (methName!='toXMLRPC' && methName!='id')	{
						methodResponse = eval('obj.'+methName)
						eval('response_'+jsCall+'(objName, id, methodResponse)')
						res+="Respuesta al método "+methName+"="+methodResponse+"\n";
					}
				}
				res+="\n"
			}
		}
//		alert(res)	// solo para depurar
		window.status='Terminado'
		document.body.style.cursor = ''
	}
	
	function submitXMLRPC()	{
		elementos = document.form1.elements;
		var txt = ''
		var entrada = new Object();

		// convertimos los elementos del formulario en una estructura Javascript
		// Esta estructura es a XMLRPC lo que el array de datos POST es al envío normal de formularios
		for( i=0;i<elementos.length;i++ )	{		
			ctrl = elementos[i];
			if (ctrl.type=='hidden' || ctrl.type=='text' || ctrl.type=='checkbox' || 
				ctrl.type=='select-one' || ctrl.type=='password' || ctrl.type=='textarea' || ctrl.type=='radio') 	{
				pos = ctrl.name.indexOf('[');
				pos2= ctrl.name.indexOf(']');
				idx = ctrl.name.substr(0,pos)
				obj = ctrl.name.substr(pos+1, pos2-pos-1)
				obj2= ctrl.name.substr(pos2+2, ctrl.name.length-pos2-3)

				txt+=ctrl.name+'='+ctrl.value+' ('+idx+','+obj+')\n';
				try {
					if ( !eval('entrada.'+idx) )	{
						eval('entrada.'+idx+'= new Object()');
					}
					// Cambios los checks por valor: checked->1; unchecked=0
					if (ctrl.type=='checkbox'){
						ctrl.value = (ctrl.checked)?1:0;
					}

					if (ctrl.type=='radio' && !ctrl.checked) {		continue;		}
					
					if (obj2!='')	{	// es un array de controles
						if (!eval('entrada.'+idx+'.'+obj))
							eval('entrada.'+idx+'.'+obj+' = new Object()'); 
						
						eval('entrada.'+idx+'.'+obj+'.idx'+obj2+' = ctrl.value'); 
					}
					else	{
						eval('entrada.'+idx+'.'+obj+' = ctrl.value'); 
					}
				}
				catch(e)	{
					if (self.DEBUG==1)		alert('Desarrollador: el control '+ctrl.name+' no cumple con la convencion CInput, revisa el formulario')
					return;
				}
			}
			else	{
			//	alert(ctrl.type+','+ctrl.name+','+ctrl.value)
			}
		
		}
		doXMLRPCCall(entrada)
	}
	
	function genericSubmit(method)	{
		switch (method)	{
			case "POST":
				document.form1.action=serverAddress+inputscript+'?method=POST';
				document.form1.submit();
				break;
				
			case "XMLRPC":
				submitXMLRPC();
				break;
		}
	}
	
	function responseError(msg)	{
		alert('Se produjo un error:\n\n'+msg)
	}
	

	// parámetro icon si más adelante usamos una capa tipo Plone con letras e iconito
	function showMessage( text, icon)	{
		var capamsg = document.getElementById('response_text');
		if (!capamsg)	{
			nuevacapa = document.createElement('div');
			nuevacapa.id = 'response_text'
			//nuevacapa.style.display = 'none'
			nuevacapa.style.visibility = 'hidden'
			nuevacapa.className = 'portalMessage'
			//document.body.insertBefore(nuevacapa, document.body.firstChild);
			document.body.appendChild(nuevacapa)
		}
		capamsg = document.getElementById('response_text');
		capamsg.innerHTML = text;
		//capamsg.style.display = ''
		capamsg.style.visibility = 'visible'
		window.scroll(0,1000000);
		setTimeout("javascript:hideMessage();",5000);
	}
	
	function hideMessage()	{
		capamsg = document.getElementById('response_text');
		if (capamsg)	{
			//capamsg.style.display = 'none'
			capamsg.style.visibility = 'hidden'
		}
	}
	
	function OpenWindow(url, target, options)	{
		var bMax = false;
		if (target==null)	target='_blank'
		if (options==null)	{
			bMax = true
			options='scrollbars=yes,toolbars=no,menubar=no,width='+screen.width+',height='+screen.height+', resizable=yes'
		}
		wnd = window.open(url, target, options)
		if (bMax) maximize(wnd)
	}

	function maximize(wnd)	{
		wnd.resizeTo(screen.availWidth,screen.availHeight-20); 
		wnd.moveTo(0,0); 
	}
