/**
 * ファイル選択ダイアログのカテゴリツリーを表すクラスです。
 * 
 * @namespace com.nec.jp.ngsf.wiki
 * @class SDWikiFileSelectTreeView
 * @extends com.nec.jp.ngsf.wiki.SDWikiCategory
 * @uses YAHOO.widget.TreeView
 * @param containerId {string} カテゴリツリーを作成するコンテナ（divエレメント）のID
 * @constructor
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelectTreeView = function(containerId, tabs) {
	if (containerId) {
		this.initialize(containerId, tabs);
	}
};
com.nec.jp.ngsf.wiki.SDWikiFileSelectTreeView.prototype =
	Object.extend(new com.nec.jp.ngsf.wiki.SDWikiCategoryTree, {
	
	/**
	 * コンテナIDのプレフィックス。
	 * @property containerIdPrefix
	 * @type string
	 * @default 'gleanfeed-wiki-fileselect-category'
	 */
	containerIdPrefix: 'gleanfeed-wiki-fileselect-category',
	
	/**
	 * 非同期読み込みフラグ。
	 * @property isDynamic
	 * @type boolean
	 */
	isDynamic: true,
	
	/**
	 * メニュー表示フラグ。
	 * @property menu
	 * @type boolean
	 */
	menu: false,
	
	/**
	 * 表示タブのリストを保持する配列。
	 * @property tabs
	 * @type string[]
	 * @default ['page']
	 */
	tabs: ['page'],
	
	/**
	 * 画面が閉じられた場合のコールバック処理
	 * @property closeCallback
	 * @type function
	 * @default null
	 */
	closeCallback: null,

	/**
	 * 選択されているコンテンツのエレメント
	 * @property _selectedContents
	 * @type Element
	 * @default null
	 */
	_selectedContents: null,

	/**
	 * カテゴリツリーを初期化します。<br />
	 * 各プロパティの設定を行い、_makeTreeメソッドを呼び出します。
	 * @method initialize
	 * @param containerId {string} カテゴリツリーを作成するコンテナ（divエレメント）のID
	 * @param tabs {string[]} 表示するタブのリスト
	 */
	initialize: function(containerId, tabs) {
		this.tabs = tabs;
		this.containerId = containerId;
		
		var containerElm = document.getElementById(this.containerId);
		
		// 表示中のカテゴリを設定
		if (document.getElementById('gleanfeed-wiki-category')) {
			this.dispCategory = document.getElementById('gleanfeed-wiki-category').value;
		}
		
		// ルートカテゴリを設定
		var rootCategoryElm = document.getElementsByClassName('rootCategory', containerElm);
		if (rootCategoryElm && rootCategoryElm[0]) {
			this.rootCategory = rootCategoryElm[0].value;
		}
		
		// 非同期読み込みフラグを設定
		var isDynamicElm = document.getElementsByClassName('isDynamic', containerElm);
		if (isDynamicElm && isDynamicElm[0]) {
			this.isDynamic = Boolean(eval(isDynamicElm[0].value));
		}
		
		// メニュー表示フラグを設定
		var menuElm = document.getElementsByClassName('menu', containerElm);
		if (menuElm && menuElm[0]) {
			this.menu = Boolean(eval(menuElm[0].value));
		}
		
		// ツリーデータを設定
		var treeDataElm = document.getElementsByClassName('treeData', containerElm);
		if (treeDataElm && treeDataElm[0]) {
			this.treeData = eval(treeDataElm[0].value);
		}
		
		// ルートカテゴリのイベントをセット
		var topElm = document.getElementsByClassName(this.containerIdPrefix + '-top', containerElm);
		if (topElm && topElm[0]) {
			var anchorElm =	topElm[0].getElementsByTagName('a');
			if (anchorElm && anchorElm[0]) {
				var href = 'javascript:WikiEditPageController.getFileListForm(\'/\', [';
				for (var j = 0; j < this.tabs.length; j++) {
					href = href + '\'' + this.tabs[j] + '\',';
				} 
				href = href + '], com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectCategoryCallback);';
				
				anchorElm[0].href = href;
			}
		}

		// ツリーの作成
		this._makeTree();
	},
	
	/**
	 * カテゴリツリーの選択されているカテゴリーをハイライトします。
	 * @method hilightNode
	 * @param categoryTitle {string} 選択されたカテゴリのタイトル
	 */
	hilightNode: function(categoryTitle) {
		var treeElm = this.tree.getEl();
		
		// 選択されていたノードのスタイルを初期化
		var selectedNodeElms =
			document.getElementsByClassName('gleanfeed-wiki-plugin-category-ygtvline-selected', treeElm);
		if (selectedNodeElms && selectedNodeElms[0]) {
			selectedNodeElms[0].className = 'gleanfeed-wiki-plugin-category-ygtvline';
		}
		var containerElm = document.getElementById(this.containerId);
		var topElms = document.getElementsByClassName(this.containerIdPrefix + '-top-selected', containerElm);
		if (topElms && topElms[0]) {
			topElms[0].className = this.containerIdPrefix + '-top';
		}
		
		// 選択したノードのスタイルを変更
		if (categoryTitle == '/') {
			// ルート
			var topElms = document.getElementsByClassName(this.containerIdPrefix + '-top', containerElm);
			if (topElms && topElms[0]) {
				topElms[0].className = this.containerIdPrefix + '-top-selected';
			}
		} else {
			// ルート以外
			var nodes = this.tree._nodes;
			if (nodes) {
				for (var i = 0; i < nodes.length; i++) {
					if (nodes[i] && (nodes[i] != null) && (nodes[i].fullName == categoryTitle)) {
						var nodeElm = nodes[i].getEl();
						var tableElms =
							document.getElementsByClassName('gleanfeed-wiki-plugin-category-ygtvline', nodeElm);
						tableElms[0].className =
							'gleanfeed-wiki-plugin-category-ygtvline-selected';
						break;
					}
				}
			}
		}
	},
	
	/**
	 * ツリーにノードを追加します。
	 * @method _appendNode
	 * @param nodeData {string[]} ノードを作成するための配列データ
	 * @param parentNode {Node} 親ノードオブジェクト
	 * @private
	 */
	_appendNode: function(nodeData, parentNode) {
		if (nodeData != undefined && nodeData.length > 0) {
			var ln = nodeData.length;
			for (var i = 0; i < ln; i++) {
				if (nodeData[i] != undefined) {
					// ノードの作成
					var cNode = new YAHOO.widget.TextNode(nodeData[i][1], parentNode, false);
					cNode.href = 'javascript:WikiEditPageController.getFileListForm(com.nec.jp.ngsf.wiki.escapeForJSArg(\'' +
							nodeData[i][2] + '\'), [';
					for (var j = 0; j < this.tabs.length; j++) {
						cNode.href = cNode.href + '\'' + this.tabs[j] + '\',';
					} 
					cNode.href = cNode.href + '], com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectCategoryCallback);';
					cNode.fullName = nodeData[i][2];
					cNode._appendNode = this._appendNode; // ノード追加処理を設定 (TODO 継承とかしたい)
					cNode.tabs = this.tabs;
					
					// トグルアイコンの表示制御
					if (nodeData[i][0] == 'leaf') {
						cNode.isLeaf = true;
					}
					
					// 表示中のカテゴリによってツリーを開く
					if ((nodeData[i][0] == 'node') && (nodeData[i][4] != undefined)) {
						cNode.expand();
					}
					
					// 表示中のカテゴリをハイライト
					if (cNode.fullName == this.dispCategory) {
						cNode.selected = true;
					}

					// サブカテゴリを再帰的に作成
					if ((nodeData[i][4] != undefined) && (nodeData[i][4].length > 0)){
						this._appendNode(nodeData[i][4], cNode);
						cNode.dynamicLoadComplete = true;
					}
				}
			}
		}
	}

});

