﻿/* Copyright (c) 2008 Kean Loong Tan http://www.gimiti.com/kltan
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * Version: 1.1 (March 26, 2008)
 * Requires: jQuery 1.2+
 */
 
(function($) {

    var dialogDisplayed = false;
    var currentPos = true;

    $.fn.createModal = function(options) {

        // Extend our default options with those provided.
        var opts = $.extend({}, $.fn.createModal.defaults, options);

        $(this).click(function() {

            currentPos = opts.center;

            if (!dialogDisplayed) { //display dialog if none is there
                $("div.lt-memorial:first").prepend('<div class="ajax-loading">Loading...</div><div class="modal-overlay"></div><div class="modal"><div class="r"><div class="r"><div class="r"><div class="r"><div class="body"></div></div></div></div></div></div>');
                if (opts.closeButton) $("div.lt-memorial div.modal div.body").before('<a class="modal-close" href="javascript:void(0);" onclick="$.closeDialog();">close</a>');
                overlayPos(1);
                dialogDisplayed = true;
            }

            if (opts.progress) {
                if ($.browser.msie) {
                    var top = document.body.scrollTop || document.documentElement.scrollTop;
                }
                else {
                    var top = window.pageYOffset;
                }

                $("div.ajax-loading").css({
                    top: top
                }).show();
            }

            if (opts.urlRequest) {
                $.ajax({
                    type: opts.method,
                    data: opts.data,
                    url: opts.urlRequest,
                    success: function(msg) {
                        $("div.modal").addClass(opts.cssClass);
                        $("div.modal div.body").html(msg);
                        if (currentPos)
                            if (opts.reposition) { reposition(); }
                        $("div.ajax-loading").fadeOut(900);

                        if (opts.loadCallback) {
                            opts.loadCallback.call();
                        }

                        if (!opts.disableClose) {
                            $("div.modal-overlay").click(function() {
                                $.closeDialog();
                            });
                        }
                        if ($.browser.msie && parseInt($.browser.version) < 7 && !!DD_belatedPNG.fixPng) {
                            $("div.modal, div.modal *:not(input,span.input-text)").each(function() {
                                var background = $(this).css("background-image") || "";
                                if (background.indexOf(".png") != -1) {
                                    DD_belatedPNG.fixPng(this);
                                }
                            });
                        }
                    }
                });
            } else {
                $("div.modal").addClass(opts.cssClass);
                $("div.modal div.body").html(opts.content);
                if (currentPos)
                    if (opts.reposition) { reposition(); }
                $("div.ajax-loading").fadeOut(900);

                if (opts.loadCallback) {
                    opts.loadCallback.call();
                }

                if (!opts.disableClose) {
                    $("div.modal-overlay").click(function() {
                        $.closeDialog();
                    });
                }
            }

            //only IE6 needs this function
            if ($.browser.msie && parseInt($.browser.version) < 7) {
                $(window).scroll(function() {
                    if (dialogDisplayed == 1) {
                        overlayPos();
                        if (currentPos)
                            if (opts.reposition) { reposition(); }
                    }
                });
            }

            $(window).resize(function() {
                if (dialogDisplayed == 1) {
                    overlayPos();
                    if (currentPos)
                        if (opts.reposition) { reposition(); }
                }
            });

            if (!opts.disableClose) {
                $(window).unload(function() {
                    if (dialogDisplayed == 1)
                        $.closeDialog();
                });

                $(window).keydown(function(event) {
                    if (event.keyCode == 27)
                        $.closeDialog();
                });
            }
        });

        //private function
        function overlayPos(init) {
            var left = 0;
            var top = 0;
            var overlayWidth = $(window).width();
            var overlayHeight = $(document).height();
            var winHeight = $(window).height();

            if ($.browser.msie && parseInt($.browser.version) < 7) { //if IE6
                $("div.modal-overlay").css({
                    top: 0,
                    left: 0,
                    width: overlayWidth,
                    height: overlayHeight,
                    position: "absolute",
                    display: "block",
                    color: opts.bg,
                    zIndex: opts.index,
                    filter: 'mask()',
                    opacity: opts.opacity
                });
                $("div.modal-overlay").parents().each(function() {
                    var pos = $(this).css("position");
                    if (/relative|absolute/.test(pos)) $(this).css("z-index", opts.index - 1);
                });
            }
            else { //other browsers
                $("div.modal-overlay").css({
                    top: 0,
                    left: 0,
                    width: overlayWidth,
                    height: winHeight,
                    position: "fixed",
                    display: "block",
                    background: opts.bg,
                    zIndex: opts.index
                }).show();
            }

            if (init == 1) {
                $("div.modal-overlay").css("opacity", 0);
                $("div.modal-overlay").fadeTo(200, opts.opacity);
            }
        }

        //private function
        function reposition() { //calculate the position
            var left = 0;
            var top = 0;
            var winWidth = $(window).width();
            var winHeight = $(window).height();
            var dialogHeight = $("div.modal").children().height();
            var dialogWidth = $("div.modal").children().width();

            if ($.browser.msie) {
                left = document.body.scrollLeft || document.documentElement.scrollLeft;
                top = document.body.scrollTop || document.documentElement.scrollTop;
            }
            else {
                left = window.pageXOffset;
                top = window.pageYOffset;
            }

            var topOff = top + winHeight / 2 - dialogHeight / 2; //offset for IE6
            var leftOff = left + winWidth / 2 - dialogWidth / 2; //offset for IE6
            var topFixed = topOff - top;
            var leftFixed = leftOff - left;

            if ($.browser.msie && parseInt($.browser.version) < 7) { // IE6
                //IE 6 fix
                $("select").hide();
                //IE 6 fix
                $("div.modal div.body select").show();
                //IE6 doesn't support fixed position
                $("div.modal").css({
                    top: topOff,
                    left: leftOff,
                    position: "absolute",
                    zIndex: (opts.index + 1)
                }).show();

                $("div.ajax-loading").css({
                    top: topOff,
                    left: leftOff
                })
            }
            else {	// firefox and IE7
                $("div.modal").css({
                    top: topFixed,
                    left: leftFixed,
                    position: "fixed",
                    zIndex: (opts.index + 1)
                }).show();
            }

            if (opts.hideScroll) {
                $("html").addClass("html-no-scroll");
                if ($.browser.safari) {
                    $("html").css("overflow-y", "");
                }
                overlayPos(1);
            }
        }
        return this;
    };

    $.fn.createModal.defaults = {
        progress: true,
        center: true,
        method: 'GET',
        cssClass: '',
        data: '',
        opacity: 0.25,
        bg: '#000',
        index: 9999,
        reposition: true,
        loadCallback: false,
        closeButton: true,
        hideScroll: false,
        disableClose: false
    };

    $.closeDialog = function() {
        dialogDisplayed = false;

        if ($.browser.msie && parseInt($.browser.version) < 7) {
            //IE6 bug
            $("select").show();
            $("div.modal-overlay").parents().each(function() {
                var pos = $(this).css("position");
                if (/relative|absolute/.test(pos)) $(this).css("z-index", "");
            });
        }
        // IE bug with flash objects
        if ($.browser.msie) {
            $("div.modal object").each(function(obj) {
                try {
                    this.parentNode.removeChild(this);
                } catch (ex) { }
            });
        }

        $("div.modal-overlay").fadeTo(200, 0, function() {
            if ($.browser.msie && parseInt($.browser.version) < 7 && !!DD_belatedPNG.fix) {
                var wrapper = $("div.modal").parent();
                $("shape", wrapper).remove();
            }
            $("div.modal a.modal-close, div.modal, div.modal-overlay, div.ajax-loading").remove();

            $("html").removeClass("html-no-scroll");
            // Chrome bug with page scroll
            if ($.browser.safari) {
                $("html").css("overflow-y", "scroll");
            }
        });

    };

})(jQuery);