/*
 * タグ JavaScript
 *
 *
 * Copyright (c) 2003 DRECOM CO.,LTD. All rights reserved.
 * 
 * info@drecom.co.jp
 * http://www.drecom.co.jp/
 */


/**
 * String scanner
 * 
 * @param aString     文字列
 * @param packNewline getc() で改行 (CR, CRLF, LF) をすべて LF に変換するか
 */
function StringPointer(aString, packNewline)
{
	this.string = aString;
	this.location = 0;
	
	if (this.string == null) {
		this.string = '';
	}
	
	this.packNewline = packNewline;
}
StringPointer.prototype.getString = function() { return this.string; }
StringPointer.prototype.getLocation = function() { return this.location; }
StringPointer.prototype.setLocation = function(anIndex)
{
	if (anIndex > this.string.length) {
		throw ASSERT_EXCEPTION + 'attempt to set bounding over location.';
	}
	this.location = anIndex;
}
StringPointer.prototype.isAtEnd = function() { return this.string.length <= this.location; }

StringPointer.prototype._getc = function() 
{
	return this.isAtEnd() ? null : this.string.charCodeAt(this.location++);
}
StringPointer.prototype.getc = function() 
{
	var c = this._getc();
	
	if (c == null) {
		return null;
	}
	
	if (this.packNewline && c == XBSCType.CR) {
		var nextc = this._getc();
		
		if (nextc != XBSCType.LF && nextc != null) {
			this.pushback();
		}
		c = XBSCType.LF;
	}
	return c;
}
StringPointer.prototype.pushback = function()
{
	this.location--;
	if (this.location < 0) this.location = 0;
}

StringPointer.prototype.readSpaces = function()
{
	var ret = false;
	var c;
	
	while (c = this.getc()) {
		if (!XBSCType.isspace(c)) {
			this.pushback();
			break;
		}
		ret = true;
	}
	return ret;
}
StringPointer.prototype.readUpToString = function(/* String */ stopString)
{
	var i = this.string.indexOf(stopString, this.location);
	if (i == -1) {
		return false;
	}
	this.location = i + stopString.length;
	return true;
}
StringPointer.prototype.readChar = function(aCharacter)
{
	if (this.isAtEnd()) {
		return false;
	}
	var c = this.getc();
	
	if (c == aCharacter) {
		return true;
	} else {
		this.pushback();
		return false;
	}
	return false;
}
XBSUtil.indexOfCharacter = function(aString, c)
{
	var i;
	var len = aString.length;
	
	for (i = 0; i < len; i++) {
		if (c == aString.charCodeAt(i)) {
			return i;
		}
	}
	return -1;
}
StringPointer.prototype.scanUpToCharactersIn = function(/* String */ stopChars)
{	
	var fromIndex = this.getLocation();
	var toIndex   = fromIndex;
	
	if (stopChars == null) {
		stopChars = '';
	}
	while (c = this.getc()) {
		if (XBSUtil.indexOfCharacter(stopChars, c) != -1) {
			this.pushback();
			break;
		}
		toIndex++;
	}
	// end 
	if (toIndex == this.string.length) {
		this.location = fromIndex;
		return null;
	}
	
	if (fromIndex == toIndex) {
		return '';
	}
	
	return this.string.substring(fromIndex, toIndex);
}
// substring stuffs
StringPointer.prototype.substring = function(/* Integer */ fromIndex, toIndex)
{
	return this.string.substring(fromIndex, toIndex);
}
StringPointer.prototype.substringFrom = function(/* Integer */ fromIndex)
{
	return this.substring(fromIndex, this.location);
}

//---------------------------------------------------------------------------------
// Tag
//---------------------------------------------------------------------------------
/**
 * Tag:
 * タグオブジェクト。<A hoge="foo"> と </A> は別々のインスタンスになる。
 * オブジェクト自体にはタグ関連の機能をまとめてある
 * 
 * @param aTagName タグ名
 * @param aSource テキスト
 * @param isEndTag 閉じタグか
 * @author  Takanori Ishikawa
 * @version 1.0
 */
