(function($){

	var patterns = {
		text: /^["']?(.+?)["']?$/,
		url: /^url\(["']?(.+?)["']?\)$/ //'"
	};

	function clean(content) {
		if(content && content.length) {
			var text = content.match(patterns.text)[1],
				url = text.match(patterns.url);
				return url ? '<img src="' + url[1] + '" />': text;
		}
	}

	function inject(prop, elem) {
		if(prop != 'after') prop = 'before';
		if(elem[prop] == elem.currentStyle[prop]) return;
		elem[prop] = elem.currentStyle[prop];
		var content = clean(elem.currentStyle[prop]);
		$(elem).children(prop == 'before' ? 'span:first-child' : 'span:last-child').remove('.'+prop);
		if(content) {
			var span = document.createElement('span');
			span.className = prop;
			span.innerHTML = content;
			$(elem)[prop == 'before' ? 'prepend' : 'append'](span);
		}		
	}
	
	function handle(e, prop) {
		prop = e.propertyName || prop;
		if(prop != 'bubble')
			(this.all ? $(this.all) : $('*', this)).trigger('propertychange', ['bubble']);
		if(e.target == document.body) return;
		switch(prop) {
		case 'init':
		case 'bubble':
		case 'style.before':
		case 'style.after':
		case 'className':
		case 'id':
			inject('before', e.target);
			inject('after', e.target);
			break;
		}	
	}

	$.pseudo = function(element, bubble) {
		inject('before', element);
		inject('after', element);
		if(bubble === true) $(element).bind('propertychange', handle);
		element.runtimeStyle.behavior = null;
	};

})(jQuery);
