var listaSlides=new Array();  //aqui guardo todos los objetos slide que tenga
  
   //const no esta definido en iexplorer
   //const E_NORMAL = 0; //estado normal,
   //const E_BLOQ = 1; //estado bloqueado hasta que el proceso que lo bloqueó lo desbloquee (ventanas de avisos y eso)
   //const E_REPLAY = 2; //ha llegado al final y está esperando que se pulse play para continuar
   
   var E_NORMAL = 0; //estado normal,
   var E_BLOQ = 1; //estado bloqueado hasta que el proceso que lo bloqueó lo desbloquee (ventanas de avisos y eso)
   var E_REPLAY = 2; //ha llegado al final y está esperando que se pulse play para continuar
  
   //en las siguientes constantes poner valores mayores o iguales que 0 para que no se confunda con estadoAnterior
   var M_PAUSA = 0;  //esta parado (modo manual) o en pausa (modo auto)
   var M_PLAY = 1;  //esta reproduciendo en modo auto
   var M_REPLAY = 2;  //ha llegado al final de la reproduccion y espera play para continuar (o hay una ventana de avisos abierta y espera a que se cierre)
   var M_BLOQ=3; //slide bloqueado y nada funciona hasta que se desbloquee por accion de usuario o se arregle error que ha provocado bloqueo

   //OJO QUE EL VALOR POR DEFECTO SEA EL 0, O USAR TRES NUMEROS QUE NO SEAN 0
   var AJ_NORMAL=1; //no ajuste. ajuste de tamaño: se ajusta al valor html o al contenido
   var AJ_CONTENT=0; //se ajusta al contenido
   var AJ_STRICT=2; //se ajusta al valor html o css

   //var parametrosSlide={autoplay:true,loop:true,ajuste:AJ_CONTENT,delay:3500,carpeta:"carpeta1",prefijo:"foto",tipo:"jpg",numfotos:5,textoPortada:""};
   
   function photoslide(idDiv,parametros)
    {  //constructor, se le pasa el id de un div creado en el codigo html y ahi es donde trabaja
       //carpeta y numfotos son opcionales, pero van los dos o ninguno. Es la carpeta donde estan las fotos y se llamaran foto1.jpg a numfotos.jpg

       this.modo=M_PAUSA; //0 esta parado (pausa o modo manual), 1 esta reproduciendo (modo auto), 2 replay (fin de reproduccion y esperando play) 

       this.altoCapa0=0; //altura de las capas que contienen la imagen, para no tener que calcularlas, que da problemas si slide oculto o de tamaño reducido
       this.anchoCapa0=0;
       //propiedades del objeto
       this.textoPortada=(parametros.textoPortada)?parametros.textoPortada:"";
       this.ciclos=1;
       this.maxciclos=-1; //negativo o 0 es indefinido, no acaba
       this.reintentos=0;  //se suma a un intento minimo por defecto, si pongo 1 intenta leer la normal y otra mas
       this.maxreintentos=5;  //numero de intentos de leer una foto o esperas a que la cargue por si tarda o conexion lenta
       this.mitimeout=1000; //¿MAYOR QUE ESPERA?? //tiempo que tarda en considerar error la carga de una foto y espera en cada reintento
       //CONSEJO: PONER TIMEOUT PEQUEÑO Y MAXREINTENTOS ALTO Y ASI TIENES EL MISMO TIEMPO DE ESPERA PERO TE AVISA ANTES DEL ERROR
       this.error=0; //0 no error, 1 error al cargar una foto
       this.errores=""; //cadena donde voy guardando errores de cargas y eso
       this.relojCargaFotos=null;  
       this.relojCapas=null;
       this.reloj=null;
       this.efecto=0; //0=fadeIn, 1:show,100=aleatorio
       // this.opacidadCapa=1.00;
       // this.inc=0.2;
       this.sentido=-1; //-1 hacia atras, 1 hacia adelante
       // this.velocidad=30; //milisegundos
       // this.estilo=0; //0 transparencia, 1=transparencia y tamaño
       this.espera=(parametros.delay)?parametros.delay:3500; //tiempo que se muestra una foto 
       this.autoplay=(parametros.autoplay)?parametros.autoplay:0;
       this.loop=(parametros.loop)?parametros.loop:0;
       this.stop=1; //0 normal, 1 para slide
       this.stopTemp=this.stop; //variable temporal que uso para guardar estado de stop al abrir ventanas de aviso
//       this.estado=E_REPLAY;  //para que stop no este activo, solo play
       this.avisosvisible=0; //si hay alguna ventana de avisos abierta es 1, si no 0
       this.capavisible=1; // 1=la capa movil capa1 esta visible, 0 =transparente y solo se ve el fondo (capa0)
       //if (prefijo) this.prefijoFoto=prefijo; //las fotos deben llamarse prefijo+numero+.tipo
       //else this.prefijoFoto="foto";
       //if (carpeta) this.carpeta=carpeta; 
       //else this.carpeta=""; //idem carpeta donde esta el script
       //if (tipo) this.tipo=tipo; 
       //else this.tipo="jpg"; //tipo por defecto
       //this.numfotos=numfotos;  // 1 a numfotos
       this.carpeta=(parametros.carpeta)?parametros.carpeta:""; 
       this.prefijoFoto=(parametros.prefijo)?parametros.prefijo:"";
       this.tipo=(parametros.tipo)?parametros.tipo:"jpg";
       this.numfotos=(parametros.numfotos)?parametros.numfotos:1; 
       //this.listafotos=new Array("foto1.jpg","foto2.jpg","foto3.jpg","foto4.jpg","foto5.jpg","foto6.png");
       //this.numfotos=this.listafotos.length;
       this.fotoActual=-1;  //-1 sin inicializar aun. 0 es la foto de portada, si la hay, 1 la primera foto
       this.escala=0; //0 es foto a tamaño natural, 1 la imagen es grande y ha sido escalada, permite zoom
       this.idContenedor=idDiv; //nombre del div que nos pasa el usuario
       this.contenedor=$(this.idContenedor); //objeto creado por usuario para contener el slide
       this.idCaja0=this.idContenedor+"_caja0";  //idContenedor ya lleva el #
       this.idFoto0=this.idContenedor+"_foto0";  //idContenedor ya lleva el #
       //this.capa0=null; //capa0
       this.idCaja1=this.idContenedor+"_caja1";
       this.idFoto1=this.idContenedor+"_foto1";  //idContenedor ya lleva el #
       this.capa1=null; //capa1
       this.cambiandoCapa=0; //1 si se esta produciendo una transicion entre capas, 0 en otro caso.

       this.idCubierta=this.idContenedor+"_cubierta";
       this.estadoTelon=1; //1 es bajado, 0 subido u oculto
   
       this.idMensajes=this.idContenedor+"_mensajes";
       this.mensajeAbierto=0; //1 si hay algun mensaje visible=la capa idMensajes esta visible

       this.idCajaFotos=this.idContenedor+"_cajafotos";
       //this.controles=null;
       this.idControles=this.idContenedor+"_controles";
       this.idNFoto=this.idContenedor+"_numfoto"; //caja de texto con foto actual, se puede modificar para ir a otra foto
       this.idMFoto=this.idContenedor+"_maxfoto";// aparece junta a la anterior indicando el numero maximo de fotos
       this.idZoom=this.idContenedor+"_zoom"; //enlace a la foto original para fotos grandes a escala
       //this.objboton="play"; //play o pause, es el icono del boton play/pause
       this.altoControles=30; //altura de la capa de controles en px
       this.margen=15; //margen de la capa de avisos;
       this.idCapaAvisos=this.idContenedor+"_avisos";
       this.idNombreFoto=this.idContenedor+"_nombrefoto";
       this.ajustarTamano=(parametros.ajuste)?parametros.ajuste:AJ_CONTENT; //al contenido
       //this.ajustarTamano=1; //1=contenido: ajusta tamaño de la capa para que los bordes y padding no oculten contenido (en iexplorer este valor hará crecer tamaño de caja un valor borde+padding) y la foto se vera completa
                                        // 2=estricto: la caja debe tener exactamente el tamaño con que se ha definido en html y css (firefox amplia caja si tiene borde o padding, ieplorer oculta parte del contenido con borde padding y la caja no crece) 
                                        // 0=defecto: no hace nada, cada navegador lo presentará como le de la gana
        this.visible=1;
        this.idPreload=this.idContenedor+"_preload";
        this.cargandofoto=0;
        this.imgTemp=new Image(); //aqui voy haciendo la precarga y controlo errores
        this.imgEstado=new Image(); //imagen sobre la que voy precargando los iconos de error, precarga, replay,etc
        
       //metodos publicos
       this.reset=resetSlide;
       this.iniciar=iniciarSlide;  
       this.parar=pararSlide;
   
       //metodos privados
       this.creacapas=creacapas;
       //this.cambiafoto=cambiafoto;   
       this.obtenerPathFoto=obtenerPathFoto;
       this.origenFotos=cambiarOrigenFotos;
       this.cambiarTamano=cambiarTamanoSlide;
       this.ajustarContenedor=ajustarTamanoCaja;
       this.ocultar=ocultarSlide;
       this.mostrar=mostrarSlide;
       this.mostrarPreload=mostrarPreload;
       this.ocultarPreload=ocultarPreload;
       this.portada=portada;
       this.telon=telon;
       this.mensaje=mensaje;
      
       this.crearCapaAvisos=crearCapaAvisos;
       this.cambiaCapas=cambiaCapas;
       this.setEstado=setEstado;
       this.capaActual=capaActual;
       this.f_timeOut=f_timeOut;
       this.siguiente=Siguiente;
       this.anterior=Anterior;
       this.cargarFoto=cargarFoto;
       this.finReproduccion=finReproduccion;
     
       //this.reiniciar=reiniciar;
       
       this.posListaSlides=asignaNumSlide(this,listaSlides);  //guardo este objeto en la lista de slides para poder acceder a el con la funcion auto
       this.zIndex=this.posListaSlides+1;
       this.ajustarContenedor(); //por si es iexplorer para que se vea la foto completa
       //crear capas y controles
       this.creacapas();
       this.reset();
    //CONTROLAR QUE EL TELON ESTE SUBIDO PARA INICIAR, O BIEN SUBIRLO....
     //  if (this.autoplay) this.iniciar(0);  //debo controlar si esta el telon bajado y eso para que se vea la primera foto
    }
 

   //funciones asociadas a los metodos
   
   function cambiarOrigenFotos(newCarpeta,newPrefijo,newNumFotos,newTipo,newTextoPortada)
    {  //cambia la carpeta donde el slide busca las fotos
    
       //para el slide para que no se note el cambio y empiece por el principio
       this.parar();

       this.carpeta=newCarpeta;
       this.tipo=newTipo;
       this.numfotos=newNumFotos;       
       this.prefijoFoto=newPrefijo;
       this.textoPortada=newTextoPortada;
       this.reset(); //reinicia el slide con los nuevos valores
      //CONTROLAR QUE TELON ESTE SUBIDO O SUBIRLO...
       if (this.autoplay) this.iniciar(0);   //this.iniciar(); //esto empieza en la primera foto y no muestra la portada
    }

   
   function ajustarTamanoCaja()
    {

        var caja=$(almo(this.idContenedor));
        var w=caja.width(); var ow=caja.outerWidth(); 
        var y=caja.height(); var oy=caja.outerHeight();
//alert(y);
        var difX=ow-w;
        var difY=oy-y;
        switch(this.ajustarTamano) {
             case AJ_NORMAL:  break; //no hace nada
             case AJ_CONTENT: if (bordeDiv()) { //ajusto tamaño caja para que se vea todo contenido (iexplorer)
                              if (difX || difY) caja.animate({width:ow+difX,height:oy+difY},"fast");
                              //llevo la animacion al final inmediatamente para que creacapas que viene luego trabaje con los nuevos valores 
                              caja.stop( true,true ); //termina inmediatamente la animacion
                              //  if (difX || difY) { difX=ow+difX; difY=oy+difY; 
                              //    $(almo(this.idCapa0)).css({"width":difX,"height":difY});
                              //    $(almo(this.idCapa1)).css({"width":difX,"height":difY});
                              //    caja.animate({width:difX,height:difY},"fast");
                              //    caja.stop( true,true ); //termina inmediatamente la animacion
                              // }
                          }
                         break;
             case AJ_STRICT:    if (!bordeDiv()) { //estricto, reduzco tamaño caja para que se ajuste exactamente a valores originales html y css (firefox y similares)
                                   if (difX || difY) caja.animate({width:w-difX,height:y-difY},"fast");
                                   //llevo la animacion al final inmediatamente para que creacapas que viene luego trabaje con los nuevos valores 
                                   caja.stop( true,true ); //termina inmediatamente la animacion
                           
                           //   if (difX || difY) { difX=w-difX; difY=y-difY; 
                           //       $(almo(this.idCapa0)).css({"width":difX,"height":difY});
                           //       $(almo(this.idCapa1)).css({"width":difX,"height":difY});
                           //       caja.animate({width:difX,height:difY},"fast");
                           //       caja.stop( true,true ); //termina inmediatamente la animacion
                           //   }
                           }
                          break;
             default: break;
         }
      
         
         //llevo la animacion al final inmediatamente para que creacapas que viene luego trabaje con los nuevos valores 
      

//alert(caja.height());
            // if (difX) caja.width(caja.width+difX); //esto da error
            // if (difY) caja.height(caja.height+difY);
    }

