var fhtml_loading_file_path = "/fhtml/fhtml-loading.gif";

var next_load_params = {};

function registFhtmlEvent(self) {
    var fhtml_mask_display = $('#fhtml_mask').css('display');
    if ('none' == fhtml_mask_display || undefined == fhtml_mask_display) {
        // まだfhtmlを1枚も表示していないときにスクロールした方がいい
        // fhtmlの中から別のfhtmlを呼ぶ時もアニメーションがつくとうっとしい
        $("html ,body").animate({
            scrollTop: 0
        }, 500);
    }
    var fhtml = new FHtmlByStep();
    fhtml.show(self);
    return false;
}

$(document).ready(function(){
/*
 * 廃止予定

    $("a.fhtml").live("click", function(e) {
        var fhtml = new FHtml();
        fhtml.show($(this));
        $("html ,body").animate({
            scrollTop: 0
        }, 500);
        return false;
    });
*/
    $("a.fhtml_steps").live("click", function(e) {
        return registFhtmlEvent($(this));
    });
    $("a.fhtml-steps, a.fhtml-step, a.fhtml_step").live("click", function(e) {
        alert('スペルミスです。正しくはfhtml_stepsです。');
        return registFhtmlEvent($(this));
    });
});

// 表示するfhtmlのステップ名を取得する
function get_step_titles(step_data, current_rel) {
    var step_titles = [];
    var current_index = 0;
    var i = 0;
    for (var rel_key in step_data) {
        step_titles.push(step_data[rel_key].title);
        if (rel_key == current_rel) {
            current_index = i;
        }
        i += 1;
    }
    return [current_index, step_titles];
}

// 表示するfhtmlの前後のrelを取得する
function get_prev_and_next_rel(step_data, current_rel) {
    var do_get = false;
    var prev_rel = null;
    for (var rel_key in step_data) {
        if (do_get) {
            return [prev_rel, rel_key];
        }
        if (rel_key == current_rel) {
            do_get = true;
        } else {
            prev_rel = rel_key;
        }
    }
    return [prev_rel, null];
}

// jQuery.loadするURLを取得
function get_url(a_href) {
    if (a_href.lastIndexOf("javascript", 0) < 0
        && a_href.lastIndexOf("#", 0) < 0
        && a_href.lastIndexOf("?", 0) < 0) {
        return a_href;
    }
    return null;
}

// fhtml共通初期パラメータ
var fhtml_params = {
    "close_callback": function() {},
    "init_post_data": {}
};
// 画面が表示されるタイミングとかで、fhtmlの初期パラメータを設定する
function init_fhtml(params) {
    var _f = fhtml_params;
    for (var k in fhtml_params) {
        if (k in params) {
           _f[k] = params[k];
        }
    }
    fhtml_params = _f;
    next_load_params = fhtml_params['init_post_data'];
}

// windowだけ閉じる
function close_fhtml_window_only() {
    $("#fhtml_loading").hide();
    $("div.fhtml_window, div.fhtml2_window").remove();
}

// fhtml全て閉じる
function close_fhtml() {
    close_fhtml_on_fhtml_mask();
    $("#fhtml_loading").hide();
    $("div.fhtml_window, div.fhtml2_window").remove();
    $("#fhtml_mask").fadeOut(400,function(){
        if ($.browser.msie && $.browser.version < 7){
            $("#folder_navi select,#file_navi select").show();}
    });
}

// 指定のfhtmlを閉じる
function close_fhtml_window(fhtml_id, fhtml_rel) {
    $("#fhtml_window_" + fhtml_id + "_" + fhtml_rel).remove();
}

// 指定のfhtmlを非表示にする
function hidden_fhtml_window(fhtml_id, fhtml_rel) {
  $("#fhtml_window_" + fhtml_id + "_" + fhtml_rel).css("top", "-2500px");
}

