/*
 *	Měřící kód pro ADSL.cz
 *
 *	verze 1.8
 *	Autor: Martin Jung
 *
 */

var tst_url = '/_ajax/sm_';

var prgs_start = new Array();
prgs_start['r'] = 29; //236; //221;
prgs_start['g'] = 113; //250; //221;
prgs_start['b'] = 191; //230; //221;

var prgs_end = new Array();
prgs_end['r'] = 234;
prgs_end['g'] = 32;
prgs_end['b'] = 40;

//download vars
var files = 6;

var dwn_status = new Array();
var dwn_times = new Array();
var dwn_sizes = new Array();

var upl_status = new Array();
var upl_times = new Array();
var upl_sizes = new Array();

var progress = 0;
var state = 0;
var size = 0;
var e_time = 0;
var soucet = 0;
var actFiles = files;

// ulozene prichozi data
// pouzitelne pro mereni uploadu
var file = new Array();

var responseData = "";

var dwn_messages = new Array();
var upl_messages = new Array();

//ping vars

var ping_status = new Array();
var ping_packets = new Array();
var ping_messages = new Array();

var pSuccess = 0;
var pIp = '0.0.0.0';
var lang;

function SetMessages(msgs) {
	dwn_messages = msgs['dwn'];
	upl_messages = msgs['upl'];
	ping_messages = msgs['ping'];
}

function initSpeedTest(lng) {
	lang = lng;
	dwn_status = new Array();
	dwn_times = new Array();
	dwn_sizes = new Array();
	upl_status = new Array();
	upl_times = new Array();
	upl_sizes = new Array();
	progress = 0;
	state = 0;
	size = 0;
	e_time = 0;
	soucet = 0;
	actFiles = files;
	pSuccess = 0;
	pIp = '0.0.0.0';
	ping_status = new Array();
	ping_packets = new Array();
	div = document.getElementById('textSlideShow').getElementsByTagName('div')[1];
	document.getElementById('upl_h3').style.display = 'none';
	document.getElementById('next_h3').style.display = 'none';
	document.getElementById('textSlideShow').style.display = 'block';
	writeMessage('dwn_metter', dwn_messages[0]);
	writeMessage('ping_metter', '');
	writeMessage('upl_metter', '');
	writeMessage('dwn_metter', dwn_messages[1]);
	makeProgress(0);
	document.getElementById('mereni_box').style.display = 'block';
	window.setTimeout('dwn_test(0);', 1000);
}

function dwn_test(i) {
	state = 0;
	url = tst_url + 'getdata/' + i;
//	prompt("url", url);
	s_time = getCas();
	if(!send_xmlhttprequest(dwn_testStep, "GET", url,'','')) {
		alert('Váš prohlížeč tuto technologii bohužel nepodporuje.');
	}
	resultWait(i, s_time);
}

function resultWait(id, s_time) {
	if(state == 0) {
		window.setTimeout('resultWait('+id+', ' + s_time + ')', 20);
	} else {
		progress = Math.ceil((100/actFiles)*(id+1));
		if(((id+1) == actFiles) && (progress < 100)) progress = 100;
		makeProgress(progress);
		saveResult(id, s_time, e_time);
	}
}

function dwn_testStep(xml) {
	if (xml.readyState == 4) {
		responseData = xml.responseText;
		e_time = getCas();
		xml = '';
		state = 1;
		return true;
	}
}

function saveResult(id, tm1, tm2) {
	ct = (tm2-tm1) /2; // jumbo.. pridal tento radek, zakomentoval ten dole...
//  ct = tm2 - tm1;
	file[id] = responseData;
	size = responseData.length;
	speed = (size/1024) / (ct/1000);
//	alert(size + "\n" + speed + "\n" + ct);
	dwn_times[id] = ct;
	dwn_sizes[id] = size;
	dwn_status[id] = speed;
	e_time = 0;
	size = 0;
	soucet += speed;
	id += 1;
	if(id < actFiles) {
		window.setTimeout('dwn_test(' + id + ');', 1);
	} else {
		makeProgress(100);
		window.setTimeout('nextUpload();', 500);
	}
}

// +upload

