/*
 * Modo de uso:
 *
 * 1.	Crear el objeto: var miobjeto = new imgTransition(nombrecapa,ancho,alto)
 * 2.	Añadir las imágenes: miobjeto.addImagen(URLimagen,URLenlace)
 * 3.	Iniciar el objeto: miobjeto.init()
 * Not:	Mejor incluir lo anterior en una función y ejecutar con un addonload("funcion()")
 */

var transiciones = new Array()
transiciones[0] = "progid:DXImageTransform.Microsoft.RandomDissolve(Enabled=false)"
transiciones[1] = "progid:DXImageTransform.Microsoft.Iris(irisStyle='star', motion='out', Enabled=false)"
transiciones[2] = "progid:DXImageTransform.Microsoft.Iris(irisStyle='diamond', motion='in', Enabled=false)"
transiciones[3] = "progid:DXImageTransform.Microsoft.Iris(irisStyle='cross', motion='out', Enabled=false)"
transiciones[4] = "progid:DXImageTransform.Microsoft.Iris(irisStyle='circle', motion='in', Enabled=false)"
transiciones[5] = "progid:DXImageTransform.Microsoft.Iris(irisStyle='square', motion='out', Enabled=false)"
transiciones[6] = "progid:DXImageTransform.Microsoft.Iris(irisStyle='plus', motion='in', Enabled=false)"
transiciones[7] = "progid:DXImageTransform.Microsoft.Barn(orientation='vertial' motion='in', Enabled=false)"
transiciones[8] = "progid:DXImageTransform.Microsoft.Barn(orientation='vertial' motion='out', Enabled=false)"
transiciones[9] = "progid:DXImageTransform.Microsoft.Barn(orientation='horizontal' motion='in', Enabled=false)"
transiciones[10] = "progid:DXImageTransform.Microsoft.Barn(orientation='horizontal' motion='out', Enabled=false)"
transiciones[11] = "progid:DXImageTransform.Microsoft.Pixelate(Enabled=false)"
transiciones[12] = "progid:DXImageTransform.Microsoft.Inset(Enabled=false)"
transiciones[13] = "progid:DXImageTransform.Microsoft.Checkerboard(Direction='left', Enabled=false)"
transiciones[14] = "progid:DXImageTransform.Microsoft.Checkerboard(Direction='right', Enabled=false)"
transiciones[15] = "progid:DXImageTransform.Microsoft.Checkerboard(Direction='down', Enabled=false)"
transiciones[16] = "progid:DXImageTransform.Microsoft.Checkerboard(Direction='up', Enabled=false)"
transiciones[17] = "progid:DXImageTransform.Microsoft.RandomBars(motion='horizontal', Enabled=false)"
transiciones[18] = "progid:DXImageTransform.Microsoft.RandomBars(motion='vertical', Enabled=false)"
transiciones[19] = "progid:DXImageTransform.Microsoft.Slide(bands=5, slideStyle='push', Enabled=false)"
transiciones[20] = "progid:DXImageTransform.Microsoft.Slide(bands=5, slidestyle='swap', Enabled=false)"
transiciones[21] = "progid:DXImageTransform.Microsoft.Slide(bands=5, slidestyle='hide', Enabled=false)"
transiciones[22] = "progid:DXImageTransform.Microsoft.Spiral(Enabled=false)"
transiciones[23] = "progid:DXImageTransform.Microsoft.Stretch(stretchStyle='push', Enabled=false)"
transiciones[24] = "progid:DXImageTransform.Microsoft.Blinds(bands=10, Enabled=false)"

