(function ($) { // 無名関数
   
  $.fn.QSlider = function (options) {
    var defaults = {
      controller: true,
      pagination: true,
      autoSlide : true,
      interval  : 3000,
      duration  : 300,
      easing    : 'linear',
      layerEasing:'linear',
      thumMargin:5,
      thumWidth : 50,
      thumHeight : 50,
      pageNaviTop:170,
      pagerSize:30,
      pagerMargin:5,
      slideBottomMargin:70
    };

    var o = $.extend(defaults, options);

    this.each(function () { // fn の内容別に 3 つに分けて各種メソッドの一括登録

    var $slider     = $(this),
    $view       = $slider.children('.qs-view'), // 大枠
    $container  = $view.children('.qs-container'),　// 各スライド
    $contents   = $container.children().addClass('qs-content'),
    $firstChild = $contents.filter(':first-child'),
    $lastChild  = $contents.filter(':last-child');

    var size = {
      width : $view.width(),
      height: $view.height()
    };

    var count = {
      min    : 0,
      max    : $contents.length,
      current: 0
    };

    $container.css({
      width      :  size.width * ($contents.length + 2),
      marginLeft : -size.width,
      paddingLeft:  size.width,
      position:'relative'
    });

    var distance;

var slide = {
    next: function (index) {
      // 次へ
      slide.hidelayer();
      fnc.range(index, 'plus'); // distanceに移動距離をセット
      if(count.current < count.max - 1) {
        // 最後のスライドでなければ
        fnc.scroll(distance);
      } else {
        $firstChild.css('left', size.width * $contents.length);
        $container.stop(true, false)
        .animate({left: -distance},
          o.duration,
          o.easing,
          function (index) { 
            // Callback
            $firstChild.css('left', 0);
            $container.css('left', 0);
            slide.showlayer();
          }
        );
        count.current = -1;
      }
      slide.nextbrink();
      fnc.counter(index, 'increment'); // カレントを記憶する
      fnc.pageNav(count.current); // ナビゲーションを更新
    },
    prev: function (index) {
      slide.hidelayer();
      fnc.range(index, 'minus'); // distanceに移動距離をセット
      if(count.current > count.min) {
        // 最初のスライドでなければ
        fnc.scroll(distance);
      } else {
        $lastChild.css('left', -(size.width * $contents.length));
        $container.stop(true, false)
        .animate({left: -distance},
          o.duration,
          o.easing,
          function (index) {
            $lastChild.css('left', '');
            $container.css('left', -(size.width * ($contents.length - 1)));
            slide.showlayer();
          }
         );
         count.current = count.max;
      }
      slide.backbrink();
      fnc.counter(index, 'decrement'); // カレントを記憶する
      fnc.pageNav(count.current); // ナビゲーションを更新
    },
showlayer: function(){
$(".qs-content > .layer-" + count.current).animate({right:0,opacity: 1},o.duration/2,o.layerEasing);

},
hidelayer: function(){
$(".qs-content > .layer-" + count.current).animate({right:-50,opacity: 0},o.duration/4,o.layerEasing);
},
navibrink:function(){
  slide.nextbrink();
  slide.backbrink();
},
nextbrink:function(){
$(".qs-pager-next").dequeue().animate({left:size.width - o.pagerSize - 7},300,'easeInOutCubic').animate({left:size.width - o.pagerSize - o.pagerMargin},300,'easeOutBounce');
},
backbrink:function(){
$(".qs-pager-back").dequeue().animate({left:o.pagerMargin + 7},300,'easeInOutCubic').animate({left:o.pagerMargin},300,'easeOutBounce');
}
}

var fnc = {
range  : function (n, d) {
if(n >= 0) {
distance = size.width * n;
} else {
var addNum;
if(d === 'minus') { addNum = -1; }
if(d === 'plus') { addNum = +1; }
distance = size.width * (count.current + addNum);
}
},
scroll : function (d) {
$container.stop(true, false)
.animate({left: -d}, o.duration, o.easing, slide.showlayer);
},
counter: function (n, c) {
if(n >= 0) {
count.current = n;
} else {
if(c === 'increment') { count.current++; }
if(c === 'decrement') { count.current--; }
}
},
pageNav: function (n) {
if(!o.pagination) {
return;
} else {
$pagination.children('a').removeClass('current').dequeue().animate({opacity: 0.5},500,'linear');
$pagination.children('a:eq(' + n + ')').addClass('current').dequeue().animate({opacity: 1},500,'linear');
}
},
pager  : function (d, e) {
e.preventDefault();
if(!$container.is(':animated')) {
if(o.autoSlide) {
clearInterval(start);
}
if(d === 'positive') {
slide.next();
} else if(d === 'negative') {
slide.prev();
}
if(o.autoSlide) {
play();
}
}
}
}

// CSS 調整
$(".qs-view > .qs-container").css({
position: 'absolute',
top: 0,
left: 0
});
$(".qs-container > .qs-content").css({
position: 'relative',
float: 'left',
width: size.width,
height: size.height
});

$(this).css({
  position: 'relative',
  marginBottom: o.slideBottomMargin,
  textAlign:'center'
});


// DOM 生成
var layers;
$contents.each(function (i) {
layer = $(this).children('.layer');
layer.css({
width      :  size.width,
position: 'absolute',
top: 0,
right: -50,
opacity: 0
}).addClass('layer-' + i);
});

if(o.pagination) {
var $pagination = $('<div/>').addClass('qs-page-navi');
$contents.each(function (i) {
thumbnail = $(this).attr('thumbnail');
title = $(this).attr('title'); 
$('<a/>').attr('href', '#')
.appendTo($pagination)
.click(function (e) {
e.preventDefault();
if(o.autoSlide) {
clearInterval(start);
}
if(i > count.current) {
slide.next(i); // iに進める
} else if(i < count.current) {
slide.prev(i); // iに戻す
}
if(o.autoSlide) { play(); }
})
.append('<div class="qs-thum-wrapper"><img class="qs-thumb qs-thumb-' + i + 1 + ' vtip" src="' + $(this).attr('thumbnail') + '" title="' + title + '"/></div>');
});

$pagination.appendTo($slider); // #this.sls-pagination

$(".qs-page-navi").css({
position: 'absolute',
display:'block',
left:0,
top: o.pageNaviTop,
width:size.width,
textAlign:'center',
opacity: 0
});

$pagination.find('a').css({
display:'inline-block',
overflow:'hidden',
cursor:'pointer',
width:o.thumWidth + o.thumMargin * 2,
height:o.thumHeight + o.thumMargin * 2,
opacity: 0.5
});

$(".qs-thum-wrapper").css({
display:'block',
width:o.thumWidth,
height:o.thumHeight,
overflow:'hidden',
margin:o.thumMargin
});

$(".qs-page-navi").animate({opacity: 1},1000,'linear');
$pagination.find('a:first-child').addClass('current').dequeue().animate({opacity: 1},1000,'linear');
}

// create next/prev controller
if(o.controller) {
$('<div/>')
.addClass('qs-pager').addClass('qs-pager-next')
.text('\u00BB')
.appendTo($slider)
.click(function (e) {
fnc.pager('positive', e);
})
.css({
position:'absolute',
left:size.width - o.pagerSize - o.pagerMargin,
opacity: 0
})
.hover(
function () {
$(this).dequeue().animate({opacity: 1},300,'linear');
},
function () {
$(this).dequeue().animate({opacity: 0.5},300,'linear');
}
);

$('<div/>')
.addClass('qs-pager').addClass('qs-pager-back')
.text('\u00AB')
.appendTo($slider)
.click(function (e) {
fnc.pager('negative', e);
})
.css({
position:'absolute',
left:o.pagerMargin,
opacity: 0
})
.hover(
function () {
$(this).dequeue().animate({opacity: 1},300,'linear');
},
function () {
$(this).dequeue().animate({opacity: 0.5},300,'linear');
}
);

$('.qs-pager').animate({opacity: 0.5},1000,'linear');
}

// autoslide
if(o.autoSlide) {
var play, start;
play = function () {
start = setInterval(function () {
slide.next();
}, o.interval);
};

$contents.hover(
function () {
clearInterval(start);
/*slide.navibrink();*/
},
function () {
play();
}
);
play();
}

slide.showlayer();

});
  
};
   
})(jQuery);
