/*
 * ASO kiirusemõõtmise saidi JavaScript teek.
 *
 * (c) 2006 Cybernetica AS
 *
 * $Id: asokiirus.js,v 1.31 2008-02-01 07:14:34 okul Exp $
 */

// muutujad {{{

var faas1_ajapiirang = 40;
var faas2_ajapiirang = 80;
var faas3_ajapiirang = 240;
var faas4_ajapiirang = 20;
var taimer = NaN;
var testOnLoad = NaN;
var algus = 0;

// }}}

// üldfunktsioonid {{{
// get_browser() {{{

// veebilehitseja tuvastamine

function get_browser() {
	var agent = navigator.userAgent;
	if (agent.indexOf('MSIE') != -1) { return "IE"; }
	if (agent.indexOf('Mozilla') != -1) { return "MZ"; }
  return "UNKNOWN";
}

// }}}
// htmlNahtavaks(nahtav, id) {{{

// HTML-bloki nähtavaks tegemine või peitmine. Selle funktsiooni loomine oli
// tingitud IE ja muude veebisirvijate erinevustest.
//
// parameeter "nahtav" on kas 0 (peitmine) või 1 (nähtavale toomine)
// parameeter "id" on HTML-sildi ID

function htmlNahtavaks(nahtav, id) {
  var e = $(id);
  if (e == null)
    return;

  e.style.visibility = nahtav ? "visible" : "none";
  e.style.display = nahtav ? "block" : "none";
}

// }}}
// }}}
// kiirusetestid {{{
// kiiruseTestPuhastus() - kiirusetesti puhastus {{{

function kiiruseTestPuhastus() {
  // taimeri nullimine
  if (! isNaN(taimer))
    clearTimeout(taimer);

  disconnectAll($("testiauk"));
}

// }}}
// kiiruseTestiAjapiirang() {{{

// Siia satutakse siis, kui kiirusetest ületab ajapiirangu

function kiiruseTestiAjapiirang() {
  kiiruseTestPuhastus();

  // kontroll, kas dokumendis on kõik vajalikud elemendid olemas
  var g = testLeiaTestiauk();
  if (g == null)
    return alert("VIGA: Dokumendis puudub kirje 'testiauk'");
  if (g.getElementById("faas") == null)
    return null;
  if ($("faas") == null)
    return alert("VIGA: Dokumendis puudub kirje 'faas'");

  // veateate väljastamine
  $("testiauk").src =
      baseurl + "/kiirus/timeout.html?faas=" +
      $("faas").value;

  return null;
}

// }}}
// kiiruseTestFaas1() {{{

// Kiirusetesti esimese faasi läbiviimine
//
// Esimeses faasis laaditakse kiiruse ligikaudse tuvastamise eesmärgil alla
// väikesemahuline (või kui parameeter "suurus" on määratud, siis suurem)
// dokument. Allalaadimise edukal lõppemisel aktiveeritakse funktsioon
// kiiruseTestFaas1Saada()

function kiiruseTestFaas1(suurus) {
  kiiruseTestPuhastus();
  $("faas").value = 1;

  // mitme testi läbiviimisel ka selle edenemise näitamine
  if ($("ametnik") != null)
    $("ametnik").innerHTML =
      $("testinr").value + 
      " / " +
      $("testidearv").value;

  // edenemisnäidikute paikakruttimine
  htmlNahtavaks(1, "testistatistika");
  for (var i=1; i<6; i++)
    aktiveeriNaidik("testfaas_" + i, i == 1);

  // paketigeneraatori aadressile suunamine
  var g = $("testiauk")
  if (suurus == undefined)
    suurus = '80_kbit';
  g.src = baseurl + "/static/testandmed/" + suurus + ".html?aeg=" +
    new Date().getTime();

  // testile ajapiirangu seadmine
  
  taimer = setTimeout("kiiruseTestiAjapiirang()", faas1_ajapiirang * 1000);
  // testi valmimisel järgmisele funktsioonile suunamine
  testOnLoad = connect('testiauk', 'onload', kiiruseTestFaas1Saada);
}

// }}}
// kiiruseTestFaas1Saada() {{{

// Kiirusetesti esimese faasi andmete saatmine
//
// Esimese faasi lõppedes saadetakse serverile kliendi arusaam testi
// tulemustest - testandmete allalaadimise kestus.

