var dconv;

$(function () {
    dconv = new DataConverter();
    
    if (location.search.match(/debug/)) {
        // パラメータにdebugが含まれていた場合デバッグモードで動作
        dconv.isDebug = true;
    }
    
    // 変換実行ボタンクリック時の動作
    $("#exec").click( function () {
        dconv.scriptExecClick();
        return false;
    });
    
    // スクリプトを見るボタンクリック時の動作
    $("#view").click( function () {
        dconv.scriptViewClick();
        return false;
    });
    
    $("#usage").click( function () {
        $("#usageMessage")
            .show()
            .dialog({
                modal: true,
                resizable: false,
                title: "使い方",
                width: 600,
                height: 330,
                overlay: {
                    opacity: 0.5,
                    background: "blue"
                }
            });
    });
    
    //scriptList.sort(function (a, b) {
    //    return a.caption.localeCompare(b.caption);
    //});

    // スクリプト一覧
    var list = $("#scriptList");
    list.append(
        $("<option>").attr("value", "").html("処理を選んで下さい")
    );
    for (var i = 0; i < scriptList.length; i++) {
        var item = scriptList[i];
        list.append(
            $("<option>").attr("value", item.name).text(item.caption)
        );
    }
    
    // 強制的に再描画させる(これをやらないとIE7でボタンの位置が変わらない)
    list.css('margin-right', '0.25em');

    // Ajaxリクエストのキャッシュ対応
    if (dconv.isDebug) {
        $(document.body).ajaxSend(function (event, xhr, options) {
            dconv.ajaxSend(event, xhr, options);
        });
    }
    
});

function DataConverter() {
    this.scriptName = '';
    this.script;
    this.scriptText = '';
    this.isDebug = false;
}

DataConverter.prototype.scriptExecClick = function () {
    var self = this;

    // 選択されているスクリプトが何かを取得する
    var script = $("#scriptList").val();
    
    if (script == '') {
        alert('処理を選んで下さい。');
        return false;
    }
    if (!this.isDebug) {
        if (script == this.scriptName) {
            // スクリプト読み込み済み
            this.scriptExec();
            return false;
        }
    }
    this.scriptName = script;
    
    this.scriptDownload({
        file: script,
        success: function (data) {
            self.scriptExecClickSuccess(data);
        }
    });
}

// opt.file   : スクリプトファイル名
//    .success: ダウンロード成功時に実行するメソッド
DataConverter.prototype.scriptDownload = function (opt) {
    var self = this;
    $.ajax({
        url: "script/" + opt.file + ".js",
        type: "GET",
        data: {
        },
        dataType: 'data',
        success: function (data) {
            opt.success(data);
        },
        error: function (xhr, status, e) {
            self.buttonExecClickError(xhr, status, e);
        },
        beforeSend: function (xhr) {
            self.buttonExecClickBefore(xhr);
        },
        complete: function (xhr, status) {
            self.buttonExecClickComplete(xhr, status);
        }
    });
}

DataConverter.prototype.scriptExecClickSuccess = function(data) {
    try {
        this.setScript(data);
        this.scriptExec();
    } catch (e) {
        alert(e);
    }
}

DataConverter.prototype.scriptExec = function (){
    try {
        var result = this.script(this.getSourceData());
        this.setDestinationData(result);
    } catch (e) {
        alert(e);
    }
}

DataConverter.prototype.buttonExecClickError = function(xhr, status, e) {
    this.script = '';
    
    var message = '';
    message += 'データ取得エラーです。';
    message += "\n";
    message += 'しばらく待ってから再度実行して下さい。';
    
    alert(message);
}

DataConverter.prototype.buttonExecClickBefore = function(xhr) {
    $("#exec").attr("disabled", true);
    $("#view").attr("disabled", true);
}

DataConverter.prototype.buttonExecClickComplete = function(xhr, status) {
    $("#exec").attr("disabled", false);
    $("#view").attr("disabled", false);
}

DataConverter.prototype.getSourceData = function() {
    return $("#source").val();
}

DataConverter.prototype.setDestinationData = function(val) {
    $("#dest").val(val);
}

DataConverter.prototype.ajaxSend = function(event, xhr, options) {
    xhr.setRequestHeader(
        "If-Modified-Since", "Thu, 01 Jan 1970 00:00:00 GMT");
}

DataConverter.prototype.scriptViewClick = function () {
    var self = this;
    
    // 選択されているスクリプトが何かを取得する
    var script = $("#scriptList").val();
    
    if (script == '') {
        alert('処理を選んで下さい。');
        return false;
    }
    
    if (!this.isDebug) {
        if (script == this.scriptName) {
            // スクリプト読み込み済み
            this.scriptView();
            return false;
        }
    }
    this.scriptName = script;
    
    this.scriptDownload({
        file: script,
        success: function (data) {
            self.scriptViewClickSuccess(data);
        }
    });
}

DataConverter.prototype.scriptViewClickSuccess = function(data) {
    try {
        this.setScript(data);
        this.scriptView();
    } catch (e) {
        alert(e);
    }
}

DataConverter.prototype.setScript = function (script) {
    eval('this.script = ' + script);
    if (jQuery.browser.msie) {
        // IEの場合textareaにデータをセットする際に
        // \rでないと改行しないため、置換処理を行う
        // \nは空白になるので削除する
        script = script.replace(/\r?\n/g, "\r");
    }
    this.scriptText = script;
}

DataConverter.prototype.scriptView = function () {
    if (! $("body").is(":has('#scriptDisplay')")) {
        // #scriptDisplayが存在していない場合に作成する
        $("body").append(
            $("<div>")
                .attr("id", 'scriptDisplay')
                .append(
                    $("<textarea>").attr("id", "scriptArea")
                )
        );
    }
    
    $("#scriptArea").val(this.scriptText);
    $("#scriptDisplay")
        .dialog({
            modal: true,
            resizable: false,
            title: "スクリプト表示",
            width: 600,
            height: 330,
            overlay: {
                opacity: 0.5,
                background: "blue"
            }
        });

    // ダイアログ内部のマージンを調整
    $(".ui-dialog-content").css("margin", "0.25em");
    // IEで表示がずれるので強制的に再描画させる
    $("#scriptArea").css("margin", 0);
}