Tag = function(aTagName, aSource, isEndTag) 
{
	this.name = aTagName;
	this.source = aSource;
	this.value = '';
	this.isEnd = !(!isEndTag);
	this.isComment = false;
}
Tag.prototype.getName   = function() { return this.name; }
Tag.prototype.getSource = function() { return this.source; }
Tag.prototype.getValue  = function() { return this.value; }

// タグ定義
TagDefs = new Object();
TagDefs['斜'] 		= ['span', 'style="font-style: italic;"'];
TagDefs['太'] 		= ['span', 'style="font-weight: bold;"'];
TagDefs['大']   	= ['span', 'style="font-size: 125%;"'];
TagDefs['特大']		= ['span', 'style="font-size: 150%;"'];
TagDefs['小']     	= ['span', 'style="font-size: 75%;"'];
TagDefs['下線']   	= ['span', 'style="text-decoration: underline;"'];
TagDefs['打消線'] 	= ['span', 'style="text-decoration: line-through;"'];
TagDefs['左']		= ['div', 'style="text-align: left;"'];
TagDefs['中']		= ['div', 'style="text-align: center;"'];
TagDefs['右']		= ['div', 'style="text-align: right;"'];
TagDefs['リンク']		= ['a', 'href="', '" target="_blank"'];
TagDefs['色']		= ['span', 'style="color: ', ';"'];

/**
 * 絵文字
 */
