/**
 *  SpeedmeterAJAX 2.0
 *  
 *  Javascript + XHR meranie rýchlosti sťahovania
 *  a nahrávania dát.
 */

var text = {
  'not_activated': 'Nepodařilo se navázat spojení se serverem!',
  'no_file': 'Nenašel se datový soubor!',
  'init_download': 'Inicializuji měření stahování dat...',
  'download_progress': 'Probíha měření downloadu  <br><img src=\'/img/loading.gif\' width=\'24\' height=\'24\'><br> Průběžná rychlost <strong></strong><br> <span style=\'font-weight:bold\'></span>% z <b style=\'font-weight:normal\'></b>.',
  'download_progress_lite': 'Probíha měření downloadu  <br><br><img src=\'/img/loading.gif\' width=\'24\' height=\'24\'><br> Stahuje se <strong></strong>.',
  'download_done': 'Naměřena rychlost stahování dat: <strong></strong>.',
  'init_upload': 'Inicializuji měření nahravání dat...',
  'upload_progress': 'Probíhá měření uploadu  <br><img src=\'/img/loading.gif\' width=\'24\' height=\'24\'><br> Nahrává se <strong></strong>.',
  'upload_done': 'Naměřena rychlost nahravání dat: <strong></strong>.'
};

/**
 *  Dátový súbor s dátovým blokom
 */ 
var dataFile = 'data_10kb.txt';
var absolutePath = '/'; //http://62.240.165.163/speedmeter/';
var requestPath = "http://89.187.137.45/sm/";
requestPath = absolutePath;

var downloadData = 100;
var uploadData = 100;
var s = '';
/**
 *  Minimálny časový limit sťahovania dát [s].
 */ 
var downloadTimeLimit = 4;

/**
 *  Maximálny dátový limit downloadu [kB].
 */ 
var downloadDataLimit = 24000;

var lightDownloadSizes = [199,399,793,1570,3177,6655,12824,24602];
var lightDownloadFile = '_dlimg_';
var ldi = 0;

/**
 *  Minimálny časový limit nahrávania dát [s].
 */ 
var uploadTimeLimit = 4;

/**
 *  Maximálny dátový limit uploadu [kB].
 */ 
var uploadDataLimit = 12000;

var activated = false;

var requestURL = requestPath + 'request.php';

var xhr = false;

var states = ['runDownload(downloadData)', 'runUpload(uploadData)', 'stopAll()', 'resetAll()'];
var state = 0;

var percentage = 0;
var transmittedData = 0;
var startTime = 0;
var endTime = 0;

/**
 *  Nebolo ešte spustené meranie
 */ 
var virgin = true;
var ddd;
var inProgress = false;


function objSize(obj) {
  var len = -1;
  for (var k in obj)
    len++;
  return len;
}

function setServer(id) {
  $("#sm-server-selection a").removeClass("selected");
  $("#" + id).addClass("selected");
  if (id == "s1") {
      $("#sm-wrapper").show();
      $("#sm-wrapper-2").hide();
  }
  else {
      $("#sm-wrapper").hide();
      $("#sm-wrapper-2").show();
      $("#sm-wrapper-2").attr("src", $("#sm-wrapper-2").attr("src"));
  }
  createCookie("smServer", id, 365);
}

