MJL.event.add(window, "load", function(event) {
    MJL.enable.flash("flash", {version:7});
    MJL.enable.rollover("roll", {disable:"unroll"});

    //
    // 画像とテキスト (based on jQuery)
    //
    // 画像とテキストの並列処理を行う関数を返す高階関数
    function getImgParallelStyler(side) {
        // side は既定値しか認めない
        if ("left" != side && "right" != side) {
            throw Error("invalid side type: '"+side+"'");
        }
        // 実行関数
        return function() {
            var obj = $(this);
            var imgBlock = $("div.image:first-child", obj);
            var imgWidth = $("p.image img", imgBlock).width(); // 画像幅
            imgBlock.css("width", imgWidth+"px"); // 画像幅を強制
            // 別カラムの margin を調整
            $("div.column", obj).css("margin-"+side,
                                     imgBlock[0].offsetWidth+"px");
        };
    }
    // 実行
    $(".image-parallel.image-L").each(getImgParallelStyler("left"));
    $(".image-parallel.image-R").each(getImgParallelStyler("right"));
}, false);

// ================================================================
// MJL と無関係なコードはこの先に記述
// ================================================================

$(function() {
    // URL 取得
    var path = window.location.pathname.replace("index.html", "");

    // グローバルナビゲーション管理
    $("body.sales #ng-sales, body.designer #ng-designer, body.coordinator #ng-coordinator, body.supervisor #ng-supervisor").each(function(){
        $("img", this).each(function(){
            this.src = this.src.replace(/(\.[a-z]{3,}$)/, "_o$1"); // 現在地表示用の画像に置換
        });
        $(this).addClass("unroll"); // ロールオーバーを停止
    });
    // グレーアウトメニュー
    $("#ng-coordinator").addClass("unroll"); //「コーディネーター」をグレーアウト
    $("#ng-supervisor").addClass("unroll"); // 「現場監督」をグレーアウト

    // ローカルナビゲーション管理
    var $localNav = $("#nav-local");
    $("a", $localNav).each(function(){
        var _href = $(this).attr("href").replace("index.html", "");
        if (path == _href) {
            $(this).addClass("unroll"); // ロールオーバーを停止
            $("img", this).each(function(){
                this.src = this.src.replace(/(\.[a-z]{3,}$)/, "_o$1"); // 現在地表示用の画像に置換
            });
        }
    });

    // 担当者インデックス ポップアップ表示
    (function() {
        // 各種 class 属性値
        var classes = {
            enable : 'jsActive', // ポップアップ処理 有効化トリガ
            active : 'active'    // ポップアップ アクティブ化トリガ
        };
        // 非アクティブ画像 URI 生成条件
        var imgCond = {
            cond    : /(\.[^.]+)$/, // 条件
            replace : '_off$1'      // 置換文字列
        };
        // 非アクティブ画像キャッシュ
        var imgCache = {/* EMPTY */};
        // 各種 jQuery ラッピング キャッシュ
        var doc = $(document);
        var win = $(window);

        // 対象フックがあれば常に有効
        $('.box-index-01-wrap').each(function() {
            var root   = $(this);
            var list   = $('> ul', root);
            var items  = $('> li', list);
            var imgs   = $('> .main-photo img', items);
            var active = null; // 現在アクティブなアイテム

            // ポップアップ表示 有効化
            list.addClass(classes.enable);

            // ポップアップ位置を再調整
            win.bind('resize scroll', function() {
                active && active.trigger('setPosition');
            });

            // ポップアップ非表示
            doc.click(function() {
                if (active) {
                    active.removeClass(classes.active);
                    active = null;
                    imgs.trigger('imgEnable');
                }
            });

            // ポップアップ内で発生したイベントが document オブジェクトに伝搬し
            // てしまい、ポップアップ非表示が発生しうる問題を解決
            $('> .window', items).click(function(event) {
                event.stopPropagation();
            });

            // アクティブ・非アクティブ画像切替 設定
            imgs.each(function() {
                var img     = $(this);
                var enable  = img.attr('src');
                var disable = enable.replace(imgCond.cond, imgCond.replace);
                // 未アクティブ時の画像をキャッシュ
                if (!(disable in imgCache)) {
                    imgCache[disable] = document.createElement('img');
                    imgCache[disable].setAttribute('src', disable);
                }
                // 独自イベントベースにして非同期化
                img.bind('imgEnable', function() {
                    img.attr('src', enable);
                    return false;
                }).bind('imgDisable', function() {
                    img.attr('src', disable);
                    return false;
                });
            });

            // ポップアップ表示・非表示 設定
            items.each(function() {
                var item = $(this);
                var img  = $('> .main-photo img', item);

                // フォーカス用 a 要素を生成・ポップアップ表示を設定
                img.wrap('<a href="#"></a>').parent().click(function(event) {
                    if (active !== item) {
                        // ポップアップ表示
                        active && active.removeClass(classes.active);
                        active = item;
                        active.addClass(classes.active);
                        // 必ずポップアップ表示後に実行
                        active.trigger('setPosition');
                        // 画像切替
                        imgs.trigger('imgDisable'); // 一旦全て非アクティブ化
                        img.trigger('imgEnable');   // 対象のみアクティブ化
                        event.stopPropagation();
                    }
                    // デフォルトの挙動は常に無効化しておく
                    event.preventDefault();
                    // 現在アクティブな a 要素が再選択された場合は
                    // イベントをそのまま document オブジェクトまで bubble-up
                    // 結果的にポップアップ非表示とする
                });

                // ポップアップ位置 設定
                item.bind('setPosition', function() {
                    var popup  = $('> .window', this);
                        // ページ width/height
                        sW     = win.scrollLeft() + win.width(),
                        sH     = win.scrollTop()  + win.height(),
                        // 対象画像の絶対位置 (原点: ページ先頭左上)
                        imgPos = img.offset(),
                        // ポップアップ XY 座標 (原点: 包含要素)
                        pcX    = 0,
                        pcY    = img.outerHeight(),
                        // ポップアップ width/height
                        pW     = popup.outerWidth(),
                        pH     = popup.outerHeight(),
                        // ポップアップ 右端・下端 座標 (原点: ViewPort 左上)
                        pR     = imgPos.left + pcX + pW,
                        pB     = imgPos.top  + pcY + pH,
                        // 計算済ポップアップ XY 座標 (原点: 包含要素)
                        x      = pcX + (sW < pR ? sW - pR : 0),
                        y      = pcY + (sH < pB ? sH - pB : 0),
                        // 最小座標
                        minX   = img.outerWidth() - pW, // 画像右端とポップアップ右端が揃う
                        minY   = 0;                     // 画像上端とポップアップ上端が揃う
                    // 最小座標が ViewPort 端から飛び出してしまう場合は
                    // ViewPort 端でとどめておくようにする
                    if (minX < -imgPos.left) {
                        minX = -imgPos.left;
                    }
                    // 設定
                    popup.css({
                        left : minX < x ? x : minX,
                        top  : minY < y ? y : minY
                    });
                });
            });
        });
    })();
});

