Popupper = {
	opacityId: 'pb-opacity',
	contentId: 'pb-content',
	closerId: 'pb-closer',
	testerId: 'pb-tester',
	
	open: function (cfg) {
		src = jQuery(this); if (typeof cfg.currentTarget != 'object' && typeof cfg.target == 'object') { cfg = jQuery(cfg.target); }
		if (typeof cfg.currentTarget == 'object' && /^(popupper:)/.test(cfg.currentTarget.href)) { cfg = jQuery(cfg.currentTarget); }
		if (typeof cfg.target == 'object' && cfg.currentTarget == cfg.target) { cfg = jQuery(cfg.target); }
		if (cfg.attr && typeof cfg.attr('rel') == 'string' && cfg.attr('rel').replace(/^\s*|\s*$/g, '').length != 0) {
			if (/^(popupper:)?(inline|remote):(.+)$/.test(cfg.attr('rel'))) {
				parts = cfg.attr('rel').replace('popupper:', '').split(':'); config = { source: parts[1], content: parts[0], type: 'link' };
			}
		} else if (cfg.attr && typeof cfg.attr('href') == 'string' && cfg.attr('href').replace(/^\s*|\s*$/g, '').length != 0) {
			if (/^(popupper:)?(inline|remote):(.+)$/.test(cfg.attr('href').replace(/^\s*|\s*$/g, ''))) {
				parts = cfg.attr('href').replace(/^\s*|\s*$/g, '').replace('popupper:', '').split(':');
				config = { source: parts[1], content: parts[0], type: 'link' };
			} else {
				parts = cfg.attr('href').replace(/^\s*|\s*$/g, '').split('#');
				source = (cfg.attr('mode') == 'remote' ? cfg.attr('href') : '#'+parts[1]);
				config = { source: source, content: cfg.attr('mode') || 'inline', type: 'link' };
			}
		} else {
			config = cfg;
		}
		switch (config.content || 'inline') {
			case 'inline':
				sourceObj = jQuery(config.source);
				Popupper.render(sourceObj.html(), sourceObj.width(), sourceObj.height());
				break;
			case 'remote':
				jQuery.get(config.source, config.data || {}, function (data, status, request) {
					testerObj = jQuery('#'+Popupper.testerId); testerObj.html(data);
					testerObj.ready(function () {
						if (jQuery(this).html() != '') {
							Popupper.render(data, testerObj.innerWidth(), testerObj.height()); testerObj.html('');
						}
					});
				}, 'html');
				break;
		}
		if ((config.type || '') == 'link') { return false; }
	},
	
	close: function () {
		jQuery('#'+Popupper.opacityId).fadeOut(); jQuery('#'+Popupper.contentId).fadeOut();
	},
	
	render: function (content, width, height) {
		opacityObj = jQuery('#'+Popupper.opacityId); contentObj = jQuery('#'+Popupper.contentId);
		contentObj.html('<div style="padding: 10px;">'+content+'<div id="'+Popupper.closerId+'"><a href="javascript:Popupper.close();"></a></div></div>');
		closerObj = jQuery('#'+Popupper.closerId); contentObj.css('width', (width + 20)+'px').css('height', (height + 22 + closerObj.outerHeight())+'px').corner();
		contentObj.css('margin-top', '-'+Math.round((height + 22 + closerObj.outerHeight()) / 2)+'px');
		contentObj.css('margin-left', '-'+Math.round((width + 20) / 2)+'px');
		opacityObj.css('width','100%').css('height','100%').fadeIn().click(Popupper.close);
		contentObj.fadeIn();
	},

	init: function (config) {
		Popupper.opacityId = (config.opacityId || 'pb-opacity'); Popupper.contentId = (config.contentId || 'pb-content');
		Popupper.closerId = (config.closerId || 'pb-closer'); Popupper.testerId = (config.testerId || 'pb-tester');
		jQuery(document.body).append('<div id="'+Popupper.opacityId+'"></div><div id="'+Popupper.contentId+'"></div>');
		jQuery(document.body).append('<div style="display: none;" id="'+Popupper.testerId+'"></div>');
		jQuery('#'+Popupper.opacityId).hide(); jQuery('#'+Popupper.contentId).hide();
		if (config.cls) { jQuery('.'+config.cls).click(Popupper.open); }
		jQuery('[href^=popupper:]').click(Popupper.open);
		jQuery('[rel^=popupper:]').click(Popupper.open);
	}
}