Tag.emojiTable = new Object();
Tag.emojiTable['00'] = '笑顔';
Tag.emojiTable['01'] = '笑い';
Tag.emojiTable['02'] = '怒り';
Tag.emojiTable['03'] = '悲しい';
Tag.emojiTable['04'] = 'ラブ';
Tag.emojiTable['05'] = '落ち込み';
Tag.emojiTable['06'] = '困った';
Tag.emojiTable['07'] = 'ウインク';
Tag.emojiTable['08'] = 'びっくり';
Tag.emojiTable['09'] = 'はてな';
Tag.emojiTable['10'] = '音符';
Tag.emojiTable['11'] = 'ハート';
Tag.emojiTable['12'] = 'ハート割れ';
Tag.emojiTable['13'] = '料理';
Tag.emojiTable['14'] = 'ドクロ';
Tag.emojiTable['15'] = 'うんち';
Tag.emojiTable['16'] = '月';
Tag.emojiTable['17'] = '星';
Tag.emojiTable['18'] = '雲';
Tag.emojiTable['19'] = '太陽';
Tag.emojiTable['20'] = '雨';
Tag.emojiTable['21'] = '雪';
Tag.emojiTable['22'] = '木';
Tag.emojiTable['23'] = '山';
Tag.emojiTable['24'] = '携帯';
Tag.emojiTable['25'] = 'メール';
Tag.emojiTable['26'] = 'グラス';
Tag.emojiTable['27'] = 'ジョッキ';
Tag.emojiTable['28'] = 'パソコン';
Tag.emojiTable['29'] = 'プレゼント';
Tag.emojiTable['30'] = 'テレビ';
Tag.emojiTable['31'] = '本';
Tag.emojiTable['32'] = '花';
Tag.emojiTable['33'] = 'お金';
Tag.emojiTable['34'] = 'トイレ';
Tag.emojiTable['35'] = '家';
Tag.emojiTable['36'] = 'ビル';
Tag.emojiTable['37'] = '学校';
Tag.emojiTable['38'] = '温泉';
Tag.emojiTable['39'] = '幽霊';
Tag.emojiTable['40'] = '犬';
Tag.emojiTable['41'] = '猫';
Tag.emojiTable['42'] = '鳥';
Tag.emojiTable['43'] = '馬';
Tag.emojiTable['44'] = 'ネズミ';
Tag.emojiTable['45'] = '魚';
Tag.emojiTable['46'] = 'クジラ';
Tag.emojiTable['47'] = 'ペンギン';
Tag.emojiTable['48'] = '車';
Tag.emojiTable['49'] = '電車';
Tag.emojiTable['50'] = '船';
Tag.emojiTable['51'] = '飛行機';
Tag.emojiTable['52'] = '自転車';
Tag.emojiTable['53'] = '観覧車';
Tag.emojiTable['54'] = '新幹線';
Tag.emojiTable['55'] = 'ロケット';
Tag.emojiTable['56'] = '野球';
Tag.emojiTable['57'] = 'サッカー';
Tag.emojiTable['58'] = 'スキー';
Tag.emojiTable['59'] = 'テニス';
Tag.emojiTable['60'] = 'ゴルフ';
Tag.emojiTable['61'] = 'スノボー';
Tag.emojiTable['62'] = '走る';
Tag.emojiTable['63'] = '泳ぐ';
Tag.emojiTable['64'] = '乾杯';
Tag.emojiTable['65'] = '熱燗';
Tag.emojiTable['66'] = '食パン';
Tag.emojiTable['67'] = 'アイス';
Tag.emojiTable['68'] = 'ごはん';
Tag.emojiTable['69'] = 'ラーメン';
Tag.emojiTable['70'] = 'おにぎり';
Tag.emojiTable['71'] = 'おでん';
Tag.emojiTable['72'] = 'りんご';
Tag.emojiTable['73'] = 'みかん';
Tag.emojiTable['74'] = 'いちご';
Tag.emojiTable['75'] = 'OK';
Tag.emojiTable['76'] = 'アウト';
Tag.emojiTable['77'] = 'クラッカー';
Tag.emojiTable['78'] = '音量';
Tag.emojiTable['79'] = '鐘';
Tag.emojiTable['80'] = 'ダメ';
Tag.emojiTable['81'] = 'まる';
Tag.emojiTable['82'] = 'すいません';
Tag.emojiTable['83'] = 'バニー';
Tag.emojiTable['84'] = '赤ちゃん';
Tag.emojiTable['85'] = '拍手';
Tag.emojiTable['86'] = '足跡';
Tag.emojiTable['87'] = '熱帯魚';
Tag.emojiTable['88'] = 'ヒヨコ';
Tag.emojiTable['89'] = 'ウサギ';
Tag.emojiTable['90'] = 'ニワトリ';
Tag.emojiTable['91'] = 'カエル';
Tag.emojiTable['92'] = 'サル';
Tag.emojiTable['93'] = 'ブタ';
Tag.emojiTable['94'] = '宇宙人';
Tag.emojiTable['95'] = '力こぶ';
Tag.emojiTable['96'] = '自動車';
Tag.emojiTable['97'] = 'ボート';
Tag.emojiTable['98'] = 'バス';
Tag.emojiTable['99'] = '信号';
Tag.emojiTable['100'] = 'チューリップ';
Tag.emojiTable['101'] = 'ひまわり';
Tag.emojiTable['102'] = 'サボテン';
Tag.emojiTable['103'] = 'クローバー';
Tag.emojiTable['104'] = 'ハイビスカス';
Tag.emojiTable['105'] = 'ドキドキ小';
Tag.emojiTable['106'] = 'ドキドキ大';
Tag.emojiTable['107'] = 'ハート矢';
Tag.emojiTable['108'] = 'キラキラ';
Tag.emojiTable['109'] = '電球';
Tag.emojiTable['110'] = '炎';
Tag.emojiTable['111'] = 'VS';
Tag.emojiTable['112'] = '祝';
Tag.emojiTable['113'] = '汗';
Tag.emojiTable['114'] = '怒';
Tag.emojiTable['115'] = 'ZZZ';
Tag.emojiTable['116'] = 'はさみ';
Tag.emojiTable['117'] = 'メモ';
Tag.emojiTable['118'] = 'タバコ';
Tag.emojiTable['119'] = '帽子';
Tag.emojiTable['120'] = '服';
Tag.emojiTable['121'] = 'カバン';
Tag.emojiTable['122'] = '冠';
Tag.emojiTable['123'] = '注射';
Tag.emojiTable['124'] = 'メガホン';
Tag.emojiTable['125'] = 'カギ';
Tag.emojiTable['126'] = 'ランドセル';
Tag.emojiTable['127'] = '傘';
Tag.emojiTable['128'] = '注意';
Tag.emojiTable['129'] = '初心者';
Tag.emojiTable['130'] = '18禁';
Tag.emojiTable['131'] = '手紙';
Tag.emojiTable['132'] = '国旗';
Tag.emojiTable['133'] = '祝日';
Tag.emojiTable['134'] = '朝日';
Tag.emojiTable['135'] = 'リボン';
Tag.emojiTable['136'] = 'ダッシュ';
Tag.emojiTable['137'] = '男の子';
Tag.emojiTable['138'] = '女の子';
Tag.emojiTable['139'] = '雷';
Tag.emojiTable['140'] = '電波';
Tag.emojiTable['141'] = '病院';
Tag.emojiTable['142'] = 'パンダ';
Tag.emojiTable['143'] = 'バラ';
Tag.emojiTable['144'] = '天使';


