SpeedTest = function(holder, options){
	if(!holder || (!holder.tagName && !(holder = document.getElementById(holder)))){return;}
	if(!options){options = {};}
	var pass = options.pass || 2;
	var size = options.size || 32764;
	var path = options.path || 'http://play.radiolla.com/';
	var p = pass;
	var opass = pass;
	var step = 20;	// in milliseconds
	var gears = [0, 150, 750, 1500, 3000, 5000];	// in Kbps
	// attempts: 3   5    8    11    14    18
	var timer, speedArray = [], speed = 0, time = 0, gear = 1, seed = 999999999, percent = 0;
	var y = function(){
		timer = setInterval(function(){
			time += step;
		}, step);
		var per = parseInt((pass - p + 1)/(pass + 1)*100);
		if(per > percent){
			percent = per;
		}
		var x = new Image();
		x.onload = z;
		x.src = path + size + '.png?pass=' + (pass - p + 1) + '&seed=' + Math.round(Math.random() * seed);
		holder.innerHTML = percent + '% speed test';
		holder.onclick = null;
	};
	var z = function(){
		clearInterval(timer);
		speed = Math.floor(size * 8 * (pass - p + 1) / time);
		speedArray.push(speed);
		var again = function(){
			time = 0;
			percent = 0;
			gear = 1;
			p = pass = opass;
			y();
		};
		if(p){
			p--;
			if(gear == 1 && speed > gears[gear]){
				p += 2;
				pass += 2;
				gear++;
			}
			else if(gear == 2 && speed > gears[gear]){
				p += 3;
				pass += 3;
				gear++;
			}
			else if(gear == 3 && speed > gears[gear]){
				p += 3;
				pass += 3;
				gear++;
			}
			else if(gear == 4 && speed > gears[gear]){
				p += 3;
				pass += 3;
				gear++;
			}
			else if(gear == 5 && speed > gears[gear]){
				p += 4;
				pass += 4;
				gear = 0;
			}
			y();
		}
		else if(speedArray.length){
			var all = 0;
			for(var i=0; i<speedArray.length; i++){
				all += speedArray[i];
			}
			var finalSpeed = Math.floor(all/speedArray.length);
			if (typeof options.onReady == 'function') {
				options.onReady.call(window, finalSpeed);
			}
			holder.innerHTML = (finalSpeed / 1024).toString().substring(0, 3) + ' mb/s';
			if (finalSpeed < 32) {
				holder.innerHTML += '<span id="speedtext">Your connection speed with Radiolla is very low!<br/>Please stop other downloads if any or increase your speed to have ability to listen the radio</span>';
			}
			else if (finalSpeed < 128) {
				holder.innerHTML += '<span id="speedtext">Your connection speed with Radiolla is not high!<br/>It is recommended to use 32k channel in this case, or try to stop other downloads if any to have ability to listen 128k channel</span>';
			}
			//holder.title = all +' / '+ speedArray.length;
			holder.onclick = again;
		}
	};
	y();
};