/**
 * Объект для манипуляций с DOM
 *
 * @author    Viacheslav Glushko <mail@ixax.ru>
 * @version   1.0.201110.24.1
 */

function booknikObject()
{
    var o = this;

    o.areas                   = {};

    o.areas.base              = {};
    o.areas.base.aside          = 'aside';

    //  Табы справа в aside
    o.areas.tabbed            = {};
    o.areas.tabbed.wrapper    = '#tabbed';
    o.areas.tabbed.tabs       = '#tabbed ul.tabs li';
    o.areas.tabbed.areas      = '#tabbed div.areas div.area';

    //  Горизонтальный скроллинг контента
    o.areas.hscroll                   = {};
    o.areas.hscroll.wrapper           = 'div.h-scroll_line';
    o.areas.hscroll.ctrl              = {};
    o.areas.hscroll.ctrl.prev         = 'div.move_prev';
    o.areas.hscroll.ctrl.next         = 'div.move_next';
    o.areas.hscroll.ctrl.all          = 'div.move';
    o.areas.hscroll.list              = {};
    o.areas.hscroll.list.wrapper      = 'div.viewport';
    o.areas.hscroll.list.list         = 'ul';
    o.areas.hscroll.list.item         = 'li';

    //    Вертикальный скроллинг видео-роликов
    o.areas.video_scroll                = {};
    o.areas.video_scroll.wrapper        = 'div.video_item';
    o.areas.video_scroll.ctrl           = {};
    o.areas.video_scroll.ctrl.prev      = o.areas.video_scroll.wrapper + ' a.cprev';
    o.areas.video_scroll.ctrl.next      = o.areas.video_scroll.wrapper + ' a.cnext';
    o.areas.video_scroll.ctrl.all       = o.areas.video_scroll.wrapper + ' a.ctrl';
    o.areas.video_scroll.list           = {};
    o.areas.video_scroll.list.wrapper   = o.areas.video_scroll.wrapper + ' div.v-carousel';
    o.areas.video_scroll.list.list      = o.areas.video_scroll.list.wrapper + '>ul';
    o.areas.video_scroll.list.item      = o.areas.video_scroll.list.list + '>li';

    //    Показываем баннеры справа от текста
    o.areas.banners                        = {};
    o.areas.is_text                        = 'div.text';

    o.areas.fixed_label = $('#fixed_label');


    o.currentBanner                        = 0;
    o.bannersOnStep                        = 3;



    /**
     * Запускаем все оработчики
     */
    o.init = function()
    {
        o.asideTabs();
        o.videoVScroll();
        o.contentHScroll();
        o.bannersVShow();

        o.toggleTitle();

        if ( o.areas.fixed_label.length > 0 )
        {
            o.fixLabel( o.areas.fixed_label );
        }
    }



    /**
     * Табы справа в aside
     * Выделяем нужные, action при клике
     */
    o.asideTabs = function()
    {
        var wrapper = $( o.areas.tabbed.wrapper );

        if ( wrapper.length > 0 )
        {
            var tabs  = $( o.areas.tabbed.tabs );
            var areas = $( o.areas.tabbed.areas );

            //    Выделяем первый таб и показываем первый контент-блок
            tabs.first().find('a').addClass('active');
            areas.first().addClass('active');

            if ( tabs.length > 1 )
            {
                tabs.find('a').click( function()
                {
                    tabs.find('a').removeClass('active');
                    $(this).addClass('active');

                    var id = $(this).attr('tab-id');

                    areas.removeClass('active');
                    areas.parent().find( 'div.tab-' + id ).addClass('active');

                    return false;
                })
            }
        }
    }



    /**
     * Вертикальный скроллер рядом с Youtube роликом
     *
     * 1. Показываем нижнюю стрелку, если контента много
     * 2. action на клики стрелок. При достижении края - скрываем ближайшую стрелку
     */
    o.videoVScroll = function()
    {
        var oWrapper = o.areas.video_scroll.wrapper;

        if ( oWrapper.length > 0 )
        {
            //    Высота всего враппера
            var wrapper_height = $( o.areas.video_scroll.wrapper ).height();

            //
            var oMove        = $( o.areas.video_scroll.ctrl.all );
            var oMovePrev    = $( o.areas.video_scroll.ctrl.prev );
            var oMoveNext    = $( o.areas.video_scroll.ctrl.next );

            var oList        = $( o.areas.video_scroll.list.list );

            var oItem        = $( o.areas.video_scroll.list.item );


            //    Сколько сейчас items в строке? Если не влазят - показываем праву и делаем action нажатия
            var items_count   = oItem.length;
            var item_width    = oItem.height() + 20; /* margin-bottom */


            if ( item_width * items_count > wrapper_height )
            {
                oMoveNext.show();


                //    Предустановки
                var current_item = 1;
                var items_onpage = 5;


                //    Клик вправо
                oMoveNext.click( function()
                {
                    oMovePrev.show();

                    oList.animate(
                    {
                        marginTop: '-=' + item_width + 'px'
                    });

                    current_item++;

                    if ( ( current_item + items_onpage ) == items_count )
                    {
                        $(this).hide();
                    }

                    return false;
                });


                //    Клик влево
                oMovePrev.click( function()
                {
                    oMoveNext.show();

                    oList.animate(
                    {
                        marginTop: '+=' + item_width + 'px'
                    });

                    current_item--;

                    if ( current_item == 1 )
                    {
                        $(this).hide();
                    }

                    return false;
                });
            }
        }
    }



    /**
     * Горизонтальный скроллер контента
     *
     * 1. Вычисляем максимальный размер враппера контента
     * 2. Если контента меньше, чем ширина страниы - не показываем стрелки, больше - показываем правую стрелку
     * 3. Вытягиваем стрелки и их врапперы по высоте, центрируем сами стрелки
     * 4. action на клики стрелок. При достижении края - скрываем ближайшую стрелку
     */
    o.contentHScroll = function()
    {
        var oWrappers = $( o.areas.hscroll.wrapper );
        
        var moveLength = 232;

        if ( oWrappers.length > 0 )
        {
            oWrappers.each( function( i, item )
            {
                var el = $(item);

                //    Высота всего враппера
                var wrapper_height = el.height();
                var wrapper_width  = el.width();

                //    Вытягиваем по вертикали стрелки ← → и показываем правую
                var oMove        = el.find( o.areas.hscroll.ctrl.all );
                var oMovePrev    = el.find( o.areas.hscroll.ctrl.prev );
                var oMoveNext    = el.find( o.areas.hscroll.ctrl.next );

                var oList        = el.find( o.areas.hscroll.list.list );

                var oItem        = el.find( o.areas.hscroll.list.item );


                oMove.height( wrapper_height );


                //    Сколько сейчас items в строке? Если не влазят - показываем праву и делаем action нажатия
                var items_count   = oItem.length;
                //var item_width    = oItem.outerWidth();
                
                if ( moveLength * items_count > wrapper_width )    //    item_width
                {
                    oMoveNext.show();

                    //    Предустановки
                    var items_onpage     = 5;
                    var itemsLeft         = 0;
                    var itemsRight        = items_count - items_onpage;

                    //    Клик вправо
                    oMoveNext.click( function()
                    {
                        oMovePrev.show();

                        oList.animate(
                        {
                            marginLeft: '-=' + moveLength + 'px'    //    item_width
                        });

                        itemsRight--;
                        itemsLeft++;

                        if ( itemsRight == 0 )
                        {
                            $(this).hide();
                        }

                        return false;
                    });

                    //    Клик влево
                    oMovePrev.click( function()
                    {
                        oMoveNext.show();

                        oList.animate(
                        {
                            marginLeft: '+=' + moveLength + 'px'    //    item_width
                        });

                        itemsRight++;
                        itemsLeft--;

                        if ( itemsLeft == 0 )
                        {
                            $(this).hide();
                        }

                        return false;
                    });
                }
            });
        }
    }



    /**
     * Показываем по очереди баннеры при высоком тексте (макет 3)
     */
    o.bannersVShow = function()
    {
        if ( $( o.areas.is_text ).length > 0 )
        {
            var container     = $('#container');
            var bannerPlace  = $('#banners_placeholder');

            var sizes         = getFullPageSize();

            //    Эти баннеры мы будем показывать
            var banners         = $('#banners li');
            var bannersCount = banners.length;

            //    Маркируем баннеры
            var step = 1;
            var y = 1;
            for ( i = 0; i <= ( bannersCount - 1 ); i++ )
            {
                banners.eq( i ).addClass( 'step-' + step );


                if ( y == o.bannersOnStep )
                {
                    step++;
                    y = 0;
                }

                y++;
            }

            if ( bannersCount > 0 )
            {
                var docHeight     = $('#doc').height();
                var asideHeight  = $( o.areas.base.aside ).height() + 194;

                var bannerRight  = ( sizes['0'] - container.width() ) / 2;
                bannerPlace.css('right', bannerRight + 'px')

                //    В этом пространстве будем показывать баннеры
                var bannersSpace = docHeight - asideHeight;
                //    Столько пикселей будет показываться баннер
                //var pxPerBanner  = ( bannersSpace / bannersCount ) * o.bannersOnStep;
                var pxPerBanner  = bannersSpace / bannersCount;

                //    Если у нас есть свободное пространство - будем показывать баннеры
                if ( sizes['1'] > ( asideHeight + sizes['3'] ) )
                {
                    $(window).scroll( function()
                    {
                        var top = $(this).scrollTop();
                        var currentBannerIndex = -1;

                        if ( top > asideHeight )
                        {
                            bannerPlace.show();

                            currentBannerIndex = parseInt( ( top - asideHeight ) / pxPerBanner );

                            if ( o.currentBanner !== currentBannerIndex )
                            {
                                o.currentBanner = currentBannerIndex;

                                //var place = banners.parent().find( 'li.step-' + o.currentBanner );
                                var place = banners.eq( o.currentBanner );

                                bannerPlace.html( place );
                            }
                        }
                        else
                        {
                            bannerPlace.hide();
                        }
                    });
                }

            }
        }
    }

    /**
     * Скрываем большие заголовки
     */
    o.toggleTitle = function()
    {
        var maxHeight   = 50;
        var maxLength   = 33;
        var newLink     = '<a href="#" class="over_title"></a>';

        $('a.toggle_title').each( function( index, item )
        {
            var el = $(item);

            var title_large = el.text();
            var href        = el.attr('href');

            if ( el.height() > maxHeight )
            {
                el.before( newLink );

                var over = el.parent()
                             .addClass('posRel')
                             .children('a.over_title');

                var offset  = el.position();
                var width   = el.width() + 10;

                over.text(title_large)
                        .attr('href', href)
                        .attr( 'class', el.attr('class'))
                        .addClass('over_title')
                        .width(width)
                        .hide();

                if ( offset.top > 0 )
                {
                    over.css('top', offset.top);
                }

                el.text( title_large.substr(0, maxLength) + '…' );

                el.mouseenter( function()
                {
                    over.show().mouseout( function()
                    {
                        $(this).hide();
                    });
                });
            }
        });
    }

    /**
     * Фиксируем на нужной высоте лейбл на index странице
     *
     * @param   object  root    Лейбл
     */
    o.fixLabel = function( root )
    {
        var dif = 2.875;

        var top = (root.outerWidth() / dif) - 2 + 'px';

        root.css('top', top)
            .show();
    }
}
