(function($) {
	$.fn.waokon = function(){
		var noLeftMarginWith = /[、。：；」）！？＃＄％＆’＠]$/;
		var noRightMarginWith = /^[、。：；「（！？＃＄％’℃€￡￠‰Å㏋㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡]/;
		var romanString = /[\w\s\.,"'+-=*\/!#\$%\|@&;:\[\]\{\}<>\(\)°'″′“”‘’]+/ig;
		var romanClass = 'waokon';
		var shortMarginClass = 'shortMargin';
		var noLeftMarginClass = 'noLeftMargin';
		var noRightMarginClass = 'noRightMargin';
		var langIdentifier = 'en';
		
		return this.each(function(){
			var elem = $(this);
			var srcs = elem.contents().not('[nodeType=8]');
			for(key in srcs){
				if(/\d+/.test(key)){
					var obj = $(srcs[key]);
					if(obj.is('*') && obj.not('.'+romanClass)){
						obj.waokon();
					}else{
						var res = srcs[key].data.replace(
							romanString,
							function(text){
								if(/^\s+$/.test(text)){
									return ''
								}else{
									return '<span class="'+romanClass+'" lang="'+langIdentifier+'">'+$.trim(text)+'</span>'
								}
							})
						$(srcs[key]).before(res);
						$(srcs[key]).remove();
					}
				}
			}

			var nodes = elem.contents();

			var isShortMargin = function(){
				if(/[\d\.,]+|^\w{1,3}$/.test($(nodes[i]).text())){
					return true;
				}
				return false;
			}

			var isNoLeftMargin = function(){
				if(i==0){
					if(elem.css('display') == 'block'){
						return true;
					}else if(elem.is(':first-child') && elem.parent().css('display') == 'block'){
						return true;
					}
				}else if(noLeftMarginWith.test($(nodes[i-1]).text()) || noLeftMarginWith.test(nodes[i-1].data)){
					return true;
				}
				return false;
			}

			var isNoRightMargin= function(){
				if(i<l-1 && typeof(nodes[i+1]) == 'object'){
					if(noRightMarginWith.test($(nodes[i+1]).text()) || noRightMarginWith.test(nodes[i+1].data) || $(nodes[i+1]).is('sub,sup')){
						return true;
					}
				}
				return false;
			}

			for(var i=0,l=nodes.length;i<l;i++){
				if($(nodes[i]).is('.'+romanClass)){
					if(isShortMargin()){
						$(nodes[i]).addClass(shortMarginClass)
					}
					if(isNoLeftMargin(i)){
						$(nodes[i]).addClass(noLeftMarginClass)
					}
					if(isNoRightMargin()){
						$(nodes[i]).addClass(noRightMarginClass)
					}
				}
			}
			
		});
	};
})(jQuery);