function validarInteger(n,min,max)
  { //devuelve un entero si n es un entero correcto y que esta entre los valores indicados, si no devuelve -1;

     var k=parseInt(n);
     if (k && k<=max && k>=min) return k;
     else return false;
  }

   function telon(subir,velocidad,porcentaje,borde)
    { //quita la cubierta del slide si esta visible (es como subir el telon) a una velocidad dada en milisegundos
      //subir=1--> baja el telon,   subir=0-->sube el telon, lo oculta
      //borde=1 modifica el borde y le pone el marco que tuviera
      //porcentaje es la cantidad de telon que baja si subir=0
      //ANIMATE 0PX NO SE PUEDE HACER EN IEXPLORER 7, PONER UN TAMAÑO MINIMO DE 1PX

        var marcoConTelon="url('bordecubierta1.jpg')";
        var marcoSinTelon="url('bordecubierta.jpg')";
        if (!porcentaje) porcentaje="100%";
        var obj=this;

        //if (!subir) $(almo(obj.idCubierta)).slideUp(velocidad,function(){if (borde) $(almo(obj.idContenedor)).css({"background-image":marcoSinTelon}); obj.estadoTelon=0;}  );
        if (!subir) $(almo(obj.idCubierta)).animate({height:"1px"},velocidad,function(){ 
                 $(this).css("visibility","hidden");
                 if (borde) $(almo(obj.idContenedor)).css({"background-image":marcoSinTelon});
                 obj.estadoTelon=0;
                  if (obj.relojCapas) clearTimeout(obj.relojCapas);
                  if (obj.relojCargaFotos) clearTimeout(obj.relojCargaFotos);
                 if (obj.autoplay) { obj.modo=M_PLAY; obj.setEstado("iniciando en modo Auto..."); obj.relojCapas=setTimeout(function(){ obj.siguiente(); },obj.espera);  }  //obj.iniciar(); }
                 else obj.modo=M_PAUSA;
               });
        else {
                  //if (borde) $(almo(obj.idContenedor)).css({"background-image":marcoConTelon});
                  $(almo(obj.idCubierta)).css("visibility","visible").animate({height:porcentaje},velocidad,function(){ 
                               obj.estadoTelon=1; 
                               if (borde) $(almo(obj.idContenedor)).css({"background-image":marcoConTelon}); 
                             });
               }
    }

   function creacapas()  
    { //crea las capas sobre las que trabaja el slide
      //una capa donde van las dos capas moviles y otra debajo donde van los controles
      
       var obj=this;

       $(almo(obj.idContenedor)).html(""); //vaciar el contenido del contenedor, lo uso habitualmente para avisar de que javascript no esta activado
       //calculo el tamaño del contenedor para dibujar las capas. (alta capas=altocontenedor-30px para los controles)
       var p=$(almo(obj.idContenedor)); 
       //var pd=parseInt(p.css("padding"));
       var tX=parseInt(p.width());
       var tY=parseInt(p.height())-obj.altoControles; 
       obj.anchoCapa0=tX; 
       obj.altoCapa0=tY; //lo uso luego para no tener que recalcularlo cada vez
       
       //crear div contenedores de las fotos y las fotos
       $("<div></div>").attr("id",obj.idCajaFotos).css({"position":"relative","overflow":"hidden","width":"100%","height":tY,"font-family":"verdana","color":"#ffffff","font-size":"0.8em"}).appendTo(almo(obj.idContenedor));
       $("<div></div>").attr("id",obj.idCaja0).css({"position":"relative","overflow":"hidden","width":"100%","height":tY,"text-align":"center","background-color":"#ffffff","background-image":"url('photoslide/iconos/sombra1.png')"}).appendTo(almo(obj.idCajaFotos));
       $("<a href='#' target='_blank'></a>").html( $("<img id='"+obj.idFoto0+"' src='photoslide/iconos/sombra1.png' alt='' />").css({"position":"relative","border":"none"}) ).appendTo(almo(obj.idCaja0));
       $("<div></div>").attr("id",obj.idCaja1).css({"position":"relative","top":-tY,"overflow":"hidden","width":"100%","height":tY,"text-align":"center","background-color":"#ffffff","background-image":"url('photoslide/iconos/sombra1.png')"}).appendTo(almo(obj.idCajaFotos));
       $("<a href='#' target='_blank'></a>").html( $("<img id='"+obj.idFoto1+"' src='photoslide/iconos/sombra1.png' alt='' />").css({"position":"relative","border":"none"}) ).appendTo(almo(obj.idCaja1));
     
       $(almo(obj.idFoto0)).parent().click(function(e){ if (obj.modo == M_BLOQ) { alert("kkdk"); e.stopPropagation(); e.preventDefault(); return; } if (obj.escala) { obj.parar(); return; } e.stopPropagation(); e.preventDefault(); if (obj.modo==M_PLAY) obj.parar(); else obj.iniciar(); });
       $(almo(obj.idFoto1)).parent().click(function(e){ if (obj.modo == M_BLOQ) { alert("kkdk"); e.stopPropagation(); e.preventDefault(); return; } if (obj.escala) { obj.parar(); return; } e.stopPropagation(); e.preventDefault(); if (obj.modo==M_PLAY) obj.parar(); else obj.iniciar(); });
     
    //   $(almo(obj.idCapa0)).attr({"src":"photoslide/iconos/preloadG.gif"});
    //   if (!obj.textoPortada) $(almo(obj.idCapa1)).attr({"src":"photoslide/iconos/fondoinicial.png"});

       //crear los controles OJO: DEBEN CREARSE EN ESTE ORDEN: PLAY JUSTO A LA IZQUIERDA DE STOP SIN NADA ENTRE MEDIAS
       $("<div></div>").attr("id",obj.idControles).css({"position":"relative","overflow":"hidden","text-align":"left","width":"100%","height":"30px","background-image":"url('fondocontroles.png')","background-color":"#F5EDB7","margin":"0px","padding":"0px"}).appendTo(almo(obj.idContenedor));

       $("<a></a>").html("<img id=\"" + obj.idControles + "_play\" src=\"photoslide/iconos/play_off.png\" alt=\"play\" />").attr({"id":obj.idControles+"e_play","href":"#","title":"play"}).appendTo(almo(obj.idControles));
       $("<a></a>").html("<img id=\"" + obj.idControles + "_stop\" src=\"photoslide/iconos/stop_off.png\" alt=\"stop\" />").attr({"id":obj.idControles+"e_stop","href":"#","title":"stop"}).appendTo(almo(obj.idControles));

       //modo manual
       $("<a></a>").html("<img id=\"" + obj.idControles + "_ant\" src=\"photoslide/iconos/anterior_off.png\" alt=\"anterior\" />").attr({"id":obj.idControles+"e_ant","href":"#","title":"anterior"}).appendTo(almo(obj.idControles)).click(function(e){
               e.stopPropagation(); e.preventDefault();
               if (obj.modo == M_BLOQ) return;
               obj.parar();
               obj.anterior();
           });
       $("<input type='text' id='"+obj.idNFoto+"'>").attr({"maxlength":"4"}).css({"width":"35px","text-align":"right","font-family":"verdana","font-size":"0.8em","color":"#000000","vertical-align":"middle","margin-left":"5px"}).appendTo(almo(obj.idControles)).focus(function(e){if (obj.modo == M_BLOQ) {this.blur(); return; }this.select();e.preventDefault(); e.stopPropagation();}).click(function(e){ e.preventDefault(); e.stopPropagation(); if (obj.modo == M_BLOQ) return; obj.parar(); }).keypress(function(e){ if (e.which==13) if ((j=validarInteger($(this).attr("value"),1,obj.numfotos)) !== false) obj.siguiente(j); else $(this).attr("value",obj.fotoActual); });
       $("<span id='"+obj.idMFoto+"'></span>").html("/ "+obj.numfotos).css({"font-family":"verdana","font-size":"0.8em","color":"#000000"}).appendTo(almo(obj.idControles));
       $("<a></a>").html("<img id=\"" + obj.idControles + "_sig\" src=\"photoslide/iconos/siguiente_off.png\" alt=\"siguiente\" />").attr({"id":obj.idControles+"e_sig","href":"#","title":"siguiente"}).appendTo(almo(obj.idControles)).click(function(e){
               e.stopPropagation(); e.preventDefault();
               if (obj.modo == M_BLOQ) return;
               obj.parar();
               obj.siguiente();
           });
       $("<a></a>").html("<img src=\"photoslide/iconos/ayuda_off.png\" alt=\"ayuda\" />").attr({"id":obj.idAyuda,"href":"#","title":"Instrucciones funcionamiento","target":"_blank"}).click(function(e){e.preventDefault(); e.stopPropagation(); if (obj.modo == M_BLOQ) return; esperandoMensaje=1; obj.mensaje(instrucciones,1);}).appendTo(almo(obj.idControles));
       $("<a></a>").html("<img src=\"photoslide/iconos/opciones_off.png\" alt=\"opciones\" />").attr({"id":obj.idOpciones,"href":"#","title":"Configurar pase fotos","target":"_blank"}).click(function(e){e.preventDefault(); e.stopPropagation(); if (obj.modo == M_BLOQ) return; esperandoMensaje=1; obj.mensaje(configurar,2);}).appendTo(almo(obj.idControles));
       $("<img>").attr({"id":obj.idPreload,"src":"photoslide/iconos/preload1.gif"}).css({"visibility":"hidden","vertical-align":"middle"}).appendTo(almo(obj.idControles));
       $("<div></div>").attr("id",obj.idNombreFoto).html("").css({"display":"inline","background-color":"transparent","font-family":"verdana","font-size":"0.8em","text-align":"left","padding-left":"3px","margin-left":"5px","color":"#000000"}).appendTo(almo(obj.idControles));
       $("<a></a>").html("<img id=\"" + obj.idControles + "_zoom\" src=\"photoslide/iconos/zoom_off.png\" alt=\"zoom\" />").attr({"id":obj.idZoom,"href":"#","title":"Zoom Imagen Actual","target":"_blank"}).css({"visibility":"hidden"}).click(function(e){ if (obj.modo == M_BLOQ) { e.stopPropagation(); e.preventDefault(); return;} }).appendTo(almo(obj.idControles));

       $(almo(obj.idControles)+" a img").css({"border":"none","vertical-align":"middle"});
       $(almo(obj.idControles)+" a").css({"text-decoration":"none","margin-left":"5px"});

       //asignar funciones a los botones
       $(almo(obj.idControles)+"e_play").click(function(e){ 
              e.stopPropagation(); e.preventDefault();
              if (obj.modo == M_BLOQ) return; //esta bloqueado, no hago nada
              var x=$(this).children("img").attr("alt"); 
              if (x=="play") obj.iniciar(); 
              else  obj.parar(); 
            });

       $(almo(obj.idControles)+"e_stop").click(function(e){
              e.stopPropagation(); e.preventDefault();
              if (obj.modo==M_BLOQ) return;
              //if (obj.modo != M_PLAY && obj.modo != M_PAUSA) return; //esta bloqueado o esperando replay del usuario, no hago nada
              obj.parar();
              obj.reset();
            });

       $(almo(obj.idControles)+"_ant").parent().css({"margin-left":"30px"});
       $(almo(obj.idControles)+"_play").parent().css({"margin-left":"50px"});
       $(almo(obj.idControles)+"_sig").parent().css({"margin-right":"30px"});
       $(almo(obj.idControles)+" img").hover( 
                    function(){ $(this).attr("src","photoslide/iconos/" + $(this).attr("alt") + "_on.png"); }, 
                    function(){ $(this).attr("src","photoslide/iconos/" + $(this).attr("alt") + "_off.png"); }
        ); 
//       $(almo(obj.idControles)+"_play").mouseover(function(){ if (obj.modo==M_BLOQ) return;  $(this).attr({"src":"photoslide/iconos/"+$(this).attr("alt")+"_on.png"});}).mouseout(function(){if (obj.modo==M_BLOQ) return; $(this).attr({"src":"photoslide/iconos/"+$(this).attr("alt")+"_off.png"});});
//       $(almo(obj.idControles)+"_stop").mouseover(function(){ if (obj.modo!=M_PLAY && obj.modo!=M_PAUSA) return; $(this).attr("src","photoslide/iconos/stop_on.png");}).mouseout(function(){if (obj.modo==M_BLOQ) return; $(this).attr("src","photoslide/iconos/stop_off.png");});

       //crear cubierta (el telon)
       var h=obj.altoCapa0+obj.altoControles;
       //alert("h:"+h+", el otro:"+(obj.altoCapa0+obj.altoControles));
       $("<div></div>").attr("id",obj.idCubierta).css({ "z-index":"10","position":"relative","top":-h,"overflow":"hidden","text-align":"center","width":"100%","height":"100%","background-image":"url('cubierta1.jpg')","background-repeat":"no-repeat","background-position":"center center","margin":"0px","padding":"0px"}).appendTo(almo(obj.idContenedor)); 
       $("<div></div>").attr("id",obj.idMensajes).css({ "z-index":"9","position":"relative","top":-h,"overflow":"hidden","width":"100%","height":h,"background-color":"#ffffff","margin":"0px","padding":"0px","color":"#000000","text-align":"left","font-family":"verdana","font-size":"0.8em"}).appendTo(almo(obj.idContenedor)).hide();  //click(function(e){ e.stopPropagation(); e.preventDefault(); obj.mensaje("",1);})
       //si pones el hide antes de appendTo a veces en chrome no lo hace correctamente...
    }


  function resetSlide()
    {  //reinicia el slide y lo coloca en la primera foto

       //if (this.fotoActual==0) return;   //estoy en la portada, no recargo otra vez
 
       if (this.relojCapas) clearTimeout(this.relojCapas);
       if (this.relojCargaFotos) clearTimeout(this.relojCargaFotos);
       // this.fotoActual=-1; //suponiendo que se pone una foto de portada en capa1, para que empieze en la primera foto sin portada poner 0
 
       //this.modo=M_PAUSA; 

       //this.ciclos=0;
       //this.stop=1;

       this.sentido=1;
       this.cargandofoto=0;
       this.reintentos=0;
       this.error=0;
       this.errores="";
       this.ocultarPreload();
       $(almo(this.idZoom)).attr("href","#").css({"visibility":"hidden"}); 
       $(almo(this.idNFoto)).attr("value","0");
       $(almo(this.idMFoto)).html("/"+this.numfotos);
 
       var obj=this;

       var im= $(almo(this.idFoto1));


/****
this.textoPortada="";
       if (this.textoPortada=="") muestraEstado(3,obj.altoCapa0,obj.idFoto1,obj.imgEstado,obj.obtenerPathFoto(0,1));
       else { im.attr({"src":"photoslide/iconos/sombra1.png","alt":""}); obj.portada(); } 

       //if (!this.capavisible) ca.show("slow",function(){obj.capavisible=1;}); 
       if (!this.capavisible) obj.cambiaCapas(); //muestra la capa1 encima
       //this.capavisible=1;
**/

       //       this.estado=E_REPLAY;  //tal vez e_replay
       
       if (this.relojCapas) clearTimeout(this.relojCapas);
       if (this.relojCargaFotos) clearTimeout(this.relojCargaFotos);

       this.ocultarPreload();
       this.siguiente(0);
    }

   function iniciarSlide(n)
    {  //inicia el slide por la foto que estuviera (fotoactual)
       //se usa con el boton play que inicia el modo automatico
       //si n>=0 empieza por esta foto, si no por la actual

         if (this.modo == M_BLOQ) return; //slide bloqueado por usuario u otro motivo
   
         //si esta en replay borro la capa de avisos
         //if (this.estado==E_REPLAY) continuar(this);

         //this.stop=0; //el slide está en curso
         //this.modo=M_PLAY; //funcionando en modo auto
         //this.estado=E_NORMAL;
         
         this.sentido=1; //hacia adelante
         this.error=0;
         
         //el boton play/pause en pause
         var z=$(almo(this.idControles)+"e_play"); 
         z.children("img").attr({"src":"photoslide/iconos/pause_off.png","alt":"pause"});
         z.attr("title","pause");

         if (this.modo == M_REPLAY && this.fotoActual == this.numfotos) n=1; //estaba al final de reproduccion y continua en la primera foto
         //si estaba en modo M_REPLAY en cualquier otra foto continua en la siguiente

         this.modo=M_PLAY;
         if (n>=0) this.siguiente(n);
         else this.siguiente();
     }
  
   function pararSlide()
    {  

       this.modo=M_PAUSA; //parado o pausa
       //this.stop=1; 
       this.cargandofoto=0; 
       if (this.relojCapas) clearTimeout(this.relojCapas);
       if (this.relojCargaFotos) clearTimeout(this.relojCargaFotos);
       if (this.fotoActual<=0) this.setEstado(""); //si no esta visible ninguna foto
       this.ocultarPreload();
     
       //el boton play/pause en play
       var z=$(almo(this.idControles)+"e_play"); 
       z.children("img").attr({"src":"photoslide/iconos/play_off.png","alt":"play"});
       z.attr("title","play");
    }

   function Siguiente(n)
     { //si no hay n o n<0 carga la foto siguiente a la actual, si no carga la foto n
       //deberia controlar donde llamo a siguiente si le voy a pasar un valor n que sea correcto
         
        if (n>=0) var numFoto=n; 
        else var numFoto=this.fotoActual+1;
         
        if (numFoto>this.numfotos)  { 
           if ( (this.modo==M_PLAY && !this.loop) && this.modo!=M_REPLAY)
                        {
                          this.finReproduccion(); 
                          return; 
                        }
           numFoto=1;  //AQUI PUEDO CONTROLAR EL FIN DEL SLIDE
        }   

//       if (this.avisosvisible && this.modo != M_REPLAY) { this.mensaje("",1); return; } //hay un mensaje abierto, lo cierra y reinicia, por eso el return
//       else
 if (this.avisosvisible) { //esta en modo replay (finReproduccion)
             borrarObjeto(this.idCapaAvisos);
             this.avisosvisible=0;
           }
         this.sentido=1;
  //       this.estado=E_NORMAL;
         this.cargarFoto(numFoto);
     }

    function Anterior(n)
     { //si no hay n o n<0 carga la foto siguiente a la actual, si no carga la foto n
       //deberia controlar donde llamo a siguiente si le voy a pasar un valor n que sea correcto

       if (n) var numFoto=n;
       else var numFoto=this.fotoActual-1;

       if (numFoto<1) numFoto=this.numfotos;

//       if (this.avisosvisible && this.modo != M_REPLAY) { this.mensaje("",1); return; } //hay un mensaje abierto, lo cierra y continua
//       else 
if (this.avisosvisible) { //esta en modo replay (finReproduccion)
             borrarObjeto(this.idCapaAvisos);
             this.avisosvisible=0;
           }
       this.sentido=-1;
       this.cargarFoto(numFoto);
     }

   function cambiaCapas()
    { //oculta la capa visible y deja ver la otra
     
       var obj=this; //para poder pasarla como parametro en setTimeout y otras funciones callback

       // if (obj.capavisible) $(almo(obj.idCapa1)).hide("slow",function(){ obj.capavisible=0; });
       // else $(almo(obj.idCapa1)).show("slow",function(){ obj.capavisible=1; });
        
       var path=obj.obtenerPathFoto(obj.fotoActual,0);
       obj.cambiandoCapa=1; 
       if (obj.fotoActual==0 && !obj.autoplay) var x="clic sobre la foto para iniciar...";
       else var x="";
       if (obj.capavisible) $(almo(obj.idCaja1)).fadeOut("slow",function(){ if (!obj.cargandofoto) obj.ocultarPreload(); obj.cambiandoCapa=0; obj.capavisible=0; if (!obj.cargandofoto && !obj.error) obj.setEstado(x); $(almo(obj.idNFoto)).attr("value",obj.fotoActual);  if (obj.escala) $(almo(obj.idFoto0)).parent().css({"cursor":"url('photoslide/iconos/mouse_zoom1.cur'),pointer"}); });
       else $(almo(obj.idCaja1)).fadeIn("slow",function(){  if (!obj.cargandofoto) obj.ocultarPreload(); obj.cambiandoCapa=0;  obj.capavisible=1; if (!this.cargandofoto && !obj.error) obj.setEstado(x); $(almo(obj.idNFoto)).attr("value",obj.fotoActual); if (obj.escala) $(almo(obj.idFoto1)).parent().css({"cursor":"url('photoslide/iconos/mouse_zoom1.cur'),pointer"}); });
    }

   function muestraEstado(estado,altoContenedor,idFoto,objImage,fotoPortada)
     {     //muestra la imagen en cuestion y la centra verticalmente y ajusta el tamaño al contenido real

       switch (estado) {
           case 0:  var path="photoslide/iconos/preloadG.gif"; var alt="cargando diapositiva"; break;
           case 1:  var path="photoslide/iconos/imagenerror.png"; var alt="error en diapositiva"; break;
           case 2:  var path="photoslide/iconos/replay_off.png"; var alt="repetir / replay"; break;
           case 3:  var path=fotoPortada; var alt="portada"; break;
       }
       //en chrome y konqueror debo crear una nueva imagen, si no no detecta bien el load
       objImage=null;
       objImage=new Image();
       $(objImage).bind("load",function(){ 
           $(this).unbind(); 
           //calcula tamaño de la nueva imagen a cargar
           var h=parseInt(objImage.height);
           var w=parseInt(objImage.width);

           //si la imagen se sale del contenedor (en anchura y/o altura) la ajusto al contenedor proporcionalmente
           if (h < altoContenedor) mh=parseInt( (altoContenedor - h) / 2 ); //si la imagen es menos alta la centra verticalmente, horizontalmente lo hace text-align)
           else mh=0;
           $(almo(idFoto)).attr({"src":path}).css({"width":w,"height":h,"top":mh});  //animate en firefox queda feo
         });

       if (estado==3) { 
           $(objImage).bind("error",function(){ $(this).unbind();
           $(almo(idFoto)).attr({"src":"photoslide/iconos/fondoinicial.png"}).css({"width":"100%","height":"100%","top":"0px"});  
         });
       }
       objImage.src=path;
      }

