// JavaScript Document
// modify from util_requestSend, just return text, not xml
var isie = (window.navigator.userAgent.indexOf("MSIE")>0);
var url = "speedtest.asp?datasize=";

var allsize = 0;
var allinterval = 0;
var testtimes=1;


//defaut test 
var totalTesttimes=15;//default, 15 times
var datasize=500000;//500k Bytes test data each time

//for scrollbar
var bar=0; 
var line="|"; 
var amount="|"; 


//
var finishload= 0;
var starttest=0;

function util_createRequest()
{
  if(isie)
	{
		var requester = new ActiveXObject("Microsoft.XMLHTTP");
		return requester;
	}
	else
	{
		var requester = new XMLHttpRequest();
		return requester;
	}
}

function finishLoaded()
{
	finishload=1;
	//alert("fsfds");
	document.getElementById("testStatus").innerHTML="Ready";
	document.getElementById("megaBytes").innerHTML="";

	if(starttest==1)
	{
		testspeed();
	}
}

function testspeed()
{
	if(finishload ==0)
	{
		starttest=1;
		return;
	}
	if(document.getElementById("avgSpeed") && document.getElementById("avgSpeed").value!="")
	{
		//reset to inital status
		document.getElementById("avgSpeed").value="";
		if(document.getElementById("testStatus"))
		{
			document.getElementById("testStatus").innerHTML="Initial";
		}
		if(document.getElementById("megaBytes"))
		{
			document.getElementById("megaBytes").innerHTML="";
		}
		allsize = 0;
	    allinterval = 0;
        testtimes=1;
        
		bar=0; 
        line="|"; 
        amount="|"; 
        document.getElementById("chart").value="";
		document.getElementById("percent").value="";

		redraw();
	}
	if(document.getElementById("testStatus"))
	{
       document.getElementById("testStatus").innerHTML="Processing";
	   document.getElementById("megaBytes").innerHTML="";
	   document.getElementById("percent").value="0%";
	}
	window.setTimeout(doTest,500);
}

function doTest()
{
	Atest();
}
function Atest()
{
	var startTime=0;
	var http=util_createRequest();
    http.open("POST",url+datasize, true);
    http.send("");
	http.onreadystatechange = function()
	{
	   if(3==http.readyState)
		{//Receiving
		  if(startTime == 0)
		 {
			startTime = new Date().getTime();
		 }
		}
		else if(4==http.readyState)
		{//Loaded
		  var interval = new Date().getTime() - startTime;
		  var size = http.responseText.length;
		  allsize += size;
		  allinterval += interval;
		  
		  if(testtimes<totalTesttimes)
		  {
			testtimes ++;
			startTime = 0;

		   //
			var ss = Math.round(100/totalTesttimes);
			bar = bar+ ss;
			for(var p=0;p<=ss;p++)
			{
				amount=amount+line;
			}
			count();

			//
			Atest();
		  }
		  else
		  {
			var avg = allinterval==0?0:allsize/allinterval;//KB/S
			var spkBAvg = avg;
			var spkbAvg = spkBAvg*8;
			var datakbytesAll = allsize/1000;//kbytes
			var downloadtimeAll = allinterval/1000;//s


		    document.getElementById("avgSpeed").value=avg;

			//final
			bar = 100;
			for(var p=0;p<100;p++)
			{
				amount=amount+line;
			}
			count();

			showFinalResult(totalTesttimes,downloadtimeAll,datakbytesAll,spkbAvg,spkBAvg);

			drawResult(spkbAvg,spkBAvg);
		  }
		} 
	}
}


function requestDataFromServer(datasize)
{
   var data = util_requestSend0("Get",url+datasize,null);
   return data;
}


//draw result
var speedArray=new Array('10000','8000','4000','2000','1500','1000','768','512','256','128','64','56','41.8','33.6');
function drawResult(spdKBits,spdKBytes)
{
  var topIndex =-1;
  for(var i=0;i<speedArray.length;i++)
  {
	  if(spdKBits>Number(speedArray[i]))
	  {
		   topIndex=i;
		   break;
	  }
  }
  if(topIndex==-1)
	{
	  topIndex=15;
	}
  draw(topIndex,spdKBits,spdKBytes);
}


//draw the result
function draw(top,spdKBits,spdKBytes)
{
	var resultTable=document.getElementById("resultTable");
	for(var i=16;i>top+1;i--)
	{
		var oRow = resultTable.rows[i];
		if(oRow)
		{  
			 var currBgcolor= "";
			 if(oRow.cells[1])
			 {
				currBgcolor= oRow.cells[1].bgColor;
				oRow.cells[2].bgColor=currBgcolor;
				oRow.cells[3].bgColor=currBgcolor;
				if(i==top+2)
				 {
					//alert(i);
					oRow.cells[2].innerHTML=formatNumber(spdKBits,2);
					oRow.cells[3].innerHTML=formatNumber(spdKBytes,2);
				 }
			 }
		}
	}				 
}

function redraw()
{
	var resultTable=document.getElementById("resultTable");
	for(var i=16;i>1;i--)
	{
		var oRow = resultTable.rows[i];
		if(oRow)
		{  
			oRow.cells[2].bgColor="#ffffff";
			oRow.cells[3].bgColor="#ffffff";
			oRow.cells[2].innerHTML="";
			oRow.cells[3].innerHTML="";
		}
	}				
}
//
function showFinalResult(testtimes,downloadtime,datasize,spkb,spkB)
{
	document.getElementById("testStatus").innerHTML="Complete";
	var mBytes = spkB/1000;
	var avg = document.getElementById("megaBytes");
	if(spkB>1000)
	{
	   avg.innerHTML=formatNumber(mBytes,2)+" M(Bytes/Sec)";
	}
	else
	{
		avg.innerHTML=formatNumber(spkB,2)+" K(Bytes/Sec)";
	}
}


//format number
function formatNumber(num,i)
{
     var s = num;
	 if (!isNaN(s))
	 {
			var aa = new Number(s);
			try
			{
				return( ""+aa.toFixed(i)); 
			}
			catch (e) {}      		
	 }  
}

function count()
{ 
     amount =amount + line ;

     document.getElementById("chart").value=amount; 
     document.getElementById("percent").value=bar+"%";
 }