$(document).ready(function() {
    
  var serverID = readCookie("smServer");
  if (typeof serverID != "undefined" && serverID != null && serverID != "")
      setServer(serverID);
  
  $("#sm-server-selection a").click(function(e){
      e.preventDefault();
      var id = $(this).attr("id");
      setServer(id);
  });

  //$("#sup").html("<input type='image' src='img/button.png' style='width: 201px; height: 40px; cursor: pointer; border: 0 none;'  />");
  $("#button").click(function(e) {
    e.preventDefault();
    //console.log('RUN SM');
    $("#sm-start").fadeOut('fast');
    $("#workplace").css({zIndex: 999}).show();
    //console.log($("#speedmeterBox").get(0));
    //showOverlay();
    //console.log('GO!');
    $("#container").append("<iframe src='" + requestPath + "ping2_new.php'></iframe>");
    $("#sm-container").css('background-position', '0 0');
    //console.log('ping started');
    $(this).blur();
  });//.fadeIn();
  
  $("#traceroute").click(function(e) {
    e.preventDefault();
    $("#traceplace").css({zIndex: 999}).show();
    //console.log($("#speedmeterBox").get(0));
    showOverlay();
    //console.log('GO!');
    $("#traceplace").append("<iframe src='./traceroute.php' width='650' height='550' style='margin:0;border:0 none'></iframe>");
    $("#sm-container").css('background-position', '0 0');
      //console.log('ping started');
    $(this).blur();
  });
  
  if ($(window).width() < 1200) {
    $("#ad1-sub").html($("#ad-1").html()).addClass('adbox').show();
    $("#ad-1").hide();
  
    $("#ad2-sub").html($("#ad-2").html()).addClass('adbox').show();
    $("#ad-2").hide();
  }
  else {
//     $("#ad-1").css({
//       "position": "fixed",
//       "left": Math.abs($("#ad-1").get(0).offsetParent.offsetLeft-$("#ad-1").get(0).offsetLeft),
//       "top": $("#ad-1").get(0).offsetParent.offsetTop+$("#ad-1").get(0).offsetTop
//     });
//     console.log($("#ad-1").css("left"));
//     $("#ad-2").css({
//       "position": "fixed",
//       "left": $("#ad-2").get(0).offsetParent.offsetLeft+$("#ad-2").get(0).offsetLeft,
//       "top": $("#ad-2").get(0).offsetParent.offsetTop+$("#ad-2").get(0).offsetTop
//     });
  }
  
  /* test spojenia */
  $.ajax({
    url: absolutePath + "request.php",
    dataType: 'json', 
    data: {action: 'hello', checkFile: dataFile},
    complete: function(d) {
    d = $.parseJSON(d.responseText);
    if (d.t == 'hi') {
      activated = true;
      if (d.file == 'no_file') {
        activated = false;
        alert(text['no_file']);
      }
      if (activated && location.hash.match(/^#run$/)) {
        $("#button").click();
        location.hash = '';
      }
      else if (activated) {
        $("#sm-start").fadeIn('fast');
      }
    }
  }});
  
  $("#runSpeed").click(function(e) {
    e.preventDefault();
    if (!activated) {
      alert(text['not_activated']);
    }
    else {
      $("#toHide").hide();
      $("#toShow").show();
      $("#status").html(text['init_download']);
      downloadData = 100;
      shiftState();
      //runDownload(downloadData);
    }
  });
  
  //$.cookie('graph', null);
 
});

function hideTracePlace() {
  hideOverlay();
  $("#traceplace").empty().hide();
  return false;
}

function shiftState() {
  state = (state + 1) % states.length;
/*  if (state == 1)
    virgin = false;
  if (state == 0) */
  virgin = true;
//  alert(state + ": " + states[state]);
  eval(states[state]);
  _('shift ' + state);
}

function getTime() {
  var date = new Date();
  return date.getTime();
}

var globalStart = 0;
var traffic = 0;
var speeds = 0;
var appxs = 0;
var spAr = new Array(0, 0, 0);
var spMax = 0;

var graphData = {};

var lightDownload = false;

function runDownload(data) {
    
  if (lightDownload) {
      runDownloadLight(lightDownloadSizes[ldi]);
      return;
  }
  
  $("#container").html("");
  if (virgin) {
    speeds = 0;
    appxs = 0;
//    table = '<tr><th>speed</th></tr>';
    virgin = false;
  }
  var difference = 0;
  startTime = getTime();
  globalStart = startTime;
  endTime = startTime;
  graphData[data] = {};
  var src = requestPath + "request.php?action=getCDownloadFile&amp;size=" + data + "&amp;s=" + s + "&amp;file=" + dataFile;
  //console.log("DL start " + unescape(src));
  $("#container")
  .html("<iframe width='700' height='200' src='" + src +"'></iframe>");
  $("#workplace").html(text['download_progress']);
/*  $("#status strong").html('0 kbps'); */
  $("#workplace span").html('0');
  $("#workplace b").html(data + " KB");
  startTimer();
  _('dl started ' + data);
}

function runDownloadLight(data) {
  $("#container").html("");
  $.cookie('SM_unique', "");
  var difference = 0;
  startTime = getTime();
  globalStart = startTime;
  endTime = startTime;
//  var src = requestPath + "request.php?action=getLDownloadFile&amp;size=" + data + "&amp;s=" + s + "&amp;file=" + dataFile + "&amp;rand=" + startTime;
  var file = lightDownloadFile + data + ".jpg";
  var src = requestPath + "speedmeter/img/" + file + "?rand=" + startTime;
  //console.log("DL start " + unescape(src));
  $("#workplace").html(text['download_progress_lite']);
  if (data > 1024) {
      d = data * 100;
      d = Math.round(d/1024) / 100;
      t = "MB";
  }
  else {
      d = data;
      t = "KB";
  }
  $("#workplace strong").html(d + " " + t);
  $("#container")
  .html("<img id='smImg' width='1' height='1' onload='stopDownload(s)' style='visibility:hidden' src='" + src +"'>");
//  .html("<iframe width='700' height='200' src='" + src +"'></iframe>");
  $("#smImg").bind("load", function() { stopDownload(s); });
/*  $("#status strong").html('0 kbps'); */
  startTimer();
  _('dl started ' + data);
}

var pc = 0;
var td = 0;
var timer;
var tdtd = 0;

function updateDownload(pc_, td_) {
  tdtd++;
  percentage = parseInt(pc_);
  transmittedData = parseInt(td_);
  var time = getTime();
  var dif = (time - startTime) / 1000;
  var speed = Math.round(800 * (transmittedData / dif) / 1024) / 100;
  spMax = Math.max(spMax, speed);
  if (tdtd % 10) {
    graphData[downloadData][time] = speed;
  }
//  var speed = 8 * Math.round((transmittedData / difference)/1024, 2);
/*  $("#status strong").html(speed + ' kbps');
  $("#status span").html(percentage + ' of ' + downloadData + ' kB'); */
  pc = pc_;
  td = speed;
}

var dlF = 0;

function stopDownload(_s){
  s = _s;
  if (lightDownload) {
      downloadData = lightDownloadSizes[ldi];
      transmittedData = downloadData * 1024;
      ldi = ldi + 1;
  }
  _('dl stop ' + downloadData);
  endTime = getTime();
  difference = (endTime - startTime) / 1000;
  var speed = 8 * Math.round((transmittedData / difference)/1024);
  speeds += speed;
  appxs++;
  spAr[0] = spAr[1];
  spAr[1] = speed;
  traffic += transmittedData;
  if (!lightDownload)
    $("#workplace strong").html(speed + ' kbps');
  $("#workplace span").html(percentage);
  $("#container iframe").remove();
//  if (graphData) graphData[downloadData][endTime] = speed;
  if (difference < downloadTimeLimit && downloadData < downloadDataLimit) {
    downloadData = downloadData * 2;
    runDownload(downloadData);
    _('dl double size');
  }
  else {
    stopTimer();
    speeds += speed;
    appxs++;
    spAr[2] = speed;
    spMax = Math.max(spMax, speed);
    if (spAr[0] == 0) 
      spAr[0] = spAr[1];
    $("#workplace").html(text['download_done']);
    var a = Math.round(speeds/appxs);
//     a = Math.round((spAr[0] + spAr[1] + spAr[2])/3);
    a = spMax;
    var average = a + ' kbps';
//     console.log(graphData.size2());
    var gSize = objSize(graphData);
    if (!lightDownload && JSON.stringify && gSize > 0 && document.getElementById) {
       $.post(requestURL, {action: 'getGraph', data: JSON.stringify(graphData), avg: average}, function(d) {
  //      alert('post');
       });
    }
    var td = a, _e = 'kbps';
    if (td > 1024) {
      td = Math.round((100 * td / 1024)) / 100;
      _e = 'Mbps';
    }  
    if (td > 1024) {
      td = Math.round((100 * td / 1024)) / 100;
      _e = 'Gbps';
    }  
    if (td > 1024) {
      td = Math.round((100 * td / 1024)) / 100;
      _e = 'Tbps';
    }
    var _average = td + ' ' + _e;
    _('dl done ' + average + ' at ' + downloadData);
    if (!lightDownload)
        $("#workplace strong").html(_average);
    dlF = average;
    $.get(requestURL, {action: 'getS', speed: a/8, data: downloadData, 's': s, img: ''}, function(_s) {
      s = _s;
      //console.log('DL s ' + unescape(_s));
      shiftState();
    });
/*    var globalEnd = getTime();
    var dif = (globalEnd - globalStart) / 1000;
    var vel = 8 * Math.round((traffic / dif) / 1024, 2);
    $("#status").after("<p id='res'>Celková rýchlosť: " + vel + " kbps, avg: " + Math.round(speeds/appxs, 2) + "</p>");
*/  

//    shiftState();
  }
}

function runUpload(data) {

  if (virgin) {
    speeds = 0;
    appxs = 0;
    virgin = false;
  }
  var src = requestPath + "request.php?action=getCUploadFile&amp;size=" + data + "&amp;s=" + s + "&amp;file=" + dataFile;
  //console.log("UP start " + unescape(src));
  src = absolutePath + "upload2.php?size=" + data + "&amp;s=" + s;
  $("#container")
  .html("<iframe width='700' height='200' src='" + src +"'></iframe>");
//  $("#workplace").append("<p id='upstat'></p>");
  $("#workplace").html(text['upload_progress']);
/*  $("#status strong").html('0 kbps'); */
  $("#workplace strong").html(data + " KB");
}

function updateUpload(text) {
  $("#workplace strong").html(text);
}

function stopUpload(time, speed, size) {
  speeds += Math.round(speed);
  appxs++;
  if (time < uploadTimeLimit && size < uploadDataLimit) {
    size = size * 2;
    runUpload(size);
  }
  else {
    stopTimer();
    speeds += Math.round(speed);
    appxs++;
    $("#workplace").html(text['upload_done']);
    var finalSpeed = Math.round(8 * speeds / appxs);
    var td = finalSpeed, _e = 'kbps';
    if (td > 1024) {
      td = Math.round((100 * td / 1024)) / 100;
      _e = 'Mbps';
    }  
    if (td > 1024) {
      td = Math.round((100 * td / 1024)) / 100;
      _e = 'Gbps';
    }  
    if (td > 1024) {
      td = Math.round((100 * td / 1024)) / 100;
      _e = 'Tbps';
    }  
    var average = td + ' ' + _e;
    $("#workplace strong").html(average);
    $.get(requestURL, {action: 'saveData', down: dlF.replace(' kbps', ''), dblock: downloadData, up: finalSpeed, ublock: size});
/*    $.post(requestURL, {action: 'getGraph', data: JSON.stringify(graphData), avg: average}, function(d) {
      if (d) {
        $("#toShow").append('<img src="' + requestURL + '?action=getTempImage&amp;file=' + d + '">');
      }
    }); */
/*    var globalEnd = getTime();
    var dif = (globalEnd - globalStart) / 1000;
    var vel = 8 * Math.round((traffic / dif) / 1024, 2);
    $("#status").after("<p id='res'>Celková rýchlosť: " + vel + " kbps, avg: " + Math.round(speeds/appxs, 2) + "</p>");
*/
    shiftState();
  }
  
}

function stopAll() {
  inProgress = false;
  $("#toShow").append("<p><a class='button' id='okButton' href='#'>OK</a></p>");
  $("#okButton").click(function(e){
    e.preventDefault();
    $(this).parent().remove();
    shiftState();
  });
}

function resetAll() {
  inProgress = false;
  $("#toShow img").remove();
  $("#upstat").remove();
  $("#toShow p#res").remove();
  $("#toShow").hide();
  $("#toHide").show();
}

function startTimer() {
  timer = setInterval('doTime()', 500);
}

function stopTimer() {
  clearTimeout(timer);
  timer = false;
}

function doTime() {
  if (timer == false) return;
  var _e = 'kbps';
  var t = td;
  if (t > 1024) {
    t = Math.round((100 * t / 1024)) / 100;
    _e = 'Mbps';
  }  
  if (t > 1024) {
    t = Math.round((100 * t / 1024)) / 100;
    _e = 'Gbps';
  }  
  if (t > 1024) {
    t = Math.round((100 * t / 1024)) / 100;
    _e = 'Tbps';
  }
  if (!lightDownload)
    $("#workplace strong").html(t + ' ' + _e);
  $("#workplace span").html(pc);
}

function showOverlay() {
  $("#overlay").fadeIn(200);
}

function hideOverlay() {
  $("#overlay").fadeOut('fast');
}

function message(t) {
  /* console.log(t); */
  $("#workplace span").html(t);
}

function messageWP(t) {
  $("#workplace").html(t);
}

function WriteMessage(docid,text) {
  document.getElementById(docid).innerHTML = text;
}

function _(t){
  return;
  if (typeof console != 'undefined')
    console.log(t);
}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}









