/*
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ Plugin: AGC Modal
@ Author: Alexandre.Quinto[at]AgenciaClick.com.br
@ Version: v 0.2
@ Last release: 29-10-2007
@ jQuery version: 1.2.x
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ How to:
@ $.modal.open(modal.fade, modal.overlay.lock, modal.cssClass, ajax{url, data, callback});
@ Instructions
@ modal.fade: true for fadeIn/fadeOut, false for show/hide
@ modal.overlay.lock: true for background layer lock, false for a backgorund layer clickable
@ modal.cssClass: the css class of your modal window
@ ajax: loads external data into the modal window thru an URL
@ ajax.url: 'some url'
@ ajax.data: some serialized data like 'image=01.jpg&width=400'
@ ajax.callback: some after load callback function
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/

$.modal = {
	/*DEFAULTS*/
	fade: true, // true: usa fade na transicao / false: nao usa fade na transicao, para alterar utilize '$.modal.setFade(true/false)'
	cssClass: "modal", // "modal" é a classe CSS padrão deste plugin, para alterar utilize '$.modal.setCssClass("CLASS")'
	visibility: false,

	/*SETS*/
	setFade: function(fade){
		this.fade = fade;
	},
	setCssClass: function(cssClass){
		$("." + this.cssClass).removeClass().addClass(cssClass);

		this.cssClass = cssClass;
	},
	setVisibility: function(visibility){
		this.visibility = visibility;

		visibility == true ? $("." + this.cssClass).show() : $("." + this.cssClass).hide();
	},
	setMargin: function(topMargin, leftMargin){
		this.topMargin = topMargin;
		this.leftMargin = leftMargin;

		$("div."+this.cssClass).css({"margin-top": this.topMargin + "px","margin-left": this.leftMargin + "px"});
	},
	setPosition: function(topPosition, leftPosition){
		this.topPosition = topPosition;
		this.leftPosition = leftPosition;

		$("div."+this.cssClass).css({"top": this.topPosition,"left": this.leftPosition});
	},

	/* GETS */
	getObject: function(){ return $("div."+this.cssClass); },
	getWidth: function(){ return $("div."+this.cssClass).width(); },
	getHeight: function(){ return $("div."+this.cssClass).height(); },
	getTopPosition: function(){ return parseInt($("div."+this.cssClass).css("top").replace("px","","gi")); },
	getLeftPosition: function(){ return parseInt($("div."+this.cssClass).css("left").replace("px","","gi")); },
	getTopMargin: function(){ return parseInt($("div."+this.cssClass).css("margin-top").replace("px","","gi")); },
	getLeftMargin: function(){ return parseInt($("div."+this.cssClass).css("margin-left").replace("px","","gi")); },
	
	/*OVERLAY OBJECT*/
	overlay: {
		/*DEFAULTS*/
		lock: false, // Fundo fica destravado
		width: 100, // Apenas para inicio, valor será alterado pela largura do document
		height: 100, // Apenas para inicio, valor será alterado pela altura do document
		zIndex: 5000, // Valor alto para manter overlay acima de todos os objetos
		opacity: 40, // 40% visivel, manter multiplo de 10 de 0 a 100
		cssClass: "overlay", // Classe CSS padrão da camada overlay

		/*SETS*/
		setLock: function(lock){
			this.lock = lock;
		},
		setSize: function(width, height){
			this.width = width;
			this.height = height;

			$("div."+this.cssClass).css({"width": this.width + "px","height": this.height +"px"});
		},
		setZIndex: function(index){
			this.zIndex = index;

			$("div."+this.cssClass).css({"z-index": this.zIndex });
		},	
		setOpacity: function(opacity){ //multiplo de 10 de 0 a 100
			this.opacity = opacity;

			$("div."+this.cssClass).css({"opacity": "." + this.opacity / 10 ,"filter":"alpha(opacity="+ this.opacity +")"});
		},
		setCssClass: function(cssClass){
			$("." + this.cssClass).removeClass().addClass(cssClass);

			this.cssClass = cssClass;
		},

		/* GETS */
		getObject: function(){ return $("div."+this.cssClass); }
	},

	/*
	METHOD: create(cssClass)
	Cria overlay e modal
	*/
	create: function(cssClass){
		if(cssClass != undefined) {
			this.setCssClass(cssClass);
		}

		if(!$("body div").hasClass(this.cssClass)){
			$("body").append("<div class='"+ this.cssClass +"'></div>");
		}

		if(!$("body div").hasClass(this.overlay.cssClass)){
			$("body").append("<div class='"+ this.overlay.cssClass +"'></div>");
			this.overlay.setSize($(document).width(),$(document).height());
		}
	},

	/*
	METHOD: center()
	Centraliza modal
	*/
	center: function(){
		this.setPosition("50%","50%");
		this.setMargin(-(this.getHeight() / 2),-(this.getWidth() / 2));
	},

	/*
	METHOD: open(fade, lock, target)
	Cria overlay e modal, e os abre
	*/
	open: function(fade, lock, cssClass, ajaxLoad){
		if(fade == undefined){
			this.setFade(true);
		} else {
			this.setFade(fade);
		}
		if(lock == undefined){
			this.overlay.setLock(false);
		} else {
			this.overlay.setLock(lock);
		}
		if(cssClass == undefined){
			this.setCssClass('modal');
		} else {
			this.setCssClass(cssClass);
		}
		if(ajaxLoad == undefined){
			ajaxLoad = null;
		} 

		if(!$("body div").hasClass(this.cssClass)){
			$("body").append("<div class='"+ this.cssClass +"'></div>");
			if (ajaxLoad != null){
				$.modal.getObject().load(ajaxLoad.url, ajaxLoad.data, ajaxLoad.callback);
			}
		}

		if(!$("body div").hasClass(this.overlay.cssClass)){
			$("body").append("<div class='"+ this.overlay.cssClass +"'></div>");
			this.overlay.setSize($(document).width(),$(document).height());
		}

		if(this.fade == true){
			this.getObject().fadeIn();
			this.overlay.getObject().fadeIn();
		} else {
			this.getObject().show();
			this.overlay.getObject().show();
		}

		if(this.overlay.lock == false)
		{
			var thisRef = this;
			this.overlay.getObject().unbind().click(
				function() {
					thisRef.close();
				}
			);
		}
	},

	/*
	METHOD: show(fade,lock)
	Mostra o modal
	*/
	show: function(fade, lock) {
		if(fade != undefined){
			this.setFade(fade);
		}
		if(lock != undefined){
			this.overlay.setLock(lock);
		}

		if(this.fade == true){
			this.getObject().fadeIn();
			this.overlay.getObject().fadeIn();
		} else {
			this.getObject().show();
			this.overlay.getObject().show();
		}

		if(this.overlay.lock == false)
		{
			var thisRef = this;
			this.overlay.getObject().unbind().click(
				function() {
					thisRef.close();
				}
			);
		}
	},

	/*
	METHOD: close()
	Fecha modal
	*/
	close: function() {
		var thisRef = this;
			if(this.fade == true){
				$("div."+ this.cssClass +", div."+ this.overlay.cssClass).fadeOut("normal",function(){$("div."+ thisRef.cssClass +", div."+ thisRef.overlay.cssClass).remove()});
			} else {
				$("div."+ this.cssClass +", div."+ this.overlay.cssClass).hide("normal",function(){$("div."+ thisRef.cssClass +", div."+ thisRef.overlay.cssClass).remove()});
			}
	}
};
