var rePractice;

$(function () {
    rePractice = new RegexpPractice();
    
    if (location.search.match(/debug/)) {
        // パラメータにdebugが含まれていた場合デバッグモードで動作
        rePractice.isDebug = true;
    }
    
    // 確認ボタンクリック時の動作
    $(".check").click( function () {
        rePractice.check(this);
    });
    
    // 回答入力時の動作
    $(".matchPattern").keydown( function (e) {
        rePractice.inputAnswer(this, e);
    });
    $(".replaceString").keydown( function (e) {
        rePractice.inputAnswer(this, e);
    });
    $(".option").keydown( function (e) {
        rePractice.inputAnswer(this, e);
    });
    
    // 回答例ボタンクリック時の動作
    $(".exCheck").click( function () {
        rePractice.exampleAnswerShow(this);
    });
    
    // 目次作成
    var contents = $("<ul>");
    $("h2").each(function (i) {
        var title = $(this).text();
        var href = $(this).find("a").attr("name");
        // IE7で上手く行かない
        //var li = $("<li>").append(
        //    $("<a>").attr("href", "#" + href).text(title)
        //);
        var li = $("<li>").html(
            '<a href="#' + href + '">&raquo; ' + title + '</a>'
        );
        contents.append(li);
    });
    $("#contents").append(contents);
});

function RegexpPractice() {
    this.isDebug = false;
}

RegexpPractice.prototype.inputAnswer = function (self, e) {
    var code = e.keyCode;
    if (code != 13) {
        // enterキー以外の入力の場合は何もしない
        return;
    }
    
    // 確認ボタンのelementを取得
    var check = $(self).parent().find("input").get(0);
    
    // 確認ボタンクリックの動作を行う
    this.check(check);
}

RegexpPractice.prototype.check = function (self) {
    var input = $(self).parents(".practice").find(".input").val();
    var output = $(self).parents(".practice").find(".output").val();
    var matchPattern = $(self).parents("tr").find(".matchPattern").val();
    var replaceString = $(self).parents("tr").find(".replaceString").val();
    var option = $(self).parents("tr").find(".option").val();

    $(self).parents(".answer").find(".result").val('');
    
    if (matchPattern == '') {
        alert('マッチパターンを入力して下さい。');
        return false;
    }
    
    var regexp;
    try {
        regexp = new RegExp(matchPattern, option);
    } catch (e) {
        // 正規表現として不正な文字列だった
        return false;
    }
    var lines = input.split("\n");
    var resultData = '';
    
    for (var i = 0; i < lines.length; i++) {
        if (i != 0) {
            resultData += "\n";
        }
        var line = lines[i];
        resultData += lines[i].replace(regexp, replaceString);
    }
    $(self).parents(".answer").find(".result").val(resultData);
    
    if (output == resultData) {
        alert('正解です！');
    }
}

RegexpPractice.prototype.exampleAnswerShow = function (self) {
    var exMatchPattern = $(self).parent().find(".exMatchPattern").text();
    var exReplaceString = $(self).parent().find(".exReplaceString").text();
    var exOption = $(self).parent().find(".exOption").text();

    var answer = '';
    answer += "[ マッチパターン ]\n" + exMatchPattern + "\n";
    answer += "\n";
    answer += "[ 置換文字列 ]\n" + exReplaceString + "\n";
    if (exOption != '') {
        answer += "\n";
        answer += "[ オプション ]\n" + exOption + "\n";
    }
    
    alert(answer);
}
