﻿///compress=true

var w = new String();
var chars = 0;
var timer;
var a;
var kb;
var st = new Date();
var et = new Date();
var results = [];
var divResults;
var word_display;
var words = [
    'test',
    'joeka',
    'reaction',
    'typewriter',
    'Capital',
    'joeka.net',
    'scelerisque',
    'necessary',
    'condimentum',
    'lollipop',
    'vestibulum',
    'aWkWaRd',
    'maintenance',
    'institutions',
    'stewardesses'
    ];


function initializeTest() {

    if (!divResults) divResults = $('results');
    if (!word_display) word_display = $('word_display');

    chars = 0; kb = 0; a = 100;

    var i;

    while (!i || words[i] == w)
        i = Math.floor(Math.random() * words.length);

    w = words[i];
    word_display.innerHTML = w;
    word_display.className = '';

    txtWords = $('txtWords');
    txtWords.value = '';
    txtWords.focus();
}

function startTimer() {
    st = new Date();
}
function endTimer() {
    et = new Date();
    //alert((et.getTime() - st.getTime()) / 1000);

    var s = (et.getTime() - st.getTime()) / 1000;
    word_display.addClass('done');

    results.insert(0, word_display.innerHTML + ' - ' + new String(s).padRight(5, '0') + 's - ' + a + '%');
    if (results.length > 10)
        results.removeAt(10);
        
    divResults.innerHTML = '';
    for (var i = 0; i < results.length; i++) {
        divResults.innerHTML += (i == 0 ? '<span style="color:#333;">' : '') + results[i] + (i == 0 ? '</span>' : '') + '<br />';
    }
    
    updateResult(w, s, a);
}
function checkValidKeys(e) {

    if (window.event) // IE
        keynum = e.keyCode;
    else if (e.which) // Netscape/Firefox/Opera
        keynum = e.which;

    switch (keynum) {

        case 8:
        case 37:
        case 38:
        case 39:
        case 40:
            return false;

        case 13:
            initializeTest();
            return false;
        default:
            return true;
    }
}

function checkKey(e) {
    if (chars == 0)
        startTimer();

    if (window.event) // IE
        keynum = e.keyCode;
    else if (e.which) // Netscape/Firefox/Opera
        keynum = e.which;

    if (w.charCodeAt(chars) == keynum) {

        var highlightedWord = "";
        highlightedWord += "<span>";
        for (var i = 0; i < w.length; i++) {
            if (w.charCodeAt(chars) == w.charCodeAt(i) && i >= chars) {
                highlightedWord += w.substring(i, i + 1);
                highlightedWord += "</span>";
            } else
                highlightedWord += w.substring(i, i + 1);
        }

        word_display.innerHTML = highlightedWord;



        chars++;
        if (chars == w.length) {
            endTimer();
        }
        return true;
    }
    else {
        kb++;
        a = 100 - Math.ceil((kb / w.length) * 100);
        a = kb == 0 ? 100 : (a < 0 ? 0 : a);
        
        return false;
    }


}




function updateResult(w, s, a) {

    txtWords.value = "please wait...";
    txtWords.disabled = "disabled";
    

    Ekina.JSPB.invoke({
        assemblyName: "App_Code",
        className: "JoekaNet.TypingTest",
        methodName: "Save",
        args: [
        { type: "string", data: w },
        { type: "string", data: s },
        { type: "int", data: a }
			]
    }, updateResult_Callback);
    
    if (pageTracker)
        pageTracker._trackPageview('/Typing-Test/' + w);
}

function updateResult_Callback(ret) {
     populateGrid();
}


function populateGrid() {
    Ekina.JSPB.invoke({
        assemblyName: "App_Code",
        className: "JoekaNet.TypingTest",
        methodName: "GetCollection"
        }, populateGrid_Callback);
}
function populateGrid_Callback(ret) {

    var table = $("table_results");
    var tBody = $("table_results_body");


    while (tBody.hasChildNodes()) { tBody.removeChild(tBody.lastChild); }

    for (var j = 0; j < ret.length; j++) {
        populateResultRow(tBody, ret[j]);
    }


    txtWords.value = "";
    txtWords.disabled = "";
    initializeTest();

}


function populateResultRow(tBody, result) {


    var row = tBody.insertRow(tBody.rows.length);

    if (result.Word == w)
        row.className = "highlight";

    var col;


    col = row.insertCell(row.cells.length);
    col.innerText = result.Word;
    col = row.insertCell(row.cells.length);
    col.innerText = result.Count;
    col.style.textAlign = "center";
    col = row.insertCell(row.cells.length);
    col.innerText = result.FastestSpeed;
    col.style.textAlign = "center";
    col = row.insertCell(row.cells.length);
    col.innerText = result.SlowestSpeed;
    col.style.textAlign = "center";
    col = row.insertCell(row.cells.length);
    col.innerText = result.AvgSpeed;
    col.style.textAlign = "center";
    col = row.insertCell(row.cells.length);
    col.innerText = result.BestAccuracy;
    col.style.textAlign = "center";
    col = row.insertCell(row.cells.length);
    col.innerText = result.WorstAccuracy;
    col.style.textAlign = "center";
    col = row.insertCell(row.cells.length);
    col.innerText = result.AvgAccuracy;
    col.style.textAlign = "center";
       

    //var aTween = Ekina.UI.Effects.Tween.alpha(cols[1], 50, { duration: 2, func: Ekina.UI.Effects.Tween.Regular.Out });
    //aTween.start();
}