var iLast = 0;
var http_requests = new Array();
var handled = new Array();
var iMaxDC;
var sUrl;
var iDcCount = 0;
var iResults = new Array(); // unique # pages 
var iCountDC = new Array(); // 'c'+iResults() -> # of DCs with this many pages
var iTotalResults = 0;
var iAbort = 0;
var iAborted = 0;

function resetpage(url,iMax) {
	iMaxDC = iMax;
	sUrl = url;
	timer = setTimeout("getnext("+iLast+",1)", 100);
	return false;
}

function getnext(nr, pMore) {
	var id = document.getElementById('id'+nr).innerHTML;
	makeRequest('checkch.aspx?s='+sUrl+'&nr='+nr+'&dc='+id, nr);
	iLast = iLast + 1;
	if ((pMore==1) && (iAbort==0)) if (iLast < iMaxDC) timer = setTimeout("getnext("+iLast+",1)", 350);
}

function makeRequest(url, i) {
    if (window.XMLHttpRequest) { // Mozilla, Safari, etc.
        http_requests[i] = new XMLHttpRequest();
        if (http_requests[i].overrideMimeType) {
            http_requests[i].overrideMimeType('text/xml');
        }
    } else if (window.ActiveXObject) { // IE
        try {
            http_requests[i] = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                http_requests[i] = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
        }
    }
    if (!http_requests[i]) {
        return false;
    }
    http_requests[i].onreadystatechange = handleResponse;
    http_requests[i].open('GET', url, true);
    http_requests[i].send(null);
    handled[i]=false;
    return true;
}

function handleResponse() {
    var nr = -1;
    for (var i = 0; i < iMaxDC; ++i) {
        if ((handled[i] != true) && http_requests[i] && 
            (http_requests[i].readyState == 4) && (http_requests[i].status == 200)) {
            nr = i;
            break;
        }
    }

    if (nr != -1) {
        var xmldoc = http_requests[nr].responseXML;

        var ds = xmldoc.getElementsByTagName('ds').item(0);
        var nr = ds.getAttribute('nr');

        var dc = ds.getElementsByTagName('dc').item(0).firstChild.data;
        var datum = ds.getElementsByTagName('da').item(0).firstChild.data;
        var name = ds.getElementsByTagName('n').item(0).firstChild.data;
        
        if ((iDcCount==0) && (iAborted>4)) iAbort=1;

        handled[nr] = true;
        updatePage(dc, name, datum, nr);

    } else {
        // you know
    }
}


function sortNumberDesc(a,b)
{ return b - a; }

function getFluxFactor() {
	// 100% * count results outside of x% from average / count total results 
	var iOutside = 0.15;
	
	if (iDcCount>0) {
		var iAvg;
		var iFluxed = 0;
		
		iAvg = iTotalResults / iDcCount;
		for (var i=0; i<iResults.length; i++) {
			if (iResults[i] < (iAvg * (1.0 - iOutside))) iFluxed += iCountDC['c'+iResults[i]];
			if (iResults[i] > (iAvg * (1.0 + iOutside))) iFluxed += iCountDC['c'+iResults[i]];
		}
		return parseInt(100.0 * (iFluxed / iDcCount) );
	} else {
		return 0;
	}
}

function addResults(atext) {
	// check if in iResults
	var sPages = atext;
	var iHat=0;
	for (var i=0; i<iResults.length; i++) if (iResults[i]==sPages) {iHat=1;break;}
	if (iHat==1) iCountDC['c'+sPages] += 1;
	else {
			iResults.push(sPages);
			iCountDC['c'+sPages] = 1;
	}
	iDcCount += 1;
	// sort by results desc
	try {iResults.sort(sortNumberDesc);} catch(err) {};
	var iMax=9;
	if (iResults.length<iMax) iMax=iResults.length;
	for (var i=0; i<iMax; i++) {
		document.getElementById('cnt'+i).innerHTML = (iResults[i]);	
		if (iCountDC['c'+iResults[i]]>0) {
			document.getElementById('pr'+i).style.width=(100*iCountDC['c'+iResults[i]]/iDcCount) + '%';
			document.getElementById('pr'+i).title = iResults[i] + ' / ' + iCountDC['c'+iResults[i]] + ' DCs';
		} else
			document.getElementById('pr'+i).style.width='1%';
	}
}

function updatePage(dc, name, datum, nr) {
    // DC
    var dc_content = "DC: ";
    dc_content += dc;
    document.getElementById('dc'+nr).innerHTML = dc_content;
    document.getElementById('dn'+nr).innerHTML = name;
    // Content
    var text_content ;
    text_content = "Cached: ";
    
    if (datum=="?") {
		text_content += "? "; 
		if (iAbort==0) {
			text_content += "(";
			text_content += "<a href='#' onclick='";
			text_content += 'document.getElementById("co'+nr+'").innerHTML="Retrying...";';
			text_content += "getnext("+nr+",0);return false;' title='Retry this DC'>Retry</a>";
			text_content += ")";
		} else {
			text_content += "<b>aborted</b>";
		}
		document.getElementById('co'+nr).innerHTML = text_content;
		iAborted += 1;
	} else {
		text_content += datum;
		
		document.getElementById('co'+nr).innerHTML = text_content;
		addResults(datum);
	}
}

function FormatNumber(num)
{ 
    if (isNaN(parseInt(num))) return "0";

	var tmpNum = num;
	var iSign = num < 0 ? -1 : 1;		// Get sign of number
	
	// Create a string object to do our formatting on
	var tmpNumStr = new String(tmpNum);

	// See if we need to put in the commas
	if (num >= 1000 || num <= -1000) {
		var iStart = tmpNumStr.indexOf(".");
		if (iStart < 0)
			iStart = tmpNumStr.length;

		iStart -= 3;
		while (iStart >= 1) {
			tmpNumStr = tmpNumStr.substring(0,iStart) + "," + tmpNumStr.substring(iStart,tmpNumStr.length)
			iStart -= 3;
		}		
	}

	return tmpNumStr;		// Return our formatted string!
}
