function TagControl(){
	var bnUseEmbed = arguments[0];
	var reTag = /^(A|B|BR|BGSOUND|BIG|BLOCKQUOTE|EMBED|BUTTON|CENTER|DIV|FONT|HR|IMG|MARQUEE|P|SMALL|SPAN)$/i;
	var reAttr = /\w+=[\'\"]?[^\'\" ]*[\'\"]?/g;
	var reStyle = /[\w\-]+:[^;\'\"]+/g;
	var reRemoveSpace = / *([=;:]) */g;
	var reInvalid = /^ON|SCRIPT/i;
	var reLink = /((http|mms|ftp):\/\/[\w\d\/\~\.\-\_\&\%\:]+)/ig;
	var nMAXPIXEL = 600; /* ÅÂ±×Áß width,height °ªÁ¦ÇÑ */

	this.getTag =		getTag;
	this.getHtml =		getHtml;
	this.getText =		getText;
	this.autolink =		autolink;

	function getTag(str){
		var sTagName,sTagAttr;
		var sTag = str;
		var nIdx=str.indexOf(" ");
		if (nIdx >0){
			sTagName = sTag.substring(0,nIdx);
			sTagAttr = getAttribute(sTag.substring(nIdx+1));
		}
		else{
			sTagName = sTag;
			sTagAttr = '';
		}
		sTagName = sTagName.toUpperCase();
		if (sTagName.charAt(0)=="/"){
			return "</" + sTagName.substring(1) + ">";
		}
		else if (reTag.test(sTagName)){
			if (sTagName == "A")	sTagAttr +=" target=_blank ";
			else if (sTagName=="EMBED"){
				if (!bnUseEmbed){
					alert ('EMBED ÅÂ±×´Â È¸¿ø¸¸ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.');
					return "";
				}
				else if (sTagAttr.match(/\.swf/i)) {
					alert ('Flash ÆÄÀÏÀº »ðÀÔÇÒ¼ö ¾ø½À´Ï´Ù.');
					return "";
				}
			}
			return "<" + sTagName + " " + sTagAttr +">";
		}
		else	return "&lt;"+ str + "&gt;";
	}
	function autolink(str){
		return str.replace(reLink,"<a href=$1 target=_blank>$1</a>");
	}
	function getHtml(msg,bnTag){
		var lt,gt,html,tag;
		html ='';
		while(msg){
			lt=msg.indexOf("<");
			if (lt >=0){
				html += autolink(msg.substring(0,lt));
				msg = msg.substring(lt+1);
				gt=msg.indexOf(">");
				if (gt >=0){
					tag= msg.substring(0,gt);
					lt=tag.indexOf("<");
					if (lt>=0){
						html +="&lt;";
					}
					else{
						if (bnTag)	html += getTag(tag);
						else		html += "&lt;" + tag + "&gt;";
						msg = msg.substring(gt+1);
					}
				}
				else{
					msg = msg.replace(/</g,"&lt;");
					html += "&lt;" + autolink(msg);
					msg = null;
				}
			}
			else{
				html += autolink(msg);
				msg=null;
			}
		}
		return html;
	}
	function getText(msg){
		var lt,gt,text;
		text ='';
		while(msg){
			lt=msg.indexOf("<");
			if (lt>=0){
				text += msg.substring(0,lt);
				msg= msg.substring(lt);
				gt=msg.indexOf(">");
				if (gt >=0)	msg = msg.substring(gt+1);
				else{
					text += msg;
					msg =null;
				}
			}
			else{
				text +=msg;
				msg =null;
			}
		}
		return text;
	}


	/* Private */
	function getAttribute(str){
		if (!str)	return '';
		var oAttr,sName,sValue,nIdx;
		var sAttr='';
		str=str.replace(reRemoveSpace,"$1");
		oAttr=str.match(reAttr);
		if (!oAttr)	return str;
		for (var i=0;i<oAttr.length;i++){
			if (!reInvalid.test(oAttr[i])){
				nIdx = oAttr[i].indexOf("=");
				if(nIdx>0){
					sName = oAttr[i].substring(0,nIdx).toUpperCase();
					sValue = oAttr[i].substring(nIdx+1);
					if (sName == "STYLE")	sAttr += sName + "='"+ getStyle(sValue) + "' ";
					else if (isValid(sName,sValue))		sAttr += oAttr[i] + " ";
				}
			}
		}
		return sAttr;
	}
	function getStyle(str){
		if (!str)	return '';
		var oStyle,nIdx,sName,sValue;
		var sStyle='';
		oStyle= str.match(reStyle);
		if (!oStyle)	return str;
		for (var i=0;i<oStyle.length;i++){
			nIdx = oStyle[i].indexOf(":");
			if (nIdx>0){
				sName = oStyle[i].substring(0,nIdx).toUpperCase();
				sValue = oStyle[i].substring(nIdx+1);
				if (isValid(sName,sValue))	sStyle += oStyle[i] + ";";
			}
		}
		return sStyle;
	}
	function isValid(name,value){
		if (value.indexOf(":") >0 && !reLink.test(value))	return false;
		value = parseInt(value);
		if ((name == "WIDTH" || name == "HEIGHT") && value > nMAXPIXEL){
			alert (name + ' ¼Ó¼º°ªÀÌ ³Ê¹« Å« °ü°è·Î ¹«½ÃµÇ¾ú½À´Ï´Ù.');
			return false;
		}
		else if (name == "FONT-SIZE" && value > 20){
			alert (name + ' ¼Ó¼º°ªÀÌ ³Ê¹« Å« °ü°è·Î ¹«½ÃµÇ¾ú½À´Ï´Ù.');
			return false;
		}
		else	return true;
	}
}
