var display_on;
var all_dakuten;
var all_yoon;
var all_dakuten_yoon;
var max_intensive = 10;


var Kana = {
    use_dakuten : 0,
    use_yoon : 0,
    gojuon_rows : [ "a", "k", "s", "t", "n", "h", "m", "y", "r", "w", "n" ],
    dakuten_rows : [ "g", "z", "d", "b", "p" ],
    gojuon_cols : [ "a", "i", "u", "e", "o" ],
    yoon_cols : [ "ya", "yu", "yo" ],
    geminates : [ 'k', 's', 't', 'h', 'g', 'z', 'd', 'b', 'p' ],
    which_kana : "hiragana",

    "force_all" : function(elem, on_off) {
        var id = elem.id.replace(/^all_/, '');
        var syllables = [];
		if (id.substr(0, 5) == 'vowel') {
			syllables = ['a', 'e', 'i', 'o', 'u'];
		} else if (id.search(/[aiueo]/) != -1) {
			syllables = $H(Kana.active).keys().findAll(function(k) { return (k.substr(k.length - 1) == id); });
		} else if (id.search(/[kstnhmyrw]/) != -1) {
			syllables = $H(Kana.active).keys().findAll(function(k) {
				if (k.length > 1 && k.substr(0, 1) == id) return true;
				if (id == 'h' && k == 'fu' || id == 't' && k == 'chi') return true;
				return false;
			});
		}
    	syllables.each(function(key) {
            Kana.active[key] = on_off;
			$(key).removeClassName('active');
			$(key).removeClassName('inactive');
			$(key).addClassName((on_off == 1) ? 'active' : 'inactive');
    	});
    },
    "html_write" : function(txt) {
        txt = txt.replace(/ou/g, 'oo');
        txt = txt.replace(/aa/g, '&#257;');
        txt = txt.replace(/ee/g, '&#275;');
        txt = txt.replace(/ii/g, '&#299;');
        txt = txt.replace(/oo/g, '&#333;');
        txt = txt.replace(/uu/g, '&#363;');
        return txt;
    },
    "inactive_col_items" : function(elem) {
        var ret = [];
        var count = -1;
        var num = get_column_number(elem);
        $(elem).up('tbody').childElements().each(function(row) {
            count++;
            if (count == 0 || count > Kana.gojuon_rows.length) return;
            var cell = get_nth_cell(row, num);
            if (Kana.is_inactive(cell)) {
                ret.push(cell);
            }
        });
        return ret;
    },
    "inactive_row_items" : function(row) {
        var ret = [];
        var count = -1;
        $(row).childElements().each(function(cell) {
        	count++;
        	if (count == 0 || count > Kana.gojuon_cols.length) return;
            if (Kana.is_inactive(cell)) {
                ret.push(cell);
            }
        });
        return ret;
    },
    "is_active" : function(elem) {
        return $(elem).classNames().include('active');
    },
    "is_inactive" : function(elem) {
        return $(elem).classNames().include('inactive');
    },
    "num_active" : function() {
    	return $H(Kana.active).findAll(function(x) { return x.value; }).length;
    },
    "random_words" : function() {
        var wordlist = [];
        var use_syllables = $H(Kana.active).keys().findAll(function(k) { return Kana.active[k]; });
        for (var i = 0; i < 100; i++) {
            var num_syl = Math.ceil(Math.random() * use_syllables.length * (1 + (10 - use_syllables.length) * .1));
            if (num_syl < 3) num_syl = 3;
            var item = { "romaji":"","kana":"","gloss":"&nbsp;" };
            var since_space = 0;
            var last = '';
            var block = 0;
            var num;
            for (var j = 0; j < num_syl; j++) {
                num = Math.floor(Math.random() * use_syllables.length);
                while (block && num == last) {
                    num = Math.floor(Math.random() * use_syllables.length);
                }
                (num == last) ? block = 1 : block = 0;
                item.kana += use_syllables[num] + ' ';
                last = num;
                since_space++;
                if (Math.floor(Math.random() * use_syllables.length) < since_space) {
                    item.kana += ' * ';
                    since_space = 0;
                }
            }
            item.romaji = item.kana.replace(/\*/g, ' ');
            wordlist.push(item);
        }
        return wordlist;
    },
    "rows" : function() {
        var ret = Kana.gojuon_rows;
        if (Kana.use_dakuten) {
            ret = ret.concat(Kana.dakuten_rows);
        }
        return ret;
    },
    "send" : function() {
        if ($('intensive_drill').checked) {
            Words = Kana.random_words();
            start_test();
        } else {
            var use_options = '';
            if (Kana.use_dakuten) use_options += "dakuten";
            if (Kana.use_yoon) use_options += " yoon";
            var use_syllables = $H(Kana.active).collect(function(pair){
                if (pair.value){return pair.key;}
            }).join(" ").replace(/ +/g, ' ');
            new Ajax.Request('./kana-drill-getwords.php', {
                method: 'get',
                parameters: { data: [Kana.which_kana, use_options, use_syllables].join(";") },
                onSuccess: function(req) {
                    Words = eval("(" + req.responseText + ")");
                    start_test();
                }
            });
        }
    },
    "set_intensive" : function() {
        if (Kana.num_active() > max_intensive) {
            $('intensive_drill').disabled = true;
            $('intensive_label').addClassName('greyed');
        } else {
            $('intensive_drill').disabled = false;
            $('intensive_label').removeClassName('greyed');
        }
    },
    "set_others" : function() {
        if ($('intensive_drill').checked) {
            $('use_dakuten').disabled = true;
            $('dakuten_label').addClassName('greyed');
            $('use_yoon').disabled = true;
            $('yoon_label').addClassName('greyed');
        } else {
            $('use_dakuten').disabled = false;
            $('dakuten_label').removeClassName('greyed');
            $('use_yoon').disabled = false;
            $('yoon_label').removeClassName('greyed');
        }
    },
    "switch_kana" : function() {
        if (Kana.which_kana == 'hiragana') {
            Kana.which_kana = 'katakana';
            $('head1').innerHTML = $('head1').innerHTML.replace(/Hiragana/, 'Katakana');
            $('switch').innerHTML = $('switch').innerHTML.replace(/Katakana/, 'Hiragana');
            document.title = document.title.replace(/Hiragana/, 'Katakana');
        } else {
            Kana.which_kana = 'hiragana';
            $('head1').innerHTML = $('head1').innerHTML.replace(/Katakana/, 'Hiragana');
            $('switch').innerHTML = $('switch').innerHTML.replace(/Hiragana/, 'Katakana');
            document.title = document.title.replace(/Katakana/, 'Hiragana');
        };
    },
    "toggle_all" : function() {
        var on_off = $('everything').innerHTML.search(/Activate/) + 1;
        $H(Kana.active).keys().each(function(k) { Kana.active[k] = on_off; });
        Kana.update_table();
    },
    "toggle_state" : function(elem) {
        if ($(elem).id.substr(0, 4) == 'all_') {
            Kana.force_all(elem, elem.innerHTML.search(/Activate/) + 1);
        } else {
            Kana.active[elem.id] = Math.abs(Kana.active[elem.id] - 1);
        }
        Kana.set_intensive();
        Kana.update_table();
    },
    "update_compounds" : function() {
        var dakuten = $$('.dakuten');
        if (Kana.use_dakuten) {
        	$A(dakuten).each(function(dak) {
                var id = dak.id;
                if (! id) return;
                var src = Kana.derivation[id.substr(0, id.length - 1)] + id.substr(id.length - 1);
                if ($H(Kana.phonetic_transform).keys().include(src)) {
                    src = Kana.phonetic_transform[src];
                }
                if (Kana.is_active(src)) {
                    dak.removeClassName('inactive');
                    dak.addClassName('active');
                } else {
                    dak.removeClassName('active');
                    dak.addClassName('inactive');
                }
            });
        }
        var yoon = $$('.yoon');
        if (Kana.use_yoon) {
            $A(yoon).each(function(yo) {
                var id = yo.id;
                if (! id) return;
                var i_src = id.substr(0, id.length - 1).replace(/y/, '') + 'i';
                var y_src = 'y' + id.substr(id.length - 1);
                if (Kana.is_active(i_src) && Kana.is_active(y_src)) {
                    yo.removeClassName('inactive');
                    yo.addClassName('active');
                } else {
                    yo.removeClassName('active');
                    yo.addClassName('inactive');
                }
            });
        }
        var dakuten_yoon = $$('.dakuten_yoon');
        if (Kana.use_dakuten && Kana.use_yoon) {
            $A(dakuten_yoon).each(function(dy) {
                var id = dy.id;
                if (! id) return;
                var first = id.substr(0, 1);
                if (id.substr(0, 2) == 'jy') first = 'dj';
                first += 'i';
                var second = 'y' + id.substr(id.length - 1);
                if (Kana.is_active(first) && Kana.is_active(second)) {
                    dy.removeClassName('inactive');
                    dy.addClassName('active');
                } else {
                    dy.removeClassName('active');
                    dy.addClassName('inactive');
                }
            });
        }
    },
    "update_gojuon" : function() {
        var idx;
        if (Kana.use_dakuten) {
        	all_dakuten.each(function(elem) { elem.style.display = display_on; });
            if (Kana.use_yoon) {
            	all_dakuten_yoon.each(function(elem) { elem.style.display = display_on; });
            }
        } else {
        	all_dakuten.each(function(elem) { elem.style.display = 'none'; });
        	all_dakuten_yoon.each(function(elem) { elem.style.display = 'none'; });
        }
        if (Kana.use_yoon) {
        	all_yoon.each(function(elem) { elem.style.display = display_on; });
            if (Kana.use_dakuten) {
            	all_dakuten_yoon.each(function(elem) { elem.style.display = display_on; });
            }
        } else {
        	all_yoon.each(function(elem) { elem.style.display = 'none'; });
        	all_dakuten_yoon.each(function(elem) { elem.style.display = 'none'; });
        }
        $H(Kana.active).keys().each(function(id) {
            $(id).removeClassName('active');
            $(id).removeClassName('inactive');
            $(id).addClassName(Kana.active[id] ? 'active' : 'inactive');
        });
        var letters = (Kana.which_kana == 'hiragana') ? Kana.hira : Kana.kata;
        var label;
        $$('td').each(function(cell) {
        	if ($H(letters).keys().include(cell.id)) {
                if ($H(Kana.label_transform).keys().include(cell.id)) {
                    label = Kana.label_transform[cell.id];
                } else {
                    label = cell.id;
                }
                cell.innerHTML = label + "&nbsp; " + letters[cell.id];
        	}
        });
    },
    "update_headers" : function() {
    	$$('td').each(function(cell) {
            if (cell.id && cell.id.substr(0, 4) == 'all_') {
                if (get_column_number(cell) == 0) {
                    if (Kana.inactive_row_items(cell.parentNode).length > 0) {
                        cell.removeClassName('deactivate');
                        cell.addClassName('activate');
                        cell.innerHTML = cell.innerHTML.replace(/Deactivate/, "Activate");
                    } else {
                        cell.removeClassName('activate');
                        cell.addClassName('deactivate');
                        cell.innerHTML = cell.innerHTML.replace(/Activate/, "Deactivate");
                    }
                } else {
                    if (Kana.inactive_col_items(cell).length > 0) {
                        cell.removeClassName('deactivate');
                        cell.addClassName('activate');
                        cell.innerHTML = cell.innerHTML.replace(/Deactivate/, "Activate");
                    } else {
                        cell.removeClassName('activate');
                        cell.addClassName('deactivate');
                        cell.innerHTML = cell.innerHTML.replace(/Activate/, "Deactivate");
                    }
                }
            } else if (cell.id && cell.id == 'everything') {
                if (Kana.num_active() > 1) {
                    cell.removeClassName('activate');
                    cell.addClassName('deactivate');
                    cell.innerHTML = cell.innerHTML.replace(/Activate/, "Deactivate");
                } else {
                    cell.removeClassName('deactivate');
                    cell.addClassName('activate');
                    cell.innerHTML = cell.innerHTML.replace(/Deactivate/, "Activate");
                }
            }
    	});
    },
    "update_table" : function() {
        Kana.update_gojuon();
        Kana.update_compounds();
        Kana.update_headers();
    },
    "write" : function(txt) {
        txt = txt.replace(/\*/g, '&nbsp;').replace(/ /g, '');
        var ret = '';
        var letters = (Kana.which_kana == 'hiragana') ? Kana.hira : Kana.kata;
        var last = '';
        textchunk:
        while (txt.length) {
            if (txt.substr(0, 1) == '&') {
                ret += txt.substr(0, txt.indexOf(';'));
                txt = txt.substr(txt.indexOf(';'));
                continue textchunk;
            }
            if (txt.substr(0, 1) == last) {
                ret += letters['choon'];
                txt = txt.substr(1);
                last = '';
                continue textchunk;
            }
            for (var n = 3; n > 0; n--) {
                var key = txt.substr(0, n).toLowerCase();
                if ($H(letters).keys().include(key)) {
                    ret += letters[key];
                    txt = txt.substr(n);
                    if (Kana.which_kana == 'katakana') last = key.substr(key.length - 1);
                    continue textchunk;
                }
                if (key.length == 2 && 
                        Kana.geminates.include(key.substr(0, 1)) && 
                        key.substr(0, 1) == key.substr(1)) {
                    ret += letters['sokuon'];
                    txt = txt.substr(1);
                    if (Kana.which_kana == 'katakana') last = key.substr(key.length - 1);
                    last = '';
                    continue textchunk;
                }
                if (key == "'") {
                    txt = txt.substr(1);
                    continue textchunk;
                }
            }
            ret += txt.substr(0, 1);
            txt = txt.substr(1);
            if (Kana.which_kana == 'katakana') last = key.substr(key.length - 1);
        }
        return ret.replace(/ /g, '&nbsp;&nbsp; ');
    },

    
    "active" : {
        "a" : 1, "i" : 1, "u" : 1, "e" : 1, "o" : 1,
        "ka" : 1, "ki" : 1, "ku" : 0, "ke" : 0, "ko" : 1,
        "sa" : 0, "shi" : 1, "su" : 1, "se" : 0, "so" : 0,
        "ta" : 1, "chi" : 1, "tsu" : 1, "te" : 1, "to" : 1,
        "na" : 0, "ni" : 1, "nu" : 0, "ne" : 1, "no" : 0,
        "ha" : 0, "hi" : 1, "fu" : 1, "he" : 0, "ho" : 0,
        "ma" : 0, "mi" : 1, "mu" : 0, "me" : 0, "mo" : 0,
        "ya" : 1, "yu" : 0, "yo" : 0,
        "ra" : 1, "ri" : 0, "ru" : 0, "re" : 0, "ro" : 0,
        "wa" : 0, "wi" : 0, "we" : 0, "wo" : 0,
        "n" : 1
    },
    "hira" : {
        "a":"&#x3042;","i":"&#x3044;","u":"&#x3046;","e":"&#x3048;","o":"&#x304A;",
        "ka":"&#x304B;","ki":"&#x304D;","ku":"&#x304F;","ke":"&#x3051;","ko":"&#x3053;",
        "sa":"&#x3055;","shi":"&#x3057;","su":"&#x3059;","se":"&#x305B;","so":"&#x305D;",
        "ta":"&#x305F;","chi":"&#x3061;","tsu":"&#x3064;","te":"&#x3066;","to":"&#x3068;",
        "na":"&#x306A;","ni":"&#x306B;","nu":"&#x306C;","ne":"&#x306D;","no":"&#x306E;",
        "ha":"&#x306F;","hi":"&#x3072;","fu":"&#x3075;","he":"&#x3078;","ho":"&#x307B;",
        "ma":"&#x307E;","mi":"&#x307F;","mu":"&#x3080;","me":"&#x3081;","mo":"&#x3082;",
        "ya":"&#x3084;","yu":"&#x3086;","yo":"&#x3088;",
        "ra":"&#x3089;","ri":"&#x308A;","ru":"&#x308B;","re":"&#x308C;","ro":"&#x308D;",
        "wa":"&#x308F;","wi":"&#x3090;","we":"&#x3091;","wo":"&#x3092;",
        "n":"&#x3093;",
        "ga":"&#x304C;","gi":"&#x304E;","gu":"&#x3050;","ge":"&#x3052;","go":"&#x3054;",
        "za":"&#x3056;","ji":"&#x3058;","zu":"&#x305A;","ze":"&#x305C;","zo":"&#x305E;",
        "da":"&#x3060;","dji":"&#x3062;","dzu":"&#x3065;","de":"&#x3067;","do":"&#x3069;",
        "ba":"&#x3070;","bi":"&#x3073;","bu":"&#x3076;","be":"&#x3079;","bo":"&#x307C;",
        "pa":"&#x3071;","pi":"&#x3074;","pu":"&#x3077;","pe":"&#x307A;","po":"&#x307D;",
        "kya":"&#x304D;&#x3083;","kyu":"&#x304D;&#x3085;","kyo":"&#x304D;&#x3087;",
        "sha":"&#x3057;&#x3083;","shu":"&#x3057;&#x3085;","sho":"&#x3057;&#x3087;",
        "cha":"&#x3061;&#x3083;","chu":"&#x3061;&#x3085;","cho":"&#x3061;&#x3087;",
        "nya":"&#x306B;&#x3083;","nyu":"&#x306B;&#x3085;","nyo":"&#x306B;&#x3087;",
        "hya":"&#x3072;&#x3083;","hyu":"&#x3072;&#x3085;","hyo":"&#x3072;&#x3087;",
        "mya":"&#x307F;&#x3083;","myu":"&#x307F;&#x3085;","myo":"&#x307F;&#x3087;",
        "rya":"&#x308A;&#x3083;","ryu":"&#x308A;&#x3085;","ryo":"&#x308A;&#x3087;",
        "gya":"&#x304E;&#x3083;","gyu":"&#x304E;&#x3085;","gyo":"&#x304E;&#x3087;",
        "ja":"&#x3058;&#x3083;","ju":"&#x3058;&#x3085;","jo":"&#x3058;&#x3087;",
        "jya":"&#x3062;&#x3083;","jyu":"&#x3062;&#x3085;","jyo":"&#x3062;&#x3087;",
        "bya":"&#x3073;&#x3083;","byu":"&#x3073;&#x3085;","byo":"&#x3073;&#x3087;",
        "pya":"&#x3074;&#x3083;","pyu":"&#x3074;&#x3085;","pyo":"&#x3074;&#x3087;",
        "sokuon":"&#x3063;","choon":"&#x30FC;"
    },
    "kata" : {
        "a":"&#x30A2;","i":"&#x30A4;","u":"&#x30A6;","e":"&#x30A8;","o":"&#x30AA;",
        "ka":"&#x30AB;","ki":"&#x30AD;","ku":"&#x30AF;","ke":"&#x30B1;","ko":"&#x30B3;",
        "sa":"&#x30B5;","shi":"&#x30B7;","su":"&#x30B9;","se":"&#x30BB;","so":"&#x30BD;",
        "ta":"&#x30BF;","chi":"&#x30C1;","tsu":"&#x30C4;","te":"&#x30C6;","to":"&#x30C8;",
        "na":"&#x30CA;","ni":"&#x30CB;","nu":"&#x30CC;","ne":"&#x30CD;","no":"&#x30CE;",
        "ha":"&#x30CF;","hi":"&#x30D2;","fu":"&#x30D5;","he":"&#x30D8;","ho":"&#x30DB;",
        "ma":"&#x30DE;","mi":"&#x30DF;","mu":"&#x30E0;","me":"&#x30E1;","mo":"&#x30E2;",
        "ya":"&#x30E4;","yu":"&#x30E6;","yo":"&#x30E8;",
        "ra":"&#x30E9;","ri":"&#x30EA;","ru":"&#x30EB;","re":"&#x30EC;","ro":"&#x30ED;",
        "wa":"&#x30EF;","wi":"&#x30F0;","we":"&#x30F1;","wo":"&#x30F2;",
        "n":"&#x30F3;",
        "ga":"&#x30AC;","gi":"&#x30AE;","gu":"&#x30B0;","ge":"&#x30B2;","go":"&#x30B4;",
        "za":"&#x30B6;","ji":"&#x30B8;","zu":"&#x30BA;","ze":"&#x30BC;","zo":"&#x30BE;",
        "da":"&#x30C0;","dji":"&#x30C2;","dzu":"&#x30C5;","de":"&#x30C7;","do":"&#x30C9;",
        "ba":"&#x30D0;","bi":"&#x30D3;","bu":"&#x30D6;","be":"&#x30D9;","bo":"&#x30DC;",
        "pa":"&#x30D1;","pi":"&#x30D4;","pu":"&#x30D7;","pe":"&#x30DA;","po":"&#x30DD;",
        "kya":"&#x30AD;&#x30E3;","kyu":"&#x30AD;&#x30E5;","kyo":"&#x30AD;&#x30E7;",
        "sha":"&#x30B7;&#x30E3;","shu":"&#x30B7;&#x30E5;","sho":"&#x30B7;&#x30E7;",
        "cha":"&#x30C1;&#x30E3;","chu":"&#x30C1;&#x30E5;","cho":"&#x30C1;&#x30E7;",
        "nya":"&#x30CB;&#x30E3;","nyu":"&#x30CB;&#x30E5;","nyo":"&#x30CB;&#x30E7;",
        "hya":"&#x30D2;&#x30E3;","hyu":"&#x30D2;&#x30E5;","hyo":"&#x30D2;&#x30E7;",
        "mya":"&#x30DF;&#x30E3;","myu":"&#x30DF;&#x30E5;","myo":"&#x30DF;&#x30E7;",
        "rya":"&#x30EA;&#x30E3;","ryu":"&#x30EA;&#x30E5;","ryo":"&#x30EA;&#x30E7;",
        "gya":"&#x30AE;&#x30E3;","gyu":"&#x30AE;&#x30E5;","gyo":"&#x30AE;&#x30E7;",
        "ja":"&#x30B8;&#x30E3;","ju":"&#x30B8;&#x30E5;","jo":"&#x30B8;&#x30E7;",
        "jya":"&#x30C2;&#x30E3;","jyu":"&#x30C2;&#x30E5;","jyo":"&#x30C2;&#x30E7;",
        "bya":"&#x30D3;&#x30E3;","byu":"&#x30D3;&#x30E5;","byo":"&#x30D3;&#x30E7;",
        "pya":"&#x30D4;&#x30E3;","pyu":"&#x30D4;&#x30E5;","pyo":"&#x30D4;&#x30E7;",
        "sokuon":"&#x30C3;","choon":"&#x30FC;"
    },
    "label_transform" : {
        "dji" : "ji*",
        "dzu" : "zu*",
        "jya" : "ja*",
        "jyu" : "ju*",
        "jyo" : "jo*"
    },
    "phonetic_transform" : {
        "si" : "shi",
        "ti" : "chi",
        "tu" : "tsu",
        "hu" : "fu"
    },
    "derivation" : {
        "g" : "k",
        "z" : "s",
        "j" : "s",
        "d" : "t",
        "dj" : "t",
        "dz" : "t",
        "b" : "h",
        "p" : "h"
    }
};

