/**

/******************************************************************************
 *  Adjustable Parameters													 *
 ******************************************************************************/

// Make sure to change these based on your settings!

//var counterURL = "http://www.bywifi.com/counter/retrieve.xml";	// The URL of your local counter mirror.
var counterURL = "http://www.bywifi.com/bywifi_file/tracker3/get_couter_xml.php";	// The URL of your local counter mirror.
var counterID = "bwfcounter";	// The ID of the counter element.
var RATE_DEFAULT = 0.3;
var DELAY_DEFAULT = 0;

/******************************************************************************
 *  Global Variables														  *
 ******************************************************************************/

var currentCount;
var displayCount;
var rate;
var request;

/******************************************************************************
 *  Intialization															 *
 ******************************************************************************/

addEvent(window, "load", initCounter);

function initCounter()
{
	// Begin getCount interval
	getCount();
	setInterval("getCount()", 600000000);
	
	// Begin update timeout
	update();
}

// Gets and returns the most recent delay, rate and count
function getCount()
{
	// Generate the XMLHttpRequest
	loadXML(counterURL);
}

// Processes the information from a returned count XML
/*
function processCount()
{
	if (request.readyState == 4) {
		if (response = request.responseXML) {

			count = parseInt(getNodeValue(response, "count"));
			rate = parseFloat(getNodeValue(response, "rate"));
			delay = parseInt(getNodeValue(response, "delay"));

			// Determine the current count based on time difference and rate
			currentCount = Math.round(count + delay * rate);
		}
	}
}
*/
// Processes the information from a returned count string
function processCount()
{
	if (request.readyState == 4) {
		if (response = request.responseText) {

			count = response;
			rate = RATE_DEFAULT;
			delay = DELAY_DEFAULT;

			// Determine the current count based on time difference and rate
			currentCount = Math.round(count + delay * rate);
		}
	}
}

function update()
{
	if (currentCount) {

		interval = (1000 / rate);
	
		if (!displayCount)
			displayCount = currentCount + 1;
		else if (displayCount < currentCount)
			setTimeout("catchUp()", interval / 2);
		else if (displayCount > currentCount)
			displayCount += 0;
		else
			displayCount += 1;
	
		currentCount++;

		// Update the display
		setText(document.getElementById(counterID), formatCount(displayCount));
		setText(document.getElementById( "dlrate"), rate );
	
		// Reset the update timeout
		setTimeout("update()", interval);

	} else {
		setTimeout("update()", 1000);
	}
}

function catchUp()
{
	displayCount++;
	setText(document.getElementById(counterID), formatCount(displayCount));
}

/******************************************************************************
 *  Utility Functions														 *
 ******************************************************************************/

function loadXML(url) 
{
	// branch for native XMLHttpRequest object
	if (window.XMLHttpRequest) {
		request = new XMLHttpRequest();
		request.onreadystatechange = processCount;
		request.open("GET", url, true);
		request.send(null);

	// branch for IE/Windows ActiveX version
	} else if (window.ActiveXObject) {
		request = new ActiveXObject("Microsoft.XMLHTTP");
		if (request) {
			request.onreadystatechange = processCount;
			request.open("GET", url, true);
			request.send();
		}
	}
}

// Adds an event handler to an element
function addEvent(element, type, handler)
{
	if (element.addEventListener) {
		element.addEventListener( type, handler, false );
	} else if (element.attachEvent) {
		element["e" + type + handler] = handler;
		element[type + handler] = function() { element["e" + type + handler](window.event); }
		element.attachEvent("on" + type, element[type + handler]);
	}
}

// Removes an event handler from an element
function removeEvent(element, type, handler)
{
	if (element.removeEventListener) {
		element.removeEventListener(type, handler, false);
	} else if (element.detachEvent) {
		element.detachEvent("on" + type, element[type+handler]);
		element[type+handler] = null;
	}
}


// Sets the text of an element (element should be empty or first child text)
function setText(element, text)
{
	var textNode = document.createTextNode(text);

	if (element.firstChild)
		element.replaceChild(textNode, element.firstChild);
	else
		element.appendChild(textNode);
}

function getNodeValue(topNode, tagName)
{
	if (elements = topNode.getElementsByTagName(tagName))
			value = elements[0].firstChild.data;
	else
			value = '';

	return value;
}

// Formats a count for display by making it into a string and inserting commas.
function formatCount(count)
{
	count = count.toString();

	for (var i = count.length - 3; i > 0 ; i -= 3) {
		count = count.slice(0, i) + ',' + count.slice(i, count.length);
	}

	return count;
}