Tag.EmojiNameTable = new Object();
for (key in Tag.emojiTable) {
	Tag.EmojiNameTable[Tag.emojiTable[key]] = key;
}

//タグの種類
Tag.TYPE_CSS = 0;
Tag.TYPE_DEPRECATED_HTML = 1;
Tag.TYPE_JP = 2;
Tag.getDefaultType = function() { return Tag.TYPE_JP; }

// shortcut
gTagType = Tag.getDefaultType();

// 絵文字のURLパス
Tag.VIEW_EMOJI_PATH = '/image/emoji/';
Tag.MEMBERS_EMOJI_PATH = '/image/emoji/';

/**
 * 改行をタグに変換するときのテキスト
 */
Tag.BR_TEXT  = '<br>' + OEMBlogGlobal.lineSeparator;
Tag.LT_TEXT  = '&lt;';
Tag.GT_TEXT  = '&gt;';
Tag.AMP_TEXT = '&amp;';

/**
 * 検索オプションを指定するための定数
 * 
 * <ul>
 * <li>BackwardSearch - 後方検索</li>
 * <li>AnchoredSearch - 文字列の先頭、または終端のみで一致</li>
 */
Tag.BackwardSearch = 1;
Tag.AnchoredSearch = 1 << 1;


Tag.findCustomTag = function(aText, option, start)
{
	var tag = Tag.findTag(aText, option, start);
	
	return (tag == null || tag.isCustomTag() == false) ? null : tag;
}

/**
 * text の中からタグを検索する。
 * 
 * @param aText 　検索対象の文字列
 * @param option 検索オプション定数を OR したもの
 * @param start　 検索開始位置（オプション）
 * @return 　　　　　Tag オブジェクト
 */
Tag.findTag = function(aText, option, start)
{
	var anchor  = null;    // AnchoredSearch 設定時の開始文字
	var sp      = null;
	
	if (null == aText || 0 == aText.length) {
		return null;
	}
	sp = new StringPointer(aText);
	
	if (start == null) {
		start = (option & Tag.BackwardSearch) ? aText.length -1 : 0;
	}
	
	//
	// Anchor オプションの処理
	// 検索開始位置 == タグ開始位置
	//
	if (option & Tag.AnchoredSearch) {
		var LR1 = (option & Tag.BackwardSearch) ? XBSCType.GT : XBSCType.LT;
		var LR2 = (option & Tag.BackwardSearch) ? XBSCType.RBRACE : XBSCType.LBRACE;
		c = aText.charCodeAt(start);
		
		switch (c) {
		case LR1:
			anchor = '<';
			break;
		case LR2:
			anchor = '{';
			break;
		default:
			return null;
			break;
		}
	}
	
	var idx    = -1;
	var fnName = (option & Tag.BackwardSearch) ? "lastIndexOf" : "indexOf";
	
	if (anchor != null) {
		// 前方検索なら start が使えるが、
		// 後方検索の場合、改めて検索する必要がある。
		// 面倒なのでどちらの場合でも検索
		idx = aText[fnName](anchor, start);
		
		// 以下のケースに対応
		// <B>hogehoge>hoge
		if (idx != -1 && option & Tag.BackwardSearch) {
			if (idx < aText.lastIndexOf('>', start-1)) {
				return null;
			}
		}
	} else {
		idx = aText[fnName]('<', start);
		if (-1 == idx) {
			idx = aText[fnName]('{', start);
		}
	}
	if (-1 == idx) {
		return null;
	}
	
	// StringPointer の位置をタグの先頭位置にして
	// scanTag() に委譲
	sp.setLocation(idx);
	return this.scanTag(sp);
}

