function GestorMarco(nombre, x, y, nombreRef) {
	// Nombre del marco, a efectos de nombres de elementos HTML.
	this.nombre = nombre;
	// Array con imágenes.
	this.imagenes = new Object();
	// Imagen vacía.
	this.imagenVacia = "graf/vacia.gif";
	// Posición inicial (para Netscape).
	this.x = x;
	this.y = y;
	// Objeto de referencia situado a la izquierda (para Netscape).
	this.nombreRef = nombreRef;

	/* MULTIPLES LAYERS (para Netscape).
	// Último layer abierto, para evitar tener que ocultar todos.
	this.layerVisible = null;
	*/


	// Asignación de funciones de objeto.
	// - Registro de imágenes.
	this.setImagen = GestorMarco_setImagen;
	this.setImagenes = GestorMarco_setImagenes;
	// - Obtención de HTML para el marco.
	this.getHtml = GestorMarco_getHtml;
	// - Ampliación del marco.
	this.ampliar = GestorMarco_ampliar;
	// - Redimensionado.
	this.onResize = GestorMarco_onResize;
	// - Posicionamiento.
	this.posicionar = GestorMarco_posicionar;
	// - Soporte de versiones de navegador.
	this.soportaCambio = GestorMarco_soportaCambio;
}

function GestorMarco_setImagen(nombreImagen, nombreAmpliacion) {
	this.imagenes[nombreImagen] = new ImagenMarco(nombreImagen, nombreAmpliacion);
}

function GestorMarco_setImagenes(nombresImagen, nombresAmpliacion) {
	for (i in nombresImagen)
		this.imagenes[nombresImagen[i]] = new ImagenMarco(nombresImagen[i], nombresAmpliacion[i]);
}

function GestorMarco_ampliar(nombreImagen) {
	var imagen = this.imagenes[nombreImagen];
	//alert("Ampliando: " + imagen.nombre + " por " + imagen.nombreAmpliacion + ", " + document[this.nombre]);
	if (this.soportaCambio())
		document[this.nombre].src = imagen.nombreAmpliacion;
	else {
		/* MULTIPLES LAYERS
		if (this.layerVisible != null)
			this.layerVisible.hidden = true;
		this.layerVisible = document.layers["layer_" + nombreImagen];
		this.layerVisible.hidden = false;
		*/
		var doc = document.layers[this.nombre].document;
		doc.writeln('<img src="' + imagen.nombreAmpliacion + '" />');
		doc.close();
		this.posicionar();
	}
}

function GestorMarco_getHtml() {
	if (this.soportaCambio())
		return '<img src="' + this.imagenVacia + '" name="' + this.nombre + '" />';
	else {
		/* MULTIPLES LAYERS
		var html = "";
		for (i in this.imagenes) {
			html += '<layer name="layer_' + this.imagenes[i].nombre + '" visibility="hide">\n' +
			        '<img src="' + this.imagenes[i].nombreAmpliacion + '"/>\n' +
					'</layer>';
		}
		return html;
		*/
		return '<layer name="' + this.nombre +
		       '" left="' + this.x +
		       '" top="' + this.y + '"></layer>';
	}
}

function GestorMarco_soportaCambio() {
	return (navigator.appName == "Microsoft Internet Explorer" &&
	        parseInt(navigator.appVersion.charAt(0)) >= 4) ||
	       (navigator.appName == "Netscape" &&
	        parseInt(navigator.appVersion.charAt(0)) >= 5);
}

function GestorMarco_onResize() {
	if (this.soportaCambio())
		// No hace falta gestionar el evento.
		return;
	// Cambia la posición en función de la del objeto de referencia.
	this.posicionar();
}

function GestorMarco_posicionar() {
	var layer = document.layers[this.nombre];
	var objRef = document[this.nombreRef];
	layer.x = objRef.x + objRef.width + 20;
	//*** El centrado no funciona al crecer el tamaño del documento.
	//*  Habría que afinar más :)
	//layer.x = objRef.x + objRef.width +
    //    (document.width - (objRef.x + objRef.width + layer.clip.width)) / 2;
}


function ImagenMarco(nombreImagen, nombreAmpliacion) {
	// Nombres de imágenes.
	this.nombre = nombreImagen;
	this.nombreAmpliacion = nombreAmpliacion;
}
