
	function ImagePreloader(images, call_back, nombreColeccion,porcentajeMiniaturas) {
	   // store the call_back
	   this.call_back = call_back;
	   this.nombreColeccion = nombreColeccion;
	   
	   //tama?o de las miniaturas
	   this.porcMiniaturas=porcentajeMiniaturas;
	   
	   // initialize internal state.
	   this.nLoaded = 0;
	   this.nProcessed = 0;
	   this.aImages = new Array;
	
	   // record the number of images.
	   this.nImages = images.length;

		//Se muestra mensaje de carga de imagenes
		var trMensajeImagenes = getElementById("tr"+nombreColeccion+"CargandoImagen");
		if (trMensajeImagenes!=null) trMensajeImagenes.className="SHOW";

	   // for each image, call preload()
	   for ( var i = 0; i <images.length; i++ ) {
		  this.preload(images[i]);
	   }
	}
	
	//The call_back function is stored for later use, then each image URL is passed 
	//into the preload() method.
	
	ImagePreloader.prototype.preload = function(image) {
	   // create new Image object and add to array
	   var oImage = new Image;
	   this.aImages.push(oImage);
	
	   // set up event handlers for the Image object
	   oImage.onload = ImagePreloader.prototype.onload;
	   oImage.onerror = ImagePreloader.prototype.onerror;
	   oImage.onabort = ImagePreloader.prototype.onabort;
	
	   // assign pointer back to this.
	   oImage.oImagePreloader = this;
	   oImage.bLoaded = false;
	
	   // assign the .src property of the Image object
	   oImage.src = image;
	}
	//The preload function creates an Image object and assigns functions for the three Image events:
	// onload, onerror and onabort. 
	//"onload event" is raised when the image has been loaded into memory, 
	//"onerror event" is raised when an error occurs while loading the image and,
	//"onabort event" is raised if the user cancels the load by clicking the Stop button on the browser. 
	//A pointer to the ImagePreloader object is stored in each Image object to facilitate the call_back mechanism. 
	//An optional boolean flag can be added here to indicate whether the image loads properly or not.
	//Finally, the ?src? attribute is assigned to start the loading of the image.
	ImagePreloader.prototype.onComplete = function() {
	   this.nProcessed++;
	   if ( this.nProcessed == this.nImages ) {
		  if (this.call_back!=null) this.call_back(this.aImages, this.nLoaded, this.nombreColeccion);
		  else imagenesCargadas(this.aImages, this.nLoaded, this.nombreColeccion, this.porcMiniaturas);
	   }
	}
	ImagePreloader.prototype.onload = function() {
	   this.bLoaded = true;
	   this.oImagePreloader.nLoaded++;
	   this.oImagePreloader.onComplete();
	}
	ImagePreloader.prototype.onerror = function() {
	   this.bError = true;
	   this.oImagePreloader.onComplete();
	}
	ImagePreloader.prototype.onabort = function() {
	   this.bAbort = true;
	   this.oImagePreloader.onComplete();
	}
	
	//Se comprueban las imagenes de la coleccion (p.ej.: articulo) que se han cargado en ImagePreloader
	//var aImagenes = new Array(); //Array con las imagenes del una coleccion
	var aColecImagenes = new Array();  //Array de colecciones de imagenes = new Array("nombreColeccion",new Array(image1,image2,image3,...),imagenActual,porcMiniaturas)
	function imagenesCargadas(aImages, nImages, strNombreColeccion, porcMiniaturas) {
		
		var aImagenes=new Array(nImages);
		
		imagenActual=0;
		//Se muestra/oculta los botones siguiente/anterior imagen
		var trBotonesImagenes = getElementById("tr"+strNombreColeccion+"ImagenBotones");
		if (trBotonesImagenes!=null)
			trBotonesImagenes.className=(aImagenes.length>1?"SHOW":"HIDE");
		var imgHolder = getElementById("img"+strNombreColeccion);
		/*if (imgHolder==null) {
			//alert("El contenedor de imagenes (img"+strNombreColeccion+") no se encuentra.");
			return;
		}*/
		var blnImagenAsignada=false;
		var contImgOK=0;
		
		for (i=0; i<aImages.length; i++) {
			/*
			alert("imagen["+i+"]="+aImages[i]+"\n"+
					"\t complete="+aImages[i].complete+"\n"+
					"\t width="+aImages[i].width+"\n"+
					"\t height="+aImages[i].height+"\n");*/
					
			if (aImages[i].width>0)
			
				/*(aImages[i].width>0 && !blnIE) || //blnMozilla
				(aImages[i].complete && blnIE))*/
				 {
				//Es una imagen descargada correctamente
				if (!blnImagenAsignada) {
					setImage(imgHolder,aImages[i],porcMiniaturas);
					blnImagenAsignada=true;
				}
				aImagenes[contImgOK]=aImages[i];
				contImgOK++;
			} 
			
		}
		/*if (this.bError)
		this.src=servidor+"/images/noImagen.gif";*/
		
		
		if (aColecImagenes.length==0) {
			aColecImagenes=new Array(new Array(strNombreColeccion,aImagenes,0,porcMiniaturas));  //0 imagen que se visualiza (imagen actual)
		} else {
			//Se comprueba si ya existe la coleccion de imagenes 
			var blnEncontrado=false;
			for (i=0; i<aColecImagenes.length; i++) {
				var arr = aColecImagenes[i];
				if (arr!=null && arr[0]==strNombreColeccion) {
					//se reemplaza/crea el array de imagenes de las nuevas imagenes cargadas
					blnEncontrado=true;
					arr[1]=aImages;
					arr[2]=0;
				}
			}

			if (!blnEncontrado) {
				//se a?ade el array de imagenes de la nueva coleccion
				var aColecImagenesAux = new Array(aColecImagenes.length);
				for (i=0; i<aColecImagenes.length; i++) {
					aColecImagenesAux[i]=aColecImagenes[i];
				}
				aColecImagenesAux[i+1]=new Array(strNombreColeccion,aImagenes,0,porcMiniaturas);  //0 imagen que se visualiza (imagen actual)
				aColecImagenes=aColecImagenesAux;
			}
			
		};
		
		//Se oculta el mensaje cargando imagenes
		var trMensajeImagenes = getElementById("tr"+strNombreColeccion+"CargandoImagen");
		if (trMensajeImagenes!=null) trMensajeImagenes.className="HIDE";

	}
	
	function verImagen(btn,strNombreColeccion) {
		//Busca la coleccion de imagenes
		for (i=0; i<aColecImagenes.length; i++) {
			var arr=aColecImagenes[i];
			if (arr!=null && 
				arr[0]==strNombreColeccion) {
				var aImagenes=arr[1];
				var imagenActual=arr[2];
				var imgHolder = getElementById("img"+strNombreColeccion);
				if (btn.value==">>") imagenActual++;
				else imagenActual--;
				arr[2]=imagenActual;
				setImage(imgHolder,aImagenes[imagenActual],arr[3]);
				
				getElementById(strNombreColeccion+"ImagenSiguiente").disabled=!(imagenActual<aImagenes.length-1);
				getElementById(strNombreColeccion+"ImagenAnterior").disabled=(imagenActual==0);
				break;
			}
		}
	}
	
	function setImage(imgHolder,imagenActual,porcMiniaturas) {
		imgHolder.src=imagenActual.src;
		imgHolder.width=imagenActual.width*porcMiniaturas/100;
		imgHolder.height=imagenActual.height*porcMiniaturas/100;
	}
	
	
	function openImg(strNombreColeccion,strNombreVentana) {
		//Busca la coleccion de imagenes
		for (i=0; i<aColecImagenes.length; i++) {
			var arr=aColecImagenes[i];
			if (arr!=null && 
				arr[0]==strNombreColeccion) {
				var aImagenes=arr[1];
				var imagenActual=arr[2];
				var imgHolder = getElementById("img"+strNombreColeccion);
				var newWin = window.open(aImagenes[imagenActual].src,strNombreColeccion+new Date().getTime(),
										'width='+(aImagenes[imagenActual].width+20)+','+
										'height='+(aImagenes[imagenActual].height+30)+','+
										'directories=no,'+
										'location=no,'+
										'menubar=no,'+
										'resizable=yes,'+
										'scrollbars=0,'+
										'status=no,'+
										'toolbar=no');
				newWin.document.title=strNombreVentana;
				break;
			}
		}
	}
	
	
