/*  
    Код для панели задаббленного сайта

    перед вставкой в html 
    определить настройки в хеше dubbyPanelOptions 
*/
(function($jq, options) {

    var opts = $jq.extend(
        {
            'position': 'top',
            'minHeight': 33,
            'maxHeight': 99,
            'minWidth':  33,
            'maxWidth':  170,
            'maxResize': 300,  // максимальный размер панели при ресайзе
            'minResize': 100,  // минимальный размер панели при ресайзе
            //'isResizing': false // флаг для изменения размера
            'scrollSize': 231,
            'menu': {
                hPadding: [30, 170, 13, 50 ],
                vPadding: [50, 13, 20, 30 ]
            },
            methods: {}
        },
        options
    );

    $jq(function() {

        // фикс высоты фрейма
        fixPanelSize('init');

        
        $jq('#toggle .button').click(togglePanel);

        // scroll
        
        /*$jq('#scroll').draggable({
            axis: ( opts.position == 'top' ? 'x' : 'y' )
        })
        .bind('drag', dragScroll);*/
            
        

        // resizer
       
        // обработчики для ресайза и скролинга 
        //$jq(document).mousedown( onMouseDown );

        var handles = {
            top: 's',
            bottom: 'n',
            left: 'e',
            right: 'w'
        };

        /*$jq('#panel-c')
            .resizable({
                handles: handles[opts.position],
                autoHide: true
                maxHeight: opts.maxResize,
                minHeight: opts.minResize,
                maxWidth:  opts.maxResize,
                minWidth:  opts.minResize,
            })
            .bind('start', 
                function (e, ui) { 
                    console.debug(ui);
                    if ( $jq('#panel').hasClass('min') )
                        ui.stop();
                }
            )
            .bind('resize', 
                function(e, ui) {
                    var name = opts.position.match('top|bottom') ? 'height' : 'width';
                    var $frame = $jq('frame-c');
                    var frameSize = $frame[name]();
                    var panelSize = $jq('#panel-c')[name]();

                    frameSize += panelSize - (frameSize - panelSize);

                    $frame.css(name, frameSize);

                    return true;
                }
            )
            .resize('disable')
        ;*/

        // выделение ссылки по клику
        $jq('#menu a').click(function () {
            $jq('#menu a.selected').removeClass('selected');
            $jq(this).addClass('selected');
            //togglePanel();
        });
       
        // при изменении размера окна изменяем размеры фрейма
        $jq(window).resize(function() { fixPanelSize('resize') }); 

        togglePanel();

    });

    // изменение размеров панельки и подгонка размеров фрейма
    var fixPanelSize = function(state) {
        $panel = $jq('#panel-c');
        $frame = $jq('#frame-c');
        var size = 0;

        var padding = 
            'padding' + 
            opts.position.substr(0,1).toUpperCase() + 
            opts.position.substr(1, opts.position.length - 1)
        ;
        //console.debug(opts.position);
        var sizeName, minSize, maxSize;
        if ( opts.position == 'top' ) {
            sizeName = 'height';
            minSize = opts.minHeight;
            maxSize = opts.maxHeight;
        }
        else {
            sizeName = 'width';
            minSize = opts.minWidth;
            maxSize = opts.maxWidth;
        }

        if ( state == 'init' ) {
            $frame.css(sizeName, ($frame[sizeName]() - minSize) + 'px');
            $frame.css(padding, minSize + 'px');
        }
        else if ( state == 'min' ) {
            $panel.css(sizeName, minSize);
            $frame.css(sizeName, ($frame[sizeName]() + (maxSize - minSize)) + 'px');
            $frame.css(padding, minSize + 'px');
            $jq('#panel').addClass('min');
            //$frame.resize('disable');
        } 
        else if ( state == 'max' ) {
            $panel.css(sizeName, maxSize);
            $frame.css(sizeName, ($frame[sizeName]() - (maxSize - minSize)) + 'px');
            $frame.css(padding, maxSize + 'px');
            $jq('#panel').removeClass('min');
            //$frame.resize('enable');
            setMenuSizes();
        }
        else if ( state == 'resize' ) {

            var panelSize = $jq('#panel').hasClass('min') ? minSize : maxSize;

            if ( opts.position == 'top' ) 
                $frame.css('height', window.innerHeight - panelSize);
            else
                $frame.css('width', window.innerWidth - panelSize);

        }

    }
    
    var setMenuSizes = function() {
        var $menu = $jq('#menu');
        var $panel = $jq('#panel');
        var mopts = opts.menu;
        var pos;
        
        if ( opts.position == 'top' ) {
            pos = {
                'top': mopts.hPadding[0],
                'left': mopts.hPadding[3],
                'width': $panel.width() - mopts.hPadding[3] - mopts.hPadding[1],
                'height': $panel.height() - mopts.hPadding[0] - mopts.hPadding[2]
            };
            // вычисляем шаг для скрола
            opts.scrollStep = parseInt( 
                ($menu.find('table').width() - pos.width) 
                / ( pos.width - opts.scrollSize ) 
            ) || 1;
            //console.debug('scrollStep: ' + opts.scrollStep);

            // если список ссылок меньше области меню, убираем скролл
            if ( pos.width > $menu.find('table').width() ) {
                $jq('#scroll').hide();
                $jq('#scroll-line').hide();
            }
            else {
                $jq('#scroll').show();
                $jq('#scroll-line').show();
            }
        }
        else {
            pos = {
                top: mopts.vPadding[0],
                left: mopts.vPadding[3],
                width: $panel.width() - mopts.vPadding[3] - mopts.vPadding[1],
                height: $panel.height() - mopts.vPadding[0] - mopts.vPadding[2]
            };            

            // вычисляем шаг для скрола
            opts.scrollStep = parseInt( 
                ($menu.find('table').height() - pos.height) 
                / ( pos.height - opts.scrollSize ) 
            ) || 1;
            //console.debug('scrollStep: ' + opts.scrollStep);

            // если список ссылок меньше области меню, убираем скролл
            if ( pos.height > $menu.find('table').height() ) {
                $jq('#scroll').hide();
                $jq('#scroll-line').hide();
            }
            else {
                $jq('#scroll').show();
                $jq('#scroll-line').show();
            }

        }
       
 
        // изменяем размены меню
        $menu.css({
            top: pos.top + 'px',
            left: pos.left + 'px',
            width: pos.width + 'px',
            height: pos.height + 'px'
        });
                
        
        // ограничиваем область, в которой перетаскивается скролл
        // BUG свойство не применяется
        $jq('#scroll')
        .draggable('destroy')
        .draggable({
            axis: ( opts.position == 'top' ? 'x' : 'y' ),
            containment: 'parent'
            //containment: [pos.left + 'px', pos.top + 'px', (pos.left+pos.width) + 'px', (pos.top+pos.height) + 'px']
        })
        .bind('drag', dragScroll);

    };

    var dragScroll = function(e, ui) {
        var cssName1, cssName2, sizeName;

        if ( opts.position == 'top' ) {
            cssName1 = 'left';
            cssName2 = 'Left';
        }
        else {
            cssName1 = 'top';
            cssName2 = 'Top';
        }

        var offset = $jq('#scroll').get(0).style[cssName1].match('-?[0-9]+');
        offset = offset ? parseInt(offset[0]) : 0;

        if ( offset > 0 ) {
            offset = - offset * opts.scrollStep;
            $jq('#menu-table').get(0).style['margin'+cssName2] = offset + 'px';
        }
        
    };
 
    // открывает/сворачивает панель
    var togglePanel = function() {
        $panel = $jq('#panel-c');
        $frame = $jq('#frame-c');
        
        if ( opts.position == 'top' )
            fixPanelSize( ( $panel.height() == opts.maxHeight ? 'min' : 'max' ) );
        else
            fixPanelSize( ( $panel.width() == opts.maxWidth ? 'min' : 'max' ) );
    
    };


 
/*
    var onMouseDown = function(e) {

        console.debug('mousedown: ' + $jq(e.target).attr('id') );

        if ( $jq(e.target).attr('id') == 'resizer' ) {
            console.debug('mousedown: resizer');
            opts.isResizing = true;

            $jq(document).mousemove( onMouseMove );
            $jq(document).mouseup( onMouseUp );
        } 
    };

    
    var onMouseUp = function(e) {
        console.debug('mouseup:');
        
        if ( opts.isResizing ) {
            opts.isResizing = false;
            $jq(document).unbind('mousemove', onMouseMove );
            $jq(document).unbind('mouseup' ,onMouseUp );            
        }

    };

    var onMouseMove = function(e) {
        $panel = $jq('#panel-c');
        
        console.debug('mousemove: ' + $jq(e.target).attr('id') );
             
        if ( opts.isResizing ) {

            var panelC, mouseC, name;
         
            if ( opts.position.match('^top|bottom$') ) {
                name   = 'height';
                panelC = $panel.height();
                mouseC = e.pageY;
            }
            else {
                name   = 'width';
                panelC = $panel.width();
                mouseC = e.pageX;
            }
         
            if ( 
                mouseC > opts.maxResize ||
                mouseC < opts.minResize ||
                ( ! $jq(e.target).attr('id').match('^panel') &&
                $jq(e.target).parents('#panel-c').length == 0 )
            ) {
                opts.isResizing = false;
                $jq(document).unbind('mousemove', onMouseMove );
                $jq(document).unbind('mouseup' ,onMouseUp );            
                return true;
            }
    
            $panel[name]( mouseC );
            return false;
        }
        
    };
*/


})(jQuery, dubbyPanelOptions);
