/*
 * SimpleModal 1.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 205 2009-06-12 13:29:21Z 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 = {
		appendTo : 'body',
		focus : true,
		opacity : 50,
		overlayId : 'simplemodal-overlay',
		overlayCss : {},
		containerId : 'simplemodal-container',
		containerCss : {},
		dataId : 'simplemodal-data',
		dataCss : {},
		minHeight : 200,
		minWidth : 300,
		maxHeight : null,
		maxWidth : null,
		autoResize : false,
		zIndex : 1000,
		close : true,
		closeHTML : '<a class="modalCloseImg" title="Fechar"></a>',
		closeClass : 'simplemodal-close',
		escClose : true,
		overlayClose : false,
		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.create(data);
			data = null;
			this.open();
			if ($.isFunction(this.opts.onShow)) {
				this.opts.onShow.apply(this, [ this.dialog ]);
			}
			return this;
		},
		create : function(data) {
			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(this.opts.appendTo);
			}
			this.dialog.overlay = $('<div/>').attr('id', this.opts.overlayId)
					.addClass('simplemodal-overlay').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(this.opts.appendTo);
			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 ? $(
									this.opts.closeHTML).addClass(
									this.opts.closeClass) : '').appendTo(
							this.opts.appendTo);
			this.dialog.wrap = $('<div/>').attr('tabIndex', -1).addClass(
					'simplemodal-wrap').css( {
				height : '100%',
				outline : 0,
				width : '100%'
			}).appendTo(this.dialog.container);
			this.dialog.data = data.attr('id',
					data.attr('id') || this.opts.dataId).addClass(
					'simplemodal-data').css($.extend(this.opts.dataCss, {
				display : 'none'
			}));
			data = null;
			this.setContainerDimensions();
			this.dialog.data.appendTo(this.dialog.wrap);
			if (ie6 || ieQuirks) {
				this.fixIE();
			}
		},
		bindEvents : function() {
			var self = this;
			$('.' + self.opts.closeClass).bind('click.simplemodal',
					function(e) {
						e.preventDefault();
						self.close();
					});
			if (self.opts.close && self.opts.overlayClose) {
				self.dialog.overlay.bind('click.simplemodal', function(e) {
					e.preventDefault();
					self.close();
				});
			}
			$(document).bind(
					'keydown.simplemodal',
					function(e) {
						if (self.opts.focus && e.keyCode == 9) {
							self.watchTab(e);
						} else if ((self.opts.close && self.opts.escClose)
								&& e.keyCode == 27) {
							e.preventDefault();
							self.close();
						}
					});
			$(window).bind(
					'resize.simplemodal',
					function() {
						w = self.getDimensions();
						self.opts.autoResize ? self.setContainerDimensions()
								: 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');
			$(document).unbind('keydown.simplemodal');
			$(window).unbind('resize.simplemodal');
			this.dialog.overlay.unbind('click.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);
									}
								}
							});
		},
		focus : function(pos) {
			var self = this, p = pos || 'first';
			var input = $(':input:enabled:visible:' + p, self.dialog.wrap);
			input.length > 0 ? input.focus() : self.dialog.wrap.focus();
		},
		getDimensions : function() {
			var el = $(window);
			var h = $.browser.opera && $.browser.version > '9.5'
					&& $.fn.jquery <= '1.2.6' ? document.documentElement['clientHeight']
					: $.browser.opera && $.browser.version < '9.5'
							&& $.fn.jquery > '1.2.6' ? window.innerHeight : el
							.height();
			return [ h, el.width() ];
		},
		getVal : function(v) {
			return v == 'auto' ? 0 : parseInt(v.replace(/px/, ''));
		},
		setContainerDimensions : function() {
			var ch = this.getVal(this.dialog.container.css('height')), cw = this.dialog.container
					.width(), dh = this.dialog.data.height(), dw = this.dialog.data
					.width();
			var mh = this.opts.maxHeight && this.opts.maxHeight < w[0] ? this.opts.maxHeight
					: w[0], mw = this.opts.maxWidth
					&& this.opts.maxWidth < w[1] ? this.opts.maxWidth : w[1];
			if (!ch) {
				if (!dh) {
					ch = this.opts.minHeight;
				} else {
					if (dh > mh) {
						ch = mh;
					} else if (dh < this.opts.minHeight) {
						ch = this.opts.minHeight;
					} else {
						ch = dh;
					}
				}
			} else {
				ch = ch > mh ? mh : ch;
			}
			if (!cw) {
				if (!dw) {
					cw = this.opts.minWidth;
				} else {
					if (dw > mw) {
						cw = mw;
					} else if (dw < this.opts.minWidth) {
						cw = this.opts.minWidth;
					} else {
						cw = dw;
					}
				}
			} else {
				cw = cw > mw ? mw : cw;
			}
			this.dialog.container.css( {
				height : ch,
				width : cw
			});
			if (dh > ch || dw > cw) {
				this.dialog.wrap.css( {
					overflow : 'auto'
				});
			}
			this.setPosition();
		},
		setPosition : function() {
			var top, left, hc = (w[0] / 2)
					- ((this.dialog.container.height() || this.dialog.data
							.height()) / 2), vc = (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] || hc;
				left = this.opts.position[1] || vc;
			} else {
				top = hc;
				left = vc;
			}
			this.dialog.container.css( {
				left : left,
				top : top
			});
		},
		watchTab : function(e) {
			var self = this;
			if ($(e.target).parents('.simplemodal-container').length > 0) {
				self.inputs = $(
						':input:enabled:visible:first, :input:enabled:visible:last',
						self.dialog.data);
				if (!e.shiftKey
						&& e.target == self.inputs[self.inputs.length - 1]
						|| e.shiftKey && e.target == self.inputs[0]
						|| self.inputs.length == 0) {
					e.preventDefault();
					var pos = e.shiftKey ? 'last' : 'first';
					setTimeout( function() {
						self.focus(pos);
					}, 10);
				}
			} else {
				e.preventDefault();
				setTimeout( function() {
					self.focus();
				}, 10);
			}
		},
		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.focus();
			this.bindEvents();
		},
		close : function() {
			if (!this.dialog.data) {
				return false;
			}
			this.unbindEvents();
			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.hide().remove();
						this.dialog.orig.appendTo(this.dialog.parentNode);
					}
				} else {
					this.dialog.data.hide().remove();
				}
				this.dialog.container.hide().remove();
				this.dialog.overlay.hide().remove();
				this.dialog.iframe && this.dialog.iframe.hide().remove();
				this.dialog = {};
			}
		}
	};
})(jQuery);