function guardaFormulario(formulario) {
	form = $(formulario);
	action = form.action;
	if(arguments.length > 1)
		action += "?accion="+arguments[1];
//	alert(action);
//	alert(Form.serializeAll(form));
	ajaxobj = new Ajax.Request(action, {onComplete: datosRecibidos, method: 'post', parameters: Form.serializeAll(form)});
	return false;
}

function guardaDato(url) {
	var parametros = "";
	for(var i=1; i < arguments.length; i++) {
		parametros += ((parametros.length == 0) ? "" : "&") + arguments[i];
	}

	var ajaxobj = new Ajax.Request(url, {onComplete: datosRecibidos, method: 'get', parameters: parametros});
}

function loadDivs() {
	var divs = document.getElementsByTagName("DIV");

	for(var i=0; i < divs.length; i++) {
		if(getExpando(divs[i], "responder"))
			cargaDiv(divs[i]);
	}
}

function cargaDiv(divid) {
	var parametros = "";
	divid = $(divid);
	var responder = getExpando(divid, "responder");
	if(getExpando(divid, "parametros"))
		var parametros = getExpando(divid, "parametros");

	for(var i=1; i < arguments.length; i++) {
		parametros += ((parametros.length == 0) ? "" : "&")+arguments[i];
	}

	parametros += ((parametros.length == 0) ? "" : "&")+"divid="+divid.id;

	var ajaxobj = new Ajax.Updater(divid, responder, {method: 'get', parameters: parametros, evalScripts: true});
	return false;
}

function cargaDivPost(divid) {
	var parametros = "";
	divid = $(divid);
	var responder = getExpando(divid, "responder");

	for(var i=1; i < arguments.length; i++) {
		parametros += ((parametros.length == 0) ? "" : "&")+arguments[i];
	}

	parametros += ((parametros.length == 0) ? "" : "&")+"divid="+divid.id;

	var ajaxobj = new Ajax.Updater(divid, responder, {method: 'post', parameters: parametros, evalScripts: true});
	return false;
}

function cargaDivForm(divid, formulario) {
	var form = $(formulario);
	var parametros = Form.serializeAll(form);
	divid = $(divid);
	var responder = getExpando(divid, "responder");

	for(var i=2; i < arguments.length; i++) {
		parametros += ((parametros.length == 0) ? "" : "&")+arguments[i];
	}

	parametros += ((parametros.length == 0) ? "" : "&")+"divid="+divid.id;

	var ajaxobj = new Ajax.Updater(divid, responder, {method: 'post', parameters: parametros, evalScripts: true});
	return false;
}

function peticion(divid) {
	divid = $(divid);
}

function datosRecibidos(respuesta) {
//	alert(respuesta.responseText);
	var ajax = respuesta.responseXML.getElementsByTagName("respuesta-ajax")[0];
//	alert("ajax typeof = "+typeof(ajax));
	var respuestas = ajax.getElementsByTagName("respuesta");
//	alert("respuestas length = "+respuestas.length);
	for(i=0; i< respuestas.length; i++)
		procesaRespuesta(respuestas[i]);

//	document.getElementById("cargando").style.display = "none";
//	alert("fin de datos recibidos");
}

function procesaRespuesta(respuesta) {
	var tipo = respuesta.getAttribute('type');
//	var tipo = getExpando(respuesta, "type");
	switch(tipo) {
		case 'copia':
			alert(typeof(respuesta));
			DisplayDOM(respuesta);
			break;
		case 'contenido':
			var objetivo = document.getElementById(respuesta.getAttribute("id"));
			clearChildNodes(objetivo);
			addXMLtoHTML(objetivo, respuesta);
			break;
		case 'inner':
			var objetivo = $(respuesta.getAttribute("id"));
			objetivo.innerHTML = respuesta.innterHTML;
			break;
		case 'data':
			document.getElementById(respuesta.getAttribute("field")).value = unescape(respuesta.getAttribute("value"));
			break;
		case 'redireccion':
			if(respuesta.getAttribute("url").length)
				window.open(respuesta.getAttribute("url"), '_self');
			else {
				history.go(0);
			}
			break;
		case 'reload':
			history.go(0);
			break;
		case 'show':
		case 'muestra':
			getObj(respuesta.getAttribute("id")).style.display = "";
			break;
		case 'hide':
		case 'esconde':
			getObj(respuesta.getAttribute("id")).style.display = "none";
			break;
		case 'alerta':
		case 'aviso':
			alert(respuesta.getAttribute("value"));
			break;
		case 'operacion':
			if(respuesta.getAttribute("value") != "correcta")
				alert("Se produjo un error en la comunicacion con el servidor");
			break;
		case 'play':
			eval(respuesta.getAttribute("value"));
			break;
		case 'text':
			if($(respuesta.getAttribute("id")))
				$(respuesta.getAttribute("id")).innerHTML = respuesta.getAttribute("value");
			break;
	}
}

function clearChildNodes(target) {
	while(target.childNodes.length)
		target.removeChild(target.firstChild);
}

