﻿/* ユーティリティ
------------------------------------------------------------ */

// map関数
Array.prototype.map = function(func) {
  var result = [];
  for (var i = 0, length = this.length; i < length; i++)
    result[i] = func(this[i], i, this);
  return result;
};
Array.map = function(array, func) {
  return Array.prototype.map.call(array, func);
};

// イベントハンドラ登録
function addHandler(element, type, func) {
  if (element.addEventListener)
    element.addEventListener(type, func, false);
  else if (element.attachEvent)
    element.attachEvent("on" + type, func);
  else
    element["on" + type] = func;
}


/* メニューのロールオーバー
------------------------------------------------------------ */

// 画像をあらかじめキャッシュしておく
function chacheImage(url) {
  var img = new Image();
  img.src = url;
  return img;
}
chacheImage("/image/sign/layout/menuBgActive.png");


/* Wii用に文字サイズ拡大
------------------------------------------------------------ */
if(window.opera && window.opera.wiiremote) {
    document.addEventListener("DOMContentLoaded", function() {
        document.body.style.fontSize = "120%";
    }, false);
}


/* デフォルトのタイムゾーンの設定（主に英語版で使用）
------------------------------------------------------------ */
(function() {
    var day = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
    var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    var t = new Date();
    t.setFullYear(t.getFullYear() + 1);
    var expires =  day[t.getDay()]+', '+t.getDate()+'-'+months[t.getMonth()]+'-'+t.getFullYear()
                      +' '+t.getHours()+':'+t.getMinutes()+':'+t.getSeconds()+' GMT';
    var timezone = t.getTimezoneOffset() * 5 / 3; // means 100/60
    document.cookie = 'default_timezone=' + timezone + '; expires=' + expires + '; path=/sign/';
})();



/* 言語選択
------------------------------------------------------------ */
function toggleClassName(element) {
    if (element.className === 'true') {
        element.className = 'false';
    } else {
        element.className = 'true';
    }
}
addHandler(window, 'load', function() {
    var langMenu = document.getElementById('langMenu')
    var langMenuButton = document.getElementById('langMenuButton');
    if (langMenu && langMenuButton) {
        langMenu.className = 'false';
        addHandler(langMenuButton, 'click', function(){
            toggleClassName(langMenu);
        });
    }
});


/* なめらかなページ内リンク
------------------------------------------------------------ */

var Scroller = {
    speed: 7,

    // イベントリスナーをセットする。
    init: function() {
        if (navigator.userAgent.match(/(iPhone|iPod)/)) return;
        var as = document.getElementsByTagName('a');
        for (var i = 0, len = as.length; i < len; ++i) {
            var a = as[i];
            if (a.hash && ((a.pathname == location.pathname) || ('/'+a.pathname == location.pathname))) {
                var func = (function(toId) {
                    return function(e) {
                        var element = document.getElementById(toId);
                        if (!element) {
                            var elements = document.getElementsByName(toId);
                            if (elements.length) element = elements[0];
                        }
                        if (window.event) {
                            window.event.cancelBubble = true;
                            window.event.returnValue = false;
                        }
                        if (e.preventDefault && e.stopPropagation) {
                            e.preventDefault();
                            e.stopPropagation();
                        }
                        if (element) {
                            Scroller.beginScroll(element);
                        }
                        return false;
                    }
                })(a.hash.substr(1));
                if (a.addEventListener) a.addEventListener('click', func, false);
                if (a.attachEvent) a.attachEvent('onclick', func);
            }
        }
    },
    
    // スクロールのためのインターバル関数を開始する。
    beginScroll: function(element) {
        var clientHeight = window.innerHeight || document.documentElement.clientHeight;
        var documentHeight = document.body.offsetHeight;
        var scrollY = Scroller.getScrollY();
        var elementHeight = element.offsetHeight;
        var elementY = Scroller.getElementY(element);
        
        if (elementHeight < clientHeight) {
            var d = (elementY + elementHeight / 2) - (scrollY + clientHeight / 2);
            var toY = Math.ceil(scrollY + d);
        } else {
            toY = elementY - scrollY;
        }
        
        if (toY < 0) toY = 0;
        else if (toY > documentHeight - clientHeight) toY = documentHeight - clientHeight;
        
        clearInterval(Scroller.interval);
        Scroller.interval = setInterval(function() {
            Scroller.scroll(element, toY, clientHeight, documentHeight);
        }, 10);
    },
    
    // スクロールのためのインターバル処理関数
    scroll: function(element, toY, clientHeight, documentHeight) {
        var scrollY = Scroller.getScrollY();
        var previousScrollY = scrollY;
        
        if (toY > scrollY) {
            if (documentHeight - toY > 0) {
                scrollY += Math.ceil((toY - scrollY) / Scroller.speed);
            } else {
                scrollY += Math.ceil(((toY - scrollY) - (documentHeight - toY)) / Scroller.speed);
            }
        } else {
            scrollY += Math.floor((toY - scrollY) / Scroller.speed);
        }
        
        window.scrollTo(0, scrollY);
          
        if (scrollY == toY || previousScrollY == scrollY) {
            clearInterval(Scroller.interval);
            Scroller.beginHighlight(element);
        }
    },
    
    // ハイライトのためのインターバル関数を開始する。
    beginHighlight: function(element) {
        element = Scroller.getElementForHighlight(element);
        if (!element) return;
        var previousOutline = element.style.outline;
        
        clearInterval(Scroller.interval);
        var count = 0;
        Scroller.interval = setInterval(function() {
            if (count % 2) {
                element.style.outline = '#3F93FF solid 3px';
            } else {
                element.style.outline = previousOutline;
            }
            ++count;
            if (count > 6) {
                clearInterval(Scroller.interval);
                Scroller.endHighlight(element);
            }
        }, 150);
    },
    
    // ハイライト後の後処理。
    endHighlight: function() {
        // empty
    },

    // スクロール位置のY座標を取得する
    getScrollY: function() {
        body=document.body;
        d=document.documentElement;
        if (body && body.scrollTop) return body.scrollTop;
        if (d && d.scrollTop) return d.scrollTop;
        if (window.pageYOffset) return window.pageYOffset;
        return 0;
    },

    // 要素のY座標を取得する
    getElementY: function(d) {
        gy = d.offsetTop;
        if (d.offsetParent) while (d = d.offsetParent) gy += d.offsetTop;
        return gy;
    },
    
    // ハイライトすべき要素を取得する
    getElementForHighlight: function(a) {
        return a;
    }
};

addHandler(window, 'load', Scroller.init);

/* Google Analytics の読み込み
------------------------------------------------------------ */
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));