/*
 * 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);