function visible_fhtml_window(fhtml_id, fhtml_rel){
  $("#fhtml_window_" + fhtml_id + "_" + fhtml_rel).css("top", "0px");
}
function visible_fhtml_window_w(wind){
  wind.css("visibility", "visible");
  wind.css("top", "0px");
}
// 引数の辞書のサイズ取得
function dict_size(dict) {
    var size = 0;
    for (var key in dict) {
        size += 1;
    }
    return size;
}

// 画面遷移時に表示していた指定のfhtmlを閉じてからいく
function forward_with_current_close(current_fhtml_id, current_fhtml_rel, fhtml_id, fhtml_rel) {
    close_fhtml_window(current_fhtml_id, current_fhtml_rel);
    return {"fhtml_id": fhtml_id, "fhtml_rel": fhtml_rel};
}

// fhtmlの上にfhtmlをかぶせてシンプルなメッセージボックスを表示する
function show_simple_msg_box(title, get_msg_function) {
    show_fhtml_on_shtml(title, get_msg_function, null);
}
function show_fhtml_on_shtml(title, get_msg_function, get_footer_function) {
    var contents = $('<div>').addClass('fhtml2_inner').append(
        $('<div>').addClass('fhtml2_header lbalphafilter').append(
            $('<h5>').text(title)
        )
    ).append(
        $('<div>').addClass('fhtml2_contents lbalphafilter').append(
            $('<div>').addClass('fhtml2_contents_body').append(get_msg_function())
        )
    )
    if (get_footer_function != null) {
        $('<div>').addClass('fhtml2_footer lbalphafilter').append(get_footer_function()).appendTo(contents);
    }
    contents = $('<div>').addClass('fhtml2_window fhtml2_window_layer fhtml_message_box').css({'visibility': 'visible'}).append(contents);
    contents.appendTo($('body'));

    show_fhtml_mask();
    $('#fhtml_mask').css('z-index', '1002');
    lbalphafilter();
}

// fhtml on fhtmlのmaskを消す
function close_fhtml_on_fhtml_mask() {
    $('#fhtml_mask').removeAttr('style');
}

// シンプルメッセージボックスを消す
function close_simple_msg_box() {
    $('div.fhtml_message_box').remove();
    close_fhtml_on_fhtml_mask();
}

// 更新時に表示する処理中メッセージを表示する
function show_processing_msg_box() {
    show_simple_msg_box('処理中です', function() {
        return $('<div>').addClass('fhtml_message').append(
            $('<p class="outline">').text('ただいま処理中です、しばらくお待ちください。')
        ).append(
            $('<p class="detail1">').text('処理が正常に完了した場合、自動で更新またはこの画面が閉じられます。')
        ).append(
            $('<div>').addClass('loading').append(
                $('<img>').attr('src', '/img/thickbox/loadingAnimation.gif')
            )
        )
    });
}

// ダウロード用の処理中メッセージを表示する
function show_processing_msg_box_dl(fhtml_id) {
    show_simple_msg_box('ダウンロード中です', function() {
        return $('<div>').addClass('fhtml_message').append(
            $('<p class="outline">').text('ただいまダウンロード中です、しばらくお待ちください。')
        ).append(
            $('<p class="detail1">').text('ダウンロードには時間がかかる可能性があります。')
        ).append(
            $('<div>').addClass('loading').append(
                $('<img>').attr('src', '/img/thickbox/loadingAnimation.gif')
            )
         )
    });

    if ('multi_file_download' == fhtml_id) {
        // ファイル複数ダウンロードは全部は閉じない
        setTimeout(function() {
            close_simple_msg_box()
            if ($.browser.msie && $.browser.version < 7) {
                $("#folder_navi select, #file_navi select").show();
            }
        }, 3000);
        return;
    }

    setTimeout(function() {
        close_simple_msg_box()
        step_data = eval("fhtml_step_" + fhtml_id);
        for (var k in step_data) {
            close_fhtml_window(fhtml_id, k);
        }
        $("#fhtml_loading").hide();
        $("#fhtml_mask").fadeOut();
    }, 3000);
}


// 共通ポップアップエラーを表示する
function show_error_msg_box(detail) {
    show_base_error_msg_box('エラーが発生しました', detail, 'attention');
}

