Umnitsa.Popup = function() {

    var PADDING = 36;
    var RESIZE_DURATION = 200;
    var FADE_IN_DURATION = 300;
    var FADE_OUT_DURATION = 200;

    var DEFAULT_WIDTH = 400;

    var LOADER_SIZE = 64;

    var $w, $in, $loader;
    var shown = false;
    var width = 0;
    var height = 0;

    if (Umnitsa.disableFade) {
        FADE_IN_DURATION = 0;
        FADE_OUT_DURATION = 0;
    }

    function _draw() {
        $w = $(document.createElement('div'))
            .addClass('pop')
            .css({
                position : 'absolute',
                zIndex : 500,
                left : '50%',
                top : 0
            })
            .html('<div class="popz"><ins class="r"></ins><ins class="b"></ins><ins class="rb"></ins></div>')
            .hide()
            .appendTo(document.body);
        resize(PADDING + LOADER_SIZE, PADDING + LOADER_SIZE);
        $in = $(document.createElement('div'))
            .appendTo($w)
            .addClass('popin');
        Umnitsa.Popup._$ = $in;
        $loader = $(document.createElement('div'))
            .addClass('popup-loader')
            .css({
                opacity : .75
            })
            .hide()
            .appendTo($w);
        $(document.createElement('div'))
            .addClass('popup-close')
            .appendTo($w)
            .attr('title', 'Закрыть окно')
            .click(hide);
    }

    function show() {
        if (!$w) {
            _draw();
        }
        if (!shown) {
            Umnitsa.Overlay.show(hide);
            $w.fadeIn(FADE_IN_DURATION);
            shown = true;
        }
    }

    function hide() {
        if (shown) {
            Umnitsa.Overlay.hide();
            $w.fadeOut(FADE_OUT_DURATION, clear);
            resize(PADDING + LOADER_SIZE, PADDING + LOADER_SIZE);
            shown = false;
        }
    }

    function clear() {
        $in.empty();
    }

    function resize(_width, _height, callback) {
        if ((_width != width) || (_height != height)) {
            width = _width;
            height = _height;
            var newWidth = width + PADDING;
            var newHeight = height + PADDING;
            var top = (document.documentElement.clientHeight - newHeight) * .45;
            if (top < 20) {
                top = 20;
            }
            var scrollTop = document.documentElement.scrollTop + document.body.scrollTop;
            top += scrollTop;
            if (shown) {
                $w.animate({
                    marginLeft : - newWidth / 2,
                    //marginTop : - newHeight / 2,
                    top : top,
                    width : newWidth,
                    height : newHeight
                }, RESIZE_DURATION, 'linear', callback);
            } else {
                $w.css({
                    marginLeft : - newWidth / 2,
                    //marginTop : - newHeight / 2,
                    top : top,
                    width : newWidth,
                    height : newHeight
                });
            }
        } else {
            if ($.isFunction(callback)) {
                callback();
            }
        }
    }

    function loader() {
        resize(Math.max(width, LOADER_SIZE), Math.max(height, LOADER_SIZE));
        $loader.show();
    }

    function picture(src) {
        var image = new Image();
        show();
        loader();
        image.onload = _imageLoadHandler;
        image.src = src;
    }
    function _imageLoadHandler() {
        var image = this;
        $loader.hide();
        resize(image.width, image.height, function() { showElement($(image)) });
    }


    function showElement(el) {
        clear();
        el.hide().appendTo($in).fadeIn(FADE_IN_DURATION * 3);
    }

    function html(params) {
        show();
        if (typeof params !== 'object') {
            params = {
                html : params,
                width : DEFAULT_WIDTH
            };
        }
        if (!params.width) {
            params.width = DEFAULT_WIDTH;
        }
        var $el = $(document.createElement('div'))
            .addClass('incnt')
            .width(params.width);
        $el.get(0).innerHTML = params.html;

        if (params.css) {
            $el.addClass(params.css);
        }
        showElement($el,params.html);
        resize($el.outerWidth(), $el.outerHeight());
    }

    function multiview(params) {
        if (!params.pics) {
            return;
        }
        var $el = $(document.createElement('div'))
            .width(params.width)
            .addClass('multiview');

        var $pc = $(document.createElement('div'))
            .addClass('img')
            .height(params.height)
            .appendTo($el);
        var $bc = $(document.createElement('div')).addClass('btns').appendTo($el);
        for (var i = 0; i < params.pics.length; i++) {
            $(document.createElement('div'))
                .html('<img src="' + params.pics[i].src + '"><p>' + params.pics[i].title + '</p>')
                .appendTo($pc);
            $(document.createElement('span'))
                .addClass('buy-btn')
                .html('<span>' + (i + 1).toString() + '</span><ins></ins><ins class="r"></ins>')
                .appendTo($bc);
        }
        $el.append($(document.createElement('div')).addClass('text').html(params.content));
        show();
        showElement($el);
        resize($el.outerWidth(), $el.outerHeight());
        var $images = $pc.find('div');
        var idx = 0;
        $images.eq(idx).show();
        $bc.find('.buy-btn').mouseover(function() {
            var index = $(this).index();
            if (idx != index) {
                $images.eq(idx).fadeOut(150);
                $images.eq(index).fadeIn(150);
                idx = index;
            }
        });
    }

    return {
        showPicture : function(src) {
            picture(src);
        },
        showHTML : function(params) {
            html(params);
        },
        showMultiview : function(params) {
            multiview(params);
        },
        close : function() {
            hide()
        }
    }

}();

window.closePopup = function() {
    Umnitsa.Popup.close();
    return false;
};