/*****
   function centrarImagen(ancho,alto,idImagen)
    {  //centra verticalmente la imagen dada metiendole margin-top y bottom, la imagen ya debe estar cargada y en tamaño auto

       var objImagen=$(almo(idImagen));
       var h=objImagen.height(); //alert(h);
       if (h < alto) {  
         var mh=parseInt( (alto - h) / 2 ); //si la imagen es menos alta la centra verticalmente, horizontalmente lo hace text-align)
         objImagen.css({"margin-top":mh,"margin-bottom":mh});      
       } 
    }
*****/

   function f_timeOut(numFoto,n)
    {  //controla que la carga de una foto no supere el tiempo mitimeOut, n es el numero de reintentos de lectura (ampliaciones del plazo inicial)
       //la primera vez que detecta error o tardanza emite mensaje :"esperando foto...", al final da aviso de "error en foto..."

       var obj=this;
       $(almo(obj.idZoom)).attr("href","#"); 
       obj.fotoActual=numFoto; 
       var idCapa=(obj.capavisible)?obj.idFoto1:obj.idFoto0;
       $(almo(idCapa)).parent().css("cursor","pointer"); 
       $(almo(obj.idZoom)).css({"visibility":"hidden"}); 
       if (n<obj.maxreintentos) { 
                  this.mostrarPreload(); 
                  if (n==0) muestraEstado(0,obj.altoCapa0,idCapa,obj.imgEstado,"");
                  //$(almo(idCapa)).css({"width":"auto","height":"auto"}).attr({"src":"photoslide/iconos/preloadG.gif"});
                  //$(almo(idCapa)).attr({"src":"photoslide/iconos/preloadG.gif","alt":"cargando foto..."});
                  //if (n==0) centrarImagen(obj.anchoCapa0,obj.altoCapa0,idCapa);  //solo la centro la primera vez, luego ya no hace falta mas
                  obj.setEstado("Esperando diapositiva " + numFoto+"  ["+(obj.maxreintentos-n)+"]");
                  if (obj.relojCargaFotos) clearTimeout(obj.relojCargaFotos);
                  obj.relojCargaFotos=setTimeout(function(){obj.f_timeOut(numFoto,n+1);},obj.mitimeout);
               }
       else  {
                  this.ocultarPreload();
                  //$(almo(idCapa)).attr({"src":"photoslide/iconos/imagenerror.png","alt":"Error: foto no cargada"});
                  //$(almo(idCapa)).css({"width":"auto","height":"auto"}).attr({"src":"photoslide/iconos/imagenerror.png"});
                  //centrarImagen(obj.anchoCapa0,obj.altoCapa0,idCapa);
                  muestraEstado(1,obj.altoCapa0,idCapa,obj.imgEstado,"");
                  clearTimeout(obj.relojCargaFotos); 
                  obj.setEstado("Error diapositiva " + numFoto);
                  $(almo(obj.idNFoto)).attr("value",numFoto);
                  obj.cargandofoto=0; 
                  obj.errores=""; 
                  obj.error=0;
              
                  if (obj.relojCapas) clearTimeout(obj.relojCapas);
                  //esto funciona, si le das a una foto en manual y no la carga, pasaria a la siguiente/anterior hasta encontrar una correcta
                  //if (obj.sentido>0) obj.relojCapas=setTimeout(function(){ obj.siguiente(); },1000);
                  //else obj.relojCapas=setTimeout(function(){ obj.anterior(); },1000);
                  if (this.modo==M_PLAY) obj.relojCapas=setTimeout(function(){ obj.siguiente(); },1000); //si esta en auto sigue a la siguiente si hay error
                }
    }

   function cargarFoto(numFoto)
    { //intenta cargar una foto en el div idCapa
      
       var obj=this;

       $(almo(obj.idFoto0)).parent().css("cursor","pointer");
       $(almo(obj.idFoto0)).parent().css("cursor","pointer");
       obj.escala=0;
       $(almo(obj.idZoom)).css({"visibility":"hidden"}); 

       if (numFoto>obj.numfotos)  { alert("foto incorrecta"); return;
           if (!obj.stop) { //alert("has llegado al final en modo auto, me paro");  //esta en modo auto, al llegar al final avisa y para
                               obj.finReproduccion();
                               return; 
                            }
            numFoto=1;  //AQUI PUEDO CONTROLAR EL FIN DEL SLIDE
       }
       else if (numFoto<0) {  alert("foto incorrecta"); return;
          if (!obj.stop) {
                               //alert("has llegado al principio en modo auto, me paro");  //esta en modo auto, al llegar al final avisa y para 
                               obj.finReproduccion();
                               return;
                            }
          numFoto=obj.numfotos;
        }

       if (numFoto==0) var txt="portada";
       else var txt=numFoto;        
       this.setEstado("cargando "+txt);  //hay que tener en cuenta si se pasa, que de 1
       this.mostrarPreload();
       var pathFoto=obj.obtenerPathFoto(numFoto,1); //obtiene path completo de la foto a cargar

       var idCapaOculta=(obj.capavisible)?obj.idFoto0:obj.idFoto1; //la capaoculta donde voy a cargar la foto
       
       obj.cargandofoto=1;
       obj.fotoActual=numFoto;  //esta es la nueva foto, aunque no termine de cargarla
       $(obj.imgTemp).unbind(); //quito todos los eventos que tenga pendientes
       //chrome, konqueror y tal vez opera, no detectan el load si no cambio la imagen, y da problemas si cargo dos veces la misma imagen
       obj.imgTemp=null;
       obj.imgTemp=new Image();
       $(obj.imgTemp).bind("load",function(){ 
               //alert(obj.imgTemp.width);
               //if (obj.imgTemp.width<600) alert($(obj.imgTemp).width());
                //obj.fotoActual=numFoto; 
                if (obj.relojCargaFotos) clearTimeout(obj.relojCargaFotos);
                obj.cargandofoto=0; 
                obj.errores=""; 
                obj.error=0;

                //calcula tamaño de la nueva imagen a cargar
                var h=parseInt(obj.imgTemp.height);
                var w=parseInt(obj.imgTemp.width);
                //si la imagen se sale del contenedor (en anchura y/o altura) la ajusto al contenedor proporcionalmente
                var d1=obj.anchoCapa0-w;
                var d2=obj.altoCapa0-h;
                if (d1<0 || d2<0)
                  {
                      if (d1<d2) var prop=obj.anchoCapa0/w;
                      else var prop=obj.altoCapa0/h; 
                      var w = parseInt(w * prop);  //nuevo tamaño
                      var h = parseInt(h * prop);
                      $(almo(idCapaOculta)).parent().attr("href",obj.obtenerPathFoto(numFoto,1)); 
                      $(almo(obj.idZoom)).attr("href",obj.obtenerPathFoto(numFoto,1)); 
                      $(almo(obj.idZoom)).css({"visibility":"visible"}); 
                      //$(almo(idCapaOculta)).css("cursor","url('photoslide/iconos/mouse_zoom1.cur'),auto"); //para firefox y similares añadir despues auto...
                      obj.escala=1; //permite zoom
                  }
                else {  $(almo(obj.idZoom)).attr("href","#").css({"visibility":"hidden"}); 
                          $(almo(idCapaOculta)).parent().attr("href","#");
                          $(almo(idCapaOculta)).parent().css("cursor","pointer"); 
                          obj.escala=0;
                        }
                var mh=0;
                if (h<obj.altoCapa0) mh=parseInt( (obj.altoCapa0 - h) / 2 ); //si la imagen es menos alta la centra verticalmente, horizontalmente lo hace text-align)
                $(almo(idCapaOculta)).attr({"src":pathFoto,"alt":"diapositiva "+numFoto}).css({"width":w,"height":h,"top":mh});

                obj.cambiaCapas(); 
                if (obj.modo==M_PLAY) obj.relojCapas=setTimeout(function(){ obj.siguiente(); },obj.espera); //si no esta en pausa/manual llama a la siguiente foto
           });
       /*** ESTO FUNCIONA
       $(obj.imgTemp).bind("error",function(){
                obj.fotoActual=numFoto; 
                if (obj.relojCargaFotos) clearTimeout(obj.relojCargaFotos);
                obj.cargandofoto=0; 
                obj.errores=" * error en foto "+ numFoto; 
                obj.error=1;
                obj.setEstado("Error en " + obj.obtenerPathFoto(numFoto,0));
                $(almo(idCapaOculta)).attr({"src":"photoslide/iconos/imagenerror.png"});
                obj.cambiaCapas();
                if (!obj.stop) obj.relojCapas=setTimeout(function(){ obj.siguiente(); },obj.espera); //si no esta en pausa/manual llama a la siguiente foto
            });
       ****/
       $(almo(idCapaOculta)).css({"width":"auto","height":"auto"}).attr({"src":"photoslide/iconos/preloadG.gif"});
       obj.imgTemp.src=pathFoto;         

       if (obj.cargandofoto)  //si la foto se carga muy rapido (en local por ejemplo) el load se ejecuta antes que esto y esto luego va por libre cuando no debe
        {
           if (obj.relojCargaFotos) clearTimeout(obj.relojCargaFotos);
           //obj.relojCargaFotos=setTimeout("f_timeOut("+ pos +","+numFoto+",0)",obj.mitimeout); //si timeout>=espera puedes ponerlo aqui, si no queda feo
           obj.relojCargaFotos=setTimeout(function(){ obj.f_timeOut(numFoto,0); },obj.mitimeout);
        }
    }

   function setEstado(n)
    { //escribe un mensaje en la capa de controles, para errores sobre todo

        $(almo(this.idNombreFoto)).html(n);
    }

   function capaActual()
    {  //devuelve el id de la capa visible
     
        if (this.capavisible) return this.idCapa1;
        else return this.idCapa0;
    }

   function ocultarSlide(velocidad)
    {
      if (!this.visible) return;
      if (this.avisosvisible)  {
            var c=$(almo(this.idCapaAvisos)).hide("slow");
            if (velocidad) c.stop(true,true); //termina la animacion de golpe
         }
      var p=$(almo(this.idContenedor)).hide("slow");
      if (velocidad) p.stop(true,true); //termina la animacion de golpe
      this.visible=0;
    }

   function mostrarSlide(velocidad)
    {
      if (this.visible) return;
      var p=$(almo(this.idContenedor)).show("slow");
      if (velocidad) p.stop(true,true);
      if (this.avisosvisible) {
            p=$(almo(this.idCapaAvisos)).show("slow");
            if (velocidad) p.stop(true,true);
         }
      this.visible=1;
    }

   //funciones auxiliares

   function almo(n)
    {
       return "#"+n; 
    }  

   function mostrarPreload()
    {
       $(almo(this.idPreload)).css("visibility","visible");
    }

   function ocultarPreload()
    {
       $(almo(this.idPreload)).css("visibility","hidden");
    }

   function borrarObjeto(idDiv)
    {  //idDiv no lleva # delante

       $(almo(idDiv)).hide("slow",function(){ $(this).remove();});
    }

   function bordeBody()
    { //comprueba si el body tiene algun borde, es util con iexplorer que suele tener un borde de 2px (medium) por defecto y que no se puede conocer con css("border")
      //esto en iexplorer daria 2 en condiciones normales, se puede solucionar si se pone en style body border=none;      
 
      $("<div></div>").attr("id","divborrameZXZ").css({"position":"absolute","left":"0px","top":"0px","z-index":"100","width":"1px","height":"1px","visible":"hidden"}).appendTo("body");
      var pos=$("#divborrameZXZ").offset(); 
      $("#divborrameZXZ").remove();
      var x=parseInt(pos.left);
      var y=parseInt(pos.top);
      return x=new Array(x,y);
    }
  
   function bordeDiv()
    { //comprueba si el tamaño del div incluye borde y padding(iexplorer, devuelve 1) o se lo añade (firefox y similares, devuelve 0)
  
      var p=$("<div></div>").attr("id","divborrameZXZ").css({"position":"absolute","left":"0px","top":"0px","z-index":"100","width":"20px","height":"20px","padding":"5px","border":"3px solid #ffffff","visible":"hidden"}).appendTo("body");
      var w=parseInt(p.width());
      var ow=parseInt(p.outerWidth());
      //si iexplorer ow=20 y w=4, para firefox, opera,chrome y similares w=20 y ow=36;
      p.remove();
      if (w<20) return 1; //iexplorer, en 20px mete el borde y el contenido sera menor de 20
      else return 0; //firefox y similares, el tamaño sera 20px y le añade el borde extra.
    }

   function crearCapaAvisos()
    { //crea una capa absoluta y la coloca encima del objeto caja y con su tamaño (con iexplorer no se puede usar relative y por eso hago esto)
      //caja debe ir en formato jquery: #objeto, .clase, body, this, etc...
      //solo puede haber una ventana de este tipo abierta
       
       var obj=this;

       //if (obj.avisosvisible) return 0;  //ya hay otra ventana abierta, no hago nada y devuelvo 0
       
       var p=$(almo(obj.idContenedor)); 
       var z=p.css("z-index"); 
      
       var tX=parseInt(p.width())-obj.margen*2; //margen*2+"px";
//       var tY=parseInt(p.height())-obj.margen*2-obj.altoControles+"px";//var tY=p.height();
var tY=obj.altoCapa0-obj.margen*2;
       var pX=obj.margen; //este no importa si pones el contenedor text-align:center y en esta capa margin:auto
//       var pY=$(almo(obj.idCapa0)).height()+obj.margen;   //este falla si el slide esta oculto o con tamaño cambiado
//*       var pY=obj.altoCapa0+obj.margen; 
       if (obj.capavisible) var pY=obj.altoCapa0*2-obj.margen; //una por cada cajafoto y luego lo voy a negar, por eso estos signos
       else var pY=obj.altoCapa0-obj.margen; //solo hay visible una capa y la posicion relativa solo respecto a esa capa

       //borro el objeto si estaba abierto, pero esto se ve feo, asi que es mejor no abrirlo si ya estaba abierto
       //$(almo(obj.idCapaAvisos).remove(); //borro el objeto si estaba abierto

       estadoAnterior=obj.modo;
       obj.modo=M_BLOQ;
       //*if (!obj.avisosvisible) $("<div></div>").attr({id:obj.idCapaAvisos}).css({position:"relative","overflow":"hidden","z-index":z,"top":-pY,"width":tX,"margin":"auto","height":tY,"background-image":"url('photoslide/iconos/sombra1.png')","text-align":"center","font-family":"verdana","font-size":"20pt",color:"#ffffff"}).hide().appendTo(almo(obj.idContenedor)).show("slow");     

       if (!obj.avisosvisible) $("<div></div>").attr({id:obj.idCapaAvisos}).css({position:"relative","overflow":"hidden","z-index":z,"top":-pY,"width":tX,"margin":"auto","height":tY,"background-image":"url('photoslide/iconos/sombra1.png')","text-align":"center","font-family":"verdana","font-size":"20pt",color:"#ffffff"}).hide().appendTo(almo(obj.idCajaFotos)).show("slow",function(){obj.modo=estadoAnterior; estadoAnterior=-1; obj.avisosvisible=1;});     
       else {
                $(almo(obj.idCapaAvisos)).html(""); //borro contenido si tenia algo
                obj.avisosvisible=1;
                obj.modo=estadoAnterior;
                estadoAnterior=-1;
              }
       
       return new Array(pX,pY,tX,tY); //ha abierto la ventana, devuelve position y tamaño
    }

   function finReproduccion()
    { //muestra una ventana con un boton replay al llegar al final de una reproduccion que tiene loop=0;

       var obj=this;

       
  //   obj.estado = E_REPLAY; //esperando play para continuar
       obj.parar(); //paro slide y espero a que pulse play o replay
       obj.modo=M_REPLAY;

       if (dat=obj.crearCapaAvisos())
        {
          $("<a></a>").attr({"id":obj.idCapaAvisos+"_replay","title":"Repetir / Play again"}).html("<img src=\"photoslide/iconos/replay_off.png\" alt=\"repetir / play again\" />").appendTo(almo(obj.idCapaAvisos));
          $(almo(obj.idCapaAvisos)+" a").click(function(e){ e.stopPropagation(); e.preventDefault(); obj.iniciar(); });       
          $(almo(obj.idCapaAvisos)+" a>img").css("border","none").bind("load",function(){ //centrar el icono replay verticalmente
               //alert($(this).height());
               var mh=parseInt( ( parseInt(dat[3]) - parseInt($(this).height()) ) / 2 );
               $(this).css("margin-top",mh);
               $(this).unbind();
             });
           $(almo(obj.idCapaAvisos)+" a").hover(  function(){ $(this).children("img").attr("src","photoslide/iconos/replay_on.png"); },  function(){ $(this).children("img").attr("src","photoslide/iconos/replay_off.png"); }); 
        }
       obj.errores="";
    }