Tag.TAG_NAME_STOP_CHARACTER = "/\"<{:";


/**
 * 空白文字を含まないテキストをスキャン
 * 
 * @param aStrPtr     StringPointer
 * @param stopChars   この文字列に含まれる文字でとまる
 * @param tagStopChar この文字でとまる
 */
Tag.scanText = function(aStrPtr, stopChars, tagStopChar)
{
	var fromIndex = aStrPtr.getLocation();
	var toIndex   = fromIndex;
	
	if (stopChars == null) {
		stopChars = '';
	}
	while (c = aStrPtr.getc()) {
		if (c == tagStopChar || 
			XBSUtil.indexOfCharacter("\r\n\t ", c) != -1 ||
			XBSUtil.indexOfCharacter(stopChars, c) != -1 ) 
		{
			aStrPtr.pushback();
			break;
		}
		toIndex++;
	}
	// end 
	if (toIndex == aStrPtr.string.length) {
		aStrPtr.location = fromIndex;
		return null;
	}
	
	if (fromIndex == toIndex) {
		return '';
	}
	
	return aStrPtr.string.substring(fromIndex, toIndex);
}
Tag.scanParameter = function(aStrPtr, tagStopChar)
{
	var idx = aStrPtr.getLocation();

	// 2004-05-06  Takanori Ishikawa 
	// ------------------------------------------------------------------------
	// ':' の周囲に空白を許す場合はふたつの readSpaces() の
	// コメントアウトを外してください。
	
	// aStrPtr.readSpaces();
	if (false == aStrPtr.readChar(XBSCType.COLON)) {
		aStrPtr.setLocation(idx);
		return "";
	}
	// aStrPtr.readSpaces();
	return Tag.scanText(aStrPtr, "", tagStopChar);
}

/**
 * タグをスキャン。
 * 
 * @param aStrPtr      タグの先頭位置を指す StringPointer
 * @return Tag オブジェクト、
 */
Tag.scanTag = function(aStrPtr)
{
	var sp = aStrPtr;
	var i, c;
	var tagName     = '';
	var isCustomTag = false;
	var tag         = null;
	var isEndTag    = false;
	var param       = null;
	
	if (null == sp || sp.isAtEnd()) {
		return null;
	}
	i = sp.getLocation();
	c = sp.getc();  // 先頭文字
	
	if (null == c) {
		return null;
	}
	
	//
	// <...> タグの場合、閉じタグも考慮する。
	// タグ名とタグの開始文字からカスタムタグかどうかを判別
	//
	var tagStopChar = (c == XBSCType.LT) ? XBSCType.GT : XBSCType.RBRACE;
	
	isEndTag    = (c == XBSCType.LT) ? sp.readChar(XBSCType.SLASH) : false;
	tagName     = Tag.scanText(sp, Tag.TAG_NAME_STOP_CHARACTER, tagStopChar);
	isCustomTag = (TagDefs[tagName] != null || c == XBSCType.LBRACE);
	
	if (tagName == null || tagName.length == 0) {
		return null;
	}
	if (!isEndTag && isCustomTag) {
		param = Tag.scanParameter(sp, tagStopChar);
		if (param == null) param = '';
	}
	
	if (isCustomTag) {
		var ch = sp.getc();
		var stop = (c == XBSCType.LT) ? XBSCType.GT : XBSCType.RBRACE;
		//画像の幅タッグへの対応
		if(ch == XBSCType.SPACE){
			idx = sp.string.indexOf('}', sp.getLocation());
			if(idx == -1) return null;
			sp.setLocation(idx+1);
		}
		if (ch != XBSCType.SPACE && ch != stop) {
			return null;
		}
	} else {
		var QT1 = '\''.charCodeAt(0);
		var QT2 = '"'.charCodeAt(0);
		
		var ch   = -1;
		var quot = -1;
	
		while (ch = sp.getc()) {
			if (ch == QT1 || ch == QT2) {
				if (quot == ch) {
					quot = -1;
				} else if (quot != -1) {
					;
				} else {
					quot = c;
				}
			} else if (c == XBSCType.LT && quot == -1) {
				// nested tag: invalid
				return null;
			}
			if (ch == XBSCType.GT) {
				break;
			}
		}
	}

	tag = sp.substringFrom(i);
	tag = new Tag(tagName, tag, isEndTag);
	tag.value = param;
	
	return tag;
}



