﻿jQuery.fn.modal = function(options){
	
	// VERIFICANDO O HREF
	if(!options){
		if(this.attr('href')) var options = { url: this.attr('href') };
	} else {
		if(!options.url)if(this.attr('href')) options.url = this.attr('href');
	}
	
	var settings = {
		url: '#',
		backgroundColor: '#000',
		backgroundOpacity: 0.77,
		position: 'center',
		referencePosition: this,
		top:0,
		left:0,
		closeEsc:true,
		closeClickOut: false,
		autoOpen: false
	};
	options = jQuery.extend(settings, options);
	var _this = this;
	
	function openModal(){
		
		if(_this.data('url') != null){
			options.url = _this.data('url');
		}
		
		/*CREATE ELEMENTS*/
		if($('.bg_modal').length > 0){
			$('.bg_modal').remove();
		}
		$('body').append($('<img />').attr({src: "/template-resources/img/structure/load.gif", width: 193, height: 102, alt: "", className: 'load'})).append($('<div></div>').addClass('bg_modal')).append($('<div></div>').addClass('view_modal'));
		
		// verificando se o body é menor do que o screen
		var altura = $('html')[0].scrollHeight < $(window).height() ? $(window).height() : $('html')[0].scrollHeight;
		$('.bg_modal').width($('html')[0].scrollWidth).height(altura);
		
		/*OPACITY*/
		if(options.backgroundOpacity != 0){
			$('.bg_modal').css('background-color',options.backgroundColor);
			$('.view_modal').css('opacity', 0);
			$('.bg_modal').css('opacity', 0);
		}
		
		// escondendo selects
		$('select').css('visibility', 'hidden');

		// posicionamento
		leftModal = topModal = 0;
		if(options.position=='relative'){
			var offset  = options.referencePosition.offset();
			leftModal = offset.left;
			topModal =  offset.top;
		}

		var GB_getPageScrollTop = function() {
			var yScrolltop;
			if (self.pageYOffset) {
				yScrolltop = self.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;
		};
		
		var onComplete = function(){
		
			/*CENTRALIZE MODAL*/
			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({
						marginTop: topModal, 
						marginLeft: leftModal,
						left: options.left,
						top: options.top
					}
				);
			
			} else {
				var scrollTop = GB_getPageScrollTop();
				var centeredY = parseInt(GB_getPageScrollTop() - ($('.view_modal').height()/2))
				
				if(centeredY < scrollTop){
					$('.view_modal').css('top', 0);
				}
				centeredY = centeredY < scrollTop ? scrollTop + 10 : centeredY;
				$('.view_modal').css({marginTop: centeredY, marginLeft: -parseInt($('.view_modal').width()/2)});
			}

			/*MODAL HIDE*/
			if(options.backgroundOpacity != 0) $('.view_modal').fadeTo('fast', 1);

			_this.trigger('onOpen', this);
			
			/*CLOSE MODAL*/
			$("a[rel='modalclose']").click(function() {
				closeModal();
				return false;
			});
		};

		/*SHOW BACKGROUND*/
		$('.bg_modal').fadeTo('fast', options.backgroundOpacity, function() {
			if(options.url.match(/\.(?:jpg|jpeg|gif|png)$/)){
				/*REMOVE LOAD*/
				$('.load').remove();
				
				var _tmpImp = $(document.createElement('img'));
					_tmpImp.bind('load', function(e){
						onComplete.call($('.view_modal'));
					});
					_tmpImp.bind('error', function(){
						closeModal();
					});
					
				setTimeout(function() {
					_tmpImp.attr('src', options.url);
				}, 10);
				
				$('.view_modal').append(_tmpImp);
			}else{
				$('.view_modal').load(options.url,{nocacheattr:(new Date()).getTime()}, function() {
					/*REMOVE LOAD*/
					$('.load').remove();
					onComplete.call(this);
				});
			}
		});
		
		
		if(options.closeClickOut==true){
			$('.bg_modal').click(function(){
				closeModal();
			});
		}
		

		if(options.closeEsc==true){
			$(window).keydown(function(event){
				if(event.keyCode==27)closeModal();
			});
		}
		return false;
	}
	


	if(options.autoOpen == false){
		this.click(openModal);	
		this.attr('href', 'javascript:;');
	} else {
		openModal();
	}
	
	
	
	
	/*CLOSE MODAL*/
	function closeModal(){
		/*HIDE MODAL*/
		$('.view_modal').fadeTo('fast', 0, function(){$(this).remove();});
		
		/*HIDE BACKGROUND*/
		$('.bg_modal').fadeTo('fast', 0, function() {
			$(this).remove();
			$('select').css('visibility', 'visible');
		});
		
		$(window).unbind();
		$('.bg_modal').unbind();
	}	

	
	this.css('visibility','visible');
};

$(document).ready(function(){
	$('a[rel="modal"]').each(function(){
		$(this).modal();	
	});
});


