/*
* $Id: trainer.js,v 1.5 2007/08/11 17:02:54 gnut Exp $
*/

var got_response = 0;
var typing_started;
var typing_ended;
var i;
var text_length;
var type_errors;
var typed_chars;

function createRequestObject() {
    var ro;
    var browser = navigator.appName;
    if(browser == "Microsoft Internet Explorer"){
        ro = new ActiveXObject("Microsoft.XMLHTTP");
    }else{
        ro = new XMLHttpRequest();
    }
    return ro;
}
var ajax = createRequestObject();


function sndReq(url) {
    //alert(url);
    ajax.open('get', url);
    ajax.onreadystatechange = handleResponse;
    ajax.send(null);
    got_response = 0;
}

function handleResponse() {
    if(ajax.readyState == 4){
        var response = ajax.responseText;
        original_text = response;
        //alert('restart ' + response);
        got_response = 1;
        restart();
        got_response = 0;
    }
}

function returnObjById( id )
{
    var returnVar;
    if (document.getElementById)
        returnVar = document.getElementById(id);
    else if (document.all)
        returnVar = document.all[id];
    else if (document.layers)
        returnVar = document.layers[id];
    return returnVar;
}

function restart()
{
    if (user_mode == 'lessons' && sub_lesson != '' && lesson != '' && got_response == 0) {
        var uri = './getstring.php?lesson=' + encodeURIComponent(lesson) + "&sublesson=" + encodeURIComponent(sub_lesson);
        //alert('getting uri: '+uri);
        sndReq(uri);
        return;
    }
    if (user_mode == 'phrases' && got_response == 0) {
        sndReq('./getstring.php?phrases=something');
        return;
    }
    //alert('restart');
    var or = returnObjById('original');
    var cw = returnObjById('catwalk');
    var rtrtxt = returnObjById('retrains');
    or.value = original_text;
    cw.value = '';
    text_length = original_text.length;
    i = 0;
    type_errors = 0;
    typed_chars = 0;
    re_train = 0;
	rtrtxt.value = 0;
    typing_started = 0;
    cw.focus();
}

function restore_background() {
    document.body.style.backgroundColor='white';
}

function blink_on_error() {
    document.body.style.backgroundColor='red';
    setTimeout('restore_background()',50);
}

function good_restart() {
    var time_total = (typing_ended - typing_started) / 1000  / 60;
    var speed_total =  Math.round(typed_chars / time_total);
    var speed_good = Math.round(text_length / time_total);
    if (type_errors == 0) {
        alert('Excellent!!!\nString finished\nspeed: ' + speed_total +'\nRestarting!');
    } else {
        alert('String finished\nerrors: ' + type_errors + ', speed: ' + speed_good + "/" + speed_total +'\nRestarting!');
    }
    restart();
}

var errors_in_word = 0;
var re_train = 0;

function key_pressed(event) {
    var cw = returnObjById('catwalk');
    var rtrtxt = returnObjById('retrains');
    var keynum = event.which;
    var keychar = String.fromCharCode(keynum);
    var need_char = original_text.charAt(i);
    var returnValue = true;
    // it's some magic key - we do not process them
	//alert('|'+keychar + '|' + keynum);
    if (keynum == 8 || keynum == 16) {
		// shift or backspace in opera
		//alert('FUCK');
		// still useless, opera does not block backspace, fuck opera developers
        return false;
    }
    if (keynum == '' || event.altKey || event.ctrlKey || event.metaKey) {
        return true;
    }
    // first char, remember when we started typing, to know the speed
    if (i == 0 && typing_started == 0) {
        var now = new Date();
        typing_started = now.getTime();
    }
    typed_chars ++ ;
    // check if right char is pressed
    if (need_char != keychar) {
        // wrong!
        if (need_char != ' ') {
            errors_in_word ++;
        }
        blink_on_error();
        returnValue = false;
        // alert(keychar + ' | ' + keynum);
        type_errors ++;
    } else {
        // right!

        if (i == (text_length - 1) || original_text.charAt(i+1) == ' ') { // the word finished
            //alert('finish: ' + errors_in_word);
            if (errors_in_word > 0) {
                re_train += 3;
				if (re_train > 6)
					re_train = 6;
            } else {
                if (re_train > 0)
                    re_train --;
            }
            rtrtxt.value = re_train;

            if (re_train > 0) {
                // we need to restart the last word;
                while(i>0 && original_text.charAt(i-1) != ' ') {
                    i--;
                }
                errors_in_word = 0;
                cw.value = cw.value.substring(0,i);
                return false;
            }
        }
        i++;
        if (i == text_length) {
            var now = new Date();
            typing_ended = now.getTime();
            setTimeout('good_restart()',100);
        }
    }
    return returnValue;
}

