(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);