function addEventToObject(obj, evt, func) {
	var oldhandler = obj[evt];
	obj[evt] = (typeof obj[evt] != 'function') ? func : function(){oldhandler();func();};
}

function bindWithArguments(object){
    var __method = this;
    var args = [];
    for (var i=0,len=arguments.length-1; i<len; i++) args[i] = arguments[i+1];
    return function(){ __method.apply(object, args); }
}

Object.prototype.bindWithArguments = bindWithArguments;



function CrossFade(intervallo, timing) {
		this.interval = intervallo;
		// Funzione che imposta l'opacità in compatibilità con tutti i browser
			this.setOpacity = function (obj, o) {
				obj.style.opacity = (o / 101);
				obj.style.MozOpacity = (o / 100);
				obj.style.KhtmlOpacity = (o / 100);
				obj.style.filter = "alpha(opacity=" + o + ")";
			}
		
		
		// Imposta per tutti gli elementi dell'array (ovvero i DIV passati ad argomento) posizione assoluta in alto a sx, zIndex 0 e opacità 0
		for(j=0;j<this.length;j++) {
			this[j].style.position='absolute';
			this[j].style.top=0;
			this[j].style.left=0;
			this[j].style.zIndex=0;
			this.setOpacity(this[j],0);
		}
		
		
		// Imposta un'opacità di partenza e nell'istruzione dopo la applica a tutto il div che contiene tutte le immagini.
		this.opacity = 100;
		this.setOpacity(this[0].parentNode,this.opacity);
		
		// Imposta il div corrente a 0 (il primo elemento dell'array), loadingCF=true(???), previousDiv come l'ultimo elemento dell'array, e poi tutto il div contenitore visibile.
		this.currentDiv = 0;
		this.loadingCF = true;
		this.previousDiv = this.length-1;
		
		this[0].parentNode.style.visibility = 'visible';


		// Imposta la funzione che cambia l'opacità. opac inizialmente è impostato a 100, quindi entra dentro e va direttamente all'else. 
		this.changeOpacity = function (opac) {
			if(opac < 100) {
				if (opac == 0){
					// Manda previousDiv sullo sfondo e porta currentDiv in primo piano
					this[this.previousDiv].style.zIndex = 0;
					this[this.currentDiv].style.zIndex = 100;
				}
				// Imposta l'opacità del div corrente a opac, quindi imposta l'opacità del div precedente a 100, quindi aggiunge ad opac timing, dopodichè attende 25 millisecondi e rientra nella funzione, finchè non arriva a 100
				this.setOpacity(this[this.currentDiv],opac);
				this.setOpacity(this[this.previousDiv],100/*-opac*/);
				opac += timing;
				window.setTimeout(this.changeOpacity.bindWithArguments(this,opac),25);
			} else {
				// Imposta l'opacità del div corrente a 100
				this.setOpacity(this[this.currentDiv],100);
				// Imposta l'opacità del div precedente (che parte come l'ultimo dell'array) a 0;
				this.setOpacity(this[this.previousDiv],0);
				// previousDiv diventa il div corrente
				this.previousDiv = this.currentDiv;
				// currentDiv diventa l'elemento seguente, oppure se è l'ultimo elemento ritorna al primo
				this.currentDiv = (this.currentDiv>=this.length-1) ? 0 : this.currentDiv + 1;

				// Imposta opac a 0
				opac = 0;
				// dopo un determinato tempo (intervallo moltiplicato 80) entra di nuovo in questa funzione portandosi dietro tutto l'array, e opac a 0
				window.setTimeout(this.changeOpacity.bindWithArguments(this,opac),(this.interval*80));
			}
		}
	
	// imposta ad olen il numero di caratteri che compongono il nome della classe del div che contiene l'immagine
	this.olen = this[0].className.length;
	// imposta ad onum l'ultima lettera del nome della classe del div contenitore (in genere fader)
	this.onum = this[0].className.charAt(this.olen-1);
	// se onum è un numero E onum è maggiore di uno allora esegue la funzione changeOpacity impostando opac all'opacità corrente, aspettando un tempo pari a 80*intervallo diviso onum
	if(!isNaN(this.onum) && this.onum > 1) {window.setTimeout(this.changeOpacity.bindWithArguments(this,this.opacity),(80*this.interval)/this.onum);
	}else {
		// altrimenti inizia la funzione con l'opacità corrente
		this.changeOpacity(this.opacity);
	}
}
Object.prototype.CrossFade = CrossFade;

var currentImg;
var previousImg;
var fadedivs = [];

function isA(o,klass){ if(!o.className) return false; return new RegExp('\\b'+klass+'\\b').test(o.className) }

function $c(c,o,t) { o=o||document;
	if (!o.length) o = [o]
	var elements = []
	for(var i = 0, e; e = o[i]; i++) {
		if(e.getElementsByTagName) {
			var children = e.getElementsByTagName(t || '*');
			for (var j = 0, child; child = children[j]; j++) {
				if(isA(child,c)) elements.push(child);
			}
		}
	}
	return elements
}

function InitCrossFade() {
	if(InitCrossFade.arguments) {
		var fadecontainer = document.getElementById(InitCrossFade.arguments[0]);
		var arg1 = InitCrossFade.arguments[1];
		var arg2 = InitCrossFade.arguments[2];
		for(i=3;i<InitCrossFade.arguments.length;i++) {
			fadecontainer.innerHTML+=InitCrossFade.arguments[i];
		}
		var aImgs = fadecontainer.getElementsByTagName('img');
		preloadImgs(aImgs);
		var fade = fadecontainer.lastChild;
		var fadeclass = fade.className;
		fadedivs = $c(fadeclass,'','*');
		window.setTimeout(function() {fadedivs.CrossFade(arg1,arg2);},1000);
	}
}

function preloadImgs(aImgs) {
	var preloadedImgs = new Array();
	for(var i=0; i<aImgs.length; i++) {
		preloadImgs[i] = new Image();
		preloadImgs[i].src = aImgs[i].getAttribute('src');
	}
}

function detect() {
	// simplify things
	var agent 	= navigator.userAgent.toLowerCase();
	
	// detect platform
	this.isMac		= (agent.indexOf('mac') != -1);
	this.isWin		= (agent.indexOf('win') != -1);
	this.isWin2k	= (this.isWin && (
			agent.indexOf('nt 5') != -1));
	this.isWinSP2	= (this.isWin && (
			agent.indexOf('xp') != -1 || 
			agent.indexOf('sv1') != -1));
	this.isOther	= (
			agent.indexOf('unix') != -1 || 
			agent.indexOf('sunos') != -1 || 
			agent.indexOf('bsd') != -1 ||
			agent.indexOf('x11') != -1 || 
			agent.indexOf('linux') != -1);
	
	// detect browser
	this.isSafari	= (agent.indexOf('safari') != -1);
	this.isSafari2 = (this.isSafari && (parseFloat(agent.substring(agent.indexOf("applewebkit/index.html")+"applewebkit/".length,agent.length).substring(0,agent.substring(agent.indexOf("applewebkit/index.html")+"applewebkit/".length,agent.length).indexOf(' '))) >=  300));
	this.isOpera	= (agent.indexOf('opera') != -1);
	this.isNN		= (agent.indexOf('netscape') != -1);
	this.isIE		= (agent.indexOf('msie') != -1);
}