jQuery.fn.dclipper = function(options){
    // настройки по умолчанию
    options = jQuery.extend({
        speed:                  0,
        defaultCss:             false,
        widthShiftCallback:     false,
        heightShiftCallback:    false
    },options);

   return this.each(
    function (){

        var elm = jQuery(this);
        var elmOffset, elmWidth, elmHeight;

        var elmMinWidth = parseInt(elm.css('min-width'));
        var elmMaxWidth = parseInt(elm.css('max-width'));


        var oElmWidth = elm.width();
        var oElmHeight = elm.height();

        var oElmHeight = elm.height();
        var oElmWidth = elm.width();
        var oElmOffset = elm.offset();
        var oWinHeight = jQuery(window).height();
        var oWinWidth = jQuery(window).width();

        var winHeight;
        var winWidth;

        var rateLeft = oWinWidth / oElmOffset.left;
        var rateRight = oWinWidth / (oWinWidth - oElmOffset.left - oElmWidth);
        var rateTop = oWinHeight / oElmOffset.top;
        var rateBottom = oWinHeight / (oWinHeight - oElmOffset.top - oElmHeight);

        elm.css('top', oElmOffset.top + 'px');

        elm.css('bottom', '45px');

        var setProperties = function(){
            elmOffset  = elm.offset();
            elmWidth   = elm.width();
            elmHeight  = elm.height();

            winHeight = jQuery(window).height();
            winWidth = jQuery(window).width();
        }

        var horizontalShift = function(load){
            setProperties();

            if(isNaN(elmMaxWidth) && (isNaN(elmMinWidth) || elmMinWidth == 0)) {
                return;
            }
            w = winWidth - elmOffset.left;

            if(w > elmMaxWidth) {
                w = elmMaxWidth;
            } else if(w < elmMinWidth) {
                w = elmMinWidth;
            }

            elm.css('width', w + 'px');
        }

        var verticalShift = function(load){
            setProperties();

            topStop = 64;
            bottomStop = 45;


            _top =  (winHeight * (1 / rateTop));

            _bottom = (winHeight - _top - elmHeight);

            if(_top < topStop) { _top = topStop; }
            if(_bottom < bottomStop) { _bottom = bottomStop; }

            _h = winHeight - _top - _bottom;
            if(_h < oElmHeight && ((_top > topStop) || (_bottom > bottomStop))) {
                dh = (oElmHeight - _h) / 2;
                dt = (_top - topStop);
                db = (_bottom - bottomStop);
                if(db == 0) {
                    dh += dh;
                }
                if(dt >= dh) {
                    dt = dh;
                } else {
                    dh = dh - dt;
                }
                _top -= dt;

            }

            elm.css('top', _top + 'px')
            heightShiftCallback();
        }

        var shift = function(load){
            horizontalShift(load);
            verticalShift(load);

        };

        var widthShiftCallback = function(){}

        var heightShiftCallback = function(){}

        var init = function(){
            if(options.defaultCss){
                elm.css(options.defaultCss);
            }
            if(options.heightShiftCallback){
                heightShiftCallback = options.heightShiftCallback;
            }
            if(options.widthShiftCallback){
                widthShiftCallback = options.widthShiftCallback;
            }
            shift(true);
            jQuery(window).bind('resize', function(){
                shift(false);
            });
        };

        init();
    });
};


$q(document).ready(function(){
    $q('.extra').dclipper({heightShiftCallback: function() {
        $q('.scroll-pane').each(function() {
            $q(this).jScrollPane( { showArrows: true, hideFocus:true });
            jsp = $q('.scroll-pane').data('jsp');
            jsp.reinitialise();
        });
    }});
});

