
var supporterWindowType = "fader";
var sortType = "normal";
var supporterSlots = 5;			// Number of display slots
var fadeInterval = 1400;		// ms between fades
var fadeStepInterval = 50;		// ms between fade steps
var supporterId = new Array();  // Supporter elements
var slot = 0;					// Next display slot to update
var supporter = 0;				// 
var req;                    	// 
var supporterList;          	// 

function getElementId(element) {
    if (document.getElementById) {
        return document.getElementById(element);
    } else {
        return eval(element);
    }
}

function addEvent(obj, event, func) {
    if (obj.addEventListener) {
        // W3C DOM standard
        obj.addEventListener(event, func, true);
    } else 
	if (obj.attachEvent) {
        // Microsoft
        obj.attachEvent("on" + event, func);
    }
}

function fadeSlot(id) {
	this.oldMessage = false;
	this.id = id;
	this.hex = 0xc0;
	this.nextMessage = "";
}

function updateResponse()
{
    if (req.readyState == 4) {

        if (req.status == 200) {
            reqOutstanding = 0;

	    supporterList = req.responseText.split("\n");

	    if (supporterWindowType == "fader") {
		for (var i = 0; i < supporterSlots; i++) {
		    supporterId[i] = new fadeSlot(getElementId ('supporters' + i));
		}

		nextSupporter();
	    } else {
		listSupporters();
	    }
        } else {
	    alert("Status is " + req.statusText);
	    alert("Text is " + req.responseText);
	}
    }
}


function fader(slot) {

	if (slot.oldMessage == true) {
		// Fade out old message

		if (slot.hex < 0xc0) {
			slot.hex += 20;
		} else {
			slot.hex = 0xc0;
			slot.oldMessage = false;
			slot.id.innerHTML = slot.newMessage;
		}
	} else {
		// Fade in new message

		if (slot.hex > 0) {
			slot.hex -= 20;
		} else {
			slot.hex = 0;
			clearInterval(slot.timerId);		
		}
	}

	slot.id.style.color = "rgb(" + slot.hex + "," + slot.hex + "," + slot.hex +")";
}

function fadeIn(slot, message) {
	slot.newMessage = message;	
	slot.oldMessage = true;
	slot.timerId = setInterval(function() { fader(slot); }, fadeStepInterval);
}

function nextSupporter()
{
    for (var done = 0; done != 1; ) {
		// Don't display any empty slots in the list
		if (supporterList[supporter] != "") {
			fadeIn(supporterId[slot], supporterList[supporter]);
			done = 1;
		}

		if (++supporter == supporterList.length) {
			supporter = 0;
		}
    }

    if (++slot == supporterSlots) {
		slot = 0;
    }

    if (supporter == 0) {
		// Reached the end of the list, fetch again from the server
		// to catch any updates
		requestSupporters();
    } else {
		setTimeout("nextSupporter()", fadeInterval);
    }
}

function listSupporters()
{
    var supporterId = getElementId('supporters0');

    var extraSlots = supporterList.length % 3;

    var string = '<table align=center cellspacing=2 cellpadding=2 border=0 width=100% class="supporter">';

    if (extraSlots)
    {
	for (var i = (3 - extraSlots); i != 0; i--)
        {
	    supporterList.push("");
	}
    }

    for (var i = 0; i < supporterList.length; i += 3)
    {
	string += '<tr height=25><td>';
	string += (supporterList[i] + '</td><td>');
	string += (supporterList[i + 1] + '</td><td>');
	string += (supporterList[i + 2] + '</td></tr>');
    }

    string += "</table>";

    supporterId.innerHTML = string;
}

function initRequest(req)
{
    req.onreadystatechange = updateResponse;

    req.open("GET", "/scripts/supporters.php?sort=" + sortType, true);
    req.setRequestHeader("If-Modified-Since", "1 Jan 1970");
}

function requestSupporters()
{
    if (window.XMLHttpRequest) {
	// Non-MS browser
	if (req = new XMLHttpRequest()) {
	    initRequest(req);
	    req.send("1");
	} else {
	    alert("Failed to allocate req");
	}
    } else if (window.ActiveXObject) {
	// MS browser
	if (req = new ActiveXObject("Microsoft.XMLHTTP")) {
	    initRequest(req);
	    req.send("1");
	} else {
	    alert("Failed to allocate req");
	}
    }
}

addEvent(window, "load", requestSupporters);


