/*
 * SimpleModal 1.2.3 - jQuery Plugin
 * http://www.ericmmartin.com/projects/simplemodal/
 * Copyright (c) 2009 Eric Martin
 * Dual licensed under the MIT and GPL licenses
 * Revision: $Id: jquery.simplemodal.js 185 2009-02-09 21:51:12Z emartin24 $
 */

(function($)
{
    var ie6 = $.browser.msie && parseInt($.browser.version) == 6 && typeof window['XMLHttpRequest'] != "object",
        ieQuirks = null, w = [];
    $.modal = function(data, options)
    {
        return $.modal.impl.init(data, options);
    };
    $.modal.close = function()
    {
        $.modal.impl.close();
    };
    $.fn.modal = function(options)
    {
        return $.modal.impl.init(this, options);
    };
    $.modal.defaults =
    {
        opacity: 50,
        overlayId: 'simplemodal-overlay',
        overlayCss: {
        },
        containerId: 'simplemodal-close',
        containerCss: {
        },
        dataCss: {
        },
        zIndex: 1000,
        close: true,
        closeHTML: '<a class="modalCloseImg" title="Close"></a>',
        closeClass: 'simplemodal-close',
        position: null,
        persist: false,
        onOpen: null,
        onShow: null,
        onClose: null
    };

    $.modal.impl =
    {
        opts: null,
        dialog: {
        },
        init: function(data, options)
        {
            if (this.dialog.data)
            {
                return false;
            }
            ieQuirks = $.browser.msie && !$.boxModel;
            this.opts = $.extend({
            }, $.modal.defaults, options);

            this.zIndex = this.opts.zIndex;
            this.occb = false;

            if (typeof data == 'object')
            {
                data = data instanceof jQuery ? data : $(data);

                if (data.parent().parent().size() > 0)
                {
                    this.dialog.parentNode = data.parent();

                    if (!this.opts.persist)
                    {
                        this.dialog.orig = data.clone(true);
                    }
                }
            }

            else if (typeof data == 'string' || typeof data == 'number')
            {
                data = $('<div/>').html(data);
            }

            else
            {
                alert('SimpleModal Error: Unsupported data type: ' + typeof data);
                return false;
            }
            this.dialog.data = data.addClass('simplemodal-data').css(this.opts.dataCss);
            data = null;
            this.create();
            this.open();

            if ($.isFunction(this.opts.onShow))
            {
                this.opts.onShow.apply(this, [this.dialog]);
            }
            return this;
        },
        create: function()
        {
            w = this.getDimensions();

            if (ie6)
            {
                this.dialog.iframe = $('<iframe src="javascript:false;"/>').css($.extend(this.opts.iframeCss,
                {
                    display: 'none',
                    opacity: 0,
                    position: 'fixed',
                    height: w[0],
                    width: w[1],
                    zIndex: this.opts.zIndex,
                    top: 0,
                    left: 0
                })).appendTo('body');
            }

            this.dialog.overlay = $('<div/>').attr('id',
                this.opts.overlayId).addClass('simplemodal-overlay simplemodal-close').css($.extend(this.opts.overlayCss,
            {
                display: 'none',
                opacity: this.opts.opacity / 100,
                height: w[0],
                width: w[1],
                position: 'fixed',
                left: 0,
                top: 0,
                zIndex: this.opts.zIndex + 1
            })).appendTo('body');

            this.dialog.container = $('<div/>').attr('id',
                this.opts.containerId).addClass('simplemodal-container').css($.extend(this.opts.containerCss,
            {
                display: 'none',
                position: 'fixed',
                zIndex: this.opts.zIndex + 2
            })).append(this.opts.close ? $(this.opts.closeHTML).addClass(this.opts.closeClass) : '').appendTo('body');

            this.setPosition();

            if (ie6 || ieQuirks)
            {
                this.fixIE();
            }
            this.dialog.container.append(this.dialog.data.hide());
        },
        bindEvents: function()
        {
            var self = this;
            $('.' + this.opts.closeClass).bind('click.simplemodal', function(e)
            {
                e.preventDefault();
                self.close();
            });
            $(window).bind('resize.simplemodal', function()
            {
                w = self.getDimensions();
                self.setPosition();

                if (ie6 || ieQuirks)
                {
                    self.fixIE();
                }

                else
                {
                    self.dialog.iframe && self.dialog.iframe.css(
                    {
                        height: w[0],
                        width: w[1]
                    });

                    self.dialog.overlay.css(
                    {
                        height: w[0],
                        width: w[1]
                    });
                }
            });
        },
        unbindEvents: function()
        {
            $('.' + this.opts.closeClass).unbind('click.simplemodal');
            $(window).unbind('resize.simplemodal');
        },
        fixIE: function()
        {
            var p = this.opts.position;
            $.each(
                [
                this.dialog.iframe || null,
                this.dialog.overlay,
                this.dialog.container
                ], function(i, el)
            {
                if (el)
                {
                    var bch = 'document.body.clientHeight', bcw = 'document.body.clientWidth',
                        bsh = 'document.body.scrollHeight', bsl = 'document.body.scrollLeft',
                        bst = 'document.body.scrollTop', bsw = 'document.body.scrollWidth',
                        ch = 'document.documentElement.clientHeight', cw = 'document.documentElement.clientWidth',
                        sl = 'document.documentElement.scrollLeft', st = 'document.documentElement.scrollTop',
                        s = el[0].style;
                    s.position = 'absolute';

                    if (i < 2)
                    {
                        s.removeExpression('height');
                        s.removeExpression('width');
                        s.setExpression('height', '' + bsh + ' > ' + bch + ' ? ' + bsh + ' : ' + bch + ' + "px"');
                        s.setExpression('width', '' + bsw + ' > ' + bcw + ' ? ' + bsw + ' : ' + bcw + ' + "px"');
                    }

                    else
                    {
                        var te, le;

                        if (p && p.constructor == Array)
                        {
                            var top =
                                p[0]
                                    ? typeof p[0] == 'number' ? p[0].toString() : p[0].replace(/px/, '')
                                    : el.css('top').replace(/px/, '');
                            te = top.indexOf('%')
                                == -1
                                    ? top + ' + (t = ' + st + ' ? ' + st + ' : ' + bst + ') + "px"'
                                    : parseInt(top.replace(/%/, '')) + ' * ((' + ch + ' || ' + bch + ') / 100) + (t = '
                                + st + ' ? ' + st + ' : ' + bst + ') + "px"';

                            if (p[1])
                            {
                                var left = typeof p[1] == 'number' ? p[1].toString() : p[1].replace(/px/, '');
                                le = left.indexOf('%')
                                    == -1
                                        ? left + ' + (t = ' + sl + ' ? ' + sl + ' : ' + bsl + ') + "px"'
                                        : parseInt(left.replace(/%/, '')) + ' * ((' + cw + ' || ' + bcw
                                            + ') / 100) + (t = ' + sl + ' ? ' + sl + ' : ' + bsl + ') + "px"';
                            }
                        }

                        else
                        {
                            te = '(' + ch + ' || ' + bch + ') / 2 - (this.offsetHeight / 2) + (t = ' + st + ' ? ' + st
                                + ' : ' + bst + ') + "px"';
                            le = '(' + cw + ' || ' + bcw + ') / 2 - (this.offsetWidth / 2) + (t = ' + sl + ' ? ' + sl
                                + ' : ' + bsl + ') + "px"';
                        }
                        s.removeExpression('top');
                        s.removeExpression('left');
                        s.setExpression('top', te);
                        s.setExpression('left', le);
                    }
                }
            });
        },
        getDimensions: function()
        {
            var el = $(window);
            var h =
                $.browser.opera && $.browser.version > '9.5'
                    && $.fn.jquery <= '1.2.6' ? document.documentElement['clientHeight'] : el.height();
            return [
            h,
            el.width()
            ];
        },
        setPosition: function()
        {
            var top, left, hCenter = (w[0] / 2) - ((this.dialog.container.height() || this.dialog.data.height()) / 2),
                vCenter = (w[1] / 2) - ((this.dialog.container.width() || this.dialog.data.width()) / 2);

            if (this.opts.position && this.opts.position.constructor == Array)
            {
                top = this.opts.position[0] || hCenter;
                left = this.opts.position[1] || vCenter;
            }

            else
            {
                top = hCenter;
                left = vCenter;
            }
            this.dialog.container.css(
            {
                left: left,
                top: top
            });
        },
        open: function()
        {
            this.dialog.iframe && this.dialog.iframe.show();

            if ($.isFunction(this.opts.onOpen))
            {
                this.opts.onOpen.apply(this, [this.dialog]);
            }

            else
            {
                this.dialog.overlay.show();
                this.dialog.container.show();
                this.dialog.data.show();
            }
            this.bindEvents();
        },
        close: function()
        {
            if (!this.dialog.data)
            {
                return false;
            }

            if ($.isFunction(this.opts.onClose) && !this.occb)
            {
                this.occb = true;
                this.opts.onClose.apply(this, [this.dialog]);
            }

            else
            {
                if (this.dialog.parentNode)
                {
                    if (this.opts.persist)
                    {
                        this.dialog.data.hide().appendTo(this.dialog.parentNode);
                    }

                    else
                    {
                        this.dialog.data.remove();
                        this.dialog.orig.appendTo(this.dialog.parentNode);
                    }
                }

                else
                {
                    this.dialog.data.remove();
                }
                this.dialog.container.remove();
                this.dialog.overlay.remove();
                this.dialog.iframe && this.dialog.iframe.remove();
                this.dialog = {
                };
            }

            this.unbindEvents();
        }
    };
})(jQuery);