var estadoAnterior=-1; //no hay ventana de mensajes abierta

var esperandoMensaje=0;

   function mensaje(texto,tipo)
    {
       var obj=this;
     
       var m=$(almo(obj.idMensajes));
       if (!obj.mensajeAbierto)
        {
          estadoAnterior=obj.modo;
          obj.parar();
          obj.modo=M_BLOQ;
          m.html(texto);
          if (tipo==1)    //ayuda
           {
             $(almo(obj.idMensajes)).css({"text-align":"center","background-color":"eeffee"});
             $(almo(obj.idMensajes)+" img").css({"vertical-align":"middle","margin":"0px","padding":"0px"});
             $(almo(obj.idMensajes)+" p").css({"margin":"3px","padding":"0px","color":"#000000","font-size":"0.9em"});
             //si no pongo lo siguiente, en chrome el h3 le mete padding grande y desplaza toda la capa
             $(almo(obj.idMensajes) +" h3").css({"margin-top":"0px","padding-top":"10px","font-size":"1.2em","color":"#38650b","text-align":"center","font-weight":"bold"});
             $(almo(obj.idMensajes) +" h4").css({"font-size":"1em","margin-left":"5px","margin-bottom":"5px"}); 
             $(almo(obj.idMensajes) + " #spancaja").css({"border":"1px solid #000000","padding-left":"10px","padding-right":"2px","margin-left":"3px","background-color":"#ffffff","text-align":"right"});
             $(almo(obj.idMensajes) + " #formbotones").css({"text-align":"center"});
             $(almo(obj.idMensajes) + " #enlacecerrar").css({"color":"#ff0000","font-weight":"bold","font-size":"1.2em"}).click(function(e){ e.stopPropagation(); e.preventDefault(); obj.mensaje(""),1;});
             $(almo(obj.idMensajes) + " #enlacecerrar").hover( 
                  function(){ $(this).css({"color":"#ff0000","background-color":"#ffffcc"}) },
                  function(){ $(this).css({"color":"#ff0000","background-color":"#dddddd"}) }
                );
            }
          else  //configurar...=2
            {
              $(almo(obj.idMensajes)+" img").css({"vertical-align":"middle","margin":"0px","padding":"0px"});
              $(almo(obj.idMensajes)).css({"text-align":"center","background-color":"eeffee"});
              $(almo(obj.idMensajes) +" h3").css({"margin-top":"0px","padding-top":"15px","font-size":"1.2em","color":"#38650b","text-align":"center","font-weight":"bold"});
              $(almo(obj.idMensajes) + " #formbotones").css({"width":"70%","margin":"auto","padding":"20px","text-align":"left","margin-top":"30px","border":"inset","font-family":"verdana","font-size":"0.9em","background-color":"#bbccbb"});
              $(almo(obj.idMensajes) + " #formbotones").submit(function(e){e.stopPropagation(); e.preventDefault();}); //cancelar submit con la tecla Enter
              $(almo(obj.idMensajes) + " [type=checkbox]").css({"margin-top":"10px"});
              $(almo(obj.idMensajes) + " [type=checkbox]:first").css({"margin-top":"30px"});
              $(almo(obj.idMensajes) + " #i_error").css({"color":"#ff0000"});
              $(almo(obj.idMensajes)+" #i_retardo").attr("value",obj.espera);
              if (obj.loop) $(almo(obj.idMensajes)+" #i_loop").attr("checked","true");
              if (obj.autoplay) $(almo(obj.idMensajes)+" #i_autoplay").attr("checked","true");
              $(almo(obj.idMensajes) + " [type=button]").css({"color":"#ff0000","font-weight":"bold","font-size":"1.2em","margin":"20px"}).hover(
                      function(){ $(this).css({"color":"#ff0000","background-color":"#ffffcc"}) },
                      function(){ $(this).css({"color":"#ff0000","background-color":"#dddddd"}) }
                   );
              $(almo(obj.idMensajes)+" #enlaceCancelar").click(function(e){ e.stopPropagation(); e.preventDefault(); obj.mensaje("",1);});
              $(almo(obj.idMensajes)+" #enlaceAceptar").click(function(e){ 
                      e.stopPropagation(); e.preventDefault();
                      if ($(almo(obj.idMensajes)+" #i_loop").attr("checked")) obj.loop=true;
                      else obj.loop=false;
                      if ($(almo(obj.idMensajes)+" #i_autoplay").attr("checked")) obj.autoplay=true;
                      else obj.autoplay=false;
                      //falta comprobar que es correcto el retardo
                      var nretardo=parseInt($(almo(obj.idMensajes)+" #i_retardo").attr("value"));
                      if (nretardo && nretardo>=1000 && nretardo<=10000 ) {obj.espera=nretardo;  obj.mensaje("",1); }
                      else $(almo(obj.idMensajes) + " #i_error").html("Error: debes dar numero entero entre 1000 y 10000");
               });
           }
          m.show("slow",function(){  obj.mensajeAbierto=1; });  //esto hace cosas raras en chrome
          //m.animate({height:"100%"},300,function(){ $(this).css("visibility","visible"); obj.mensajeAbierto=1;});
        }
       else
        {

          m.hide("slow",function(){
          //m.animate({height:"1px"},300,function(){ $(this).css("visibility","hidden"); 
                  obj.modo=estadoAnterior;
                  estadoAnterior=-1; 
                  obj.mensajeAbierto=0; 
                  if (obj.modo==M_PLAY) obj.iniciar();
                  $(this).html("");
               });  
        } 
    }


 function portada()
    { //muestra una ventana con un titulo al resetear el slide, seria la primera imagen

       var obj=this;

    //   obj.estado = E_REPLAY; //esperando play para continuar
       obj.parar(); //paro slide y espero a que pulse play o replay
       obj.modo=M_REPLAY;
       if (dat=obj.crearCapaAvisos())
        { 
          $(almo(obj.idContenedor+"_portada")).remove(); //por si ya existia, lo borro y lo creo de nuevo con los nuevos valores
          $("<div></div>").attr("id",obj.idContenedor+"_portada").css({"position":"relative","overflow":"hidden","background-image":"none","background-color":"#ccffcc","width":"100%","height":"100%","color":"#779966","text-align":"center","padding-top":"10px"}).html(obj.textoPortada).appendTo(almo(obj.idCapaAvisos));
          $(almo(obj.idContenedor+"_portada" +" p")).css({"text-align":"left","font-family":"verdana","font-size":"0.5em","color":"#005500","margin":"0px","padding":"0px"});
          $(almo(obj.idContenedor+"_portada" +" p img")).css({"vertical-align":"middle"});
          $(almo(obj.idContenedor+"_portada" +" h2")).css({"font-size":"1.1em","margin":"0px","padding":"0px"});
          $(almo(obj.idContenedor+"_portada")).click(function(e){ e.stopPropagation(); e.preventDefault(); obj.iniciar(); }); //ojo, si lo pongo solo en capa avisos y pincho aqui lo hace dos veces y empieza a cargar foto2
          $(almo(obj.idCapaAvisos)).click(function(e){ e.stopPropagation(); e.preventDefault(); obj.iniciar(); });
        }
    }
   

   function asignaNumSlide(slide,lista)
    {  //coloca el slide indicado en la ultima posicion de la lista y devuelve la posicion donde lo ha colocado
       var le=lista.length;
       lista[le]=slide;
       return le;  
    }

   function obtenerPathFoto(numfoto,completo)
    {  //numfoto es la posicion de la foto de la carpeta y tipo indicados para este objeto
       //si completo da carpeta/nombrefoto, si no completo solo da nombrefoto.
       //si das numfoto=0 te devuelve el path a la foto de portada que se debe llamar portada.jpg
  
         if (numfoto<0) { return ""; alert(numfoto); return "photoslide/iconos/bola3.png"; }  //esta precargando las primeras fotos antes de iniciar slide
         if (numfoto>this.numfotos) numfoto=1; //ha llegado al final 
         if (numfoto==0) var tx="portada.jpg";
         else var tx=this.prefijoFoto + numfoto + "." + this.tipo; 
         if (completo && this.carpeta) tx=this.carpeta + "/" + tx;
         return tx;
    }

  function cambiarTamanoSlide(newAncho,newAlto)
    {  //cambia el tamaño de un div llamado idobj (sin #) los valores dados

       cambiarTamanoDiv(this.idContenedor,newAncho,newAlto); 
       this.ajustarContenedor();
     
       if (this.modo==M_REPLAY) {  //la capa de avisos estaba abierta, adapto su tamaño
         var p=$(almo(this.idContenedor));
         var pos=p.offset();
         var x=parseInt(p.outerWidth())-parseInt(p.width()); 
         var pX=parseInt(pos.left)+x/2+this.margen;  
         pX-=bordeBody()[0]; //esto es util en iexplorer 7 al menos, los otros dan 0;
         var pY=parseInt(pos.top)+x/2+this.margen; 
         pY-=bordeBody()[1]; //esto es util en iexplorer 7 al menos, los otros dan 0;
         var tX=parseInt(p.width())-this.margen*2 + "px"; 
         var tY=parseInt(p.height())-this.margen*2-this.altoControles+"px";
         $(almo(this.idCapaAvisos)).css({"left":pX,"top":pY,"width":tX,"height":tY});  
       }
    }

  function cambiarTamanoDiv(idObj,newAncho,newAlto)
   { //cambia el tamaño de un objeto DOM (div, span, etc)
      
      var p=$(almo(idObj)).animate({width:newAncho,height:newAlto}, "slow"); //function.....
      p.stop(true,true);
      
   }

