(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: 'Fermer cet image',
		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 
					? '<h2 class="modalInfo">' + tb_Linfo + '</h2>'
						+ '<a class="modalCloseImg ' 
						+ this.opts.closeClass 
						+ '" href="#" ><img src="' + tb_pathImage + 'close-win.gif" alt="' + tb_Lfermer + '" /></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);