function nextUpload() {
	writeMessage('dwn_metter', dwn_messages[2]);
	document.getElementById('upl_h3').style.display = 'block';
	writeMessage('upl_metter', upl_messages[1]);
	files = file.length;
	soucet = 0;
	upl_test(0);
}

function upl_test(i) {
	state = 0;
	url = tst_url + 'get_response/';
//	prompt("Url",url);
	s_time = getCas();
	if(!send_xmlhttprequest(upl_testStep, "POST", url,file[i],'')) {
		alert('Váš prohlížeč tuto technologii bohužel nepodporuje.');
		return 0;
	}
	uResultWait(i, s_time);
}

function uResultWait(id, s_time) {
	if(state == 0) {
		window.setTimeout('uResultWait('+id+', ' + s_time + ')', 20);
	} else {
		progress = Math.ceil((100/actFiles)*(id+1));
		//alert(id + '\n' + actFiles + '\n' + progress);
		if(((id+1) == actFiles) && (progress < 100)) progress = 100;
		makeProgress(progress);
		saveUResult(id, s_time, e_time);
	}
}

function upl_testStep(xml) {
//	alert(xml.readyState);
	if (xml.readyState == 4) {
		e_time = getCas();
		xml = '';
		state = 1;
		return true;
	}
}

function saveUResult(id, tm1, tm2) {
	ct = tm2 - tm1;
	size = file[id].length;
	speed = (size/1024) / (ct/1000);
	upl_times[id] = ct;
	upl_sizes[id] = size;
	upl_status[id] = speed;
	e_time = 0;
	size = 0;
	soucet += speed;
	id += 1;
	if(id < actFiles) {
		window.setTimeout('upl_test(' + id + ');', 1);
	} else {
		makeProgress(100);		
//		alert(upl_status.join("\n"));
		window.setTimeout('nextPing();', 500);
	}
}

// -upload

function nextPing() {
	writeMessage('upl_metter', upl_messages[2]);
	document.getElementById('next_h3').style.display = 'block';
	writeMessage('ping_metter', ping_messages[1]);
	pingTest();
}

function pingTest() {
	url = tst_url + 'pingtest/';
//	prompt("url", url);
	if(!send_xmlhttprequest(pingTestResult, "GET", url,'','')) {
		alert('Váš prohlížeč tuto technologii bohužel nepodporuje.');
	}
}

function pingTestResult(xml) {
	if (xml.readyState == 4) {
		source = xml.responseXML.getElementsByTagName('ping_result')[0];
		pSuccess = source.getElementsByTagName('success')[0].firstChild.data;
		pIp = source.getElementsByTagName('ip')[0].firstChild.data;
		
		if(pSuccess != 0) {
			ping_packets['transmitted'] = source.getElementsByTagName('received')[0].firstChild.data;
			ping_packets['received'] = source.getElementsByTagName('received')[0].firstChild.data;
			ping_packets['loss'] = source.getElementsByTagName('loss')[0].firstChild.data;
			ping_packets['time'] = source.getElementsByTagName('time')[0].firstChild.data;
		
			ping_status['avg'] = source.getElementsByTagName('avg')[0].firstChild.data;
			ping_status['min'] = source.getElementsByTagName('min')[0].firstChild.data;
			ping_status['max'] = source.getElementsByTagName('max')[0].firstChild.data;
			//ping_status['mdev'] = source.getElementsByTagName('mdev')[0].firstChild.data;
		}
		writeMessage('ping_metter', ping_messages[2]);
		GetResults();
	}
}


function GetResults() {
//	dwn = specifyResult(dwn_status);
//	upl = specifyResult(upl_status);
	dwn = dwn_status;
	upl = upl_status;
	url = new Array();
	url.push(lang); //lang
	url.push(dwn.join('%7c')); //d
	url.push(upl.join('%7c')); //u
	if(pSuccess == 1) {
		url.push('1'); //p=1
		url.push(ping_status['avg'] + '%7c' + ping_status['min'] + '%7c' + ping_status['max']); //ps
		url.push(ping_packets['loss']);		//pl
	} else {
		url.push('0'); //p=0
	}
	url = tst_url + 'getresults/'+url.join('/');
//	prompt("url", url);
//	return true;
	if(!send_xmlhttprequest(GoToResults, "GET", url,'','')) {
		alert('Váš prohlížeč tuto technologii bohužel nepodporuje.');
	}
	return true;
}

