//Constructor
//mastersIds - lista separada por comas de los id de todos los combos de que depende el combo que estemos tratando
//slaveId - Id del combo que depende
//url - Url a la que se va a realizar la petición, en nuestro caso ser&aacute; "FrontController"
//options - Array con las opciones
function nCombo( mastersIds, slaveId, url, options ) {
  
	//Cargamos en un array todos los combos "padre"
	var arrMasterId = mastersIds.split(","); 
	this.arrMaster = new Array();

	for (i=0; i<arrMasterId.length; i++){
		this.arrMaster[i] = document.getElementById(arrMasterId[i]);
	}
  
	this.slave = document.getElementById(slaveId);
	this.value = null;
	this.options = options;

	//Creamos el objeto encargado de realizar la petición y recoger la respuesta
	//usando la librería net.js
	this.ajaxHelper = new net.ContentLoader( this, url, "POST",options.requestParameters || [] );

	//Inicializamos
	this.initializeBehavior();
}

nCombo.prototype = {
	//M&eacute;todo encargado de asignar una función en el evento onchange
	//del último combo "padre"
	initializeBehavior: function() {
		var oThis = this;
		this.arrMaster[(this.arrMaster.length - 1)].onchange = function() { oThis.masterComboChanged(); };
	},
  
	//M&eacute;todo encargado de guardar un valor para el combo "hijo"
	setValue: function(value) {
		this.value = value;
	},

	//M&eacute;todo encargado de recoger el valor de la opción seleccionada y enviar la petición
	//al servidor usando el objeto ajaxHelper inicializado en el constructor
	masterComboChanged: function() {
    
		var query = "";

		for (i=0; i<this.arrMaster.length; i++){
		  if (this.arrMaster[i].options.length > 0){
			query += this.arrMaster[i].name + "=" + this.arrMaster[i].options[this.arrMaster[i].selectedIndex].value + "&";
		  }
		}

		this.ajaxHelper.sendRequest( query );
	},

	//M&eacute;todo llamado desde la librería net.js tras recoger la respuesta del servidor
	//se encarga de actualizar el combo "hijo" añadiendo las opciones correspondientes
	//y seleccionado el valor pertinente
	ajaxUpdate: function(request) {
		var optionsXML = this.LoadXmlFromString(request.responseText);
		var slaveOptions = this.createOptions(optionsXML);
		this.slave.length = 0;

		for ( var i = 0 ; i < slaveOptions.length ; i++ )
			try{
				this.slave.add(slaveOptions[i],null);
			}catch (e){
				this.slave.add(slaveOptions[i],-1);
			}

    if (this.value != null){
      this.slave.value = this.value;
      this.value = null;
    }
    else if (this.slave.getAttribute("preValue") != null)
    {
      this.slave.value = this.slave.getAttribute("preValue");
      this.slave.removeAttribute("preValue");
    }
     
	//Una vez seleccionado un valor si tiene asociado una función
	//en el evento onchange la llamamos pues de esta forma el evento
	//no se ha producido
    if (this.slave.onchange != null)
      setTimeout(this.slave.onchange, 1);

	},

	//M&eacute;todo encargado de interpretar el xml de respuesta y crear
	//las opciones para el combo
	createOptions: function(ajaxResponse) {
		var newOptions = [];
		newOptions.push( new Option( "Seleccionar", "" ) );
    
		var opciones = ajaxResponse.getElementsByTagName('OPTION');
		for ( var i = 0 ; i < opciones.length ; i++ ) {
			var text = this.getElementContent(opciones[i]);
			var value = this.getAttributeContent(opciones[i], "value");

			newOptions.push( new Option( text, value ) );
		}

		return newOptions;
	},

	//M&eacute;todo encargado de recoger el texto de un nodo
	getElementContent: function(element) {
		return (element.text != undefined) ? element.text : element.textContent;
	},

	//M&eacute;todo encargado de recoger el valor de un atributo de un nodo
	getAttributeContent: function(element,tagName) {
		return element.getAttribute(tagName);
	},

	//Si salta algún error...
	handleError: function(request) {
		if ( this.options.errorHandler )
			this.options.errorHandler(request);
	},

	LoadXmlFromString: function(xmlString) {
		var dom = null;
		if (document.implementation && document.implementation.createDocument) 
		{
		  var domParser = new DOMParser();
		  dom = domParser.parseFromString(xmlString, 'text/xml');
		} 
		else 
		{
		  dom = new ActiveXObject('Microsoft.XMLDOM');
		  dom.loadXML(xmlString);
		}
		 return dom;
	  }  


};
