/*
 * SimpleModal 1.1.1 - jQuery Plugin
 * http://www.ericmmartin.com/projects/simplemodal/
 * http://plugins.jquery.com/project/SimpleModal
 * http://code.google.com/p/simplemodal/
 *
 * Copyright (c) 2007 Eric Martin - http://ericmmartin.com
 *
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * Revision: $Id: jquery.simplemodal.js 93 2008-01-15 16:14:20Z emartin24 $
 *
 */
(
function($){
    $.modal = function(data,options) {
        return $.modal.impl.init(data,options);
    };
    
    $.modal.close = function() {
        $.modal.impl.close(true);
    };
    
    $.fn.modal = function(options) {
        return $.modal.impl.init(this,options);
    };
    
    $.modal.defaults = {
        overlay:50,
        overlayId:'modalOverlay',
        overlayCss:{},
        containerId:'modalContainer',
        containerCss:{},
        close:true,
        closeTitle:'Close',
        closeClass:'modalClose',
        persist:false,
        onOpen:null,
        onShow:null,
        onClose:null
    };
    
    $.modal.impl = {
        opts:null,
        dialog:{},
        init: function(data,options) {
            if (this.dialog.data) {
                return false;
            }
            this.opts = $.extend({},$.modal.defaults,options);
            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.original = data.clone(true);
                    }
                }
            } else if (typeof data=='string'||typeof data=='number') {
                data = $('<div>').html(data);
            } else {
                if (console) {
                    console.log('SimpleModal Error: Unsupported data type: '+typeof data);
                }
                
                return false;
            }
            this.dialog.data = data.addClass('modalData');
            data=null;
            this.create();
            this.open();
            
            if ($.isFunction(this.opts.onShow)) {
                this.opts.onShow.apply(this,[this.dialog]);
            }
            
            return this;
        },
        
        create: function() {
            this.dialog.overlay = $('<div>').attr('id',this.opts.overlayId).addClass('modalOverlay').css($.extend(this.opts.overlayCss,{
                opacity:this.opts.overlay/100,
                height:'100%',
                width:'100%',
                position:'fixed',
                left:0,
                top:0,
                zIndex:3000
            })).hide().appendTo('body');
            
            this.dialog.container = $('<div>').attr('id',this.opts.containerId).addClass('modalContainer').css($.extend(this.opts.containerCss,{
                position:'fixed',
                zIndex:3100
            })).append(this.opts.close?'<a class="modalCloseImg ' + this.opts.closeClass + '" title="' + this.opts.closeTitle + '"></a>':'').hide().appendTo('body');
            
            if ($.browser.msie && ($.browser.version<7)) {
                this.fixIE();
            }
            this.dialog.container.append(this.dialog.data.hide());
        },
        
        bindEvents: function() {
            var modal=this;
            $('.'+this.opts.closeClass).click(function(e){
                e.preventDefault();
                modal.close();
            });
        },
        
        unbindEvents: function() {
            $('.' + this.opts.closeClass).unbind('click');
        },
        
        fixIE: function() {
            var wHeight = $(document.body).height() + 'px';
            var wWidth = $(document.body).width() + 'px';
            this.dialog.overlay.css({
                position:'absolute',
                height:wHeight,
                width:wWidth
            });
            this.dialog.container.css({
                position:'absolute'
            });
            this.dialog.iframe = $('<iframe src="javascript:false;">').css($.extend(this.opts.iframeCss,{
                opacity:0,
                position:'absolute',
                height:wHeight,
                width:wWidth,
                zIndex:1000,
                width:'100%',
                top:0,
                left:0
            })).hide().appendTo('body');
        },
        
        open: function() {
            if(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(external) {
            if (!this.dialog.data) {
                return false;
            }
            if ($.isFunction(this.opts.onClose)&&!external) {
                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.original.appendTo(this.dialog.parentNode);
                    }
                } else {
                    this.dialog.data.remove();
                }
                this.dialog.container.remove();
                this.dialog.overlay.remove();
                if (this.dialog.iframe) {
                    this.dialog.iframe.remove();
                }
                this.dialog={};
            }
            this.unbindEvents();
        }
    };
})(jQuery);
