﻿(function($) {
    $.fn.notifyLotAdded = function(o) {
        return this.each(function() {
            (new $ltmf(this, o)).displayNotification();
        });
    };

    var defaults = {
        message: '',
        closeCaption: 'Close'
    };

    $ltmf = function(e, o) {
        this.options = $.extend({}, defaults, o || {});
        this.image = e;
        this.blockerDiv = null;
        this.notifBlock = null;
        this.setup();
    };

    $ltmf.prototype.extend = $.extend;

    $ltmf.getWindowDimensions = function() {
        var h = $(window).height();
        var w = $(window).width();
        return { height: h, width: w };
    };

    $ltmf.getWindowOffset = function() {
        var t = $(window).scrollTop();
        var l = $(window).scrollLeft();
        return { top: t, left: l };
    };

    $ltmf.setDimensions = function(item, dim) {
        $(item).width(dim.width);
        $(item).height(dim.height);
    }

    $ltmf.setOffset = function(item, offset) {
        $(item).css('top', offset.top + 'px');
        $(item).css('left', offset.left + 'px');
    }

    $ltmf.prototype.extend({
        setup: function() {
            this.createBlockerDiv();
            this.createNotificationBlock();
        },

        displayNotification: function() {
            this.turnOnEventBindings();
            this.blockerDiv.show();
            this.notifBlock.show();
        },

        onWindowResize: function(e) {
            var context = e.data;
            context.centerMessageBox();
        },

        onCloseClick: function(e) {
            var context = e.data;
            context.turnOffEventBindings();
            context.notifBlock.remove();
            context.notifBlock = null;
            context.blockerDiv.hide();
            context.blockerDiv.unbind('click', context.onCloseClick);
            context.blockerDiv = null;
        },

        onIEScrollResize: function(e) {
            var blockDiv = e.data;

            var offset = $ltmf.getWindowOffset();
            $ltmf.setOffset(blockDiv, offset);

            var dim = $ltmf.getWindowDimensions();
            $ltmf.setDimensions(blockDiv, dim);
        },

        turnOnEventBindings: function() {
            this.blockerDiv.bind('click', this, this.onCloseClick);
            $(window).bind('resize', this, this.onWindowResize);
            if (jQuery.browser.msie) {
                $(window).bind('resize scroll', this.blockerDiv, this.onIEScrollResize);
                this.onIEScrollResize({ data: this.blockerDiv });
            }
        },

        turnOffEventBindings: function() {
            this.notifBlock.unbind('click', this.onCloseClick);
            $(window).unbind('resize', this.onWindowResize);
            if (jQuery.browser.msie) {
                $(window).unbind('scroll', this.onIEScrollResize);
                $(window).unbind('resize', this.onIEScrollResize);
            }
        },

        createNotificationBlock: function() {
            var content = $(this.image).clone();
            var divCloseHeader = $('<div/>')
                .addClass('notification-header')
                .text(this.options.closeCaption)
                .bind('click', this, this.onCloseClick);
            var divMessage = $('<div/>')
                .addClass('notification-message')
                .html(this.options.message);
            var divContent = $('<div/>')
                .addClass('notification-content')
                .append(content);
            var divBlock = $('<div/>')
                .addClass('notification-block')
                .css({
                    'position': 'absolute',
                    'z-index': '180',
                    'top': '85px'
                })
                .append(divCloseHeader)
                .append(divMessage)
                .append(divContent);
            this.notifBlock = divBlock;
            this.notifBlock.hide();
            var body = $(document).find('body');
            $(body).prepend(this.notifBlock);
            this.centerMessageBox();
            return divBlock;
        },

        createBlockerDiv: function() {
            this.blockerDiv = $('div#blocker');
            if (this.blockerDiv.size() > 0) {
                return;
            }

            this.blockerDiv = $(this.getBlockerDivHtml())
                .addClass('blocker')
                .css({
                    'background-color': 'white',
                    'filter': 'alpha(opacity=0)',
                    'opacity': '0',
                    'z-index': '90'
                });

            // if IE - use event-based overlay floating
            if (jQuery.browser.msie) {
                $(this.blockerDiv).css({
                    'top': '0px',
                    'left': '0px',
                    'position': 'absolute'
                });
            }
            // otherwise use static giant overlay
            else {
                $(this.blockerDiv).css({
                    'position': 'fixed',
                    'width': '20000px',
                    'height': '20000px'
                });
            }

            var docDim = $ltmf.getWindowDimensions();
            $ltmf.setDimensions(this.blockerDiv, docDim);
            var body = $(document).find('body');
            $(body).prepend(this.blockerDiv);
            return this.blockerDiv;
        },

        getBlockerDivHtml: function() {
            return '<div id="blocker"></div>';
        },

        centerMessageBox: function() {
            var windowWidth = $(window).width();
            var block = this.notifBlock;
            var blockWidth = block.width();
            var left = (windowWidth - blockWidth) / 2;
            block.css({ 'left': left + 'px' });
        }
    });
})(jQuery);