var Words = [
    { romaji: "katakana", kana: "ka ta ka na", gloss: "katakana, a writing system" },
    { romaji: "hiragana", kana: "hi ra ga na", gloss: "hiragana, a writing system" },
    { romaji: "kanji", kana: "ka n ji", gloss: "kanji; Chinese-based writing system" }
];

var Drill = {
    "shown" : 0,
    "right" : 0,
    "wrong" : 0,
    "guesses" : 0,
    
    "has_looped" : 0,
    
    "give_up" : function() {
        Drill.guesses++;
        $('kana_romaji').innerHTML = Kana.html_write(Words[0].romaji);
        $('kana_romaji').style.display = 'block';
        new Effect.Puff('kana_romaji', { duration: 7.0 });
        setTimeout(Drill.next_word, 4000);
    },
    "next_word" : function() {
        if (Drill.has_looped) {
            var n = Math.floor(Words.length * 2 / 3);
            if (n < 1) n = Words.length;
            var x = Words.length - Math.ceil(Math.random() * n);
            Words.unshift(Words.splice(x, 1)[0]);
        } else {
            Words.unshift(Words.pop());
        }
        Drill.shown++;
        if (Drill.shown >= Words.length) Drill.has_looped = 1;
        Drill.show_word();
    },
    "score_word" : function() {
        var orig = $('enter_romaji').value;
        var entered = Drill.strip($('enter_romaji').value);
        var actual = Drill.strip(Words[0].romaji);
        var special = Words[0].gloss.match(/[{\[]([^\]\}]+)[}\]]/g);
        if (special) {
			special = special.map(function(m) { return m.toLowerCase().replace(/[-\{\}\[\] ]/g, ''); });
        }
        if (entered == actual || special && (special.include(orig) || special.include(entered))) {
            Drill.right++;
            $('right').innerHTML = Drill.right;
            $('guesses').innerHTML = Drill.right + Drill.wrong;
            $('gloss').innerHTML = Drill.strip_brackets(Words[0].gloss);
            $('kana_show').style.color = '#060';
            new Effect.Highlight('kana_show', { startcolor: "#ffffff", endcolor: "#ccffcc", duration: 2.5 });
            $('kana_romaji').innerHTML = Kana.html_write(Words[0].romaji);
            setTimeout(Drill.next_word, 4000);
        } else {
            Drill.wrong++;
            $('kana_show').style.color = '#c00';
            new Effect.Highlight('kana_show', { startcolor: "#ffffff", endcolor: "#ffcccc", duration: 2.5 });
            $('kana_romaji').innerHTML = 'Sorry, try again!';
            setTimeout(Drill.show_word, 4000);
        }
        $('kana_romaji').style.display = 'block';
        new Effect.Puff('kana_romaji', { duration: 2.0 });
    },
    "show_word" : function() {
        $('kana_show').style.backgroundColor = "#fff";
        $('kana_show').style.color = "#666";
        $('kana_show').innerHTML = Kana.write(Words[0].kana);
        $('enter_romaji').value = '';
        $('enter_romaji').focus();
        $('gloss').innerHTML = '&nbsp;';
        $('shown').innerHTML = Drill.shown;
        $('items').innerHTML = Words.length;
        $('right').innerHTML = Drill.right;
        $('guesses').innerHTML = Drill.right + Drill.wrong;
    },
    "strip_brackets" : function(txt) {
        txt = txt.replace(/[\[\]]/g, '');
        txt = txt.replace(/\{[^\}]+\}/g, '');
        return txt;
    },
    "strip" : function(txt) {
        txt = txt.toLowerCase().replace(/[ \.,\?!:;]/g, '');
        txt = txt.replace(/[-\[\]]/g, '');
        txt = txt.replace(/\{[^\}]+\}/g, '');
        return txt;
    }
};