function GoToResults(xml) {
	if (xml.readyState == 4) {
		ShowResults(xml.responseText);
	}
}

function makeProgress(progress) {
	if(progress > 100) progress = 100;
	document.getElementById('progress').style.width = Math.ceil(progress*4) + 'px';
	//alert('Width: ' + Math.ceil(progress*5));
	document.getElementById('progress').style.backgroundColor = 'rgb(' + (prgs_start['r']+Math.ceil((progress/100)*(prgs_end['r']-prgs_start['r']))) + ',' + (prgs_start['g']+Math.ceil((progress/100)*(prgs_end['g']-prgs_start['g']))) + ','+(prgs_start['b']+Math.ceil((progress/100)*(prgs_end['b']-prgs_start['b'])))+')';
}

function getCas() {
	time = new Date();
	return time.getTime();
}

function send_xmlhttprequest(obsluha, method, url, content, headers) {
	var xmlhttp = (window.XMLHttpRequest ? new XMLHttpRequest : (window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : false));
	if (!xmlhttp) { return false; }
	xmlhttp.open(method, url, true);
	xmlhttp.onreadystatechange = function() { obsluha(xmlhttp); };
	if (headers) {
		for (var key in headers) {
			xmlhttp.setRequestHeader(key, headers[key]);
		}
	}
	xmlhttp.send(content);
	return true;
}

function sizeFormat(size ,format) {
	pripony = new Array("","k","M","G","T");
	level = 0;
	while((size > 1024) && (pripony[level] != format) && level < 5) {
		size /= 1024;
		level++;
	}
	return strFormat(size) + ' ' + pripony[level];
}

function strFormat(str) {
	str += '';
	parts = str.split(".");
	if(parts.length < 2) parts[1] = '0';
	hlp = Math.round(parts[1].substring(0,4) / 100);
	return parts[0] + ',' + hlp;
}

//function specifyResult(spd) {
//	if(spd.length < 5) return spd;
//	mx = 0;
//	mx_i = -1;
//	mn = 9999999999999999999999;
//	mn_i = -1;
//	res = new Array();
//	for(i=0;i<spd.length;i++) {
//		mx = Math.max(mx, spd[i]);
//		if(mx == spd[i]) { mx_i = i; }
//		mn = Math.min(mn, spd[i]);
//		if(mn == spd[i]) { mn_i = i; }
//	}
//	
//	for(i=0;i<spd.length;i++) {
//		if((i != mx_i) && (i != mn_i)) res.push(spd[i]);
//	}
//	return spd;
//}

function writeMessage(target, mess) {
	document.getElementById(target).innerHTML = mess;
}

//animace textů

var prev_msg_id = -1;
var msg_id = -1;
var color = 0;
var div = null;
var animSpeed = 50;
var aTmr = null;

function changeMessage() {
	msg_id = 0;
	if(msgs.length > 1) {
		msg_id = Math.round(Math.random()*10);
	
		while((msg_id == prev_msg_id) || (msg_id >= msgs.length)) {
			msg_id = Math.round(Math.random()*10);
		}
		div.innerHTML = msgs[msg_id];
		prev_msg_id = msg_id;
		efekt(1);
	} else {
		if(msgs.length > 0) div.innerHTML = msgs[msg_id];
	}
}

function efekt(smer) {
	if(smer == 1) {
		color -= 20;
		if(color < 51) color = 51;
		div.style.color = 'rgb('+color+','+color+','+color+')';
		if(color > 51) {
			aTmr = window.setTimeout('efekt(1);', animSpeed);
		} else {
			aTmr = window.setTimeout('efekt(0);', perioda[msg_id]);
		}
	} else {
		color += 20;
		if(color > 255) color = 255;
		div.style.color = 'rgb('+color+','+color+','+color+')';
		if(color < 255) {
			aTmr = window.setTimeout('efekt(0);', animSpeed);
		} else {
			changeMessage();
		}
	}	
}

function stopAnimateTexts() {
	window.clearTimeout(aTmr);
}
