/**
  * jquery.slider.js
  *
  * @param wait ウェイト（ミリ秒）
  * @param fade スライド時間（ミリ秒）
  * @param direction スライド方向('left', 'right')
  * @param showControls ページボタン表示するかどうか
  * @param showProgress
  * @param hoverPause マウスが上に来た場合にオートスクロールをしないようにする
  * @param autoplay 自動スクロールを行うかどうか
  * @param next_str 次にスクロールする文字列（class: jquery-slider-control-next）
  * @param prev_str 前にスクロールする文字列（class: jquery-slider-control-prev）
  *
  * サムネイルボタンはクラスjquery-slider-buttonを付与する。
  * 出現順番が要素順と対応する。
  *
  */
(function( $ ) {

    $.fn.slider = function(options) {
        var $this = this;
        var settings = {
            // Dimensions
            'width'         :   this.width(),
            'height'        :   this.height(),
            // Settings
            'wait'          :   4000,
            'fade'          :   750,
            'direction'     :   'left',
            'showControls'  :   true,
            'showProgress'  :   false,
            'hoverPause'    :   true,
            'autoplay'      :   true,
            'randomize'     :   false,
            'next_str'      :   '&raquo;',
            'prev_str'      :   '&laquo;',
            // Callbacks
            'slidebefore'   :   function() {},
            'slideafter'    :   function() {},
            'rewind'        :   function() {}
        };

        var _timer = false;
        var _last = false;
        var _this = false;
        var _init_exec = false;

        var _cycle = function() {
            clearTimeout(_timer);

            _last = _this;

            if (settings.direction == 'right') {
                _this = _this.prev('.jquery-slider-element');
            } else {
                _this = _this.next('.jquery-slider-element');
            }

            if (!_this.length) {
                _rewind();
            }

            _draw();

            if (!$this.hasClass('jquery-slider-paused') && settings.autoplay) {
                _timer = setTimeout(_cycle, settings.wait);
            }
        };

        var _rewind = function() {
            if (settings.direction == 'right') {
                _this = $this.children('.jquery-slider-element').last();
            } else {
                _this = $this.children('.jquery-slider-element').first();
            }
            settings.rewind(_this, $this);
        };

        var _draw = function() {
            $this.addClass('jquery-slider-sliding');
            if (settings.showProgress) {
                $this.find('.jquery-slider-page').removeClass('jquery-slider-page-current');
                $this.find('.jquery-slider-page:eq(' + (_this.nextAll('.jquery-slider-element').length) + ')').addClass('jquery-slider-page-current');
            }
            settings.slidebefore(_this, $this);

            if (settings.direction == 'right') {
                _this.show().css('left', -settings.width);
            } else {
                _this.show().css('left', settings.width);
            }

            _this.stop(true, true).animate({
                'left'      :   (settings.direction == 'right' ? '+=' : '-=') + settings.width + 'px'
            }, {
                'duration'  :   _init_exec ? 0 : settings.fade,
                'complete'  :   function() {
                    settings.slideafter(_this, $this);
                    $this.removeClass('jquery-slider-sliding');
                }
            });

            if (_last) {
                _last.stop(true, true).animate({
                    'left'      :   (settings.direction == 'right' ? '+=' : '-=') + settings.width + 'px'
                }, {
                    'duration'  :   _init_exec ? 0 : settings.fade
                });
            }


        };

        var _next = function() {
            if ($this.hasClass('jquery-slider-sliding')) return;
            var direction = settings.direction;
            $this.addClass('jquery-slider-paused');
            settings.direction = 'left';
            _cycle();
            settings.direction = direction;
        };

        var _prev = function() {
            if ($this.hasClass('jquery-slider-sliding')) return;
            var direction = settings.direction;
            $this.addClass('jquery-slider-paused');
            settings.direction = 'right';
            _cycle();
            settings.direction = direction;
        };

        var _init = function() {
            _init_exec = true;
            if (options) {
                $.extend( settings, options );
            }

            /*
            if (settings.hoverPause) {
                $this.bind({
                    'mouseenter': function() {
                        $this.addClass('jquery-slider-paused')
                        clearTimeout(_timer);
                    },
                    'mouseleave': function() {
                        $this.removeClass('jquery-slider-paused');
                        if (settings.autoplay) {
                            _timer = setTimeout(_cycle, settings.wait);
                        }
                    }
                });
            }
            */

            var positionEls = $('<span class="jquery-slider-pages"></span>');
            $this.addClass('jquery-slider').width(settings.width).height(settings.height);
            $this.children().each(function() {
                var $tmp = $(this);
                _this = $(this).addClass('jquery-slider-element');
                positionEls.prepend($('<span class="jquery-slider-page"></span>').bind('click', function() {
                    if ($this.hasClass('jquery-slider-sliding')) return;

                    // 選択済みの場合はクリックしても反応しないように変更 ---------->>>>
                    if ($(this).hasClass('jquery-slider-page-current')) return;
                    // 選択済みの場合はクリックしても反応しないように変更 ----------<<<<

                    _last = _this;
                    _this = $tmp;
                    _draw();
                }));
            });

            if (settings.showProgress) {
                $this.append(positionEls);
            }

            if (settings.showControls) {
                /*
                var controlPrev = $('<span class="jquery-slider-control jquery-slider-control-prev">' + settings.prev_str + '</span>').bind('click', function() {_prev();});
                var controlNext = $('<span class="jquery-slider-control jquery-slider-control-next">' + settings.next_str + '</span>').bind('click', function() {_next();});
                */
                var controlPrev = $('<span class="jquery-slider-control jquery-slider-control-prev"><img src="./_img_bg/icon_slideL_17x120px.png" width="17" height="120" alt="" /></span>').bind('click', function() {_prev();});
                var controlNext = $('<span class="jquery-slider-control jquery-slider-control-next"><img src="./_img_bg/icon_slideR_17x120px.png" width="17" height="120" alt="" /></span>').bind('click', function() {_next();});
                $this.append(controlPrev);
                $this.append(controlNext);
            }

            if (settings.randomize) {
               _this = $this.children('.jquery-slider-element').eq(parseInt($this.children('.jquery-slider-element').length * Math.random()));
            }

            //---------------------------->>>>
            // サムネイル対応
            $(".jquery-slider-button").each(function(index) {
                $(this).bind("mouseenter", function() {
                    if ($this.hasClass('jquery-slider-sliding')) return;

                    if ($('.jquery-slider-element:eq(' + index + ')').css("left") == "0px") {
                        return;
                    }

                    clearTimeout(_timer);
                    $this.addClass('jquery-slider-paused');

                    _last = _this;
                    _this = $('.jquery-slider-element:eq(' + index + ')');

                    _draw();

                    if (settings.autoplay) {
                        _timer = setTimeout(_cycle, settings.wait);
                    }
                });
            });

            $(".slide_item:not(:first)").css("left", -settings.width);

            // マウスオーバー時にコントロールを表示
            /*
            $this.bind("mouseenter", function() {
                //$(".jquery-slider-control").fadeTo(300, 1);
                $(".jquery-slider-control").fadeTo(300,
                								1,
                								function() {
                									if ($.support.opacity) {
                    									$(this).css('opacity', '1');
                									}
                									else {
                    									$(this).css('-ms-filter', 'alpha( opacity=1 )');
                    									$(this).css('filter','alpha( opacity=1 )');
                    									$(this).css('opacity', '1');
                									}
                									$(this).css('display', 'block');
                								});
            });
            $this.bind("mouseleave", function() {
                //$(".jquery-slider-control").fadeTo(200, 0);
                $(".jquery-slider-control").fadeTo(200,
                								0,
                								function() {
                									if ($.support.opacity) {
                    									$(this).css('opacity', '0');
                									}
                									else {
	                									$(this).css('-ms-filter', 'alpha( opacity=0 )');
	                									$(this).css('filter','alpha( opacity=0 )');
                    									$(this).css('opacity', '0');
                									}
                									$(this).css('display', 'none');
                								});
            });
            */

            $(".jquery-slider-control").each(function(index) {
                $(this).css("top", ($(this).parent().height() / 2) - ($(this).height() / 2));
            });

            //
            //----------------------------<<<<

            _cycle();
            _init_exec = false;
        };

        _init();
    };

})( jQuery );
