var modal = function(options, callback){
	var settings = {
		url: '',
		methodType: 'GET',
		encode: 'UTF-8',
		param: '',
		loaderImage: '/img/load.gif',
		transition: 'fast',
		backgroundOpacity: 0.5,
		backgroundColor: '#fff',
		position: 'center',
		referencePosition: '',
		top: 0,
		left: 0,
		executionTimeout: 2500,
		numbersOfAttempt: 5,
		inSuccess: function(){},
		inError: function(){},
		callbackClose: function(){},
		closeEsc: true,
		closeClickOut: true
	};

	options = jQuery.extend(settings, options);

	var attempt=0, leftModal, topModal;

	var close_modal = function(callback){
		$('.view_modal').fadeTo(options.transition, 0, function(){
			$(this).remove();
			$('.bg_modal').fadeTo(options.transition, 0, function(){
				$(this).remove();
				if(callback) callback();
			});
		});
		$(window, '.bg_modal').unbind();
		$('select').css('visibility', 'visible');
	};

	var fix_bg_size = function(){
		var height = $('html')[0].scrollHeight < $(window).height() ? $(window).height() : $('html')[0].scrollHeight;
		var width = $('html')[0].scrollWidth < $(window).width() ? $(window).width() : $('html')[0].scrollWidth;
		$('.bg_modal').width(width).height(height);
	};
	
	var build_elements = function(){
		var bgElement   = options.backgroundOpacity!=0 ? '<div class="bg_modal"><!-- --></div>' : '',
			loadElement = '<img src="'+options.loaderImage+'" alt="" class="load" />',
			viewElement = '<div class="view_modal"><!-- --></div>';

		$('body').append(bgElement+loadElement+viewElement);

		options.backgroundOpacity!=0 ? $('.bg_modal').css('background-color',options.backgroundColor) : '';
		$('.view_modal, .bg_modal, .load').css('opacity', 0);

		$('select').css('visibility', 'hidden');

		$('.bg_modal').fadeTo(options.transition, options.backgroundOpacity, function(){
			$('.load').fadeTo(options.transition, 1);
		});
		
		$(window).resize(fix_bg_size);
		fix_bg_size();
	};
	
	var positioning_elements = function(){
		
		GB_getPageScrollTop = function(){
			var yScrolltop;
			if ($('.view_modal').pageYOffset){
				yScrolltop = $('.view_modal').pageYOffset;
			}else if(document.documentElement && document.documentElement.scrollTop || document.documentElement.scrollLeft){
				yScrolltop = document.documentElement.scrollTop;
			}else if(document.body){
				yScrolltop = document.body.scrollTop;
			};
			return yScrolltop;
		};
		
		if(options.position!='center'){
			var offset=$(options.referencePosition).offset();
				leftModal=offset.left;
				topModal=offset.top;
				
			$('.view_modal').css({
					'margin-top': options.top,
					'margin-left': options.left,
					'left': leftModal,
					'top': topModal
				}
			);
			
		} else {
			$('.view_modal').css({
				'margin-top': parseInt(GB_getPageScrollTop() - ($('.view_modal').height()/2)),
				'margin-left': -parseInt($('.view_modal').width()/2)
			});
		};
		
		fix_bg_size();
	};

	var request_modal = function(){
		$.ajax({
			url: options.url,
			contentType: 'application/x-www-form-urlencoded; charset='+options.encode,
			type: options.methodType,
			data: !options.param ? {_:Math.random()} : '',
			error: function(msg){
				alert('erro', msg);
			},
			beforeSend: function(){
				build_elements();
				if(options.closeClickOut==true) {
					$('.bg_modal').click(function(){
						close_modal();
						return false;
					});
				}
			},
			complete: function(msg){
				$('.load').fadeTo(options.transition, 0, function(){
					$(this).remove();
					options.backgroundOpacity!=0 ? $('.view_modal').fadeTo(options.transition, 1) : '';
				});
			},
			success: function(data){
				$('.view_modal').append(data);
				positioning_elements();
				$("a[rel='close-modal']").click(function(){
					close_modal();
					return false;
				});
				if(options.inSuccess) options.inSuccess();
			}
		});
		if(callback) callback();
		return false;
	};

	if(options.closeEsc==true){
		function trigger(e){
			if(!e){var e=window.event;};
			e.keyCode ? e.keyCode==27 ? close_modal() : '' : '';
			e.which   ? e.which==27   ? close_modal() : '' : '';
		};
		$(window).bind("keydown keypress keyup",trigger);
	};

	if($(".view_modal").size() > 0) {
		close_modal(request_modal);
	} else {
		request_modal();
	}
};
