/*!
 * Plugin jQuery Popup v2.0.1
 * http://www.versatile-dev.com/jquery.popup
 *
 * Copyright 2010, Versatile-DEV
 * Under MIT License.
 *
 * Date: 
 */
 (function($,p){  
	
	$.fn.popup = g = function(o, extra) 
    {    	
    	if( o === false ) return g.close(this);
    	if( typeof o == "string" ) { 
    		
    		if( o == "close" ) return g.close(this);
    		else if( o == "cancel" || o == "ok") { var opt = g.retrieve(this); if(opt) opt[o](opt); return false; }
    		else if( o.charAt(0) == '{' ) o = $.extend(type, $.parseJSON(o));
    	}
    	if( typeof o == 'object' ) {
    		if( typeof o.register == 'string' && o.register != '') {
    			g.types[o.register] = o; 
    			if( o.trigger ) {
    				//o.triggers = o.trigger.split('|||')
    				//if(o.triggers.length <= 1) 
    					$(document).delegate(o.trigger, 'click', function(){
    						$(this).popup({ type: o.register }); return false;
    					})
    				//else $(document).delegate('a.add, a.edit')
    			}
    			return this; 
    		}
		}
    	else if(this.selector != '' && !this.length) return this;    	
    	//if( g.lock ) return this; g.lock = true;			
    	
    	o = g.define({			
			overlay:		{ opacity:0.6, background: '#000' },
			loading: 		{ height: 200 },
			css:			{},
			url: 			this.attr('href'),
			title: 			this.attr('title') ? this.attr('title') : '',
			width: 			'auto',		
			height: 		$.support.boxModel?"auto":"1%",
			id:				false,			
			classname:		false,
			scroll:			false,
			template:		'',
			duration:		300,
			overflow: 		'.popup-overflow',
			type: 			'default',
			dataType:		'html',
			position:		false,
			unique:			false,
			left:			false,
			top:			false,
			effect:			'fade', //'slide',
			content: 		null,
			outClose:		false,
			selfClose:		false,
			cancelTrigger:	'.popup-cancel',
			cancel:			function(o) { g.close(this, o); },			
			okTrigger:		'.popup-ok',
			ok:				function(o) { g.close(this, o); },	
			closeTrigger:	'.popup-close',
			beforeClose:	function(o) { return true; },
			beforeLoad:		function(o) { return true; },
			afterClose: 	function(o) {},
			beforeOpen: 	function(o) { return true; },
			onOpen:			function(o) {},
			afterOpen: 		function(o) {},
			clickOut: 		function(o) {},
			container: 		'body'
			
		}, o, {			
			self: 			this,
			popup: 			null,			
			minHeight:		$.support.boxModel?"1%":"auto"
		});	
	
		o.popups = $(g.metaclass);
		if(!this.length && !o.popups.length && !o.url) return this;
		if(o.unique) o.popups.each(function() { g.close(this, null, true);	});		
		g.preload(o);     
    	return this;
    };   
    
    g.types = {};
    g.meta = 'ba3bff91d5c461fa22da2e9c83fd3ba9';
    g.metaclass = '.'+g.meta;
    g.define = function(defaults, o, extra) {
    	if(!o) o={};
		var type = g.types[ o.type  ? o.type : defaults.type ];
    	if( type ) {
    		var options = typeof type == 'function' ? type(o) : type;
    		if(!o.template) o.template = type.template;			
			defaults = $.extend(defaults, type);			
		}
    	else if(typeof o.type == 'string' && !o.template) o.template = o.type;
    	if( defaults.url && defaults.url.charAt(0) == '#' && $(defaults.url).length ) 
    		defaults.content = $('<div>').append( $(defaults.url).eq(0).clone().show() ).html()
    	
    	return $.extend(defaults, o, extra);
    };    
       
	g.preload = function(o, loading, reoverlay) {
		if(o.beforeOpen(o) || reoverlay) {
			if(!g.ovr ) g.ovr  = $("<div id='popup-overlay'>").css({
		    	position: !$.support.boxModel||$.ie6?'absolute':'fixed', width: '100%', height: $.ie6?$(window).height():"100%", top:0, left:0
		    }).appendTo(o.container);
		    if(!o.overlay) g.ovr.hide();	     
		    else {
		    	if(o.overlay == 'transparent') o.overlay = { opacity: 0 };
		    	g.ovr.show().css(o.overlay).css({ zIndex: 60000000 + o.popups.length + 1 }); 
		    }
		    if(!reoverlay) {
				if( o.url && !o.content ) { o.content =''; g.load(o); } 
				else if( o.content ) g.open(o);
				else if (!o.content) {       
					if(o.self.length) {  
						o.content = $('<div>').append( o.self.eq(0).clone().show() ).html();
						g.open(o);
					}
					else g.close(null, o);
				}     
			}   
		}   
    };
    
    g.load = function(o) {    	
    	g.comein(o, g.construct(o, o.loading), function() {  	
			$.ajax({
				url: o.url, type: 'GET', dataType: o.dataType,
				beforeSend: function(xhr) { return o.beforeLoad(o, xhr) !== false; },        		
				success: function(data) { 
					o.data = data;  
					if( o.dataType == 'html' && o.data.charAt(0) == '{' ) {
						o.data = $.parseJSON(data);
						o.dataType = "json";
					}
					else if(o.dataType == 'json' && typeof o.data != 'object') o.dataType = "html";		
							
					switch( o.dataType ) {        			
		    			case 'json': 
		    				if(o.data.redirect) { g.lock = false; document.location=o.data.redirect; return false; }
		    				if(o.data.overlay) { g.preload(o, false, true); }
		    				o = $.extend({}, o, o.data);  
		    			break;
		    			case 'html' : default : o.content = o.data; break;
					}
					g.open(o);
				},
				error: function(xhr, ajaxOptions, thrownError) {
					o.data = {};
					o.content = xhr.responseText;
		    		g.open(o); 
				}
			});
		});
    }; 
    
	g.comein = function(o, popup, callback) {				
		switch(o.effect) {        	
    		case 'slide':
    			var css = { left: o.p.left, top: -o.p.height-210 };
    			var anime = { left: o.p.left, top: o.p.top };
	        break;
    		case 'fade' : default :
    			var css = { opacity: 0, left: o.p.left, top: o.p.top }
    	        var anime = { opacity : 1 };
    		break;        		
    	}
		popup.css(css).stop(true,  true).animate(anime, o.duration-50, callback);
    }
    
    g.comeout = function(o, popup, callback) {	
    	switch(o.effect) {        	
    		case 'slide': var anime = { top: -o.p.height-210 }; break;
    		case 'fade' : default : var anime = { opacity: 0 }; break;
    	}
		popup.stop(true, true).animate(anime, o.duration-150, callback);
    }	
    
    g.open = function(o, loader, popup) {
    	loader = o.popup;
    	popup = g.construct(o);
    	o.onOpen(o);
    	if(loader) {
    		loader.stop(true, true).animate({ top: o.p.top, left: o.p.left }, o.duration, function() {     			
    			popup.css({ opacity: 0, left: o.p.left, top: o.p.top }).animate({ opacity : 1 }, o.duration-50, function() {     				
    				popup.stop().css({ opacity : '' });     				 
    				g.opened(o); 
    				loader.remove(); 
    			}); 
    		});
    		g.overflow(o, loader).stop(true, true).animate({ height: o.p.overflow.height(), width: o.p.overflow.width() }, o.duration, null);
    	}
    	else g.comein(o, popup, function() { g.opened(o); });
    }    

    g.construct = function(o, loading) {    	
   		if(!$.support.boxModel && o.width == 'auto') o.width = 'auto';  		
		o.css = $.extend(o.css, { width: o.width, height: o.height, position:(!$.support.boxModel||$.ie6)||o.position?'absolute':'fixed',left:0, top:-99999 });
    	var content = o.template; 
    	for(opt in o) content=content.replace('%'+opt+'%', o[opt]);
    	var jcontent = $(content);    	
    	if(jcontent.length) o.popup = jcontent;
    	else o.popup = $('<div>'+content+'</div>');  
    	if(o.id) o.popup.attr('id', o.id);  
    	if(o.classname) o.popup.addClass(o.classname); 	
    	o.popup.addClass(loading ? g.meta+'l' : g.meta).css(o.css).css({ zIndex:60000000 + o.popups.length + (loading ? 1 :2) }).appendTo(o.container)[0].popup = o;
    	o.popup.delegate(o.closeTrigger, 'click', function(){ g.close(this, o); return false; });
    	o.popup.delegate(o.okTrigger, 'click', function(){ o.ok(o); return false; });
    	o.popup.delegate(o.cancelTrigger, 'click', function(){ o.cancel(o); return false; });
    	if(o.selfClose) o.popup.click(function(){ g.close(null, o); return false; })
    	g.ovr.unbind('click').click(function() {
	    	o.clickOut(o);
	    	if(o.outClose) g.close(null, o);
	    });
    	o.p = g.position(o, o.popup, loading); 
    		
    	return o.popup;
    }
    g.correct = function(o, popup) {
    	//if(o.loader && popup) { popup.css({ opacity : '' }); o.loader.remove(); o.loader = null; }
    	if(!o.popupIsClosed) {
	    	o.p = g.position(o, o.popup); 
	    	o.popup.stop(true).animate({ left: o.p.left, top: o.p.top }, 100);
	    	o.timeout = setTimeout(function() { g.correct(o); }, 110);
    	}
    }
    g.opened = function(o) {
    	if(!o.position) o.timeout = setTimeout(function() { g.correct(o, o.popup); }, 10);     	
    	if(o.delay)setTimeout(function() { if(!o.popupIsClosed) g.close(null, o); }, o.delay);
    	o.afterOpen(o);
    }
    g.overflow = function(o, popup) {
    	var overflow = popup.find(o.overflow).eq(0);
    	if( !overflow.length ) overflow = popup
    	return overflow.css("overflow-y", "auto");  
    }
    g.position = function(o, popup, loading) {

    	var overflow = g.overflow(o, popup);
    	if(loading) overflow.css(loading);
    	var w_w = $(window).width();
    	var w_h = $(window).height();
    	var w_s = !$.support.boxModel?document.documentElement.scrollTop:0;//window.pageYOffset;
    	var p_h = popup.height();
    	var p_w = popup.width();
    	var f_h = p_h + overflow.innerHeight() - overflow.height();
    	var dec = p_h - overflow.height();
        
        if(f_h >= w_h)
        {
        	p_h = Math.max(10, w_h );
        	f_h = p_h - dec;
        	overflow.css({ height: f_h });        	
        }
        else overflow.css(loading ? {} : { height: 'auto' });  
   	
        p_h = popup.height(); 
        var tl = 0;
        var tt = 0;       	
        if(o.position) {
        	
        	if(o.position == 'self' ) var target = o.self;
		    else var target = $(o.position);
		    if(!target.length) target = o.self;
		    var visible = target.is(':visible');
		    
		    tl = visible ? target.offset().left : 0;
		    tt = visible ? target.offset().top : 0;
		}
		if(o.position || o.left) var nl = tl + (o.left ? o.left : 0);
		else var nl = Math.max( 0, (w_w-p_w) / 2 );
       	if(o.position || o.top) var nt = tt - (p_h+parseInt(popup.css('paddingTop'))+parseInt(popup.css('paddingBottom'))) + (o.top ? o.top : 0);
        else var nt = Math.max( 0, (w_h-p_h) / 2) + w_s;
  
        return { left: nl, top: nt, height: p_h-dec, width: popup.width(), overflow: overflow };
    };
    g.retrieve = function(self, o) { 
    	self=$(self);
    	if(!o) {
    		o = self[0].popup;
			if(!o || typeof o != 'object') {
				o = self.parents(g.metaclass);
				if(!o) o = self.parents(g.metaclass+'l');
				if(!o) o = $(g.metaclass);
				if(!o) o = $(g.metaclass+'l');
				o = o.length && o[0].popup ? o[0].popup : null;
				if(o && !o.popup) o.popup = $(g.metaclass);
			}
    	}
    	return o;
    };
    g.close = function(self, o, notov) {   	
    	o = g.retrieve(self, o);     	
		if(o && o.beforeClose(o)) {
			if(o.loader) o.loader.remove();
			o.popupIsClosed=true;
			o.popups = $(g.metaclass);
    		clearTimeout(o.timeout); 
    		g.comeout(o, o.popup, function() {
    			o.popup.remove();    			
    			if(!(o.popups.length - 1) && o.overlay && !notov) g.ovr.stop(true, true).animate({ opacity:0 }, o.duration-200, function(){ g.ovr.hide(); });
				else if(o.overlay) g.ovr.show().css({ zIndex: 60000000 + o.popups.length - 1 });
				o.afterClose(o);
    		})
    		g.lock = false;
		}
		return self;    	
    };
    
	g({ 
		register : 'default', 
		template : '<div class="popup %classname%">\
			<div class="popup-title"><a class="popup-close">x</a><h2>%title%</h2></div>\
		    <div class="popup-content popup-overflow">%content%</div>\
		    <div class="popup-bottom"></div>\
		</div>'
	});

})(jQuery);