function imgTransition(contenedor,width,height)
{
	this.name = contenedor
	this.obj = this.name + "Object"
	eval(this.obj + "=this")
	this.w = width
	this.h = height
	this.contenedor = new Object()			// La capa (DIV) que contiene a los elementos
	this.espera = 1000						// Espera desde carga página hasta primer cambio
	this.intervalo = 5000					// Espera entre cambios
	this.duracion = 1						// Durancion de la transicion (segundos)
	this.continuar = 0						// A 0 se para cuando llega a la última imagen
	this.numCapas = 0						// Cuantos elementos hay para intercambiar
	this.capas = new Array()				// Cuales son esos elementos
	this.capa = new Object()				// El elemento que se muestra (DIV)
	this.capaActiva = 0						// Elemento activo en cada instante
	this.capaSiguiente = 1					// Siguiente elemento en la lista
	this.manejadorCambio = 'individual'		// Secuencial, Aleatorio o Individual
	this.filtro = 0							// El filtro a utilizar (en Mozilla siempre fundido)

	this.dentrofuera = 0					// Controla el modo de funcionamiento del filtro de opacidad
	this.opac = 100							// Controla la opacidad del filtro de opacidad

	// La capa contenedora situada en la pagina HTML
	this.contenedor = document.getElementById(this.name)
	if (!this.contenedor)
	{
		alert('Error al obtener el contenedor para la transición entre capas')
		return null
	}

	// Creamos una capa que tendra definidos los filtros y almacenara
	// las capas de las transiciones
	this.capa = document.createElement('DIV')
	this.capa.id = this.name+'CapaFiltros'
	this.capa.style.width = '100%'
	this.capa.style.display = 'block'
	this.capa.style.visible = 'show'
	if (is.ie)
	{
		// Nada...
	}
	else if (is.ns)
	{
		this.capa.style.MozOpacity = 1
	}
	this.contenedor.appendChild(this.capa)
}

function iniciarTransiciones()
{
	// Si no hay capas no iniciamos nada
	if (!(this.numCapas > 0))
	{
		alert('El elemento '+this.name+' no tiene capas activas')
		return false
	}

	this.capa.appendChild(this.capas[0])

	// Comienzan las transiciones entre las capas
	setTimeout(this.obj+".cambia()",this.espera)
}


function nuevaImagen(imgSrc,imgEnlace)
{
	var capaImagen = document.createElement('DIV')

	var unaImagen = new Image()
	unaImagen.src = imgSrc
	unaImagen.style.border = 0
	unaImagen.style.width = this.w
	unaImagen.style.height = this.h


	if (imgEnlace && imgEnlace != '')
	{
		var unEnlace = document.createElement('A')
		unEnlace.href = imgEnlace
		unEnlace.appendChild(unaImagen)
		capaImagen.appendChild(unEnlace)
	}
	else
	{
		capaImagen.appendChild(unaImagen)
	}

	this.nuevaCapa(capaImagen,1)
}

// modo: 0 ID, 1 Objeto
function nuevaCapa(capa,modo)
{
	if (modo != 1)
	{
		var tmp = document.getElementById(capa)
		this.capas[this.numCapas] = tmp.cloneNode(true)
		if (!this.capas[this.numCapas])
		{
			alert('Error al obtener la capa '+capa+'. Aseguresé de que la página contiene una capa con ese identificador')
			return null
		}
	}
	else
	{
		this.capas[this.numCapas] = capa
	}

	this.capas[this.numCapas].style.display = 'block'
	this.numCapas++
}


function cambia()
{
	// Si ya estamos cambiando no hacemos nada
	if (this.cambiando == 1)
		return true

	//this.capa.width = this.w
	//this.capa.height = this.h

	this.capaActiva = this.capaSiguiente
	this.capaSiguiente = (this.capaSiguiente + 1) % this.numCapas

	switch(this.manejadorCambio)
	{
		case 'secuencial':
			this.filtro = (this.filtro + 1) % transiciones.length
		break;
		case 'aleatorio':
			this.filtro = Math.floor(Math.random() * transiciones.length)
		break;
	}

	this.cambiaFiltrando()

	// Cuando hayamos dado una vuelta completa a las imágenes decidimos
	// si continuamos o no
	if (this.capaSiguiente == 0 && this.noparar == 0)
		return true; 

	setTimeout(this.obj+".cambia()",this.intervalo)
}