/**
 * ファイル選択ダイアログを表すクラスです。
 * 
 * @namespace com.nec.jp.ngsf.wiki
 * @class SDWikiFileSelect
 * @constructor
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect = function() {
};
com.nec.jp.ngsf.wiki.SDWikiFileSelect.prototype = {
};

/**
 * ファイル選択ダイアログのカテゴリツリーを保持します。
 * @property com.nec.jp.ngsf.wiki.SDWikiFileSelect.treeView
 * @type com.nec.jp.ngsf.wiki.SDWikiFileSelect
 * @default null
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.treeView = null;

/**
 * ファイル選択ダイアログで選択されたファイルのタイトルを保持します。<br />
 * ファイル選択ダイアログを表示する際に初期化され、ファイルを選択すると値が設定されます。<br />
 * ファイル選択ダイアログを呼び出した処理中で、ダイアログを閉じた後にこのプロパティを参照し、
 * ファイル選択以降の処理を行います。
 * @property com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileTitle
 * @type string
 * @default null
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileTitle = null;

/**
 * ファイル選択ダイアログで選択されたファイルの種類を保持します。
 * @property com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileType
 * @type string
 * @default null
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileType = null;

/**
 * ファイル選択ダイアログで選択されたファイルのファイル名を保持します。
 * @property com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileName
 * @type string
 * @default null
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileName = null;

/**
 * ファイル選択ダイアログで選択されたファイルの親カテゴリを保持します。
 * @property com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedCategoryName
 * @type string
 * @default null
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedCategoryName = null;

/**
 * ファイル選択ダイアログで入力されたタイトルを保持します。
 * @property com.nec.jp.ngsf.wiki.SDWikiFileSelect.inputTitle
 * @type string
 * @default null
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.inputTitle = null;

/**
 * ファイル選択ダイアログで入力されたURLを保持します。
 * @property com.nec.jp.ngsf.wiki.SDWikiFileSelect.inputURL
 * @type string
 * @default null
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.inputURL = null;

/**
 * ダイアログを閉じる際、「解除」ボタンで閉じられたかどうかを保持します。<br />
 * 「解除」ボタンで閉じられた場合はtrueが格納されます。
 * @property com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectDelete
 * @type boolean
 * @default false
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectDelete = false;

/**
 * アップロード領域を表示する直前に表示されていたコンテンツ一覧領域のID。
 * アップロード領域を非表示にする際に表示を戻すために利用します。
 * @property com.nec.jp.ngsf.wiki.SDWikiFileSelect._hiddenContentsListAreaId
 * @type string
 * @default null
 * @static
 * @private
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect._hiddenContentsListAreaId = null;

/**
 * 初期表示時に表示されるタブの名前。
 * @property com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialSelectTabName
 * @type string
 * @default null
 * @static
 * @private
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialSelectTabName = null;

/**
 * 初期表示時に設定される値。
 * @property com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialValues
 * @type map
 * @default null
 * @static
 * @private
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialValues = null;

/**
 * 選択中のコンテンツのエレメントを保持しておくための連想配列。
 * @property com.nec.jp.ngsf.wiki.SDWikiFileSelect._selectedContentElm
 * @type map
 * @default {}
 * @static
 * @private
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect._selectedContentElm = {};

/**
 * com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileTypeに設定される値「ページ」
 * @property com.nec.jp.ngsf.wiki.SDWikiFileSelect.FILETYPE_PAGE
 * @type string
 * @static
 * @constant
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.FILETYPE_PAGE = "page";

/**
 * com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileTypeに設定される値「テンプレート」
 * @property com.nec.jp.ngsf.wiki.SDWikiFileSelect.FILETYPE_TEMPLATE
 * @type string
 * @static
 * @constant
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.FILETYPE_TEMPLATE = "template";

/**
 * com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileTypeに設定される値「画像」
 * @property com.nec.jp.ngsf.wiki.SDWikiFileSelect.FILETYPE_IMAGE
 * @type string
 * @static
 * @constant
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.FILETYPE_IMAGE = "image";

/**
 * com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileTypeに設定される値「アップロードファイル」
 * @property com.nec.jp.ngsf.wiki.SDWikiFileSelect.FILETYPE_UPLOADFILE
 * @type string
 * @static
 * @constant
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.FILETYPE_UPLOADFILE = "uploadfile";

/**
 * アップロード領域のID
 * @property com.nec.jp.ngsf.wiki.SDWikiFileSelect.ID_UPLOAD_AREA
 * @type string
 * @static
 * @constant
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.ID_UPLOAD_AREA = "gleanfeed-wiki-fileselect-upload";

/**
 * ファイル選択ダイアログを表示します。<br />
 * categoryName、tabList、closeCallbackパラメータは必須です。
 * 
 * @method com.nec.jp.ngsf.wiki.SDWikiFileSelect.open
 * @param categoryName {string} 初期表示するカテゴリ。
 * @param tabList {string[]} 表示するタブのリスト。'page'、'uploadfile'、'template'、'image'、'url'を配列で指定。
 * @param closeCallback {function} ウィンドウを閉じた際に実行されるコールバック関数オブジェクト。
 * @param initialSelectTabName {string} 初期表示するタブの名前。'page'、'uploadfile'、'template'、'image'、'url'を指定。
 * @param initialValues {map} 初期選択（入力）されている値を保持する連想配列。（省略可）
 * <table>
 * <tr><th>キー</th><th>説明</th></tr>
 * <tr><td>title</td><td>初期入力されているタイトル。</td></tr>
 * <tr><td>page</td><td>初期選択されているページ名。</td></tr>
 * <tr><td>uploadfile</td><td>初期選択されているアップロードファイル名。</td></tr>
 * <tr><td>template</td><td>初期選択されているテンプレート名。</td></tr>
 * <tr><td>image</td><td>初期選択されている画像ファイル名。</td></tr>
 * <tr><td>url</td><td>初期入力されているURL。</td></tr>
 * </table>
 * @param windowTitle {string} ウィンドウのタイトル。メッセージリソースのキーを指定します。省略時、またはnull指定時は「ファイルの選択」。（省略可）
 * @param showTitleInput {boolean} タイトル入力欄を表示するかどうか。省略時、またはnull指定時は非表示。（省略可）
 * @param showDeleteButton {boolean} 「解除」ボタンを表示するかどうか。省略時は非表示。
 * @param deleteButtonLabel {string} 「解除」ボタンのラベルを変更したい場合、メッセージリソースのキーを指定。（省略可）
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.open = function(categoryName, tabs, closeCallback, initialSelectTabName, initialValues, windowTitle, showTitleInput, showDeleteButton, deleteButtonLabel) {
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileTitle = null;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileType = null;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileName = null;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedCategoryName = null;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.inputTitle = null;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.inputURL = null;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectDelete = false;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect._selectedContentElm = {};
	com.nec.jp.ngsf.wiki.SDWikiFileSelect._hiddenContentsListAreaId = null;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialSelectTabName = null;

	// ウィンドウタイトルのデフォルト設定
	if (!windowTitle) {
		windowTitle = null;
	}

	// タイトル入力欄表示フラグのデフォルト設定
	if (!showTitleInput) {
		showTitleInput = false;
	}
	
	// 初期選択タブの指定
	if (initialSelectTabName) {
		com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialSelectTabName = initialSelectTabName;
	}
	
	// 初期値の設定
	if (initialValues) {
		com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialValues = initialValues;
	}
	
	// 「解除」ボタン
	if (!showDeleteButton) {
		showDeleteButton = false;
	}
	if (!deleteButtonLabel) {
		deleteButtonLabel = null;
	}

	try {
		WikiEditPageController.getFileSelectForm(categoryName, tabs, windowTitle, showTitleInput, showDeleteButton, deleteButtonLabel, function(oResponse) {
				if (oResponse != undefined && oResponse.length > 0) {
					// ポップアップウィンドウを表示する
					popupWindow.open(oResponse, "popup", "gleanfeed-wiki-popup-title", 300, 150, true, closeCallback);
					
					// ポップアップウィンドウのカテゴリツリー領域を初期化する
					if (document.getElementById('gleanfeed-wiki-fileselect-category') != undefined) {
						com.nec.jp.ngsf.wiki.SDWikiFileSelect.treeView =
							new com.nec.jp.ngsf.wiki.SDWikiFileSelectTreeView('gleanfeed-wiki-fileselect-category', tabs);
						com.nec.jp.ngsf.wiki.SDWikiFileSelect.treeView.draw();
					}
					
					// ページ/テンプレートのリストを表示する。
					WikiEditPageController.getFileListForm(
						com.nec.jp.ngsf.wiki.escapeForJSArg(categoryName),
						tabs,
						com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectGetPageListCallback);
				}
				com.nec.jp.ngsf.wiki.close_popup(); // TODO;may be bug, should call here to close existing popup.
			});
	} catch (e) {
		window.alert(e.description);
	}
};

/**
 * カテゴリが選択された際のページ・テンプレート表示処理。
 * @method com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectGetPageListCallback
 * @param oResponse {string[]} 非同期処理のレスポンス。要素0にHTML断片が格納されている。
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectCategoryCallback = function(oResponse) {
	// 一度選択状態を全て解除する
	com.nec.jp.ngsf.wiki.SDWikiFileSelect._selectedContentElm = {};
	$('gleanfeed-wiki-fileselect-ok').disabled = true;
	
	// ファイル一覧の表示
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectGetPageListCallback(oResponse);
};

/**
 * コンテンツ一覧を表示する処理。
 * @method com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectGetPageListCallback
 * @param oResponse {string[]} 非同期処理のレスポンス。要素0にHTML断片が格納されている。
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectGetPageListCallback = function(oResponse) {
	// レスポンスからコンテンツ領域のHTML断片を設定
	if (oResponse && oResponse[0]) {
		document.getElementById('gleanfeed-wiki-popup-form-contentslist').innerHTML = oResponse[0];
	}

	// 表示中のカテゴリを選択
	if ((com.nec.jp.ngsf.wiki.SDWikiFileSelect.treeView != null) && oResponse[1]) {
		com.nec.jp.ngsf.wiki.SDWikiFileSelect.treeView.hilightNode(oResponse[1]);
	}

	// カテゴリ名を格納
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedCategoryName = oResponse[1];
	
	// タブを切り替える
	if (com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialSelectTabName != null) {
		// 初期選択指定がある場合はそのタブを選択
		var tabNameMap = {
			page: 'fileselect-pages',
			uploadfile: 'fileselect-uploadfiles',
			template: 'fileselect-temps',
			image: 'fileselect-images',
			url: 'fileselect-url'
		};
		com.nec.jp.ngsf.wiki.SDWikiFileSelect.changeTab(tabNameMap[com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialSelectTabName]);
		com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialSelectTabName = null;
	} else {
		var selectedTab = com.nec.jp.ngsf.wiki.SDWikiFileSelect.getSelectedTabName();
		com.nec.jp.ngsf.wiki.SDWikiFileSelect.changeTab(selectedTab);
	}
	
	// 初期値設定
	if (com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialValues) {
		// タイトル
		if ($('gleanfeed-wiki-fileselect-link-title') && com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialValues['title']) {
			$('gleanfeed-wiki-fileselect-link-title').value = com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialValues['title'];
		}
		// ページ名
		if ($('gleanfeed-wiki-fileselect-pages') && com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialValues['page']) {
			var elms = $('gleanfeed-wiki-fileselect-pages').getElementsByTagName('a');
			var pageName = com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialValues['page'];
			for (var i = 0; i < elms.length; i++) {
				var elmTitle = '';
				if (document.all) {
					elmTitle = elms[i].innerText;
				} else {
					elmTitle = elms[i].textContent;
				}
				if (elmTitle == pageName) {
					if (document.all) {
						elms[i].click();
					} else {
						com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectFile(com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileTitle,
																					com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileType,
																					elms[i]);
					}
					try {
						elms[i].focus();
					} catch(e) {}
					break;
				}
			}
		}
		// ファイル名
		if ($('gleanfeed-wiki-fileselect-uploadfiles') && com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialValues['file']) {
			var elms = $('gleanfeed-wiki-fileselect-uploadfiles').getElementsByTagName('a');
			var fileName = com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialValues['file'];
			for (var i = 0; i < elms.length; i++) {
				var elmTitle = '';
				if (document.all) {
					elmTitle = elms[i].innerText;
				} else {
					elmTitle = elms[i].textContent;
				}
				if (elmTitle == fileName) {
					if (document.all) {
						elms[i].click();
					} else {
						com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectFile(com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileTitle,
																					com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileType,
																					elms[i]);
					}
					try {
						elms[i].focus();
					} catch(e) {}
					break;
				}
			}
		}
		// URL
		if ($('gleanfeed-wiki-fileselect-link-url') && com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialValues['url']) {
			$('gleanfeed-wiki-fileselect-link-url').value = com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialValues['url'];
			$('gleanfeed-wiki-fileselect-ok').disabled = false;
		}
		
		com.nec.jp.ngsf.wiki.SDWikiFileSelect._initialValues = null;
	}
};

/**
 * 選択されているタブの名前を取得します。
 * 未選択状態の場合は最もはじめに出現するタブを選択します。
 * @method com.nec.jp.ngsf.wiki.SDWikiFileSelect.getSelectedTabName
 * @return 選択されているタブの名前。
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.getSelectedTabName = function() {
	// タブの状態を見る
	var tabList = ['gleanfeed-wiki-tabs-fileselect-pages', 'gleanfeed-wiki-tabs-fileselect-temps',
						 'gleanfeed-wiki-tabs-fileselect-uploadfiles', 'gleanfeed-wiki-tabs-fileselect-images',
						 'gleanfeed-wiki-tabs-fileselect-url'];
	
	var selectedTab = 'fileselect-pages';
	for (var i = tabList.length - 1; i >= 0; i--) {
		var obj = $(tabList[i]);
		if (obj && obj.style.display != 'none') {
			var arr = obj.id.split('-');
			selectedTab = arr[arr.length-2] + '-' + arr[arr.length-1];
			
			// 選択されているタブが見つかった場合はそのタブで確定
			if (obj.className == 'cur') {
				break;
			}
		}
	}
	
	return selectedTab;
};

/**
 * タブを切り替えます。
 * @method com.nec.jp.ngsf.wiki.SDWikiFileSelect.changeTab
 * @param name {string} 表示するタブのタブ名。
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.changeTab = function(name){
	// 領域の表示を変更
	var names = new Array("fileselect-pages", "fileselect-temps", "fileselect-images", "fileselect-uploadfiles", "fileselect-url");
	var categoryElm = $('gleanfeed-wiki-popup-form-categorylist');
	var contentsElm = $('gleanfeed-wiki-popup-form-contentslist');
	var uploadElm = $('gleanfeed-wiki-fileselect-upload');
	if (categoryElm) {
		if (name == 'fileselect-url') {
			categoryElm.style.display = "none";
			contentsElm.style.width = "100%";
			uploadElm.style.display = "none";
		} else if (name == 'fileselect-images' || name == 'fileselect-uploadfiles') {
			categoryElm.style.display = "block";
			contentsElm.style.width = "60%";
		} else {
			categoryElm.style.display = "block";
			contentsElm.style.width = "60%";
			uploadElm.style.display = "none";
		}
	}

	// タブの表示を変更
	for(i = 0; i < names.length; i++){
		var objtab = document.getElementById("gleanfeed-wiki-tabs-" + names[i]);
		var objbox = document.getElementById("gleanfeed-wiki-" + names[i]);
		if(names[i] == name){
			if (objtab) {
				objtab.className = "cur";
			}
			if (objbox) {
				objbox.style.display = "block";
			}
		}else{
			if (objtab) {
				objtab.className = "";
			}
			if (objbox) {
				objbox.style.display = "none";
			}
		}
	}
	
	// 「OK」ボタンの制御等
	switch (name) {
	case 'fileselect-pages':
	case 'fileselect-temps':
	case 'fileselect-images':
	case 'fileselect-uploadfiles':
		if (com.nec.jp.ngsf.wiki.SDWikiFileSelect._selectedContentElm[name] != null) {
			$('gleanfeed-wiki-fileselect-ok').disabled = false;
		} else {
			$('gleanfeed-wiki-fileselect-ok').disabled = true;
		}
		break;
	case 'fileselect-url':	// 「URL」タブ
		// リンク先URLが未入力の場合は「OK」ボタンを無効にする
		if ($('gleanfeed-wiki-fileselect-link-url').value != '') {
			$('gleanfeed-wiki-fileselect-ok').disabled = false;
		} else {
			$('gleanfeed-wiki-fileselect-ok').disabled = true;
		}
		break;
	}
}

/**
 * 選択されているコンテンツをハイライトします。
 * @method hilightNodeContents
 * @param elm {Element} 選択されたコンテンツのエレメント
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.hilightNodeContents = function(elm) {
	// 選択されているタブ名を取得
	var selectedTabName = com.nec.jp.ngsf.wiki.SDWikiFileSelect.getSelectedTabName();
	
	// 選択されていたノードのスタイルを初期化
	var selectedContentElm = com.nec.jp.ngsf.wiki.SDWikiFileSelect._selectedContentElm[selectedTabName];
	if (selectedContentElm != null) {
		selectedContentElm.style.backgroundColor = '';
		com.nec.jp.ngsf.wiki.SDWikiFileSelect._selectedContentElm[selectedTabName] = null;
	}

	// 選択したノードのスタイルを変更
	if (elm && elm.parentNode) {
		elm.parentNode.style.backgroundColor = '#e6f7e0';
		com.nec.jp.ngsf.wiki.SDWikiFileSelect._selectedContentElm[selectedTabName] = elm.parentNode;
	}
}

/**
 * 選択された引用先ページ名、ファイルのタイプを設定します。
 * @method com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectFile
 * @param fileTitle {string}
 * @param fileType {string}
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectFile = function(fileTitle, fileType, elm) {
	// 選択されたファイルの情報をstaticプロパティに保持
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileTitle = fileTitle;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileType = fileType;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileName = elm.innerHTML;

	com.nec.jp.ngsf.wiki.SDWikiFileSelect.hilightNodeContents(elm);
	
	// タイトルを保持
	var titleObj = $('gleanfeed-wiki-fileselect-link-title');
	if (titleObj) {
		com.nec.jp.ngsf.wiki.SDWikiFileSelect.inputTitle = titleObj.value;
	} else {
		com.nec.jp.ngsf.wiki.SDWikiFileSelect.inputTitle = '';
	}
	
	$('gleanfeed-wiki-fileselect-ok').disabled = false;
};

/**
 * URL入力欄の入力時のイベント処理です。
 * 「OK」ボタンの制御を行います。
 * @method com.nec.jp.ngsf.wiki.SDWikiFileSelect.onkeyupUrlInput
 * @param inputElm {Element} URL入力欄のエレメント。
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.onkeyupUrlInput = function(inputElm) {
	if (inputElm && inputElm.value != '') {
		$('gleanfeed-wiki-fileselect-ok').disabled = false;
	} else {
		$('gleanfeed-wiki-fileselect-ok').disabled = true;
	}
}

/**
 * 「OK」ボタンがクリックされてダイアログを閉じるときの処理を行います。
 * （closeCallbackに指定した処理の直前に実行されます）
 * 選択したコンテンツ、入力したURLをグローバル変数に格納し、popupWindow.close()を呼び出します。
 * @method com.nec.jp.ngsf.wiki.SDWikiFileSelect.finish
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.finish = function() {
	// 選択中のタブ名を取得
	var selectedTabName = com.nec.jp.ngsf.wiki.SDWikiFileSelect.getSelectedTabName();
	
	// タイトルを保持
	var titleObj = $('gleanfeed-wiki-fileselect-link-title');
	if (titleObj) {
		com.nec.jp.ngsf.wiki.SDWikiFileSelect.inputTitle = titleObj.value;
	} else {
		com.nec.jp.ngsf.wiki.SDWikiFileSelect.inputTitle = '';
	}
	
	if (selectedTabName != 'fileselect-url') {
		com.nec.jp.ngsf.wiki.SDWikiFileSelect.inputURL = '';
	} else {
		// URLを保持
		var urlObj = $('gleanfeed-wiki-fileselect-link-url');
		if (urlObj) {
			com.nec.jp.ngsf.wiki.SDWikiFileSelect.inputURL = urlObj.value;
		} else {
			com.nec.jp.ngsf.wiki.SDWikiFileSelect.inputURL = '';
		}
		// 他プロパティを初期化
		com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileTitle = '';
		com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileType = '';
		com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileName = '';
	}
	
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectDelete = false;
	
	popupWindow.close(0);
}

/**
 * 「キャンセル」ボタンがクリックされてダイアログを閉じる処理を実行します。
 * 全てのグローバル変数の値が初期化され、popupWindow.close()が呼ばれます。
 * @method com.nec.jp.ngsf.wiki.SDWikiFileSelect.cancel
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.cancel = function() {
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileTitle = null;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileType = null;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileName = null;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedCategoryName = null;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.inputTitle = null;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.inputURL = null;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectDelete = false;
	
	popupWindow.close(0);
}

/**
 * 「解除」ボタンがクリックされてダイアログを閉じる処理を実行します。
 * 全てのグローバル変数の値が初期化され、popupWindow.close()が呼ばれます。
 * @method com.nec.jp.ngsf.wiki.SDWikiFileSelect.onclickDelete
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.onclickDelete = function() {
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileTitle = null;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileType = null;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileName = null;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedCategoryName = null;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.inputTitle = null;
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.inputURL = null;
	
	// 「解除」ボタン
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectDelete = true;
	
	popupWindow.close(0);
}

//
// 「ローカルファイル」タブ画面のスクリプト
//

/**
 * 「ローカルファイル」タブからサブミットされたときに true が設定される。
 * @property com.nec.jp.ngsf.wiki.SDWikiFileSelect.uploadFlg
 * @type string
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.uploadFlg = false;

/**
 * 「ローカルファイル」タブでのインジケータ画像ID。
 * @type string
 */