/*********************************   fin del objeto slideshow   *************************************/

   //creamos una variable para cada slide que tengamos en la pagina
   //podemos acceder a los slides por estas variables o por el array listaSlides[pos] que se han ido añadiendo en esta matriz en el orden en que se han creado
   //cada slide tiene una propiedad posListaSlides que indica en que posicion de listaSlides se encuentra

   //var instrucciones="<h3 style=\"text-align:center\"><img src=\"photoslide/iconos/ayuda_off.png\"> INSTRUCCIONES</h3><h4> Modo auto: las fotos pasan solas cada 3 segundos.</h4><p><img src=\"photoslide/iconos/play_off.png\" alt=\"iniciar\" /> iniciar pase de fotos automático</p><p><img src=\"photoslide/iconos/pause_off.png\" alt=\"pausa\" /> pausar pase automático</p><p><img src=\"photoslide/iconos/stop_off.png\"  alt=\"stop\" /> parar pase automático y volver a la primera foto</p><p>&nbsp</p><h4>Modo manual: pasar fotos manualmente</h4><p><img src=\"photoslide/iconos/anterior_off.png\"  alt=\"anterior\" /> ver foto anterior (modo manual)</p><p><img src=\"photoslide/iconos/siguiente_off.png\"  alt=\"siguiente\" /> ver foto siguiente (modo manual)</p><p><span style=\"border:1px solid #000000; padding-left:10px;padding-right:2px; margin-left:5px; background-color:#ffffff;text-align:right;\">3</span> escribe un número de foto y pulsa tecla Intro</p><p>&nbsp;</p><p><img src=\"photoslide/iconos/zoom_off.png\" alt=\"zoom\" /> aparece en imagenes escaladas,  pínchalo para ver imagen a tamaño real</p><p><img src=\"photoslide/iconos/opciones_off.png\"  alt=\"opciones\" /> configurar pase de diapositivas</p><p>&nbsp</p><h3 style=\"text-align:center;color:#ff0000;cursor:pointer\">clic AQUI para continuar</h3>";

 var instrucciones="<h3><img src=\"photoslide/iconos/ayuda_off.png\" alt=\"icoayuda\" /> INSTRUCCIONES</h3><h4>Modo auto: las fotos pasan solas cada cierto tiempo (3 seg. por defecto).</h4><p><img src=\"photoslide/iconos/play_off.png\" alt=\"iniciar\" /> iniciar pase de fotos automático</p><p><img src=\"photoslide/iconos/pause_off.png\" alt=\"pausa\" /> pausar pase automático</p><p><img src=\"photoslide/iconos/stop_off.png\"  alt=\"stop\" /> parar pase automático y volver a la primera foto</p><p>&nbsp</p><h4>Modo manual: pasar fotos manualmente</h4><p><img src=\"photoslide/iconos/anterior_off.png\"  alt=\"anterior\" /> ver foto anterior (modo manual)</p><p><img src=\"photoslide/iconos/siguiente_off.png\"  alt=\"siguiente\" /> ver foto siguiente (modo manual)</p><p><span id=\"spancaja\">3</span> escribe número de foto que quieras ver y pulsa tecla INTRO</p><p>&nbsp;</p><p><img src=\"photoslide/iconos/zoom_off.png\" alt=\"zoom\" /> ver imagen a tamaño real (sólo aparece en imágenes grandes)</p><p><img src=\"photoslide/iconos/opciones_off.png\"  alt=\"opciones\" /> configurar pase de diapositivas (velocidad, loop, inicio automático, ...)</p><p><img src=\"photoslide/iconos/ayuda_off.png\"  alt=\"ayuda\" /> mostrar esta ayuda</p><p>&nbsp</p><form id=\"formbotones\"><input type=\"button\" id=\"enlacecerrar\" title=\"cerrar instrucciones y volver a las fotos\" value=\"clic aquí para CONTINUAR\"></form>";

 var configurar="<h3><img src=\"photoslide/iconos/opciones_off.png\" alt=\"icoopciones\" /> OPCIONES</h3><form id=\"formbotones\"><span id=\"i_error\"></span><br />Retardo: <input type=\"text\" id=\"i_retardo\" > (1000 a 10000)<br /> (tiempo de espera entre fotos en milisegundos. A menor valor las fotos irán pasando más rápido en el modo Auto)<br /><input type=\"checkbox\" id=\"i_autoplay\" > Reproduccir automáticamente (autoplay)<br /><input type=\"checkbox\" id=\"i_loop\" > Repetir indefinidamente<br /><input type=\"button\" id=\"enlaceAceptar\" value=\"Aplicar cambios\"><input type=\"button\" id=\"enlaceCancelar\" value=\"Cancelar\"></form>";

   var texto07="<h2>Cabalgata Reyes Cónchar 2007</h2><p>&nbsp</p><img src='photoslide/iconos/logoconchar.gif' />" + instrucciones;
   var texto08="<h2>Cabalgata Reyes Cónchar 2008</h2><p>&nbsp</p><img src='photoslide/iconos/logoconchar.gif' />" + instrucciones;
   var texto09="<h2>Cabalgata Reyes Cónchar 2009</h2><p>&nbsp</p><img src='photoslide/iconos/logoconchar.gif' />" + instrucciones;

   
   var slide1; 
   var parametrosSlide = {
             autoplay:false,
             loop:false,
             ajuste:AJ_CONTENT,
             delay:3000,
             carpeta:"fotos2007",
             prefijo:"",
             tipo:"jpg",
             numfotos:35,
             textoPortada:texto07
           };


  function preloadPortadas()
    {
        var n=new Image();
        n.src="photoslide/iconos/preloadG.gif";
        var m=new Image();
        m.src="photoslide/iconos/imagenerror.png";
        var j=new Image();
        j.src="fotos2009/portada.jpg";
 
    }

  var relojTelon;
  var intentosTelon=0;
  var primerpaso=0; //controlo si se ha subido alguna vez el telon, mas que nada es por el borde y eso que quede bonito

 function cambiarAno(ano)
    { //muestra el slide con el año indicado (pasar ano como cadena: mostrarslide("2007");
        
        //baja el telon y espera a que este bajado para cambiar el año

        slide1.modo=M_BLOQ;
        var velo=800; //milisegundos
        var altura=parseInt(slide1.altoCapa0) +"px";
        //altura="100%"; //para que si el telon esta bajado no pueda iniciar slide
        if (!slide1.estadoTelon && primerpaso)   //si el telon esta subido lo bajo y espero a que termine de bajar
           { 
              slide1.telon(1,velo,altura,0); //bajo solo hasta los controles que no quedan ocultos
              if (relojTelon) clearTimeout(relojTelon);
              relojTelon=setTimeout("mostrarAno('"+ano+"')",velo);
           }
        else mostrarAno(ano);
    }

  function mostrarAno(ano)
    { //muestra el slide con el año indicado (pasar ano como cadena: mostrarslide("2007");

        switch(ano) {
            //case "2007": slide1.origenFotos("http://www.conchar.com/contenido/videosreyes/fotos2007","",35,"jpg"); break;
            case "2007": slide1.origenFotos("fotos2007","",35,"jpg",texto07); break;
            case "2008": slide1.origenFotos("fotos2008","",42,"jpg",texto08); break;
            case "2009": slide1.origenFotos("fotos2009","",44,"jpg",texto09); break;
            //case "2009": slide1.origenFotos("fotos2009","foto",10,"jpg",texto09); break;
            default: slide1.origenFotos("fotos2007","",35,"jpg",texto07); break;
         }
        slide1.modo=M_BLOQ; //cambiar origenFotos usa parar() y lo deja en M_PAUSA
        subirTelon();
    }

   function subirTelon()
    {
   //esto da problemas, tal vez al bajarlo intento subirlo antes de que termine de bajar y no lo sube
   //     if (!slide1.estadoTelon) return;  //si el telon esta subido no hago nada

        if (!primerpaso) {  slide1.telon(0,1200,0,1); primerpaso=1; return; }

        var rei=(slide1.maxreintentos>5)?(slide1.maxreintentos-1):2;
        if ( (slide1.cambiandoCapa || slide1.cargandofoto ) && intentosTelon <= rei /*&& primerpaso*/) //si slide1 esta cambiando capa o cargando foto espera y reintenta
//if ( slide1.cambiandoCapa  && intentosTelon <= rei ) //si slide1 esta cambiando capa o cargando foto espera y reintenta
          {  
             intentosTelon++;
             clearTimeout(relojTelon);
             relojTelon=setTimeout("subirTelon()",slide1.mitimeout);
             return;
          }

        intentosTelon=0;
        //sube el telon, si es la primera vez un poco mas lento para recalcar efecto
        if (!primerpaso) { primerpaso=1; borde=1; var velo=1200;}
        else { var borde=1; var velo=800;}

        slide1.telon(0,velo,0,1);


//        if (slide1.autoplay) slide1.modo=M_PLAY;
//        else slide1.modo=M_PAUSA;
//        slide1.iniciar();
    }


   $(document).ready(function(){
      
       preloadPortadas();

       //creo el slide con los parametros dados   
        
        //$("body").css({"font-size":"16px"});  //esto lo tengo en la pagina principal
        $("#instrucciones").css({"visibility":"hidden"}); //hide("fast");   $("#instrucciones").stop(true,true); 
        //$("#nosoportado").remove();
        $("#contenedor").html("");
        
        //$("#ocultar1").css({"padding-top":"30px","list-style-type":"circle"});
        //$("#ocultar").css({"font-size":"1em"});
        //$("#ocultar2").css({"padding-top":"30px","list-style-type":"circle"});
        //$("#ocultar3").css({"font-size":"1em"});

        slide1=new photoslide("contenedor",parametrosSlide);

//        slide1.ocultar(1); //lo oculto para que se vea el fondo

//        $(almo(slide1.idCapa1)).click(function(e){ e.stopPropagation(); e.preventDefault(); if (slide1.modo == M_BLOQ) return; if (!slide1.stop) slide1.parar(); else slide1.iniciar(1); });
//        $(almo(slide1.idCapa0)).click(function(e){ e.stopPropagation(); e.preventDefault(); if (slide1.modo == M_BLOQ) return;if (!slide1.stop) slide1.parar(); else slide1.iniciar(1); });

         //enlaces de la pagina principal
        $("#fotos07").click(function(e) { e.stopPropagation(); e.preventDefault(); if (slide1.modo == M_BLOQ) return; cambiarAno("2007");  $(this).parent().css("list-style-type","circle").siblings().css("list-style-type","square");  });
        $("#fotos08").click(function(e) { e.stopPropagation(); e.preventDefault(); if (slide1.modo == M_BLOQ) return; cambiarAno("2008");  $(this).parent().css("list-style-type","circle").siblings().css("list-style-type","square");  });
        $("#fotos09").click(function(e) { e.stopPropagation(); e.preventDefault(); if (slide1.modo == M_BLOQ) return; cambiarAno("2009");  $(this).parent().css("list-style-type","circle").siblings().css("list-style-type","square");  }) ;
        $("#ocultar").click(function(e)  { e.stopPropagation(); e.preventDefault(); if (slide1.modo == M_BLOQ) return; /*slide1.ocultar();*/ slide1.telon(1,1500,"100%",1); primerpaso=0; $("#instrucciones").css({"visibility":"hidden"}); });

        //$("#fotos09").click(function(e) { /*slide1.cambiarTamano(600,480);*/  slide1.ocultar(); /*mostrarslide("2009");*/   e.stopPropagation(); e.preventDefault(); });

      });

//OJO: PARA IEXPLORER 7 ES CONVENIENTE PONER CSS: BORDER:NONE PORQUE POR DEFECTO TRAE UN BORDE DE 2PX
//NOTA: SI HAY POSIBILIDAD DE QUE DOS SLIDES SE SUPERPONGAN, UNO DEFINIRLE ZINDEX MAYOR QUE EL OTRO Y PONER POSITION ABSOLUTE SI LO
//NECESITAS PARA COLOCARLO Y SI NO PONERLE RELATIVE, PERO DE FORMA EXPLICITA, SI NO EL ZINDEX NO SE COMPORTA BIEN
//SI EL SLIDE QUE ESTA ENCIMA ESTA DENTRO DE OTRO DIV, ESE DIV DEBE TENER EL MISMO ZINDEX QUE EL SLIDE Y POSITION ABSOLUTE O RELATIVE DE FORMA EXPLICITA
   