function kiiruseTestFaas1Saada() {
  kiiruseTestPuhastus();

  var maht = testLeiaMaht();
  if (maht == null)
    return alert("Viga esimese faasi andmete laadimisel");
  var kestus = Number($("kestus").value);

  // kui allalaadimine kestis vähem kui 0,5 sekundit, siis täpsema mõõtmise
  // huvdes laadime alla tiba suurema dokumendi
  if (kestus < 500) {
    if (maht == 50000)
      return kiiruseTestFaas1("320_kbit");
    else if (maht == 200000)
      return kiiruseTestFaas1("640_kbit");
    else if (maht >= 400000)
      return kiiruseTestFaas1( String(Math.round(maht / 400000) + "_Mbit"));
  }

  if ($("kestus").value == null) {
    alert("Viga: Test ei mõõtnud kiirust!");
  } else {
    $("maht").value = testLeiaMaht();
    testOnLoad = connect('testiauk', 'onload', testJargmineFaas);
    $("statistika").submit();
  }
  return null;
}

// }}}
// kiiruseTestFaas2() {{{

// Kiirusetesti teise faasi läbiviimine
//
// Teises faasis laaditakse kiiruse täpse tuvastamise eesmärgil alla
// suuremamahuline dokument. Allalaadimise edukal lõppemisel aktiveeritakse
// funktsioon kiiruseTestFaas3()

function kiiruseTestFaas2() {
  kiiruseTestPuhastus();

  $("faas").value = 2;

  // edenemisnäidiku paikakruttimine
  aktiveeriNaidik("testfaas_1", 0);
  aktiveeriNaidik("testfaas_2", 1);

  var d = new Date();
  // paketigeneraatori aadressile suunamine
  var g = $("testiauk")
  var kestus = Number( $("kestus").value );
  var maht = Number( $("maht").value );
  var kiirus = maht / kestus; // kbitti sekundis
  $("kestus").value = "";
  if (kiirus < 10) { // aeglane ühendus, kuni 64kbit/s
    g.src = baseurl + "/static/testandmed/320_kbit.html?aeg=" + d.getTime();
  } else if (kiirus < 20) { // ühendus kuni 128kbit/s
    g.src = baseurl + "/static/testandmed/640_kbit.html?aeg=" + d.getTime();
  } else if (kiirus < 40) { // ühendus kuni 256kbit/s
    g.src = baseurl + "/static/testandmed/1_Mbit.html?aeg=" + d.getTime();
  } else if (kiirus < 80) { // ühendus kuni 512kbit/s
    g.src = baseurl + "/static/testandmed/2_Mbit.html?aeg=" + d.getTime();
  } else if (kiirus < 160) { // ühendus kuni 1mbit/s
    g.src = baseurl + "/static/testandmed/5_Mbit.html?aeg=" + d.getTime();
  } else if (kiirus < 320) { // ühendus kuni 2mbit/s
    g.src = baseurl + "/static/testandmed/10_Mbit.html?aeg=" + d.getTime();
  } else if (kiirus < 640) { // ühendus kuni 4mbit/s
    g.src = baseurl + "/static/testandmed/20_Mbit.html?aeg=" + d.getTime();
  } else { // ühendus 8mbit/s või kiirem
    g.src = baseurl + "/static/testandmed/40_Mbit.html?aeg=" + d.getTime();
  }

  // testile ajapiirangu seadmine
  taimer = setTimeout("kiiruseTestiAjapiirang()", faas2_ajapiirang * 1000, 1);
  // testi valmimisel järgmisele funktsioonile suunamine
  testOnLoad = connect('testiauk', 'onload', kiiruseTestFaas3);
}

// }}}
// kiiruseTestFaas3() {{{

// Kiirusetesti kolmanda faasi andmete saatmine
//
// Kolmandas faasis kogutakse kokku teise faasi statistika - andmete
// allalaadimise kiirus ja saadetakse serverile allalaaditud testandmetes
// sisalduv vorm, milles sisalduvad andmed moodustavad ca. 10% allalaaditud
// andmete mahust. Lisaks pannakse vormiga kaasa kliendi arusaam testandmete
// allalaadimise kestusest.