var Saved = {
    "beginner1" : {
        "title" : "Beginner",
        "kana"  : "a i u e o ka ki ku ke ko n",
        "desc"  : "Just the first ten items, plus <i>n</i>. A great place to start learning!"
    },
    "top15" : {
        "title" : "Popular 15",
        "kana"  : "n i u ka ma ki ri ta na to shi sa ha",
        "desc"  : "The 15 most often-used hiragana on the system. Another good starting point."
    },
    "drill_cons" : {
        "title" : "Drill: Curvy Consonants",
        "kana"  : "sa ki chi ra ha ho ma yo",
        "desc"  : "A few easily-confused squiggles. Makes a great Intensive Drill!",
        "opts"  : "drill"
    },
    "drill_vowel" : {
        "title" : "Drill: Curvy Vowels",
        "kana"  : "a o re ne wa nu no me ru ro",
        "desc"  : "A few more easily-confused squiggles. Makes a great Intensive Drill!",
        "opts"  : "drill"
    },
    "drill_line" : {
        "title" : "Drill: Lines",
        "kana"  : "i ri ko ni ta ha ho ke",
        "desc"  : "A few easily-confused line-based hiragana. Makes a great Intensive Drill!",
        "opts"  : "drill"
    },
    "compounds" : {
        "title" : "Compounds/Small Chars",
        "kana"  : "u tsu ya yu yo ki shi chi ni hi mi ri",
        "desc"  : "Learn about <i>u</i> vs. <i>tsu</i>, <i>sokuon</i>, and <i>y&#333;on</i>.",
        "opts"  : "yoon"
    },
   "*katakana_start" : {
        "title" : "Katakana Start",
        "kana"  : "ri ka se shi he ki ni ya mo",
        "desc"  : "Get started on katakana with these, that look similar to their hiragana counterparts.",
        "opts"  : "katakana"
    }
};




