(function($) {
	// image modal
	$.fn.image_modal = function(options) {/**/};
	
	// confirm modal
	$.fn.confirm_modal = function(options) {/**/};
	
	// gallery modal
	$.fn.gallery_modal = function(options) {/**/};

	// data modal
	$.fn.modal = function(options) {
		var settings = {
			type: 'html',
			loaderImage: '/img/load.gif',
			transition: 'fast',
			backgroundOpacity: 0.5,
			backgroundColor: '#000',
			position: 'center',
			referencePosition: this,
			top: 0,
			left: 0,
			url: $(this).attr('href'),
			methodType: 'GET',
			encode: 'UTF-8',
			param: '',
			executionTimeout: 2500,
			numbersOfAttempt: 5,
			inSucess: 'Sucesso!',
			inError: 'Erro.',
			callbackClose: 'Pós close',
			closeEsc: true,
			closeClickOut: false,
			autoOpen: false
		};
		
		options = jQuery.extend(settings, options);

		var attempt=0, altura='';

		var close_modal = function(){
			$('.view_modal').fadeTo(options.transition, 0, function(){
				$(this).remove();
				$('.bg_modal').fadeTo(options.transition, 0, function(){
					$(this).remove();
				});
			});
			$(window).unbind();
			$('.bg_modal').unbind();
			$('select').css('visibility', 'visible');
		};
		
		var build_elements = function(){
			var contentBgModal = options.backgroundOpacity!=0 ? contentBgModal=$('<div></div>').addClass('bg_modal') : '';

			$('body')
				.append(($('<img/>').attr({src:options.loaderImage, alt:''}).addClass('load')))
				.append(contentBgModal)
				.append($('<div></div>').addClass('view_modal'));

			altura = $('html')[0].scrollHeight < $(window).height() ? $(window).height() : $('html')[0].scrollHeight;

			$('.bg_modal').width($('html')[0].scrollWidth).height(altura);

			options.backgroundOpacity!=0 ? $('.bg_modal').css('background-color',options.backgroundColor) : '';
			$('.view_modal').css('opacity', 0);
			$('.bg_modal').css('opacity', 0);
			$('.load').css('opacity', 0);

			$('select').css('visibility', 'hidden');

			if(options.position=='relative'){
				var offset=options.referencePosition.offset();
				leftModal=offset.left;
				topModal=offset.top;
			};

			$('.bg_modal').fadeTo(options.transition, options.backgroundOpacity, function(){
				$('.load').fadeTo(options.transition, 1);
			});
		};
		
		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 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 {
				$('.view_modal').css({
					'margin-top': parseInt(GB_getPageScrollTop() - ($('.view_modal').height()/2)),
					'margin-left': -parseInt($('.view_modal').width()/2)
				});
			};
		};
		
		var execute_type = function(data){
			switch(options.type){
				case 'html':
					$('.view_modal').append(data);
					break;
				case 'image':
					//
					break;
				case 'confirm':
					//
					break;
				case 'gallery':
					//
					break;
				default:
					$('.view_modal').append(data);
					break;
			};
		};

		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(){
					if(attempt < options.numbersOfAttempt){
						return request_modal();
					}else{
						alert('Erro:'+options.inError);
						close_modal();
					};
					attempt++;
				},
				beforeSend: function(){
					build_elements();
			    },
				complete: function(msg){
					$('.load').fadeTo(options.transition, 0, function(){
						$(this).remove();
						options.backgroundOpacity!=0 ? $('.view_modal').fadeTo(options.transition, 1) : '';
					});
				},
				success: function(data){
					//options.inSucess ? console.log(options.inSucess) : '' ;
					execute_type(data);
					positioning_elements();
					$("a[rel='close-modal']").click(function() {
						close_modal();
						return false;
					});
				}
			});
			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();
	};

	$(document).ready(function(){
		$("a[rel='open-modal']").each(function(){
			$(this).modal();
		});
	});

})(jQuery);
