(function ($) {
    $(function () {
        var url = window.location.href;
        var slideFrame = /slideframe/ig.test(url);
        var moveHorizon = true;
        var slideDuration = 1500;
        var slideTimer = 5000;
        var isIE = /*@cc_on!@*/false;
        
        inieSlideNews();
        initMainImages();
        
        //newsのスライド機能初期化
        function inieSlideNews(){
            var TIMER_DELAY = 5000; //切り替えタイマーの間隔（ミリ秒）
            if(slideTimer)TIMER_DELAY = slideTimer;
            var CHANGE_DURATION = moveHorizon ? 500 : 400;  //切り替えスライドアニメーションの時間（ミリ秒）
            if(slideDuration){
                CHANGE_DURATION = slideDuration;
            }
            TIMER_DELAY = TIMER_DELAY + CHANGE_DURATION;
            
            //internal
            //jQueryオブジェクト
            var $container = $("div.box-index-news");
            var $dl = $container.find("dl");
            var $dt = $dl.children("dt");
            var $dd = $dl.children("dd");
            //初期化用
            var items = [];     //Array.<jQueryObject…$(dt,dd)>
            var itemLength = $dt.length;    //newsの数
            //アクティブな要素のインデックス
            var currentIndex = 0;   //現在表示しているnewsのインデックス番号
            var timerID;
            var dlWidth = $dl.width();
            
            $dl.addClass("enable");
            storeData();
            initNews();
            playAuto(); //自動再生開始
            
            function storeData(){
                //itemsに対象要素を格納
                $dt.each(function(i){
                    items.push($([this,$dd.get(i)]));
                });            
            }
            
            function initNews(){
                //スタイル初期化
                items[0].show().css("top",0);//一番目を表示
                //水平移動時のみ
                if(moveHorizon){
                    $.each(items,function(i,$target){
                        $target.css({
                            height:"1.5em",
                            overflow:"hidden"
                        })
                    });
                }
                
                //イベントハンドラをセット   
                $dl.scroll(function(){
                    $dl.scrollTop(0);
                    return false;
                });
                
                $dd.find("a")
                .bind("focusin mouseover",function(){
                    stop();
                })
                .bind("focusout mouseout",function(){
                    $(this).blur();
                    playAuto();
                })
            }
            
            //自動再生開始
            function playAuto(){
                stop();
                timerID = setTimeout(changeNextNews,TIMER_DELAY);
            }
            
            //自動再生停止
            function stop(){
                if(typeof timerID != "undefined"){
                    clearTimeout(timerID);
                }
            }
            
            //newsの切り替え
            function changeNextNews(){
                var preIndex = currentIndex;
                currentIndex++;
                if(currentIndex>itemLength-1)currentIndex = 0;
                
                var $target = items[currentIndex];  //表示（上からスライド）要素
                var $pre = items[preIndex]; //非表示（下へスライド）要素
                
                if(moveHorizon){
                    $target.show().css({
                        left:dlWidth
                    }).animate({
                       left:0
                    },{
                        duration:CHANGE_DURATION,
                        complete:function(){
                            $target.scrollLeft(0);
                            $dl.scrollLeft(0);
                            $dt.scrollLeft(0);
                        }
                    });
                    
                    $pre.animate({
                        left:-dlWidth
                    },{
                        duration:CHANGE_DURATION,
                        complete:function(){
                            $pre.hide();
                        }
                    });

                }else{
                    $target.show().css({
                        top:-25
                    }).animate({
                       top:0 
                    },{
                        duration:CHANGE_DURATION,
                        complete:function(){
                            $target.scrollTop(0);
                            $dl.scrollTop(0);
                            $dt.scrollTop(0);
                        }
                    });
                    
                    $pre.animate({
                        top:25
                    },{
                        duration:CHANGE_DURATION,
                        complete:function(){
                            $pre.hide();
                        }
                    });
                }
                playAuto();
            }
        }

        //メインローテーションバナー機能初期化
        function initMainImages() {
            var TIMER_DELAY = 5000;
            var SLIDE_DURATION = 300;
            var CROSSFADE_DURATION = 200;
            var FRAME_IMG_SRC = "/common/images/top/img_frame.png";
       
            //internal
            //jqueryオブジェクト
            var $stage = $("#theme");
            var $mainImages = $("#theme-inner .mainvisual")
            var $thumbsListContainer = $("div.thumbs-list-container");
            var $listContainer = $("div.list-container");
            var $thumbsList = $("#theme ul");
            var $thumbsItems = $thumbsList.children("li");
            var itemLength = $thumbsItems.length;
            var $back = $stage.find(".back a").attr("tabIndex", -1);
            var $next = $stage.find(".next a").attr("tabIndex", -1);
            var $frameImage = $("<img>",{
                src:FRAME_IMG_SRC
            });
            var $frame = $("<a>", {
                href: "",
                tabIndex: -1
            });
            //初期化用
            var mainHrefList = [];//リンク先配列(main)
            var bannerHrefList = [];  //リンク先配列(banner)
            var targetList = [];    //リンクターゲット配列
            var arrowHeight = 15   //矢印画像の高さ
            var items = []; //対象要素
            var cellHeight = $thumbsItems.eq(0).outerHeight(true);  //listItemの高さ+listItemのマージン
            //状態管理フラグ
            var isMouseOvered = false;  //マウスオーバーされているかどうか
            var isFocusOut = true;  //フォーカスが外れているかどうか
            //$thumbsListの座標操作用
            var currentPosIndex = 0;    //$thumbsListの位置インデックス
            var maxReturnPos = currentPosIndex * (-cellHeight);
            var minReturnPos = (currentPosIndex + (itemLength - 3)) * (-cellHeight);
            var returnHeight = itemLength * cellHeight;
            var preThumbsListY = 0;
            //アクティブな要素のインデックス
            var currentItemIndex = 0;   //現在アクティブな要素のインデックス
            var itemIndexAtTheTop = 0;   //現在一番上に来ている要素のインデックス
            //フレーム位置等
            var frameIndex = 0; //フレームの位置インデックス
            var frameY = 0; //フレームの座標
            //メイン画像
            var preMainIndex = 0;   //前回のメイン画像
            var timerID;
            
            $stage.addClass("enable");
            storeData();
            initFrame();
            initThumbnais();
            initMainImages();
            setEventHandler();
            
            startTimer();
            
            function storeData(){
                $thumbsItems.each(function (i) {
                    var $this = $(this);
                    var $item = $this.find("a");
                    var $img = $this.find("img");
                    if(!$item.length){
                        $img.wrap("<a></a>");
                        $item = $this.find("a");
                        $item.attr("href","");
                    }
                    $item.data("index", i); //dataプロパティにindexを登録
                    bannerHrefList.push($item.attr("href"));  //リンク先保持
                    targetList.push($item.attr("target") || "_self");   //ターゲット保持
                    items.push($(this));    //jQUeryオブジェクト保持
                });
            }
            
            function initFrame(){
                //frameをDOMツリーに追加する（div.thumbs-list-container直下）
                $frame.attr({
                    href: bannerHrefList[0],
                    target: targetList[0]
                }).css({
                    position: "absolute",
                    top: arrowHeight,
                    left: 0
                }).append($frameImage).appendTo($thumbsListContainer)
            }
            
            function initMainImages(){
                $mainImages.each(function(i){
                    var $this = $(this);
                    var $a = $this.find("a");
                    mainHrefList.push($a.attr("href") || "");
                    
                    var $img = $this.find("img");
                    if(!$a.length){
                        $img.wrap("<a></a>");
                        $a = $this.find("a");
                    }
                    $a.attr({
                        tabIndex:-1,
                        href:mainHrefList[0],
                        target:targetList[0]
                    });
                    $img.data("defaultAlt",$img.attr("alt"));//alt保持
                });

                if(isIE){
                    $mainImages.hide().eq(0).show();
                }else{
                    $mainImages.css("opacity", 0).eq(0).css("opacity", 1)
                }
            }
            
            function initThumbnais(){
                $thumbsList.css({
                    height: cellHeight * itemLength
                });
                $thumbsItems.css("top", function (i, elem) {
                    this.style.top = 43 * i + (i * 3) + "px";
                });
                if(itemLength == 3){
                    $next.parent().css("visibility","hidden");
                    $back.parent().css("visibility","hidden");
                }else if(itemLength < 3){
                    $next.parent().css("visibility","hidden");
                    $back.parent().css("visibility","hidden");
                    startTimer = function(){};
                    stopTimer = function(){};
                }
            }
            
            function setEventHandler(){
                //フレーム＆メイン画像
                $frame.add($mainImages.find("a"))
                .mouseover(function(){
                    if(!$(this).attr("href")){
                        $frame.css("cursor","default");
                    }else{
                        $frame.css("cursor","pointer");
                    }
                    stopTimer();
                })
                .mouseout(function(){
                    startTimer();
                })
                .click(function(){
                    //href未設定なら遷移しない
                    if(!$(this).attr("href"))return false;
                });
                
                $frame.mouseover(function(){
                    $frame.attr({
                        alt:$thumbsList.find("img").eq(currentItemIndex).attr("alt")
                    });
                });
                
                $listContainer.scroll(function () {
                    $listContainer.scrollTop(0)
                    return false;
                });
                
                $mainImages.each(function(i){
                    var $img = $(this).find("img");
                    var $top = $mainImages.eq(itemLength -1 ).find("img");
                    $(this).find("a").mouseover(function(){
                        var $this = $(this);
                        var $img = $this.find("img");
                        if(!$this.attr("href")){
                            $this.css("cursor","default");
                        }else{
                            $this.css("cursor","pointer");
                        }
                        var $tgtImg = $mainImages.find("img").eq(currentItemIndex);
                        $top.attr("alt",$tgtImg.data("defaultAlt"));
                    });
                });

                $thumbsItems.each(function (i) {
                    //マウスオーバー時の挙動
                    $(this).mouseover(function () {
                        var relativeIndex = i - itemIndexAtTheTop; //表示場一番上が0となる
                        if (i < itemIndexAtTheTop) {
                            relativeIndex = (i + itemLength) - itemIndexAtTheTop;
                        }
                        isMouseOvered = true;//フラグオン
                        updateFrame(relativeIndex, "direct",false,true);//フォーカス当てる
                        isMouseOvered = false;//フラグオフ
                    
                    //tabキーの押下時の挙動
                    }).find("a").keydown(function(e){
                        var index = $(this).data("index");
                        if(e.which == 9){
                            //tabキー
                            if(!e.shiftKey){
                                //バナーの数が3以下の場合は2で終わり
                                if(itemLength <= 3){
                                    if(index == 2)return;
                                    updateFrame(index+1, "direct",false,false);
                                    return;
                                }                            
                                //末尾のアイテム以外なら移動させる
                                if(currentItemIndex != itemLength-1){
                                    e.preventDefault();
                                    moveTo(-1,true,true,true);  
                                }
                            //shift+tabキー
                            }else{
                                //バナーの数が3以下の場合は0で終わり
                                if(itemLength <= 3){
                                    if(index == 0)return;
                                    updateFrame(index-1, "direct",false,false);
                                    return;
                                }
                                
                                //先頭のアイテム以外なら移動させる
                                if(currentItemIndex != 0){
                                    e.preventDefault();
                                    moveTo(1,true,true,true);
                                }
                            }
                        }
                        
                    //フォーカスイン時の挙動
                    }).focusin(function(e){
                        var $this = $(this);
                        
                        //マウスオーバーされていたら無視する
                        if(isMouseOvered){
                            isFocusOut = false;
                            return;
                        }
                        
                        stopTimer();
                        
                        if(itemLength <= 3){
                            
                        }else{
                            var index = $this.data("index");//現在フォーカスが当たっているサムネのindex
                            //indexが0で、外からの移動なら
                            if(index == 0 && isFocusOut){   
                                var indexDist = currentItemIndex;//移動量
                                moveTo(indexDist,true,true,true);
                            //indexが最後の要素で、外からの移動なら
                            }else if(index == itemLength-1 && isFocusOut){ 
                                var indexDist = -((itemLength-1)-currentItemIndex);
                                moveTo(indexDist,true,true,true);//移動量
                            }                        
                        }
                        isFocusOut = false;
                        
                    //フォーカスアウト時の挙動
                    }).focusout(function(e){
                        setTimeout(function(){
                            var inItems = false;
                            var activeTarget = document.activeElement;

                            $thumbsItems.find("a").each(function(){
                                if(this == activeTarget){
                                    inItems = true;
                                    return false;
                                }
                            });
                            if(!inItems){
                                isFocusOut = true;   //リスト以外の要素にフォーカスが当たっている
                                startTimer();   //タイマースタート
                            }
                        },0);
                    });
                }).click(function(e){
                    //href未設定なら遷移しない
                    if(!$(this).find("a").attr("href"))return false;
                });

                $back.click(function (e) {
                    back();
                    return false;
                });
                
                $next.click(function (e) {
                    next();
                    return false;
                });
            }
            
            function back(){
                isFocusOut = false;
                moveTo(-1,false,true);
            }
            
            function next(){
                isFocusOut = false;
                moveTo(1,false,true);            
            }

            function pushItem() {
                items.push(items.shift());
            }

            function unshiftItem() {
                items.unshift(items.pop());
            }

            //ulをスライドさせる
            function moveTo(dist,fixFrame,endFocus,noTimer) {
                currentPosIndex += dist;

                //itemIndexAtTheTopを更新
                if (currentPosIndex >= 0) { 
                    itemIndexAtTheTop = (itemLength - (Math.abs(currentPosIndex) % itemLength)) % itemLength;
                } else {
                    itemIndexAtTheTop = Math.abs(currentPosIndex % itemLength);
                }

                //フレームをdist分移動させる（±1）
                updateFrame(dist, "dist", fixFrame,endFocus);
                
                //自動再生STOP
                stopTimer();
                
                //必要なら再生する（フォーカス時は再生しない）
                if(!noTimer){
                    startTimer();
                }
                //サムネを移動させる
                $thumbsList.stop().animate({
                    top: currentPosIndex * cellHeight   //topを調整
                }, {
                    duration: SLIDE_DURATION,
                    complete: function () {
                        //フレーム位置を再調整（for IE）
                        var y = currentPosIndex * cellHeight;
                        var yVector = y - preThumbsListY;
                        updateFrame(yVector, "yVector",fixFrame,endFocus);
                        
                        preThumbsListY = y;

                        if(currentPosIndex%itemLength == 0){
                            resetYPos();
                        }
                    },
                    step: function (y, obj) {
                        if (y > maxReturnPos) { //maxReturnPosを超えたらitemの位置を再計算する
                            unshiftItem();
                            minReturnPos += cellHeight;
                            maxReturnPos += cellHeight;
                            $.each(items, function (i) {
                                this.css("top", -maxReturnPos + i * cellHeight);
                            });
                        }
                        if (y < minReturnPos) { //maxReturnPos未満になったらitemの位置を再計算する
                            pushItem();
                            minReturnPos -= cellHeight;
                            maxReturnPos -= cellHeight;
                            $.each(items, function (i) {
                                this.css("top", -minReturnPos + (i - (itemLength - 3)) * cellHeight);
                            });
                        }
                        //ulの移動量を枠に反映させる
                        var yVector = y - preThumbsListY;
                        updateFrame(yVector, "yVector",fixFrame,endFocus);
                        preThumbsListY = y;
                    }
                });
            }
            
            //$thumbsListのy座標を0に戻す。その他初期化処理
            function resetYPos(){   
                //itemsリセット
                var resetItems = [];
                $.each(items,function(i,elem){
                    var index = (elem.find("a").data("index"));
                    resetItems[index] = elem;
                });
                items = resetItems;
                //その他リセット
                currentPosIndex = 0;
                maxReturnPos = currentPosIndex * (-cellHeight);
                minReturnPos = (currentPosIndex + (itemLength - 3)) * (-cellHeight);
                $thumbsList.css("top",0);
                $thumbsItems.css("top", function (i) {
                    this.style.top = cellHeight * i + "px";
                });
                preThumbsListY = 0;
            }

            //指定index（0,1,2）にフレームを配置する
            function setFrameByIndex(index) {
                frameY = index * cellHeight;
                //アニメーションする？
                if(slideFrame){
                    $frame.stop().animate({
                        top: frameY + arrowHeight
                    }, {
                        duration: slideFrame ? 200 : 0
                    });
                }else{
                    $frame.css("top", frameY + arrowHeight);
                }
            }

            //指定座標（y軸）にフレームを配置する
            function trailFrameByYPos(y) {
                $frame.css("top", y + arrowHeight);
            }

            //フレームの位置を変更する
            function updateFrame(value, type, fixFrame,endFocus) {
                //y座標を変更
                if (type == "yVector" && !fixFrame) { //trail ul
                    frameY += value;
                    if (frameY < 0) {
                        frameY = 0;
                    } else if (frameY > cellHeight * 2) {
                        frameY = cellHeight * 2
                    } else {
                        trailFrameByYPos(frameY);
                    }
                //indexで移動(相対値：+1 or -1)
                } else if (type == "dist" && !fixFrame) { //change index(+1 or -1)
                    var dist = value;
                    frameIndex += dist;
                    if (frameIndex < 0) {
                        frameIndex = 0;
                    } else if (frameIndex > 2) {
                        frameIndex = 2;
                    }
                //indexで移動（絶対値）
                } else if (type == "direct") { // 0 or 1 or 2
                    frameIndex = value;
                    setFrameByIndex(frameIndex);
                }
                
                //currentItemIndexを更新する
                var itemIndex = (frameIndex + itemIndexAtTheTop) % itemLength;
                if (currentItemIndex != itemIndex) {
                    $frame.attr({
                        href: bannerHrefList[itemIndex] || "",
                        target: targetList[itemIndex] || ""
                    });

                    changeMainImage(itemIndex);//メイン画像更新
                    if(endFocus){
                        $thumbsItems.eq(itemIndex).find("a").eq(0).focus();//サムネリンクにフォーカス当てる
                    }
                    
                }
                currentItemIndex = itemIndex;
            }

            //メイン画像の切り替え
            function changeMainImage(index) {
                if (index == preMainIndex) return;
                var $current = $mainImages.eq(index);
                var $preMainImage = $mainImages.eq(preMainIndex);
                
                //IEはクロスフェード無し
                if(isIE){
                    $preMainImage.hide();
                    $current.show();
                }else{
                    $current.stop().animate({
                        opacity: 1
                    }, {
                        duration: CROSSFADE_DURATION
                    });
                    $preMainImage.stop().animate({
                        opacity: 0
                    }, {
                        duration: CROSSFADE_DURATION
                    });                
                }
                //set link
                $mainImages.find("a").attr({
                    href: mainHrefList[index] || "",
                    target: targetList[index] || ""
                });
                preMainIndex = index;
            }
            
            //タイマースタート
            function startTimer(){
                if(typeof timerID != "undefined")stopTimer();
                timerID = setTimeout(function(){
                    isFocusOut = true;
                    if(itemLength <= 3){
                        var index = currentItemIndex + 1 > 2 ? 0 : currentItemIndex + 1;
                        updateFrame(index, "direct",false,false);
                        startTimer();
                    }else{
                        moveTo(-1,false,false);
                    }
                },TIMER_DELAY);
            }
            
            //タイマーストップ
            function stopTimer(){
                if(typeof timerID != "undefined"){
                    clearTimeout(timerID);
                }
            }
        }
    });
})(jQuery);