function cambiaFiltrando()
{
			// En el Mozilla la única transición que hago es un fundido
			if (!is.ie || this.filtro==25)
			{
				this.cambiaFundiendo()
				return
			}

			this.cambiando = 1

			this.capa.style.filter = transiciones[this.filtro]
			this.capa.filters[0].Duration = this.duracion
			this.capa.filters[0].apply()
			this.cambiaSimple()
			this.capa.filters[0].play()

			this.cambiando = 0
}

function cambiaFundiendo()
{
	var npasos = 10
	var delta = 100 / npasos 
	var tout = (this.duracion / (npasos * 2)) * 1000

	// Empezamos difuminando, al llegar a OPAC=0 cambiamos, al llegar a OPAC=100 volvemos
	// al modo difuminando para la siguiente ejecución
	if (this.opac == 0) 
	{
		this.cambiaSimple()
		this.dentrofuera = 1
	}
	else if (this.opac == 100)
	{
		this.dentrofuera = 0
		// Si llego a OPAC=100 y estaba cambiando es que ya he terminado el cambio
		if (this.cambiando == 1)
		{
			this.cambiando = 0
			return true
		}
	}

	this.cambiando = 1
	// De 100 a 0
	if (this.dentrofuera == 0)
	{
		if (this.opac > 0)
		{
			this.opac -= delta // Si lo hago en un sólo paso (this.capa.opac-=0.1) no funciona bien
			if (is.ns) this.capa.style.MozOpacity = this.opac / 100
			else if (is.ie) this.capa.filters.item("DXImageTransform.Microsoft.Alpha").opacity = this.opac
			setTimeout(this.obj+'.cambiaFundiendo()',tout)
		}
	}	
	else
	{
		if (this.opac < 100)
		{
			this.opac += delta
			if (is.ns) this.capa.style.MozOpacity = this.opac / 100
			else if (is.ie) this.capa.filters.item("DXImageTransform.Microsoft.Alpha").opacity = this.opac
			setTimeout(this.obj+'.cambiaFundiendo()',tout)
		}
	}	
}

function cambiaSimple()
{
	this.capa.removeChild(this.capa.firstChild)
	this.capa.appendChild(this.capas[this.capaActiva])
}


imgTransition.prototype.init = iniciarTransiciones
imgTransition.prototype.inicio = iniciarTransiciones
imgTransition.prototype.addImage = nuevaImagen
imgTransition.prototype.nuevaImagen = nuevaImagen
imgTransition.prototype.nuevaCapa = nuevaCapa
imgTransition.prototype.cambia = cambia
imgTransition.prototype.cambiaFiltrando = cambiaFiltrando
imgTransition.prototype.cambiaFundiendo = cambiaFundiendo
imgTransition.prototype.cambiaSimple = cambiaSimple

function BrowserCheck() {
        var b = navigator.appName
        if (b=="Netscape") this.b = "ns"
        else if (b=="Microsoft Internet Explorer"||b=="Opera") this.b = "ie"
        else this.b = b
        this.version = navigator.appVersion
        this.v = parseInt(this.version)
        this.ns = (this.b=="ns" && this.v>=4)
        this.ns4 = (this.b=="ns" && this.v==4)
        this.ns5 = (this.b=="ns" && this.v==5)
        this.ie = (this.b=="ie" && this.v>=4)
        this.ie4 = (this.version.indexOf('MSIE 4')>0)
        this.ie5 = (this.version.indexOf('MSIE 5')>0)
        this.min = (this.ns||this.ie)
}
is = new BrowserCheck()

function isEmpty(s)
{   return ((s == null) || (s.length == 0))
}

function isDigit(c)
{   return ((c >= "0") && (c <= "9"))
}

function isNumber(s)
{
   var i;
    if (isEmpty(s))
       if (isNumber.arguments.length == 1) return defaultEmptyOK;
       else return (isNumber.arguments[1] == true);

    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        if( i != 0 ) {
            if (!isDigit(c)) return false;
        } else {
            if (!isDigit(c) && (c != "-") || (c == "+")) return false;
        }
    }
    return true;
}