// 機能にアクセスする権限が無いとかのワーニングを表示する場合
function show_warn_msg_box(detail) {
    show_base_error_msg_box('ご確認ください', detail, 'warn');
}

function show_fhtml_mask() {
    if ($("#fhtml_mask").length == 0) {
        var mask = $("<div>").attr("id", "fhtml_mask");
        $(document.body).append(mask);
        $(document.body).append(
            $("<div>").attr("id", "fhtml_loading").addClass("fhtml_window_layer").append(
                $("<img>").attr("src", fhtml_loading_file_path)
            )
        );
    } else {
        $("#fhtml_mask").remove();
        $('#fhtml_loading').remove();
        show_fhtml_mask();
    }
}

function show_base_error_msg_box(outline, detail, styleClass) {
    error_body = function() {
        var wrapper = $('<div>').addClass('fhtml_contents_bodyinner_step3 fhtml_error_box');
        var errmsg = $('<div>').text(outline);
        var error = $('<div>').addClass('fhtml_attention');
        $('<p>').addClass(styleClass).text(detail).appendTo(error);
        wrapper.append(errmsg).append(error);
        return wrapper;
    }
    error_footer = function() {
        return $('<ul>').addClass('fhtml2_footer_action').append(
            $('<li>').addClass('close').append(
                $('<a>').attr('href', 'javascript: void(0)').click(function(e) {
                    close_fhtml();
                })
            )
        )
    }
    show_fhtml_on_shtml(outline, error_body, error_footer);
}

var FHtml = function() {
    this.initialize.apply(this, arguments);
}
FHtml.prototype = {
    initialize: function() {
        this.self = null;
        this.id = null;
        this.rel = null;
        this.title = null;
        this.step_data = null;
        this.current_step_index = null;
    },
    set_self: function(self) {
        this.self = self;
        if (self.attr("id").length > 0) {
            this.id = self.attr("id");
        } else if (self.attr("href").length > 0) {
            href = self.attr("href");
            var fhtml_id_index = href.indexOf("#");
            if (fhtml_id_index == 0) {
                this.id = href.slice(1, href.length);
            } else if (fhtml_id_index > 0) {
                this.id = href.slice(fhtml_id_index + 1, href.length);
            } else {
                this.id = href;
            }
        } else {
            this.id = 'default';
        }
        this.rel = self.attr("rel").length > 0 ? self.attr("rel") : 'default';
        this.title = self.attr("title");
    },
    get_step_data: function () {
        if (this.step_data == null) {
            var rel = this.self.attr("rel");
            this.step_data = eval("fhtml_step_" + this.id);
        }
        return this.step_data;
    },
    closing: function() {

        var step_data = this.get_step_data()[this.rel];
        var callback = fhtml_params["close_callback"];
        // ステップ毎のclosing_callbackがあるなら、その引数に
        // 共通のclosing_callback関数を入れて内部で判断してやってもらう
        var callback_result = null;
        if ('closing_callback' in step_data) {
            callback_result = eval(step_data["closing_callback"])(callback);
        } else {
            callback_result = callback();
        }
        if (!callback_result && undefined != callback_result) {
            return;
        }
        close_fhtml();

    },
    create_header_steps: function() {
        return null;
    },
    create_footer: function() {
        return null;
    },
    create_header: function() {

        var self = this;
        var h = $("<div>").addClass("fhtml_header").addClass('lbalphafilter');
        var title = $("<h2>").text(this.title).addClass("fhtml_header_title");
        var header_steps = this.create_header_steps();
        return h.append(title).append(header_steps);

    },
    append_mask_and_contents: function() {

        var self = this;
        create_popup = function() {
            wind = $("<div>").attr("id", "fhtml_window_" + self.id + "_" + self.rel).addClass("fhtml_window").addClass("fhtml_window_layer");
            var header = self.create_header();
            var contents = $("<div>").attr("id", "fhtml_contents_" + self.id + "_" + self.rel).addClass("fhtml_contents lbalphafilter");
            var footer = self.create_footer();
            var inner = $("<div>").addClass("fhtml_inner").append(header).append(contents).append(footer);
            $(document.body).append(wind.append(inner));
            $("#fhtml_loading").show();
        }

        show_fhtml_mask();

        var step_data = this.get_step_data();
        if ('nocache' in step_data[this.rel]) {
            create_popup();
            return false;
        } else {
            var wind = $("#fhtml_window_" + this.id + "_" + this.rel);
            if (wind.length == 0) {
                create_popup();
                return false;
            } else {
                visible_fhtml_window_w(wind);
                return true;
            }
        }
    },
    show: function(self) {
        if ($.browser.msie && $.browser.version < 7){
            $("#folder_navi select,#file_navi select");
            var file_navi_h = $("#file_navi").height();
            var folder_navi_h = $("#folder_navi").height();
            $("#folder_navi select,#file_navi select").hide();
            $("#file_navi").height(file_navi_h);
            $("#folder_navi").height(folder_navi_h);
	      }
        this.set_self(self);
        var cache = this.append_mask_and_contents();
        // 常に画面遷移したときに入力を初期化するなら、cacheをfalseにする
        if (!cache) {
            var step_data = this.get_step_data()[this.rel];
            var url = get_url(this.self.attr("href"));
            url = step_data["url"];
            var _self = this;
            var load_params = {};
            if (this.id + '_' + this.rel in next_load_params) {
                load_params = next_load_params[this.id + '_' + this.rel];
            }
            if ('load_callback' in step_data) {
                var callback_result = eval(step_data["load_callback"])();
                for (var k in callback_result) {
                    load_params[k] = callback_result[k];
                }
            }
            $("#fhtml_contents_" + this.id + "_" + this.rel).load(url, load_params, function() {
                var w = $("#fhtml_window_" + _self.id + "_" + _self.rel);
                visible_fhtml_window_w(w);
                // IE6で透過PNGとプルダウンがLightboxの上に表示される不具合対応
                if (typeof document.documentElement.style.maxHeight != "undefined") { //IE7以上、Firefox, Opera, Chrome等
                } else { //IE6
                    w.bgiframe();
                }
                lbalphafilter();
                imageReplace();
            });
        }
    }

}