function addXMLtoHTML(target, source) {
	if(browser.isIE)
		buildHTMLIE(target, source);
	else if(browser.isNS) {
		target.innerHTML = buildHTML(source);
	}
	else
		buildHTMLDOM(target, source);
}

function buildHTML(source) {
	var buffer = "";
	for(var i=0; i < source.childNodes.length; i++) {
		var nodo = source.childNodes[i];
		switch(nodo.nodeType) {
			case document.ELEMENT_NODE:
				buffer += "<"+nodo.nodeName+getAttributes(nodo)+">";
				if(nodo.childNodes.length)
					buffer += buildHTML(nodo);
				buffer += "</"+nodo.nodeName+">";
				break;
			case document.TEXT_NODE:
				buffer += nodo.nodeValue;
				break;
		}
	}
	return buffer;
}

function buildHTMLIE(target, source) {
	for(var i=0;i < source.childNodes.length; i++) {
		var nodo = source.childNodes[i];
		switch(nodo.nodeType) {
			case document.ELEMENT_NODE:
				var objeto = document.createElement("<"+nodo.nodeName+getAttributes(nodo)+">");
				target.appendChild(objeto);
				if(nodo.childNodes.length)
					addXMLtoHTML(objeto, nodo);
				break;
			case document.TEXT_NODE:
				var texto = document.createTextNode(nodo.nodeValue);
				target.appendChild(texto);
				break;
		}
	}
}

function buildHTMLDOM(target, source) {
//	alert("entra en html dom");
	for(var i=0;i < source.childNodes.length; i++) {
		var nodo = source.childNodes[i];
		if(nodo.nodeType == document.ELEMENT_NODE) {
			var objeto = document.createElement("<"+nodo.nodeName+">");
			setAttributes2(objeto, nodo);
			target.appendChild(objeto);
			if(nodo.childNodes.length)
				addXMLtoHTML(objeto, nodo);
		}
		if(nodo.nodeType == document.TEXT_NODE) {
			var texto = document.createTextNode(nodo.nodeValue);
			target.appendChild(texto);
		}
	}
}

function getAttributes(source) {
	var buffer = "";
	for(var i=0; i < source.attributes.length; i++) {
		attributo = source.attributes[i];
		buffer += " "+attributo.nodeName+"=\""+attributo.nodeValue.toString()+"\"";
	}
	return buffer;
}

function setAttributes2(target, source) {
	for(var i=0; i < source.attributes.length; i++) {
		attributo = source.attributes[i];
		attr = document.createAttribute(attributo.nodeName);
		attr.value = attributo.nodeValue.toString();
		target.setAttributeNode(attr);
	}
}

function setAttributes(target, source) {
	for(var i=0; i < source.attributes.length; i++) {
		attributo = source.attributes[i];
		if(attributo.nodeName.substr(0, 2) == "on")
			target[attributo.nodeName] = new Function(attributo.nodeValue);
		else
			if(attributo.nodeName == "style") {
				estilos = attributo.nodeValue.split(";");
				for(var j=0; j < estilos.length; j++) {
					pareja = estilos[j].split(":");
					if(typeof(eval("target.style."+pareja[0])))
						eval("target.style."+pareja[0]+" = \""+pareja[1].toString().trim()+"\"");
//					target.style[pareja[0]] = pareja[1].toString();
				}
			} else {
				attr = document.createAttribute(attributo.nodeName);
				attr.value = attributo.nodeValue.toString();
				target.setAttributeNode(attr);
//				eval("target."+attributo.nodeName+" = \""+attributo.nodeValue.toString()+"\"");
//				target[attributo.nodeName] = attributo.nodeValue.toString();
			}
	}
}

Ajax.Responders.register({
 onCreate : muestraAviso,
 onComplete : ocultaAviso,
 onFailure : falloCarga,
 onException : excepcionCarga
});

function muestraAviso() {
	posTopRight("cargando").style.display = "";
}

function ocultaAviso(objeto) {
//	alert(objeto.transport.responseText);
	document.getElementById("cargando").style.display = "none";
//	DisplayDOM(objeto);
}

function falloCarga(objeto) {
//	alert(typeof(objeto));
//	DisplayDOM(objeto);
	ocultaAviso();
	alert("Error procesando XML\n"+objeto.transport.responseText);
	alert(objeto.transport.responseXML.childNodes.length+"\n"+objeto.transport.responseXML.xml);
}

function excepcionCarga(objeto) {
	ocultaAviso();
	alert("Excepcion en dialogo Ajax\n"+objeto.transport.responseText);
}


//
// Extensiones a prototype
//

Object.extend(Form, {
  serializeAllElements: function(elements, getHash) {
	 var data = elements.inject({}, function(result, element) {
		if (element.name) {
		  var key = element.name, value = $(element).getValue();
		  if (value != null) {
				if (key in result) {
				if (result[key].constructor != Array) result[key] = [result[key]];
				result[key].push(value);
			 }
			 else result[key] = value;
		  }
		}
		return result;
	 });

	 return getHash ? data : Hash.toQueryString(data);
  },

  serializeAll: function(form, getHash) {
	 return Form.serializeAllElements(Form.getElements(form), getHash);
  }
});

Object.extend(Form.Methods, {
});

