/**
 * Слайдер, аналог duke.edu
 *
 * @author AspektLab -> GP
 *
**/

/** СТРУКТУРА HTML
        <div class="intro-place jqSliderBig">
                <div class="intro jqSliderBigContent" style="z-index: 3">                -- pos: absolute
                        <div class="intro-content jqSliderBigContentBlock">
                                CONTENT 1
                        </div>
                </div>
                <div class="intro jqSliderBigContent" style="z-index: 1">
                        <div class="intro-content jqSliderBigContentBlock">                -- pos: absolute
                                CONTENT ...
                        </div>
                </div>
                <div class="slider">                                                                -- pos: relative
                        <div class="slider-content jqSliderBigThumbs">
                                <a class="back jqSliderBigPrev" href="#"></a>
                                <a class="next jqSliderBigNext" href="#"></a>
                                <a class="jqSliderBigThumb" href="#"><img src="/images/del/intro-img-5.jpg" width="50" height="50" alt="" /></a>
                                <a class="jqSliderBigThumb" href="#"><img src="/images/del/intro-img-1.jpg" width="50" height="50" alt="" /></a>
                        </div>
                </div> <!-- slider -->
        </div>
**/

$.fn.big_slider = function(options)
{
        var defaults = {
                slider_content: '.jqSliderBigContent',
                slider_content_block: '.jqSliderBigContentBlock',
                slider_thumbs_container: '.jqSliderBigThumbs',
                slider_thumb: '.jqSliderBigThumb',
                slider_prev_btn: '.jqSliderBigPrev',
                slider_next_btn: '.jqSliderBigNext',

                /* ------------------------------------------------------------------------------------------------ */
                slider_width: null,
                slides: null,
                slide_content_blocks: null,
                container: this,
                thumbs_in_line: 5,                        /* количество тамбов превью-баре */

                /* ------------------------------------------------------------------------------------------------ */
                need_thumbs_sliding: false,        /* нужно ли вращать тамбы */

                /* ------------------------------------------------------------------------------------------------ */
                next_next_slide: -1,                /* следующий за этим следующим слайдом слайд */
                next_slide: 0,
                current_slide: 0,
                prevent_sliding: false,                /* прекратить слайдшоу */
                time_out: 12000,                                /* время показа слайда */
                moving_timer: null,                        /* таймер смещений */
                moving_speed: 100,                        /* таймаут между смещениями */
                moving_dx: 200,                                /* смещение слайда по ОХ */
                moving_now: false,                        /* тру, во время смещения */
                hidden_info_block: false        /* уже спрятали инфо блок */
        };

        var funs = {
                beginAnimation: null,
                beginSlideShowAnimation: null,
                makeAnimation: null,
                animate: null,
                bindThumbs: null,
                manageClick: null,                        /* работает при клике на стрелку или тамб */
                manageThumbLine: null                /* скрывает или показывает нужные/ненужные тамбы в превью-баре */

        };

        var opts = $.extend(defaults, options);

        opts.slides = $(opts.slider_content);
        opts.slide_content_blocks = $(opts.slider_content_block);
        opts.slider_width = $(this).width();

        if (opts.slides.length>opts.thumbs_in_line) opts.need_thumbs_sliding = true;

        funs.manageClick = function(clicked)
        {
                if (!opts.moving_now && opts.current_slide != clicked)
                {
                        opts.next_slide = clicked;
                        funs.animate();
                        opts.prevent_sliding = true;
                }
                else// if (opts.next_slide != clicked)
                {
                                                opts.next_next_slide = clicked;
                        opts.prevent_sliding = true;
                }
        }

        funs.bindThumbs = function()
        {
                /* биндим клик на тамбы */
                $(opts.slider_thumb).unbind('click');
                $(opts.slider_thumb).bind('click', function(e)
                {
                        e.preventDefault();
                        e.stopPropagation();

                        funs.manageClick(new Number($(this).attr('rel')));
                });

                if (opts.need_thumbs_sliding)
                {
                        /* кнопка влево */
                        $(opts.slider_prev_btn).unbind('click');
                        $(opts.slider_prev_btn).bind('click', function(e)
                        {
                                e.preventDefault();
                                e.stopPropagation();

                                funs.manageClick(opts.current_slide == 0 ? opts.slides.length - 1 : opts.current_slide-1);
                        });

                        /* кнопка вправо */
                        $(opts.slider_next_btn).unbind('click');
                        $(opts.slider_next_btn).bind('click', function(e)
                        {
                                e.preventDefault();
                                e.stopPropagation();

                                funs.manageClick(opts.current_slide == opts.slides.length - 1 ? 0 : opts.current_slide+1);
                        });
                }
        }

        funs.beginAnimation = function()
        {
                $(opts.slider_content).css('z-index', '1');
                $(opts.slider_content).eq(0).css('z-index', '3');
                $(opts.slider_content_block).hide();
                $(opts.slider_content_block).eq(0).show();
                $(opts.slider_thumb).removeClass('jqCssSel');
                $(opts.slider_thumb).eq(0).addClass('jqCssSel');

                var thumbs = $(opts.slider_thumb);
                for (var i = 0; i<thumbs.length; i++)
                        $(thumbs[i]).attr('rel', i);
        }

        funs.animate = function()
        {
                if (!opts.moving_now)
                {
                        $(opts.slides[opts.next_slide]).css('z-index', 2);
                        opts.hidden_info_block = false;

                        opts.moving_now = true;
                        funs.makeAnimation();
                }
        }

        funs.beginSlideShowAnimation = function()
        {
                if (!opts.prevent_sliding)
                {
                        setTimeout(function()
                        {
                                funs.animate();
                        }, opts.time_out);
                }
        }

        funs.makeAnimation = function()
        {
                opts.moving_timer = setInterval(function()
                {

                        var pos_str = '0px 0px';
                        if (!$.browser.msie)
                                pos_str = $(opts.slides[opts.current_slide]).css('background-position');
                        else
                                pos_str = $(opts.slides[opts.current_slide]).css('background-position-x')+'  '+$(opts.slides[opts.current_slide]).css('background-position-y');

                        var pos = new String(pos_str).split(' ');
                        var x = new Number(pos[0].replace(/px/, ''));

                        if (x<=-opts.slider_width)
                        {
                                /* оканчиваем слайдинг */
                                clearInterval(opts.moving_timer);
                                opts.moving_now = false;


                                $(opts.slides[opts.current_slide]).css('background-position', '0px '+pos[1]);
                                $(opts.slides[opts.current_slide]).css('z-index', 1);

                                $(opts.slides[opts.next_slide]).css('z-index', 3);

                                $(opts.slider_thumb).removeClass('jqCssSel');
                                $(opts.slider_thumb+'[rel='+opts.next_slide+']').addClass('jqCssSel');

                                /* скроем или покажем нужные/ненужные тамбы */
                                funs.manageThumbLine();

                                opts.current_slide = opts.next_slide;

                                if (opts.next_next_slide == -1 && !opts.prevent_sliding)
                                {
                                        /* если не нажат другой слайд, то выбираем следующий */
                                        if (opts.current_slide == opts.slides.length - 1) opts.next_slide = 0;
                                        else opts.next_slide = opts.current_slide+1;

                                        funs.beginSlideShowAnimation();
                                }
                                else if (opts.next_next_slide != -1)
                                {
                                        /* выбираем нажатый и стопорим слайдшоу */
                                        opts.next_slide = opts.next_next_slide;
                                        opts.next_next_slide = -1;
                                        funs.animate();
                                }
                        }
                        else
                        {
                                /* вращаем еще */
                                x-=opts.moving_dx;
                                $(opts.slides[opts.current_slide]).css('background-position', x+'px '+pos[1]);
                        }

                        if (x<=-opts.slider_width/2 && !opts.hidden_info_block)
                        {
                                opts.hidden_info_block = true;
                                $(opts.slide_content_blocks[opts.current_slide]).hide();
                                $(opts.slide_content_blocks[opts.next_slide]).fadeIn();
                        }

                }, opts.moving_speed);
        }

        funs.manageThumbLine = function()
        {
                /* нужно определить реальное положение тамбов с позициями current и next */
                var thumbs = $(opts.slider_thumb);
                var real_current = 0;
                var real_next = 0;

                for (var i = 0; i<thumbs.length; i++)
                {
                        if (opts.current_slide == $(thumbs[i]).attr('rel')) real_current = i;
                        if (opts.next_slide == $(thumbs[i]).attr('rel')) real_next = i;
                }

                var direct_direction = (real_current == 0 && real_next == thumbs.length-1 ? false : true);
                //alert(real_current + '  '+real_next);
                if (direct_direction && (real_current != 0 || real_next != 0))
                {
                        var last = thumbs[thumbs.length-1];
                        for (var i = real_current; i<real_next; i++)
                        {
                                last = $(thumbs[i]).clone().insertAfter($(last));
                                if (!$.browser.msie)
                                        $(thumbs[i]).animate({
                                                        opacity: "0"
                                                  }, 'fast', 'linear', function() {
                                                                $(this).remove();
                                                  });
                                else
                                        $(thumbs[i]).remove();
                        }

                        funs.bindThumbs();
                }
                else if (!direct_direction && (real_current != 0 || real_next != 0))
                {
                        var first = thumbs[0];
                        var i = thumbs.length-1;

                        if (!$.browser.msie) $(thumbs[i]).css('opacity', 0);
                        first = $(thumbs[i]).clone().insertBefore($(first));
                        if (!$.browser.msie) $(first).animate({
                                                                                                opacity: "1"
                                                                                          }, 'fast', 'linear');
                        $(thumbs[i]).remove();


                        funs.bindThumbs();
                }
        }

        /* если есть слайды */
        if (opts.slides.length>1)
        {
                opts.next_slide = 1;

                funs.bindThumbs();
                funs.beginAnimation();
                funs.beginSlideShowAnimation();
        }
};