// ステップ毎にmargin_leftを設定する
var step1_left_margin = [40];
var step2_left_margin = [40, 355];
var step3_left_margin = [40, 255, 465];
var step4_left_margin = [40, 205, 360, 517];

var FHtmlByStep = function() {
    this.initialize.apply(this, arguments);
}
FHtmlByStep.prototype = new FHtml();
FHtmlByStep.prototype.create_header_steps = function() {
    var step_data = this.get_step_data();
    var step_index_and_titles = get_step_titles(step_data, this.rel);
    var current_rel_index = step_index_and_titles[0];
    this.current_step_index = current_rel_index + 1;
    var step_titles = step_index_and_titles[1];
    var step_size = step_titles.length;
    var step_image_style_class = 'fhtml_step_list' + step_size + '_' + this.current_step_index;
    var step_title_style_class = 'fhtml_step_list' + step_size;
    var step_ul = $("<ul>").addClass("fhtml_step_list").addClass(step_image_style_class).addClass(step_title_style_class);
    for (var i in step_titles) {
        var step_li = $("<li>").append($("<span>").text(step_titles[i]));
        if (i == current_rel_index) {
            step_li.addClass('current');
        } else if (i < current_rel_index) {
            step_li.addClass('less');
        }
        step_li.css('margin-left', eval('step' + step_size + '_left_margin')[i] + 'px');
        step_ul.append(step_li);
    }
    return $("<div>").append(step_ul).addClass("fhtml_header_steps");

}
FHtmlByStep.prototype.create_footer = function() {

    var step_data = this.get_step_data();
    var current_step_data = step_data[this.rel];
    var next_capture = current_step_data["capture"];

    var footer = $("<div>").addClass("fhtml_footer lbalphafilter");
    var action_ul = $("<ul>").addClass("fhtml_footer_action").addClass('step').addClass('clearfix');
    var prev_and_next_rel = get_prev_and_next_rel(step_data, this.rel);
    var prev_rel = prev_and_next_rel[0];
    var next_rel = prev_and_next_rel[1];

    var _self = this;
    // prev
    if (prev_and_next_rel[0] != null || 'prev_callback' in current_step_data) {
        $("<li>").addClass('prev').append(
            $("<a>").text("戻る").attr('title', '戻る').click(function(e) {

                // 戻る時のコールバック
                var id = _self.id;
                var rel = prev_rel;
                if ('prev_callback' in current_step_data) {
                    // もし戻りが辞書で、その中にfhtml_id, fhtml_relがあれば、そのfhtmlを表示する
                    var callback_result = eval(current_step_data["prev_callback"])();
                    if (!callback_result && undefined != callback_result) {
                        return false;
                    }
                    if ('object' == (typeof callback_result).toString()) {
                        if ('fhtml_id' in callback_result && 'fhtml_rel' in callback_result) {
                            id = callback_result['fhtml_id'];
                            rel = callback_result['fhtml_rel'];
                            // fhtml_reloadがあったら、戻り値のid、rel画面をクローズしてリロードする
                            if ('fhtml_reload' in callback_result) {
                                close_fhtml_window(id, rel);
                            }
                        }
                    }
                }
                // 戻る時に自分自身をDOM上から消す
                if ('prev_with_close' in current_step_data) {
                    close_fhtml_window(_self.id, _self.rel);
                } else {
                    hidden_fhtml_window(_self.id, _self.rel);
                }

                // exValidationエラーけす
                removeFormWidget();

                visible_fhtml_window(id, rel);
            }).attr("href", "javascript: void(0);").attr("style", "color:white;")
        ).appendTo(action_ul);
    }
    // next
    if (next_capture != undefined) {
        $("<li>").addClass('next').append(
            $("<a>").attr("class", "fhtml_steps").click(function(e) {

                // コールバックがあるなら実行し、returnがfalseなら遷移はしない
                // それ以外なら、そのデータを次の画面表示のloadのパラメータにする
                var id = _self.id;
                var rel = next_rel;
                if ('next_callback' in current_step_data) {
                    var callback_result = eval(current_step_data["next_callback"])();
                    if (!callback_result && undefined != callback_result) {
                        return false;
                    }
                    if ('object' == (typeof callback_result).toString()) {
                        if ('fhtml_id' in callback_result && 'fhtml_rel' in callback_result) {
                            id = callback_result['fhtml_id'];
                            rel = callback_result['fhtml_rel'];
                            // fhtml_reloadがあったら、戻り値のid、rel画面をクローズしてリロードする
                            if ('fhtml_reload' in callback_result) {
                                close_fhtml_window(id, rel);
                            }
                        }
                    }
                    next_load_params[id + '_' + rel] = callback_result;
                }

                // exValidationエラーけす
                removeFormWidget();

                // aタグのidやrelも変えないと正しく遷移しない
                $(this).attr('id', id).attr('rel', rel);
                hidden_fhtml_window(_self.id, _self.rel);
            }).text(next_capture).attr("href", "javascript: void(0);").attr("title", this.title).attr("style", "color:white;")
        ).appendTo(action_ul);
    }

    // cancel
    var cancel_ul = $('<ul>').addClass('fhtml_footer_cancel');
    $('<li>').append($('<a>').attr('href', 'javascript: void(0)').attr({style:"color:white;", title:'キャンセルする'}).text('キャンセルする').click(function(e) {

        if ('cancel_callback' in current_step_data) {
            var callback_result = eval(current_step_data["cancel_callback"])();
            if (!callback_result) {
                return false;
            }
        }
        // exValidationエラーけす
        removeFormWidget();

        _self.closing();
    })).appendTo(cancel_ul);

    // 次や戻るが無かったらappendしない
    if (action_ul.find('*').length > 0) {
        footer.append(action_ul);
    } else {
        // キャンセルするとフッター上部との間にスペースを入れる
        footer.css({'height': '60px', 'padding-top': '10px'});
    }
    return footer.append(cancel_ul);

}

