// 名前空間を定義。NSはnamespaceの略で書いてあるだけ。
// 任意の名前にすればいいと思います。
if (typeof NS == 'undefined' || !NS) {
  window.NS = {};
}

// NS.utilは他のクラスからもよく使いそうな汎用的な入れ子クラスのつもり。
// 今回はpagetopしか貼ってないけど、実際は他のクラスもあって、それらのクラスもここを使ってる。
// 便利そうな処理はreturnの中にどんどん追加する。
NS.util = function() {
  return {
    // 今回は使ってないけど、このうんこ検知システムはよく使う。
    // うんこは水に流して、なかったことにしたいけど、そうはいかないからなー。
    isMSIE : /*@cc_on!@*/false, 
    
    // 見本のyoumosにもあった、ieとその他ブラウザの仕様差異を吸収する処理。
    addListener : function (el, type, fn, flg) {
      if(!el) { return false; }
      if(el.addEventListener) {
        el.addEventListener(type, fn, flg);
      }
      else if(el.attachEvent) {
        el.attachEvent('on' + type, fn);
      }
      else {
        return false;
      }
    }
  }
}(); // 最後に括弧を入れないと、オブジェクトとして有効にならない。

// ここがスムーススクロールの本体。
NS.pageTop = function() {

  // アニメーションの処理。
  // これを独力で発想するのは、私の頭の仕様上厳しい。
  var scrollUp = function() {
    var position = getPosition();
    // アニメーション動作の微調整（早さとかスクロール量）についてはyoumosの記事を参考にしてください。
    window.scrollTo(Math.max(Math.floor(position.x / 2), 0), Math.max(Math.floor(position.y - (position.y / 5)), 0));
    if (position.x > 0 || position.y > 0) {
      window.setTimeout(scrollUp, 30);
    }
  }
  var getPosition = function() {
    var position = {};
    position.x = document.body.scrollLeft || document.documentElement.scrollLeft;
    position.y = document.body.scrollTop  || document.documentElement.scrollTop;
    return position;
  }
  var getAnchors = function() {
    var anchors = document.getElementsByTagName('a');
    return anchors;
  }
  // mainとか冗長で無駄だとは思うけど、スコープを意識する上では役に立ってる気がしてる。
  var main = function() {
    var anchors = getAnchors();
    for (var i = 0; i < anchors.length; i++) {
      if (anchors[i].className.match(/ *pagetop */)) {
        NS.util.addListener(anchors[i], 'click', scrollUp, false);
        if (anchors[i].getAttribute('href')) {
          anchors[i].setAttribute('href', 'javascript:void(0);');
        }
      }
    }
  }();
}

// 最後にロードイベントに追加。
NS.util.addListener(window, 'load', NS.pageTop , false);


