$(function () {
  //[設定する部分]-------------------------
  //メニューの上部に余白を設けるなら入力 / 単位px
  offsetY = 10;
  //absoluteでコンテンツ部分が短い時のメニューとフッターの余白 / 単位px
  minMargin = 10;
  //処理時間 (ミリ秒)  / 0だとposition:fixedのようになる、チラつくけど
  duration = 900;
  //移動させるメニューのid
  _foName = '#left';
  //positionで組んだレイアウトは「0」 floatで組んだレイアウトは「1」
  _navRelative = 1;
  //フッター部分のid
  _ftName = '#footer';
  //イージングタイプ / 使いたいのがなければjQuery Easing Pluginを追加してもいい
  easingSet = 'swing';
  //[/設定する部分]-------------------------

  windowHeight = parseInt($(window).height());
  navHeight = $(_foName).outerHeight(true); //ナビゲーションのmargin+border+padding+heightを合わせた高さ
  navHeights = navHeight + offsetY; //navの上余白
  bodyHeight = $('body').outerHeight(true); //コンテンツの高さ
  navSetY = $(_foName).offset().top; //ナビゲーションの初期座標(=margin・paddingを含めたheadの高さ)
  navMarginSetY = navSetY - offsetY; //ヘッダの高さを超えた時の位置用
  expansionFlag = false;
  //フッターがあるか?とかpositionの種類とかの
  chkLayout();
  //
  desiredHeight = navHeights + footerArea; //スクロールさせる為に最低限必要な高さ(footer+navの高さ)
  navMaxY = bodyHeight - (navHeight + footerArea + offsetY); //navが重ならずに降りられる限界y座標
  //  floatObjMoveChk(mainContent - navHeights);
  floatObjMove();
});

function chkLayout() {
  if (_navRelative) {
    $(_foName).css('position', 'relative'); //勝手にposition付与
  }

  if ($(_ftName).offset() == null) {
    //footerがない場合
    footerArea = footerSetY = 0;
  } else {
    //footerがある場合
    footerSetY = parseInt($(_ftName).offset().top); //フッターの初期座標(=margin・paddingを含めたheadの高さ)
    footerArea = bodyHeight - footerSetY; //footerの高さ
    if (_navRelative == 0 && footerSetY < navHeight + navSetY) {
      //positionabsoluteでfooterが食い込まないようにmargin-topを伸ばす
      //positionで移動させていたら、footerの下に要素があった場合にそれが食い込んだ為marginに変更
      footerTop = ((navHeights + navSetY + minMargin) - footerSetY);
      //元々のmarginを無視 
      //$(_ftName).css('margin-top', footerTop + 'px');
      
      //元々のmarginを反映
      $(_ftName).css('margin-top',parseInt($(_ftName).css('margin-top'))+footerTop + 'px');
      //footerを拡張させた場合はスクロールを移動させない。
      expansionFlag = true;

    }
  }
}

//スクロール毎の処理

function floatObjMove() {
  $(window).scroll(function () {
    var navScrollTop = parseInt($(this).scrollTop()); //スクロール量
    navBottomY = navScrollTop + navHeights; //ナビゲーションのbottomの座標
    if (navHeights < windowHeight && !expansionFlag) { //ウインドウサイズとナビゲーションのサイズ判定
      //スクロール量が最初の位置より小さい内は
      if (navScrollTop <= navSetY) {
        $(_foName).animate({
          top: 0
        }, {
          duration: duration,
          queue: false,
          easing: easingSet
        });
      }
      //
      else if (navMaxY < navScrollTop) {
        $(_foName).animate({
          top: navMaxY - navSetY
        }, {
          duration: duration,
          queue: false,
          easing: easingSet
        });
      }
      //ヘッダもフッタも無い位置
      else if (navScrollTop < navMaxY) {
        $(_foName).animate({
          top: navScrollTop - navMarginSetY
        }, {
          duration: duration,
          queue: false,
          easing: easingSet
        });
      }
      //ウインドウサイズが足りないので動かない。
    }
  });
}

//リサイズしたらwindowのサイズを変更
$(window).resize(function () {
  windowHeight = parseInt($(window).height()); //windowのサイズ
});

//jquery.easing.1.3.jsから
jQuery.extend(jQuery.easing, {
  easeOutCubic: function (x, t, b, c, d) {
    return c * ((t = t / d - 1) * t * t + 1) + b;
  },
  easeInBack: function (x, t, b, c, d, s) {
    if (s == undefined) s = 1.70158;
    return c * (t /= d) * t * ((s + 1) * t - s) + b;
  },
  easeOutBack: function (x, t, b, c, d, s) {
    if (s == undefined) s = 1.70158;
    return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;
  },
  easeInOutBack: function (x, t, b, c, d, s) {
    if (s == undefined) s = 1.70158;
    if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;
    return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;
  },
  easeOutBounce: function (x, t, b, c, d) {
    if ((t /= d) < (1 / 2.75)) {
      return c * (7.5625 * t * t) + b;
    } else if (t < (2 / 2.75)) {
      return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b;
    } else if (t < (2.5 / 2.75)) {
      return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b;
    } else {
      return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b;
    }
  }
});