Tag.prototype.charCodeAt = function(idx)
{
	var s = this.source;
	return (s == null || s.length <= idx) ? null : s.charCodeAt(idx);
}

/**
 * 拡張タグかどうか
 */
Tag.prototype.isCustomTag = function() 
{
	return (this.isCustomTag1() || this.isCustomTag2());
}
Tag.prototype.isCustomTag1 = function()
{
	return (this.charCodeAt(0) == XBSCType.LT && TagDefs[this.name] != null);
}
Tag.prototype.isCustomTag2 = function() 
{
	return (this.charCodeAt(0) == XBSCType.LBRACE);
}

/**
 * HTML 表現の文字列
 */
Tag.prototype.toHTMLString = function()
{
	return this.isCustomTag1() ? this.toHTMLString1() : this.toHTMLString2();
}
Tag.prototype.toHTMLString1 = function()
{
	if (this.isComment && (this.name == "大" || this.name == "特大")) {
		var ret = "&lt;";
		
		if (this.isEnd) {
			ret += "/";
		}
		
		return ret + this.name + "&gt;";
	}
	
	var defs = TagDefs[this.name];
	if (defs == null || 0 == defs.length) {
		return this.source;
	}
	
	if (this.isEnd) {
		return '</' + defs[0] + '>';
	}
	
	if (defs.length == 2) {
		return '<' + defs[0] + ' ' + defs[1] + '>';
	} else if (defs.length == 3) {
		var v = this.value;
		if (v == '' || v == null) {
			return '';
		}
		// 念のためサニタイジング
		v = v.replace(/</g, Tag.LT_TEXT);
		v = v.replace(/>/g, Tag.GT_TEXT);			
		return '<' + defs[0] + ' ' + defs[1] + v + defs[2] + '>';
	}

	return this.source;
}
Tag.prototype.toHTMLString2 = function()
{
	if (!this.isCustomTag2()) {
		return this.source;
	}
	
	var code = Tag.EmojiNameTable[this.name];
	var text = '';
	
	if (code != null) {	// 絵文字
		text = Tag.buildEmojiImageTag(code, this.isComment);
	} else {	// 画像
		text = this.buildUploadImageTag();
		if (null == text) {
			text = this.source;
		}
	}
	return text;
}

/**
 * インスタンスの説明的な文字列
 */
Tag.prototype.toString = function()
{
	return '[Tag:'+this.name+'] ' + this.value + '\n' + this.source;
}



 
// 絵文字タグ種類
var EMOJI_HTML 		= 0;
var EMOJI_REF_JP	= 1;
var emoji_type = EMOJI_REF_JP;

// アップ画像タグ種類
var UPIMAGE_HTML 		= 0;
var UPIMAGE_REF			= 1;
var upimage_type = UPIMAGE_REF;



//---------------------------------------------------------------------------------
// Interface
//---------------------------------------------------------------------------------
/**
 * 絵文字のコード （e.g. '01', '64'） から名前を得る。
 * 
 * @param aCode コード文字列
 */
function getEmojiNameFromCode(aCode)
{
	var code = '';
	var name = '';
	
	if (aCode != null) {
		// 空文字に連結することで無理やり文字列に変換する
		code += aCode;
	}
	name = Tag.emojiTable[aCode];
	if (name == null) {
		name = '';
	}
	return name;
}

/**
 * 絵文字タグ生成
 * 
 * @param code 絵文字 id
 */
Tag.buildEmojiImageTag = function(code, isComment)
{
	var srcPath;

	if (!isComment) {
		srcPath = Tag.MEMBERS_EMOJI_PATH;
	} else {
		srcPath = Tag.VIEW_EMOJI_PATH;
	}

	return '<img sr' + 'c="' + srcPath + code + '.gif" border="0">';
}