function populate_saved() {
	$H(Saved).keys().each(function(key) {
        if (key.search(/\*/) == 0) return;
        var opt = Builder.node('option', { value: key }, Saved[key]['title']);
        $('stored').appendChild(opt);
    });
    $('stored').selectedIndex = 0;
    $('stored').selectedIndex = -1;
}

function load_saved(key) {
    var turn_on = Saved[key]['kana'].split(/ /);
    $H(Kana.active).keys().each(function(kana) {
        if (turn_on.include(kana)) {
            Kana.active[kana] = 1;
        } else {
            Kana.active[kana] = 0;
        }
    });
    $('stored_desc').innerHTML = Saved[key]['desc'];
    if (Saved[key]['opts']) {
        if (Saved[key]['opts'].search(/dakuten/) != -1) {
            $('use_dakuten').checked = true;
            Kana.use_dakuten = 1;
        }
        if (Saved[key]['opts'].search(/yoon/) != -1) {
            $('use_yoon').checked = true;
            Kana.use_yoon = 1;
        }
        if (Saved[key]['opts'].search(/drill/) != -1) {
            $('intensive_drill').checked = true;
        }
        if (Saved[key]['opts'].search(/katakana/) != -1) {
            Kana.which_kana = 'hiragana';
            Kana.switch_kana();
        }
    } else {
        $('use_dakuten').checked = false;
        Kana.use_dakuten = 0;
        $('use_yoon').checked = false;
        Kana.use_yoon = 0;
        $('intensive_drill').checked = false;
    }
    Kana.update_table();
    Kana.set_intensive();
}

