/*
フィルタのセレクタfldの値は
	FLD_COMMENTS=0
	FLD_REPLY=1
*/
//コメント、返信のタグフィルタ
function filtrateField(mainStr,fld){
	var CR=getCRChars()
	var mainCode=new makeCode(mainStr,P_NO_USE)
	var bufStr=""
	var TAGs_atr=new Array()
	var TAGs_no_atr=new Array()
	var i=0

	//属性可なエレメント名
	TAGs_atr[i++]="a"
	TAGs_atr[i++]="div"
	TAGs_atr[i++]="font"
	TAGs_atr[i++]="img"
	if(fld==FLD_REPLY){
		TAGs_atr[i++]="area"
		TAGs_atr[i++]="bgsound"
		TAGs_atr[i++]="caption"
		TAGs_atr[i++]="dir"
		TAGs_atr[i++]="dl"
		TAGs_atr[i++]="hr"
		TAGs_atr[i++]="li"
		TAGs_atr[i++]="map"
		TAGs_atr[i++]="marquee"
		TAGs_atr[i++]="menu"
		TAGs_atr[i++]="ol"
		TAGs_atr[i++]="p"
		TAGs_atr[i++]="pre"
		TAGs_atr[i++]="span"
		TAGs_atr[i++]="table"
		TAGs_atr[i++]="td"
		TAGs_atr[i++]="th"
		TAGs_atr[i++]="tr"
		TAGs_atr[i++]="ul"
	}

	//属性不可なエレメント名
	i=0
	TAGs_no_atr[i++]="b"
	TAGs_no_atr[i++]="code"
	TAGs_no_atr[i++]="dfn"
	TAGs_no_atr[i++]="em"
	TAGs_no_atr[i++]="i"
	TAGs_no_atr[i++]="kbd"
	TAGs_no_atr[i++]="sub"
	TAGs_no_atr[i++]="sup"
	TAGs_no_atr[i++]="tt"
	TAGs_no_atr[i++]="u"
	TAGs_no_atr[i++]="var"
	if(fld==FLD_REPLY){
		TAGs_no_atr[i++]="address"
		TAGs_no_atr[i++]="big"
		TAGs_no_atr[i++]="blink"
		TAGs_no_atr[i++]="blockquote"
		TAGs_no_atr[i++]="br"
		TAGs_no_atr[i++]="center"
		TAGs_no_atr[i++]="cite"
		TAGs_no_atr[i++]="dd"
		TAGs_no_atr[i++]="dt"
		for(var k=1;k<7;k++) TAGs_no_atr[i++]="h"+k
		TAGs_no_atr[i++]="listing"
		TAGs_no_atr[i++]="nobr"
		TAGs_no_atr[i++]="plaintext"
		TAGs_no_atr[i++]="s"
		TAGs_no_atr[i++]="samp"
		TAGs_no_atr[i++]="small"
		TAGs_no_atr[i++]="strike"
		TAGs_no_atr[i++]="strong"
		TAGs_no_atr[i++]="wbr"
	}



	//一行ずつ取り出してフィルタリング
	mainCode.getChr()
	while(mainCode.Chr!=""){
		bufStr+=filtrateField_line(mainCode.getFront(CR),TAGs_atr,TAGs_no_atr)
		if(mainCode.Chr!="") bufStr+=TAG_BR+CR
		mainCode.getChr()
	}
	return bufStr
}
//タグフィルタ本体(コメント、返信用)
function filtrateField_line(mainStr,TAGs_atr,TAGs_no_atr){
	var bufStr=""
	var lineCode=new makeCode(mainStr,P_NO_USE)
	var bufName=""
	var nameStr=""
	var slashSym=""
	var tmpStr=""
	var continueFlg=false

	lineCode.getChr()
	while(lineCode.Chr!=""){
		continueFlg=false
		//"<"より前を取り出す
		bufStr+=replaceString_all(lineCode.getFront("<"),">","&gt;")
		if(lineCode.Chr=="") break

		//"<"の次の文字をチェック
		bufName=""
		lineCode.getChr()
		if(lineCode.Chr=="/"){
			slashSym="/"
			lineCode.getChr()
		}else{
			slashSym=""
		}
		//エレメント名を取得
		while(lineCode.Chr>="a" && lineCode.Chr<="z" ||
		     lineCode.Chr>="A" && lineCode.Chr<="Z"){
			bufName+=lineCode.Chr
			lineCode.getChr()
		}

		//タグ判別開始
		nameStr=bufName.toLowerCase()

		//使用可能なタグ(属性不可)の場合
		if(lineCode.Chr==">"){
			for(var i=0;i<TAGs_no_atr.length;i++){
				if(nameStr==TAGs_no_atr[i]){
					bufStr+="<"+slashSym+bufName+">"
					lineCode.getChr()
					continueFlg=true
					break
				}
			}
			if(continueFlg) continue
		}

		//使用可能なタグ(属性可)の場合
		if(lineCode.Chr==">" || lineCode.Chr==" " || lineCode.Chr==""){
			for(var i=0;i<TAGs_atr.length;i++){
				if(nameStr==TAGs_atr[i]){

					//エレメント名の後ろから">"より前を取り出す
					tmpStr=replaceString_all(lineCode.getFront(">"),"<","&lt;")
					bufStr+="<"+slashSym+bufName+tmpStr

					//">"が見つかった場合
					if(lineCode.Chr==">") bufStr+=">"

					lineCode.getChr()
					continueFlg=true
					break
				}
			}
			if(continueFlg) continue
		}

		//使用不可なタグの場合
		bufStr+="&lt;"+slashSym+bufName
	}
	return bufStr
}