var _makePopupTriggerGroups = new Array();
$.fn.makePopup = function(p, options) {
    return this.each(function() {
        var el = $(this);
        el.remove().appendTo('body');
        
        if ( !options ) {
        	options = {
        		left: 0,
        		top: p.height()
        	}
        }
        
        if ( !options.group ) {
        	options.group = 'all_popups';
        }
        
        if ( options.group ) {
        	if ( !_makePopupTriggerGroups[options.group] ) {
        		_makePopupTriggerGroups[options.group] = new Array();
        	}
        	
        	var found = false;
        	for ( var i=0; i < _makePopupTriggerGroups[options.group].length; i++ ) {
        		if (_makePopupTriggerGroups[options.group][i] == el) {
        			found = true;
        			break;
        		}
        	}
        	
        	if ( !found ) {
        		_makePopupTriggerGroups[options.group].push(el);
        	}
        }
        
        if ( options.parentcenter ) {
        	options.left = -Math.round(el.width()-p.width());
        }
        
        pos = p.position();
        if ( options.left ) pos.left += options.left;
        if ( options.top ) pos.top += options.top;
        
        elCss = {
        	position: 'absolute',
            top: pos.top, 
            left: pos.left            
        }
        
        if ( options.width ) elCss.width = options.width;

        el.css(elCss);
        
        var trigger = (options.trigger && options.trigger == "click" ) ? "click" : "mouseenter";
        
        if ( !options.noAutoShow ) {
	        p[trigger](function() {
	        	if ( _makePopupTriggerGroups[options.group] ) {
	        		for( var i=0; i < _makePopupTriggerGroups[options.group].length; i++ ) {
	        			_makePopupTriggerGroups[options.group][i].hide();
	        		}
	        	}
	        	
	        	if ( options.slideDown ) {
		        	el.slideDown(options.slideDown);
	        		el.show();
	        	}
	        	if ( options.fadeIn ) {
		        	el.fadeIn(options.fadeIn);
	        		el.show();
	        	}
	        	else {
	        		el.show();
	        	}
	        	if ( options.onshow ) {
	        		options.onshow( el );
	        	}
	        });
        }
        
        if ( !options.noAutoHide ) {
	        if ( options.hideOnLeaveTrigger ) {
		        p.mouseleave(function() {
		        	el.hide();
		        	if ( options.onhide ) {
		        		options.onhide( el );
		        	}
		        });
	        }
	        
	        el.mouseleave(function() {
	        	el.hide();
	        	if ( options.onhide ) {
	        		options.onhide( el );
	        	}
	        });
        }
        
    });
}