var fileSelectIndicatorId = null;

/**
 * 親カテゴリ名を画面に設定します。<br />
 * 「アップロードして挿入」ボタン押下時に走ります。
 * @method com.nec.jp.ngsf.wiki.SDWikiFileSelect.upload
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.upload = function() {
	// 選択中のタブ名を取得
	var selectedTabName = com.nec.jp.ngsf.wiki.SDWikiFileSelect.getSelectedTabName();
	
	switch (selectedTabName) {
	case 'fileselect-images':	//「画像」タブ
		// アップロードしようとしているファイルのファイル名を取得
		var fileName = $('gleanfeed-wiki-upload-file-file').value;
		var extension = '';
		if (fileName.lastIndexOf('.') > 0) {
			extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
		}
		
		var imageExtensions = $('gleanfeed-wiki-fileselect-upload-image-extensions').value;
		imageExtensions = imageExtensions.split(':');
		var isImage = false;
		for (var i = 0; i < imageExtensions.length; i++) {
			if (extension == imageExtensions[i].toLowerCase()) {
				isImage = true;
				break;
			}
		}
		
		// 画像の場合に拡張子をチェック
		if (!isImage) {
			alert('このファイルは画像ファイルではないため、アップロードできません。');
			return false;
		}
		break;
	}

	// インジケータ画像を表示
	fileSelectIndicatorId = setTimeout(function(){indicator.start()}, indicator.interval);

	document.getElementById('gleanfeed-wiki-upload-file-parent-name').value
		= com.nec.jp.ngsf.wiki.escapeForJSArg(com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedCategoryName);
	com.nec.jp.ngsf.wiki.SDWikiFileSelect.uploadFlg = true;
	
	return true;
};

/**
 * アップロード処理が終わった直後に画面に結果を反映します。
 * @method com.nec.jp.ngsf.wiki.SDWikiFileSelect.uploadFinish
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.uploadFinish = function() {
	// インジケータ画像を非表示にする。
	if (fileSelectIndicatorId != null) {
		indicator.stop();
		clearTimeout(fileSelectIndicatorId);
	}

	// 「アップロード」ボタン押下の場合
	if (com.nec.jp.ngsf.wiki.SDWikiFileSelect.uploadFlg) {
		com.nec.jp.ngsf.wiki.SDWikiFileSelect.uploadFlg = false;

		// アップロード結果を判定
		// エラーの場合はアラートを表示します。
		var idoc = document.getElementById('dummyFrame').contentWindow.document;

		// エラーメッセージ
		var msgTitle = idoc.getElementById('gleanfeed-wiki-fileselect-localfile-msg-title');
		var msg = idoc.getElementById('gleanfeed-wiki-fileselect-localfile-msg');

		if (msgTitle && msg) {
			// エラー表示
			if (document.all) {
				msgTitle = msgTitle.innerText;
				msg = msg.innerText;
			} else {
				msgTitle = msgTitle.textContent;
				msg = msg.textContent;
			}
			alert(msgTitle + ' : ' + msg);
		} else {
			// 正常終了
			com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileTitle =
				idoc.getElementById('gleanfeed-wiki-fileselect-localfile-encoded-title').innerHTML;
			com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileType =
				com.nec.jp.ngsf.wiki.SDWikiFileSelect.FILETYPE_UPLOADFILE;
			com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileName =
				idoc.getElementById('gleanfeed-wiki-fileselect-localfile-name').innerHTML;

			var name = com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileName;
			
			var extension;
			
			if (name.lastIndexOf('.') != -1) {
				extension = name.substring(name.lastIndexOf('.') + 1);
			} else {
				extension = '';
			}
			
			var contentsUL = $('gleanfeed-wiki-fileselect-uploadfiles-contents');
			var sep = 'uploadfiles';
			if (!contentsUL) {
				// 画像
				contentsUL = $('gleanfeed-wiki-fileselect-images-contents');
				sep = 'images';
			}
			
			if (document.all) {
				contentsUL = contentsUL.firstChild;
			} else {
				for (var i = 0; i < contentsUL.childNodes.length; i++) {
					var tName = contentsUL.childNodes[i].tagName;
					if (tName && tName.toLowerCase() == 'ul') {
						contentsUL = contentsUL.childNodes[i];
					}
				}
			}
			
			////////同名ファイルを削除
			for (var i = 0; i < contentsUL.childNodes.length; i++) {
				var li = contentsUL.childNodes[i];
				// 同名チェック
				var liTitle = '';
				if (document.all) {
					liTitle = li.innerText;
				} else {
					liTitle = li.textContent;
				}
				if (liTitle == com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileName) {
					contentsUL.removeChild(li);
				}
			}
			////////同名ファイルを削除終了
			
			// コンテンツ一覧にアップロードしたファイルを追加
			var liElement = document.createElement('li');
			liElement.className = 'gleanfeed-wiki-fileselect-' + sep + '-' + extension;
			
			var aElement = document.createElement('a');
			aElement.className = 'gleanfeed-wiki-link';
			aElement.href = 'javascript:void(0);';
			
			var onClickFunc = function() {
				com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectFile(com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileTitle,
																			com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileType,
																			aElement);
				return false;
			};
			
			Event.observe(aElement, 'click', onClickFunc);
			aElement.innerHTML =  com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileName;
			
			liElement.appendChild(aElement);
			
			if (contentsUL && contentsUL.firstChild) {
				contentsUL.insertBefore(liElement, contentsUL.firstChild);
			} else {
				contentsUL.appendChild(liElement);
			}
			
			if (document.all) {
				aElement.click();
			} else {
				com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectFile(com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileTitle,
																			com.nec.jp.ngsf.wiki.SDWikiFileSelect.selectedFileType,
																			aElement);
			}
			
			// アップロードコントロールの値を初期化
			$('gleanfeed-wiki-upload-file-name').value = '';
			
			// アップロード領域を隠す
			com.nec.jp.ngsf.wiki.SDWikiFileSelect.hideUpload();


			// Firefoxで処理中の砂時計が表示されてしまうため、setTimeoutを使用します。
//			setTimeout(function(){document.getElementById('fileSelect_cancel').click();},0);
		}
	}
};

/**
 * アップロード用領域を表示します。
 * @method com.nec.jp.ngsf.wiki.SDWikiFileSelect.showUpload
 * @param contentsListAreaId {string} 非表示にするコンテンツ一覧領域のID。
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.showUpload = function(contentsListAreaId) {
	$(contentsListAreaId).style.display = "none";
	$(com.nec.jp.ngsf.wiki.SDWikiFileSelect.ID_UPLOAD_AREA).style.display = "block";
	
	com.nec.jp.ngsf.wiki.SDWikiFileSelect._hiddenContentsListAreaId = contentsListAreaId;
};

/**
 * アップロード用領域を非表示にします。
 * @method com.nec.jp.ngsf.wiki.SDWikiFileSelect.hideUpload
 * @static
 */
com.nec.jp.ngsf.wiki.SDWikiFileSelect.hideUpload = function() {
	$(com.nec.jp.ngsf.wiki.SDWikiFileSelect._hiddenContentsListAreaId).style.display = "block";
	$(com.nec.jp.ngsf.wiki.SDWikiFileSelect.ID_UPLOAD_AREA).style.display = "none";
	
	com.nec.jp.ngsf.wiki.SDWikiFileSelect._hiddenContentsListAreaId = null;
};
