$(function () {
    var Overlay = function (opts) {
        var obj = this;
        var defaults = {};
        defaults.opacity = 0.7;     // ranges from 0 to 1, gets automatically set for IE
        defaults.effect_time = 300;    // delay for toggling overlay
        defaults.overlay_id = 'overlay';
        defaults.overlay_class = 'overlay';
        defaults.dialog_id = 'dialog';
        defaults.dialog_class = 'dialog';
        defaults.dialog_close_class = 'dialog_close';
        defaults.repositionDialogOnScrollOrResize = true;
        obj.ovl = undefined; // the overlay node
        obj.dialog_obj = undefined; // the dialog node
        obj.dialog_obj_content = undefined;
        obj.inited = false;    // wether dialog has been initialized    


        // merge options with defaults
        obj.opts = $.extend({}, defaults, opts);

        obj.init = function (css) {
            if (obj.inited) return false;

            var ovl = $(document.createElement('div'));
            ovl.attr('id', obj.opts.overlay_id);
            ovl.attr('class', obj.opts.overlay_class);

            // sets required css properties
            ovl.css({
                opacity: obj.opts.opacity,
                filter: 'alpha(opacity=' + (obj.opts.opacity * 100) + ')',
                position: ((!$.browser.msie || ($.browser.msie && parseInt($.browser.version) > 6)) ? "fixed" : "absolute"),
                display: 'none',
                top: '0px',
                left: '0px',
                height: '100%',
                'z-index': 990
            });

            //if defined, set the user defined properties
            if (typeof css == 'object') {
                ovl.css(css);
                // sets some standard css properties
            } else {
                ovl.css({
                    'background-color': '#000'
                });
            }

            var adapt_dimension = function () {
                $.Overlay.ovl.css({
                    width: ($(window).scrollLeft() > 0 ? $(window).scrollLeft() + $(window).width() : $(window).width()),
                    height: ($(window).scrollTop() > 0 ? $(window).scrollTop() + $(window).height() : $(window).height())
                });
            };

            // if window is resized then reposition the overlay box 
            $(window).resize(adapt_dimension);

            if ($.browser.msie && parseInt(jQuery.browser.version) <= 6) {
                $(window).scroll(adapt_dimension);
            }

            $('body').append(ovl);
            obj.ovl = $('#' + obj.opts.overlay_id);
            obj.ovl.click(obj.dialog_hide);
            $(document).keydown(function (e) {
                if (e.keyCode == 27) obj.ovl.trigger('click');
            });

            obj.inited = true;
        };

        obj.show = function (callback) {
            if (typeof obj.ovl == 'undefined') return false;

            obj.ovl.css({
                width: ($(window).scrollLeft() > 0 ? $(window).scrollLeft() + $(window).width() : $(window).width()),
                height: ($(window).scrollTop() > 0 ? $(window).scrollTop() + $(window).height() : $(window).height())
            });

            obj.ovl.fadeIn(obj.opts.delay, (typeof callback == "function" ? callback : null));
        };

        obj.hide = function () {
            if (typeof obj.ovl == 'undefined') return false;

            obj.ovl.fadeOut(obj.opts.delay);
        };

        obj.dialog = function (html, css, afterInsert) {
            var dialog_obj = $('<div id="' + obj.opts.dialog_id + '" class="' + obj.opts.dialog_class + '"/>');
            dialog_obj.append('<div id="topbar"><h1></h1><a class="dialog_close" id="closeBtn" href="javascript:;"><img src="/Common/dialog/close.png"></a></div>');
            dialog_obj.append('<div class="' + obj.opts.dialog_class + '_content"/>');

            dialog_obj.css({
                position: 'absolute',
                'z-index': 991,
                opacity: 'none',
                'display': 'none'
            });

            //if defined, set the user defined properties
            if (typeof css == 'object') {
                dialog_obj.css(css);
            } else {
                dialog_obj.css({
                    'background-color': '#fff',
                    width: '500px'
                });
            }

            $('body').append(dialog_obj);
            obj.dialog_obj = $('#' + obj.opts.dialog_id);
            obj.dialog_obj_content = obj.dialog_obj.find("." + obj.opts.dialog_class + "_content");

            // if window is resized then reposition the overlay box

            if (obj.opts.repositionDialogOnScrollOrResize) {
                $(document).scroll(obj.adapt_position);
                $(document).resize(obj.adapt_position);
            }

            obj.adapt_position();

            $("." + obj.opts.dialog_close_class, obj.dialog_obj).click(function () {
                obj.dialog_hide();
            });

            obj.show(function () {
                if (typeof afterInsert == "function") afterInsert(obj.dialog_obj, obj.dialog_obj_content);
                obj.dialog_obj.fadeIn(180);
            });
        };

        obj.dialog_hide = function (e) {
            $('.' + obj.opts.dialog_class).remove();

            $.Overlay.hide();

            return false;
        };

        //sets dialog position according to user-defined size and scroll
        obj.adapt_position = function (e) {

            setTimeout(function () {
                var locked = obj.dialog_obj.data('locked');

                if (typeof locked == "undefined" || locked == false) {
                    obj.dialog_obj.data('locked', true);
                    var currW = obj.dialog_obj.outerWidth();
                    var currH = obj.dialog_obj.outerHeight();
                    var lastW = obj.dialog_obj.data('lastW');
                    var lastH = obj.dialog_obj.data('lastH');
                    obj.dialog_obj.data('lastW', currW);
                    obj.dialog_obj.data('lastH', currH);
                    var left = (($(window).width() - currW) / 2) + $(window).scrollLeft();
                    var top = (($(window).height() - currH) / 3) + $(window).scrollTop();

                    if (obj.dialog_obj.css('display') != 'none') {
                        obj.dialog_obj.animate({ left: left + 'px', top: top + 'px' }, 500, null, function () {
                            obj.dialog_obj.data('locked', false);
                        });
                    } else {
                        obj.dialog_obj.css({ left: left + 'px', top: top + 'px' });
                    }
                } else {
                    setTimeout(obj.adapt_position, 500);
                }
            }, 500);
        };
    };

    $.extend({
        // expose overlay into jquery
        Overlay: new Overlay()
    });

    // auto load
    $.Overlay.init();
});