/**
 * アップロード画像へのパスを含む img タグ文字列を生成
 * 
 * @param filename      ファイル名
 * @param optional_attr 追加属性
 * @param dir           ディレクトリ
 * 
 * @return img タグ文字列
 */
Tag.buildUploadImageTag = function(filename, optional_attr, width_tag, dir)
{
	var path;
	if (dir) {
		path = dir;
	} else if (Tag.isViewableFile(filename)) {
		path = OEMBlogGlobal.uploadImageDirectory;
	} else {
		path = OEMBlogGlobal.uploadPreviewImageDirectory;
	}	
	if (null == path || filename == '') {
		return '';
	}
	if (optional_attr == null) {
		optional_attr = '';
	}
	if(width_tag == null){
		width_tag = '';
	}
	path = path + escape(filename);
	url = path;
	if (Tag.isFlashFile(filename)) {
		path = '<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'
			+ ' codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"'
			+ ' ' + optional_attr + '>'
			+ '<PARAM name=movie value="' + path + '">'
			+ '<PARAM name=quality value=high>'
			+ '<EMBED sr' + 'c="' + path + '" quality=high type="application/x-shockwave-flash"'
			+ ' pluginspage="http://www.macromedia.com/go/getflashplayer" ' + optional_attr +'></EMBED>'
			+ '</OBJECT>';
	} else if (Tag.isViewableFile(filename)) {
		path = '<img sr' + 'c="' + path + '" border="0" ' + optional_attr + '' + width_tag + '>';
	} else {
		path = '<table border="0" ' + optional_attr + '><tr><td align="center"><img sr' + 'c="' + path + '" border="0" ' + width_tag + '><br>' + filename + '</td></tr></table>';		
	}
	return path;
}

/**
 * 表示可能ファイル（画像）かどうかを得る。
 * 
 * @param fileName ファイル名
 */
Tag.viewableFileExtensions = [
  'jpg', 'jpeg', 
  'gif',
  'png',
  'bmp',
  'xbm',
  'swf'
];

Tag.isViewableFile = function(filename)
{
	var pos = filename.lastIndexOf(".");
	if (pos == -1 || pos == (filename.length -1)) {
		return false;
	}

	var extension = filename.substring(pos +1, filename.length).toLowerCase();
	var tests = Tag.viewableFileExtensions;
	for (var i = 0; i < tests.length; i++) {
	    if (extension == tests[i]) {
	        return true;
	    }
	}
	return false;
}
Tag.isFlashFile = function(filename)
{
	var extension;
	var pos = filename.lastIndexOf(".");
	if (pos == -1) {
		return false;
	}
	extension = filename.substring(pos, filename.length);
	return (extension=='.swf');
}

Tag.buildUploadImageTagFromText = function(tagText)
{
	var r;
	
	r = tagText.match(OEMBlogGlobal.IMAGE_FILE_PATTERN)
	if (null == r || 0 == r.length) {
		r = tagText.match(OEMBlogGlobal.IMAGE_FILE_PATTERN_OLD)
		if (null == r || 0 == r.length) {
			return null;
		}
		r[4] = '';
		r[5] = '';
	}
	
	//var fileName = r[r.length-1]
	var fileName = r[2];
	var option   = '';
	
	if (r.length == 6 && r[1] != null && r[1].length != 0) {
		option = (r[1] == '左:') ? 'align="left"' : 'align="right"';
	}
	

	//{左:img20060221.gif 幅:220px}は下のを得る
	//0: {左:img20060221.gif 幅:220px} 1: 左: 2: img20060221.gif 3: 横:220px 4: 220 5: px 

	var width_tag = null;
	if (r[4].length != 0 && r[5].length !=0){
		width_tag = ' width="' + r[4] + r[5] + '"';
	}

	return Tag.buildUploadImageTag(fileName, option, width_tag);
}
Tag.prototype.buildUploadImageTag = function()
{
	return Tag.buildUploadImageTagFromText(this.source);
}

