// @author B. Bottema

// namespace:
var alphatool = new Object();

/**
 * void (String/Object, boolean, int(0-1000))
 * - verzorgt de fading animatie voor een element
 * - een element kan aan/uit ge-fade worden
 * - gebruikt een extra flag 'visible' om bij te houden of er een animatie nodig is
 */
alphatool.fadeElement = function(element, show, ms) {
	var ele = this.findElement(element);
	// als hij moet verdwijnen alleen faden als hij nog zichtbaar is
	// als hij moet verschijnen alleen faden als hij nog onzichtbaar is
	if (show && !ele.visible) {
		this.setAlpha(ele, 0)
		this.fade(ele, 0, 100, ms);
		ele.visible = true;
		ele.style.visibility = "visible";
	} else if (!show && ele.visible) {
		this.fade(ele, 100, 0, ms);
		ele.visible = false;
	}
}

/**
 * void (String/Object, int(0-100), int(0-100), int(0-1000))
 * - een wat meer generieke versie van fadeElement
 * - voert de animatie planning uit met setTimeouts en zorgt ervoor dat
 *   vorige geplande animaties weggehaald worden (om flikkeren te voorkomen)
 * - wordt gebruikt door de fadeElement functie
 */
alphatool.fade = function(element, alphaStart, alphaEnd, ms) { 
    // snelheid van de updates
    var speed = Math.round(ms / 100);
    var timer = 0;
    
    // haal oude animatie planning eruit
    var ele = this.findElement(element);
    if (ele.timers != null) {
    	for (var entry in ele.timers) {
    		clearTimeout(ele.timers[entry]);
    	}
    }
    ele.timers = new Array();
    
    // bepaal welke kant uit blenden (aan of uit)
    // nieuw animatieplan maken en opslaan (timer id's opslaan)
    if (alphaStart > alphaEnd) {
        for (var i = alphaStart; i >= alphaEnd; i--) {
            ele.timers.push(setTimeout("alphatool.setAlpha('" + ele.id + "', " + i + ")",(timer++ * speed)));
        }
        ele.timers.push(setTimeout("document.getElementById('" + ele.id + "').style.visibility = 'hidden'",(timer++ * speed)));
    } else if (alphaStart < alphaEnd) {
        for(i = alphaStart; i <= alphaEnd; i++) {
            ele.timers.push(setTimeout("alphatool.setAlpha('" + ele.id + "', " + i + ")",(timer++ * speed)));
        }
    }
}

/**
 * void (String/Object, int(0-100]))
 * - crossbrowser alpha setter voor elementen
 * - wordt gebruikt door de fade() functie
 * - functie van internet gevist en aangepast; oorspronkelijke auteur onbekend.
 */
alphatool.setAlpha = function(element, alpha) {
	var ele = this.findElement(element);
    ele.style.opacity = (alpha / 100);
    ele.style.MozOpacity = (alpha / 100);
    ele.style.KhtmlOpacity = (alpha / 100);
    ele.style.filter = "alpha(opacity=" + alpha + ")";
}

/**
 * void (int(0-100]))
 * - crossbrowser alpha CSS style generator
 * - genereert een CSS style string waarin cross-browser de alpha waarde fezet wordt
 */
alphatool.getAlphaCSS = function(alpha) {
	var a = alpha / 100;
	return "opacity:"+a+"; MozOpacity:"+a+"; KhtmlOpacity:"+a+"; filter:alpha(opacity="+alpha+");";
}

/**
 * Object (String/Object, int(0-100]))
 * - argument kan een String id zijn of het element zelf
 * - geeft gegeven element terug als element niet een String is (id van element)
 * - geeft anders element terug op basis van gegeven String id
 */
alphatool.findElement = function(element) {
	return (typeof element == "string") ? document.getElementById(element) : element;
}