function setup_click_handlers() {
    $$('.clickable').each(function(elem) {
    	if (elem.id == 'everything') {
    		Event.observe(elem, 'click', function() { Kana.toggle_all(); });
    	} else {
    		Event.observe(elem, 'click', function() { Kana.toggle_state(elem); });
		}
    });
    $$('#help .header').each(function(elem) {
    	Event.observe(elem, 'click', function() { toggle_subhelp(elem); });
    });
    $$('.link.help').each(function(elem) {
    	Event.observe(elem, 'click', function() { toggle_help(); });
    });
    Event.observe($('use_dakuten'), 'click', function() { Kana.use_dakuten = Math.abs(Kana.use_dakuten - 1); Kana.update_table(); });
    Event.observe($('use_yoon'), 'click', function() { Kana.use_yoon = Math.abs(Kana.use_yoon - 1); Kana.update_table(); });
    Event.observe($('intensive_drill'), 'click', function() { Kana.set_others(); });
    Event.observe($('switch'), 'click', function() { Kana.switch_kana(); Kana.update_table(); });
    Event.observe($('test_me'), 'click', function(evt) { Kana.send(); evt.stop(); });
    Event.observe($('stored'), 'click', function() { load_saved($('stored').getValue()); });
    Event.observe($('submit_guess'), 'click', function(evt) { Drill.score_word(); evt.stop(); });
    Event.observe($('give_up'), 'click', function(evt) { Drill.give_up(); evt.stop(); });
}