function kiiruseTestFaas3() {
  kiiruseTestPuhastus();

  var maht = testLeiaMaht();
  // kui mahtu ei leita või kui kestust pole määratud, siis katkestatakse
  if ((maht == null) || ($("kestus").value == ""))
    return;

  // edenemisnäidikute paikakruttimine
  $("faas").value = 3;
  // edenemisnäidiku paikakruttimine
  aktiveeriNaidik("testfaas_2", 0);
  aktiveeriNaidik("testfaas_3", 1);

  // testdokumendi leidmine
  var g = $("testiauk");
  var f = testLeiaTestiauk();

  // testi andmete ülekandmine üleslaaditavale vormile
  f.getElementById("kirjeldus").innerHTML = "Andmete üleslaadimine";
  f.getElementById("edenemisriba_kirjeldus").setAttribute(
    "style", "display: none;"
  );
  f.getElementById("edenemisriba").setAttribute(
    "style", "display: none;"
  );
  f.getElementById("faas").value = 3;
  // üleslaadimise maht on 2x väiksem
  $("maht").value = maht / 2;

  // testi algusaja meeldejätmine
  $("algus").value = new Date().getTime();
  // testi valmimisel järgmisele funktsioonile suunamine
  testOnLoad = connect('testiauk', 'onload', kiiruseTestFaas4);
  // testile ajapiirangu seadmine
  taimer = setTimeout("kiiruseTestiAjapiirang()", faas3_ajapiirang * 1000, 2);
  // üleslaadimise testi aktiveerimine
  f.getElementById("upload").submit();
}

// }}}
// kiiruseTestFaas4() {{{

// Kiirusetesti kolmanda faasi andmete saatmine

function kiiruseTestFaas4() {
  kiiruseTestPuhastus();

  g = testLeiaTestiauk();
  if (g == null)
    return;
  if (g.getElementById("faas") == null)
    return;

  // edenemisnäidikute paikakruttimine
  $("faas").value = 4;
  aktiveeriNaidik("testfaas_3", 0);
  aktiveeriNaidik("testfaas_4", 1);

  // kolmanda faasi statistika saatmine serverile
  var d2 = new Date();
  leiaKestus();
  testOnLoad = connect('testiauk', 'onload', kiiruseTestFaas5);
  $("statistika").submit();

  // andmete saatmisele ajapiirangu seadmine
  taimer = setTimeout("kiiruseTestiAjapiirang()", faas4_ajapiirang * 1000, 2);
}

// }}}
// kiiruseTestFaas5() {{{

// Testid on läbi, siin peidetakse testide IFRAME

function kiiruseTestFaas5() {
  // kas pole viga tekkinud
  var g = testLeiaTestiauk();
  if (g == null)
    return null;
  if (g.getElementById("faas") == null)
    return null;

  if ($("ametnik") == null) {
    // kui pole ametniku test
    $("andmed").submit()
    return null;
  }

  // ametniku test
  if ($("testinr").value == $("testidearv").value) {
    // viimase testi lõpp
    $("andmed").submit();
  } else {
    kiiruseTestPuhastus();
    // kui testidega pole lõpule jõutud, siis tuleb järgmine tsükkel ette võtta
    $("testinr").value =
      Number($("testinr").value) + 1;
    viivitus = $("viivitus").value;
    $("testfaas_5").innerHTML = "Paus " + viivitus + " sekundit";
    aktiveeriNaidik("testfaas_4", 0);
    aktiveeriNaidik("testfaas_5", 1);
    taimer = setTimeout( "kiiruseTestFaas1()", 1000 * viivitus );
  }

  return null;
}

// }}}
// testJargmineFaas() {{{

function testJargmineFaas() {
  // mis faas parajasti lõppes?
  var f = $("faas");
  if (f == null)
    return;
  var faas = f.value;

  // uue faasi alustamine. seda tuleb taimeri abil teha kuna siis õnnestub enne
  // järgmist faasi onLoad sündmusest välja tulla
  if (faas == 1)
    taimer = setTimeout( "parent.kiiruseTestFaas2()", 1000 );
}

// }}}
// testLeiaTestiauk() {{{

// testi läbiviimise IFRAME leidmine

function testLeiaTestiauk() {
  if ($("testiauk") == null)
    return null;
  if (get_browser() == "IE")
    return document.frames("testiauk").document;
  else
    return $("testiauk").contentDocument;
}

// }}}
// testLeiaMaht() {{{

