modal = function(options, callback) {
	var settings = {
		type: 'html',
		loaderImage: '/img/ico/load.gif',
		transition: 'fast',
		backgroundOpacity: 0.5,
		backgroundColor: '#000',
		backgroundImage: null,
		position: 'center',
		referencePosition: this,
		top: 0,
		left: 0,
		url: $(this).attr('href'),
		methodType: 'GET',
		encode: 'UTF-8',
		param: '',
		executionTimeout: 2500,
		numbersOfAttempt: 5,
		inError: function(){},
		inBefore: function(){},
		inComplete: function(){},
		inSuccess: function(){},
		callbackClose: function(){},
		closeEsc: true,
		closeClickOut: false,
		autoOpen: false
	};

	options = jQuery.extend(settings, options);

	var attempt=0, altura='', leftModal, topModal, scrollTopPosition;

	var close_modal = function(callback){
		$('.view_modal').fadeTo(options.transition, 0, function(){
			$(this).remove();
			if($('.bg_modal')){
				$('.bg_modal').fadeTo(options.transition, 0, function(){
					$(this).remove();
				});
				//fix_footer();
			};
		});
		$(window, '.bg_modal').unbind();
		$('select').css('visibility', 'visible');
		options.callbackClose();
	};

	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 fix_footer = function(){
		var footer = $('#footer'), height = $('html')[0].scrollHeight;

		if(footer.css('position')=='static'){
			footer.css({position: 'absolute', top: height});
		}else{
			footer.removeAttr('style');
		};
	};

	var build_elements = function(){
		var bgElement   = options.backgroundOpacity!=0&&$('.bg_modal').length==0 ? '<div class="bg_modal"><!-- --></div>' : '',
			loadElement = '<img src="'+options.loaderImage+'" alt="Carregando" class="load" />',
			viewElement = '<div class="view_modal"><!-- --></div>';

		$('.view_modal').length?$('.view_modal').remove():'';
			
		$('body').append(bgElement+loadElement+viewElement);

		altura = $('html')[0].scrollHeight < $(window).height() ? $(window).height() : $('html')[0].scrollHeight;

		if(options.backgroundOpacity!=0){
			$('.bg_modal').css('background', options.backgroundColor);
		};

		$('.bg_modal').width($('html')[0].scrollWidth).height(altura);

		$('.view_modal, .bg_modal, .load').css('opacity', 0);

		$('select').css('visibility', 'hidden');

		if(options.position=='relative'){
			var offset = options.referencePosition.offset();
			leftModal = offset.left;
			topModal = offset.top;
		};

		if($('.bg_modal')){
			$('.bg_modal').fadeTo(options.transition, options.backgroundOpacity, function(){
				$('.load').fadeTo(options.transition, 1);
			});
		}else{
			$('.load').fadeTo(options.transition, 1);
		};

		$(window).resize(fix_bg_size);
	};

	var positioning_elements = function(){
		if ($('.view_modal').pageYOffset){
			scrollTopPosition = $('.view_modal').pageYOffset;
		}else if(document.documentElement && document.documentElement.scrollTop || document.documentElement.scrollLeft){
			scrollTopPosition = document.documentElement.scrollTop;
		}else if(document.body){
			scrollTopPosition = document.body.scrollTop;
		};

		if(options.position!='center'){
			var alturaModal = parseInt(options.top) + parseInt(topModal) + parseInt($('.view_modal').height());

			if(altura<alturaModal){
				options.top = 0;
				topModal    = altura - parseInt($('.view_modal').height());
			};
			$('.view_modal').css({
					'margin-top': topModal,
					'margin-left': leftModal,
					'left': options.left,
					'top': options.top
				}
			);
		} else {
			var heightModal = $('.view_modal').outerHeight(),
				topPos = (
					heightModal > $(window).height() ?
						parseInt(scrollTopPosition - ($(window).height()/2) + 100) :
						parseInt(scrollTopPosition - (heightModal/2))
				);

			$('.view_modal').css({
				'margin-top': topPos,
				'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,
			global: false,
			timeout: options.executionTimeout,
			error: function(msg){
				console.log(msg)
				
				
				/*if(options.numbersOfAttempt==0 && attempt < options.numbersOfAttempt){
					return request_modal();
				}else{
					close_modal();
				};
				attempt++;
				options.inError();*/
			},
			beforeSend: function(){
				build_elements();
				options.inBefore();
			},
			complete: function(msg){
				$('.load').fadeTo(options.transition, 0, function(){
					$(this).remove();
					$('.view_modal').fadeTo(options.transition, 1, function(){
						if(jQuery.browser.msie) this.style.removeAttribute('filter');
						//fix_footer();
						fix_bg_size();
					});
				});
				options.inComplete();
			},
			success: function(data){
				options.inSuccess();
				$('.view_modal').append(data);
				positioning_elements();
				$("a[rel='close-modal']").click(function(){
					close_modal();
					return false;
				});
			}
		});
		if(callback) callback();
		return false;
	};

	options.closeClickOut==true ? $('.bg_modal').click(function(){close_modal(); 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);
	};

	//options.autoOpen==false ? this.click(request_modal) : request_modal();
	request_modal();
};