function toggle_help() {
    if ($('help').style.display != 'block') {
        $('help').style.display = 'block';
        $('help_on_off').innerHTML = 'Turn off help';
        $('stored').style.visibility = 'hidden';
    } else {
        $('help').style.display = 'none';
        $('help_on_off').innerHTML = 'Need help?';
        $('stored').style.visibility = 'visible';
    }
}

function toggle_subhelp(anchor) {
    anchor = $(anchor);
    var target = anchor.up().next();
    if (anchor.classNames().include('open')) {
    	Effect.BlindUp(target, { duration: 0.5, afterFinish: function() {
	        anchor.removeClassName('open');
	        anchor.addClassName('closed');
		}});
    } else {
		Effect.BlindDown(target, { duration: 0.5, afterFinish: function() {
	        anchor.removeClassName('closed');
	        anchor.addClassName('open');
		}});
    }
}


function get_column_number(elem) {
    if (elem.tagName.toUpperCase() != 'TD') return false;
    var cells = $(elem.parentNode).childElements();
    for (var i = 0; i < cells.length; i++) {
    	if (cells[i] == elem) return i;
    }
}

function get_nth_cell(row, n) {
	return $(row).childElements()[n];
}

function start_test() {
    new Effect.Fade('setup', {
    	afterFinish: function() {
    		$('testing').show();
    		Drill.next_word();
		}
	});
}


function init() {
    $('use_dakuten').checked = false;
    $('use_yoon').checked = false;
    try {
        $('all_a').style.display = 'table-cell';
        display_on = 'table-cell';
    } catch (e) {
        display_on = 'block';
    }
    all_dakuten = $$('.dakuten');
    all_yoon = $$('.yoon');
    all_dakuten_yoon = $$('.dakuten_yoon');
    Kana.update_table();
    $('max_intensive').innerHTML = max_intensive;
    setup_click_handlers();
    Kana.set_intensive();
    populate_saved();
    new Effect.Appear('test_me');
}

document.observe("dom:loaded", init);