// allalaaditud dokumendist kiiruse tuvastamine

function testLeiaMaht() {
  // kui testiauku pole, siis tagastatakse null
  var g = testLeiaTestiauk();
  if (g == null)
    return null;

  var f = g.getElementById("maht");
  // kui mahtu pole, siis tagastatakse null
  if (f == null)
    return null;

  return f.value;
}

// }}}
// aktiveeriNaidik() {{{

// edenemisnäidiku sammu (de)aktiveerimine

function aktiveeriNaidik(naidik, aktiivne) {
  var faasiklass = "testifaas_" + (aktiivne ? "aktiivne" : "passiivne");
  var n = $(naidik);
  if (n == null)
    return;
  if (get_browser() == "IE")
    $(naidik).className = faasiklass;
  else
    $(naidik).setAttribute("class", faasiklass);
}

// }}}
// leiaKestus() {{{

// Testi kestuse leidmine.

function leiaKestus() {
  $("kestus").value = new Date().getTime() - $("algus").value;
}

// }}}
// javaTestiTiksuja() {{{

// Java testide vaheline tiksuja

function javaTestiTiksuja() {
    sekundeid -= 1;
    $("sekundeid").innerHTML = sekundeid;
    if (sekundeid > 0) {
      taimer = setTimeout("javaTestiTiksuja()", 1000);
      return;
    }
    window.location = baseurl + "/kiirus/java.html?raport=1";
}

// }}}
// }}}
// traceroute {{{
// alustaTraceroute() {{{

// Traceroute alustamine

function alustaTraceroute() {
  tracerouteTimeout = 60;
  taimer = setTimeout("tracerouteTiksuja()", 1000);

  $("teave").innerHTML = teave;
  $("teave").setAttribute("style", "display: block;");
  $('tracerouteauk').src = baseurl + '/cgi/traceroute.html';
  testOnLoad = connect('tracerouteauk', 'onload', lopetaTraceroute);
}

// }}}
// lopetaTraceroute() {{{

// Kutsutakse välja siis, kui Traceroute IFRAME omadega valmis saab

function lopetaTraceroute(katkesta) {
  clearTimeout(taimer);
  disconnectAll($("tracerouteauk"));
  if (katkesta != 1)
    $("teave").innerHTML = 'Traceroute lõpetas töö edukalt';
  if ( $("ametnik") != null)
    window.location = baseurl + "/ametnik/vali_test.html";
}

// }}}
// tracerouteTiksuja {{{

// Traceroute edenemise tiksuja

function tracerouteTiksuja() {
  if ($("tiksuja") != null)
    $("tiksuja").innerHTML = tracerouteTimeout;
  tracerouteTimeout--;
  if (tracerouteTimeout >= 0)
    taimer = setTimeout("tracerouteTiksuja()", 1000);
  else {
    katkestaTraceroute();
    $("teave").innerHTML =
      $("teave").innerHTML + ' Traceroute ületas ajapiirangu';
    lopetaTraceroute(1);
  }
}

// }}}
// katkestaTraceroute {{{

function katkestaTraceroute() {
  $("teave").innerHTML = 'Traceroute katkestatud.';
  clearTimeout(taimer);
  if ($("edasiliikumine") != null)
    htmlNahtavaks(1, "edasiliikumine")
  if (get_browser() == "IE")
    document.execCommand("Stop");
  else
    window.stop();
}

// }}}
// }}}
// vormide abivahendid {{{
// vormValiCSV() {{{

function vormValiCSV() {
  getElement("loading").innerHTML="Andmete laadimine...";
  if ($("otsing_valjund").value == "CSV") {
    // CSV korral tühistame ajutiselt vormi onSubmit väärtuse, postitame vormi
    // uuesti ja siis taastame onSubmit väärtuse
    vorm = document.getElementsByName("otsing")[0];
    oldSubmit = vorm.onsubmit;
    vorm.onsubmit = '';
    vorm.submit();
    vorm.onsubmit = oldSubmit;
    return 1;
  }
  return 0;
}

// }}}
// ametnikuTestideAlgus() {{{

function ametnikuTestideAlgus() {
  if ($("test_ok") != null)
    window.location="/traceroute/ametnik.html";
}

// }}}
// }}}

// vim:set ts=2 sw=2 et encoding=utf-8 foldmethod=marker:
