function Overlay() {
    this.movieInfo = {};
}

Overlay.prototype.addMovieInfo = function (obj) {
     $.extend(this.movieInfo, obj);
}

Overlay.prototype.bindProductOverlay = function (selector, getPositioningElement, x, y) {
    var overlayThis = this;
    var zoom = $("#zoom");

    var zoomHovering = {};
    var boxartHovering = {};

    $(selector).hoverIntent({sensitivity: 10, interval: 250, timeout: 400,
        over: function() {
            var productNo = _getProductNo(this);
            boxartHovering[productNo] = true;

            _fillTemplate(_getMovieInfo(this, overlayThis), zoom);
            _positionZoom(zoom, getPositioningElement(this), x, y);

            zoom.hover(
                function () {
                    zoomHovering[productNo] = true;
                },
                function () {
                    zoomHovering[productNo] = false;
                    if (!boxartHovering[productNo]) {
                        _closeZoom(zoom, productNo);
                    }
                }
            );

            _openZoom(zoom, productNo);
        },
        out: function() {
            var productNo = _getProductNo(this);
            boxartHovering[productNo] = false;

            if (!zoomHovering[productNo]) {
                _closeZoom(zoom, productNo);
            }
        }
    });
}

function _getMovieInfo(boxart, overlay) {
    return overlay.movieInfo[_getProductNo(boxart)];
}

function _getProductNo (boxart) {
    var classes = $(boxart)[0].className.split(/ /);
    var productNo = '';

    $.each(classes, function(i, item) {
        if (item.substring(0, 8) == 'product-') {
            productNo = item.substring(8);
        }
    });
    return productNo;
}

function _positionZoom(zoom, base, x, y) {
    if (base.offset().left > ($(window).width() / 2)) {
        zoom.css({
            'top': base.offset().top - y,
            'left': base.offset().left - zoom.width() + x,
            'background': 'url(/images/hoverbox_right.png) no-repeat'
        });
    } else {
        zoom.css({
            'top': base.offset().top - y,
            'left': base.offset().left + base.width() - x,
            'background': 'url(/images/hoverbox_left.png) no-repeat'
        });
    }
}

function _fillTemplate(info, zoom) {
    var template = $("#zoom-template").text();

    template = template.replace(/\{\{PRODUCT_NO\}\}/g, info.product_no);
    template = template.replace("{{TITLE}}", info.title);
    template = template.replace("{{SUMMARY}}", info.synopsis);
    template = template.replace("{{GENRE}}", info.genre);
    template = template.replace("{{RELEASE_DATE}}", info.release_date);
    template = template.replace("{{RATING}}", info.rating_html);
    template = template.replace("{{PRICE}}", '$' + info.price);

    zoom.html(template);

    if (!info.release_date) {
        zoom.find(".zoom-release-date").remove();
    }
    if (!info.price) {
        zoom.find(".zoom-links tr").eq(1).remove();
        zoom.find(".zoom-price").remove();
    }
}

var currentProductNo = null;
function _closeZoom(zoom, productNo) {
    if (currentProductNo == productNo) {
        zoom.hide();
    }
}
function _openZoom(zoom, productNo) {
    currentProductNo = productNo;
    zoom.show();
}

var overlay = new Overlay();
