/*

		Website Options (WO)
		3.3.5.20060213
		Written by TYLIGHT
		
		この JavaScript は修正 BSD ライセンスで配布します。

*/

/**
* 無条件で真を返す。
* JavaScript エラーダイアログの無効化の為に使用する。
*/
function returnTrue(){
	return true;
}

/**
* 無条件で偽を返す。
* href 属性がある a 要素に対する
* onclick などのイベントハンドラの登録の際
* href 属性指定が余計に反応する事を防ぐ為に使用する。
*/
function returnFalse(){
	return false;
}

/*
* JavaScript エラーダイアログを無効化するはず。
* 開発時はコメントアウトすること。
*/
window.onerror = returnTrue;

/**
* 最上位に位置するオブジェクト。スクリプト名の頭文字が名前。
*/
var WO = {
	
	
	
	
	
	
	/*------------------------------------------------*/
	/*----------------- 設定ここから -----------------*/
	/*------------------------------------------------*/
	Config : {
		HTML : {
			// WinIE に abbr 要素を対応させるなら true, 放っておくなら false
			useFixAbbr : true
		},
		Window : {
			// ステータスバーを弄るなら true, 弄らないなら false
			enable : true
		},
		Frame : {
			// ページがフレーム内だった時に警告するなら true, しないなら false
			// フレームを使っている場合は必ず false にして下さい。
			enable : true,
			
			// サイトのトップディレクトリの URL（ファイル名を含めない）。 (文字列)
			// 空でもよいですが、そうすると WinIE では object 要素での取り込みに警告できません
			// 例: "http://example.com/oreore/"
			address : ""
		},
		Form : {
			// フォームの送信またはリセットの際に確認を取るなら true, 取らないなら false
			enable : true
		},
		Cookie : {
			// クッキーが有効なドメイン名を指定します。空だとURLから自動的に取得します (文字列)
			// 例: "example.com"
			domain : "",
			
			// "/" から始まるクッキーが有効なパスを指定します。空だとURLから自動的に取得します (文字列)
			// 例: "/oreore/"
			path : "/"
		},
		Link : {
			// 自ページへのリンクを排除するなら true, しないなら false
			enable : true,
			
			// 上の設定が true の時、自ページを指すリンクに付け加えるクラス名 (文字列)
			activeClassName : "active"
		},
		LinkSwitcher : {
			// 外部リンクの制御をするなら true, しないなら false
			enable : true,
			
			// 内部だと判断する URL。空だと URL から自動的にドメイン部を取得します (文字列)
			// 例: "http://example.com/oreore/"
			internalURL : "",
			
			// どの ID を持つ要素にセレクトボックスを配置するか (文字列)
			// 空だと、次の要素名の設定を使って配置します。
			targetElementID : "",
			
			// どの要素にリンクスイッチを配置するか (文字列)
			// 上の設定で ID を指定した場合は無視されます
			targetElementName : "body",
			
			// その要素の何番目に配置するのか。0 ではなく 1 から数えます。(数値)
			// 上の設定で ID を指定した場合は無視されます
			targetElementIndex : 1,
			
			// チェックボックスの直後に挿入する文字列 (文字列)
			text : "外部リンクは別の作業領域で開く",
			
			// 上で設定した要素の前に挿入するなら true, 後ろに追加するなら false
			isBefore : false,
			
			// 上で指定した要素の外に追加するなら true
			// 要素の中に追加するなら false
			// body 要素や html 要素を挿入対象にする場合は false にしてください。
			isOut : false,
			
			// リンク先オープン設定の保持日数(一度でも再来訪すればまた数え直します) (数値)
			// 0 を指定するとブラウザ終了まで有効。
			expdays : 30
		},
		StyleSheet : {
			// CSS 切り替え機能を使うなら true, 使わないなら false
			enable : true,
			
			// XHTML & Opera の組み合わせでもスタイル切り替え機能を使うなら true, 使わないなら false
			affectOpera : false,
			
			// どの ID を持つ要素にセレクトボックスを配置するか (文字列)
			// 空だと、次の要素名の設定を使って配置します
			targetElementID : "",
			
			// どの要素にセレクトボックスを配置するか (文字列)
			// 上の設定で ID を指定した場合は無視されます
			targetElementName : "body",
			
			// その要素の何番目に挿入するか。0 ではなく 1 から数えます。(数値)
			// 上の設定で ID を指定した場合は無視されます
			targetElementIndex : 1,
			
			// 選択リストの直前に挿入する文字列。空でもいい (文字列)
			text : "テーマ ",
			
			// 上で設定した要素の前に挿入するなら true, 後ろに追加するなら false
			isBefore : false,
			
			// 上で指定した要素の外に追加するなら true
			// 要素の中に追加するなら false
			// body 要素や html 要素を挿入対象にする場合は false にしてください。
			isOut : false,
			
			// 設定スタイルの保持日数(一度でも再来訪すればまた数え直します) (数値)
			// 0 を指定するとブラウザ終了まで有効。
			expdays : 30,
						
			// 優先/代替 CSS 全て適用しない状態を選択リストに含めるなら true, 含めないなら false
			enableNoStyle : true,
			
			// 優先/代替 CSS 一切適用無しの名前 (文字列)
			noStyleName : "なし"
		}
	},
	/*------------------------------------------------*/
	/*----------------- 設定ここまで -----------------*/
	/*------------------------------------------------*/






	/**
	* @access public
	* @return boolean 了承されたかどうか
	* その動作を本当にしてよいのか聞く。
	*/
	really : function(){
		return confirm("OK ?");
	},



	/**
	* 窓関連機能。
	*/
	Window : {
		/**
		* @access public
		* @return void
		* ウィンドウのデフォルトステータスバー文字列を
		* ページの簡単な説明にします。
		*/
		init : function(){
			window.defaultStatus = "[ " + self.location.href + " ] - " + document.title;
		}
	},
	
	
	/**
	* 配列関連機能。
	* Array.prototype に追加したいところだけど、
	* 他の JavaScript ライブラリに悪影響が出るか判らないので保留。
	*/
	Arrays : {
		/**
		* @access public
		* @param mixed[] 検索対象配列
		* @param value mixed 検索するオブジェクト
		* @return boolean 対象配列に既にオブジェクトが存在していれば true, そうでなければ false
		* 配列の値の重複チェックなどに使用。
		* containsKey も作るかもしれないので contains でなく containsValue という名前。
		*/
		containsValue : function( array, value ){
			for(var i in array){
				if(array[i] == value){
					return true;
				}
			}
			return false;
		}
	},


	/**
	* DOM 関連機能。
	*/
	DOM : {
		namespace : {
			xhtml1 : "http://www.w3.org/1999/xhtml",
			xhtml2 : "http://www.w3.org/2002/06/xhtml2/"
		},
		
		/**
		* @access public
		* @return object(HTMLHtmlElement) ページ内のルート要素 or null
		*/
		getRootElement : function(){
			/* document.all(0) が要素とは限らない為 document.all 非使用 [Feedback 2004-12-19] */
			if(document.documentElement){
				return document.documentElement;
			} else if (document.getElementsByTagName){
				return document.getElementsByTagName("*")[0];
			} else {
				return null;
			}
		},
		
		/**
		* @access public
		* @return boolean 最低限の DOM が扱えるかどうか
		*/
		canDOM : function(){
			var D = document;
			var E = WO.DOM.getRootElement();
			if( E == null ) return false;
			return new Boolean(
				D.getElementById &&
				D.getElementsByTagName &&
				D.createElement &&
				D.createTextNode &&
				E.getAttribute &&
				E.setAttribute &&
				E.removeAttribute &&
				E.appendChild &&
				E.removeChild &&
				E.insertBefore
			);
		},
		
		/**
		* @access public
		* @return boolean 文書が XHTML かどうか
		*/
		isXHTML : function(){
			if( WO.DOM.canDOM() == false ) return false;
			
			var root = WO.DOM.getRootElement();
			/*
			XHTML/1.1 はルート要素に xmlns 属性が定義されなければならない
			HTML なら namespaceURI は null
			Opera7 は getAttribute では xmlns 属性が取得できない (getAttributeNode なら Object が返る)
			WinIE6 は namespaceURI プロパティが存在しない
			*/
			return new Boolean( root.getAttribute("xmlns") || root.namespaceURI );
		},
		
		/**
		* @access public
		* @param tagName String 生成する要素名
		* @return object(HTML*Element) 生成された要素
		* XHTML / HTML のどちらであるかを自動的に判断して指定要素を生成します。
		* XHTML の場合に生成される要素の名前空間は XHTML/1.x 共通のものです。
		*/
		createElement : function( elementName ){
			elementName = elementName.toLowerCase();
			if( WO.DOM.isXHTML() && document.createElementNS ){
				return document.createElementNS(WO.DOM.namespace.xhtml1, elementName);
			} else {
				return document.createElement(elementName);
			}
		},
		
		/**
		* @access public
		* @param newNode object(DOMNode) refNode に追加するノード
		* @param refNode object(DOMNode) ノードが追加されるノード
		* @return object|null 自動補完が加わったかもしれない newNode
		* 対象のノードが DL,UL,OL のいずれかであれば newNode に適切に要素を加えて返します。
		* 対象ノードが null か DOM が扱えなければ null を返します。
		*/
		addElementImpl : function( newNode, refNode ){
			if( WO.DOM.canDOM() == false || !refNode ) return null;
			
			/* Feedback from ALIMIKA SATOMI 2004-12-19 */
			var regxp = new RegExp("^(HTML:)?(UL|OL|DL)$", "i"); // XHTML [Opera7] 対策
			if( regxp.test(refNode.nodeName) ){
				var parentElement;
				if(refNode.nodeName.toUpperCase().indexOf("DL") != -1 ){
					parentElement = WO.DOM.createElement("dd");
				} else {
					parentElement = WO.DOM.createElement("li");
				}
				if( newNode.id ){
					parentElement.id = newNode.id + "_PARENT";
				}
				parentElement.appendChild(newNode);
				return parentElement;
			} else {
				return newNode;
			}
		},
		
		/**
		* @access public
		* @param newElement object(DOMElementNode) 新しく追加する要素
		* @param targetElement object(DOMNode) 追加対象の要素
		* @param isBefore boolean 追加対象の要素の前に追加するのかどうか (後ろなら false)
		* @param isOut boolean 追加対象要素の外に追加するのかどうか (中なら false)
		* @return object(DOMElementNode) 追加した newElement
		*
		* 新しい要素を追加対象要素の前後どちらかに追加します。
		* 追加対象要素が UL/OL/DL のいずれかである場合は適切に要素を補充した後に
		* それを新しい要素として追加します。返り値はここで生成された新しい要素です。
		* UL/OL/DL ではなければそのまま追加し、返り値の要素も最初の新しい要素と変化しません。
		* DOM をサポートしていない場合は何もせずに null を返します。
		*/
		addElement : function( newElement, targetElement, isBefore, isOut ){
			if( WO.DOM.canDOM() == false ) return null;
			
			if( isBefore ){
				if( isOut ){
					newElement = WO.DOM.addElementImpl( newElement, targetElement.parentNode );
					targetElement.parentNode.insertBefore( newElement, targetElement );
				} else {
					newElement = WO.DOM.addElementImpl( newElement, targetElement );
					targetElement.insertBefore( newElement, targetElement.firstChild );
				}
			} else {
				if( isOut ){
					newElement = WO.DOM.addElementImpl( newElement, targetElement.parentNode );
					targetElement.parentNode.insertBefore( newElement, targetElement.nextSibling );
				} else {
					newElement = WO.DOM.addElementImpl( newElement, targetElement );
					targetElement.appendChild( newElement );
				}
			}
			return newElement;
		},
		
		/**
		* @access public
		* @return void
		* 変な構造で認識されている abbr 要素を正しく生成し直す。
		* 正しく (X)HTML 構造を認識する UA では処理を実行しない。
		*/
		regenerateAbbr : function(){
			if( WO.DOM.canDOM() == false || document.getElementsByTagName("/abbr").length == 0 ){
				return;
			}
			
			var abbrs = document.getElementsByTagName("abbr");
			var attrs = [
				"style", "title", // %coreattrs ( id, class を除く  )
				"lang", "dir", // %i18n
				"onclick", "ondbclick", "onmousedown", "onmouseup", "onmouseover", "onmouseout", "onkeypress", "onkeydown", "onkeyup" // %events
			];
			for(var i=abbrs.length-1; i>=0; i--){
				var oldAbbr = abbrs[i];
				var newAbbr = WO.DOM.createElement("abbr");
				
				/*
				属性のコピー。
				XHTML の場合はあらゆる属性名を許すが HTML の場合は DTD にあるかチェックする。
				HTML では 属性名は大文字小文字の違いは問わないが、XHTML では属性名は小文字でなければならないので、とりあえず属性名は小文字で書き出す。
				*/
				for(var j=oldAbbr.attributes.length-1; j>=0; j--){
					var oldAttr = oldAbbr.attributes[j];
					if(
					oldAttr.nodeName.toLowerCase() != "class" && // WinIE は class 属性を setAttribute では正しく反映しない為、後で className プロパティに代入する
					oldAttr.nodeName.toLowerCase() != "id" && // id 属性は古い abbr 要素を削除した後で代入する
					oldAttr.nodeValue && // null や "" もあるので除外
					(WO.DOM.isXHTML() ||
					WO.Arrays.containsValue(attrs, oldAttr.nodeName.toLowerCase())
					) ){
						newAbbr.setAttribute(oldAttr.nodeName.toLowerCase(), oldAttr.nodeValue);
					}
				}
				/* 正しく生成し直した abbr 要素を追加し、以前の内容をコピーする */
				oldAbbr.parentNode.insertBefore(newAbbr, oldAbbr);
				while(oldAbbr.nextSibling.nodeName.toUpperCase() != "/ABBR") {
					newAbbr.appendChild(oldAbbr.nextSibling);
				}
				tempID = oldAbbr.id;
				tempClass = oldAbbr.className;
				
				/* 変な認識になっている abbr 要素を削除 */
				oldAbbr.parentNode.removeChild(oldAbbr.nextSibling);
				oldAbbr.parentNode.removeChild(oldAbbr);
				
				/*
				特殊属性のコピー。
				古い abbr 要素の削除が終わる前にこれを行うと insertBefore() が
				終わった瞬間は同じ ID が同じ文書に存在してしまうため、ここで処理する。
				また、IE では setAttribute で class を
				有効化させることは出来ないので className に代入する。
				*/
				if( tempID ){
					newAbbr.id = tempID;
				}
				if( tempClass ){
					newAbbr.className = tempClass;
				}
				//確認用 alert( newAbbr.parentNode.innerHTML );
			}
		}
	},



	/**
	* イベントハンドラ関連機能。
	*/
	Event : {
		/**
		* @access public
		* @param object obj(DOMElementNode) イベントを削除する要素
		* @param event String イベント名
		* @param listener Function イベント発生時に自動実行させていた関数
		* @param useCapture boolean キャプチャするかどうからしい……
		* @return void
		*
		* イベントの削除を行う。
		*/
		removeEvent : function( obj, event, listener, useCapture ){
			if(obj.removeEventListener){
				obj.removeEventListener( event, listener, useCapture ? true : false ); // Standard DOM
			} else if(obj.detachEvent){
				obj.detachEvent( "on"+event, listener ); // For IE
			}
		},
		
		/**
		* @access public
		* @param obj obj(DOMElementNode) イベントを登録する要素
		* @param event String イベント名
		* @param listener Function イベント発生時に自動実行する関数
		* @param useCapture boolean キャプチャするかどうからしい……
		* @return void
		*
		* イベントの登録を行う。
		*/
		addEvent : function( obj, event, listener, useCapture ){
			if(obj.addEventListener){
				obj.addEventListener( event, listener, useCapture ? true : false ); // Standard DOM
			} else if(obj.attachEvent){
				obj.attachEvent( "on"+event, listener ); // For IE
			}
		},
		
		/*
		* @access public
		* @param listener Function ページ読み込み完了時に自動実行する関数
		* @return void
		*/
		addLoadEvent : function( listener ){
			WO.Event.addEvent( window, "load", listener, false );
		}
	},


	/**
	* フレーム関連機能。
	*/
	Frame : {
		/*
		* @access public
		* @return void
		* フレーム内にページがあった場合に、ページをウィンドウ全体に表示しなおすか
		* 聞いて、了承されたらそのようにリロードします。
		* 主に外部サイトのフレーム内に表示される事の予防を目的とします。
		*/
		breakFrame : function(){
			/*
			object 要素での取り込みを検知する為に
			トップウィンドウはディレクトリの場所を URL で求め
			自ウィンドウは設定 URL が空であればトップディレクトリを URL で求め、
			そうでなければ設定をそのまま使用します。 [Feedback 2004-12-19]
			*/
			var selfDirURL = WO.Config.Frame.address ? WO.Config.Frame.address : self.location.protocol+"//"+self.location.hostname + "/";
			var topDir = top.location.pathname.substring(0,top.location.pathname.lastIndexOf("/")+1 );
			var topDirURL = top.location.protocol+"//"+top.location.hostname + topDir;
			selfDirURL = selfDirURL.toLowerCase();
			topDirURL = topDirURL.toLowerCase();
			if( topDirURL.indexOf(selfDirURL) == -1 ){
				if( confirm( "警告！\n'" + document.title + "'\nは他のサイトのフレーム内に入れられている可能性があります。\nフレームを破棄しますか？") ){
					top.location.href = self.location.href;
				}
			}
		}
	},
	
	
	/**
	* いわゆるファクトリーメソッドみたいなものです。
	* 同じオブジェクトを共有する機能を提供します。
	*/
	Factory : {
		cache : new Object(),
		
		/**
		* @access public
		* @param key String オブジェクトが格納されるキー
		* @param obj 格納されるオブジェクト
		*
		* 指定したオブジェクトのインスタンスを返します。
		*
		* 指定された文字列をキーとしてオブジェクトを保持し、
		* 既にキーとして使用されている文字列をキーに指定した場合
		* 以前に指定したオブジェクトのインスタンスを返します。
		*/
		newObject : function( key, obj ){
			if( WO.Factory.cache[key] == void(0) ){
				WO.Factory.cache[key] = obj;
			}
			return WO.Factory.cache[key];
		},
		
		/**
		* @access public
		* @param key String オブジェクトが格納されているキー
		*
		* 指定したキーに格納されているオブジェクトのインスタンスを返します。
		* まだオブジェクトが格納されていない場合、未定義値を返します。
		*/
		getObject : function( key ){
			return WO.Factory.cache[key];
		},
		
		/**
		* @access public
		* @param key String オブジェクトが格納されるキー
		* @param obj 格納されるオブジェクト
		*
		* 指定したオブジェクトのインスタンスを返します。
		*
		* 指定された文字列をキーとしてオブジェクトを保持します。
		* 既にキーとして使用されている文字列をキーに指定すると
		* 保持されていたオブジェクトを上書きします。
		*/
		replaceObject : function( key, obj ){
			WO.Factory.cache[key] = obj;
			return WO.Factory.cache[key];
		}
	},


	/**
	* リンク関連機能。
	*/
	Link : {
		/** 自ページの URL。# 以降があればそれを除いた URL */
		self : ( location.hash != "" ) ? location.href.substring( 0, location.href.lastIndexOf(location.hash) ) : location.href,
		
		/**
		* @access public
		* @param link object(HTMLAElement) href 属性を削除するリンク要素
		* @return void
		*
		* 指定リンクの href 削除。
		*/
		removeLink : function(link){
			link.removeAttribute("href");
		},
		
		/**
		* @access public
		* @param url String 検索対象URL
		* @return object[](HTMLAElement[]) 対象URL と同じリンク先を持つリンク要素の配列
		*/
		getLinksByURL : function(url){
			var links = document.links;
			var array = new Array();
			for(var i=links.length-1; i>=0; i--){
				if(links[i].href == url){
					array.unshift( links[i] );
				}
			}
			return array;
		},
		
		/**
		* @access protected
		* @param isInternal String 内部リンクを取得するのかどうか。false なら外部リンクを取得する
		* @param internalURL String 内部とみなす URL の断片。これが href 属性にあれば内部とする
		* @return object[](HTMLAElement[]) リンク要素の配列
		*/
		getLinks : function( isInternal, internalURL ){
			var links = document.links;
			var array = new Array();
			if( !internalURL ) internalURL = location.hostname;
			var regxp = new RegExp( internalURL, "i" );
			for(var i=links.length-1; i>=0; i--){
				if( regxp.test(links[i].href) == isInternal ){
					array.unshift( links[i] );
				}
			}
			return array;
		},
		
		/**
		* @access public
		* @param internalURL String 内部とみなす URL の断片
		* @return object[](HTMLAElement[]) サイト外リンク要素の配列
		* 外部リンクを全て返す
		*/
		getExternalLinks : function( internalURL ){
			return WO.Link.getLinks( false, internalURL );
		},
		
		/**
		* @access public
		* @param internalURL String 内部とみなす URL の断片
		* @return object[](HTMLAElement[]) サイト内リンク要素の配列
		* 内部リンクを全て返す
		*/
		getInternalLinks : function( internalURL ){
			return WO.Link.getLinks( true, internalURL );
		},
		
		/**
		* @access public
		* @param link object(HTMLAElement) リンク先ウィンドウを設定するリンク要素
		* @param target String リンク先ウィンドウ名
		* @return void
		* 対象リンクを開くウィンドウ名を設定します。キーボード使いには
		* こんな機能は必要無い（Ctrl+Enterなどで新窓を開く）ので
		* onkeydown にはイベントを割り当てていません
		*/
		setOpenTarget : function( link, target ){
			/* 前の target 指定があれば打ち消す */
			var previousTarget = WO.Factory.getObject( link.href );
			if( previousTarget ){
				WO.Event.removeEvent( link, "click", WO.Factory.getObject( "#" + previousTarget + "@" + link.href), false );
			}
			
			/* 新しい target 指定を保存してイベントハンドラに登録する */
			WO.Factory.replaceObject( link.href, target );
			WO.Event.addEvent( link, "click", WO.Factory.newObject( "#" + target+ "@" + link.href, function(){
				window.open(link.href, target);
				return false;
			}), false );
			
			/*
			* href 属性無効化設定を行う。
			* その際に他のスクリプトと競合しないよう考慮する。
			*/
			var handler = link.onclick;
			if( handler && handler != returnFalse ){
				/*
				* 未定義でなく且つ returnFalse でも無ければ何か設定されている。
				* 従ってクロージャを使う。この function は何度も繰り返される可能性があるので
				* 処理が被らないようにファクトリーも使っておく。
				*/
				link.onclick = WO.Factory.newObject( "&" + link.href, function(){
					handler();
					return false;
				} );
			} else if( ! handler ){
				/* 未定義っぽいので直接 href 属性無効化設定を行う */
				link.onclick = returnFalse;
			}
		},
		
		/**
		* @access public
		* @return void
		* 自己リンクの排除
		*/
		removeSelfLinks : function(){
			var links = WO.Link.getLinksByURL(WO.Link.self);
			for(var i=links.length-1; i>=0; i--){
				WO.Link.removeLink( links[i] );
				if( WO.Config.Link.activeClassName ){
					links[i].className += (" " + WO.Config.Link.activeClassName);
				}
			}
		}
	},


	/**
	* クッキー関連機能。よくあるヤツ。
	*/
	Cookie : {
		/**
		* @access public
		* @param name String 取得するクッキーの名前
		* @return String|null クッキーが存在しなければ null、そうでなければクッキーの値
		*/
		getCookie : function(name){
			var start, end;
			var c = document.cookie;
			
			if(c.indexOf(name + '=') != -1){
				start = c.indexOf(name + '=');
				end = c.indexOf( ';', start + name.length+1 );
				if(end == -1){
					end = c.length;
				}
				var value = c.substring( start + name.length+1, end );
				return decodeURIComponent ? decodeURIComponent(value) : unescape(value) ;
			}
			return null;
		},
	
		/**
		* @access public
		* @param name String 設定するクッキーの名前
		* @param value String 設定する値
		* @param expdays int クッキー有効日数
		* @param domain String クッキーを有効にするドメイン
		* @param path String クッキーを有効にするパス
		* @return void
		*/
		setCookie : function(name,value,expdays,domain,path){
			if( value == null ) throw "Invalid Value";
			if( !expdays ) expdays = 0;
			/* ドメインとパスは空設定の場合を考慮 */
			if( !domain ) domain = location.hostname;
			if( !path ) path = location.pathname.substring(0,location.pathname.lastIndexOf("/")+1 );
			
			value = encodeURIComponent ? encodeURIComponent(value) : escape(value) ;
			
			var c = name + "=" + value;
			c += "; domain=" + domain;
			c += "; path=" + path;
			if(expdays != 0){
				var expires = new Date();
				expires.setTime(expires.getTime() + 1000*60*60*24*expdays);
				c += "; expires=" + expires.toGMTString();
			}
			document.cookie = c;
		}
	},


	/**
	* フォーム関連機能。
	*/
	Form : {
		/**
		* @access public
		* @param formElement object(HTMLFormElement) セーフモード適用対象のフォーム要素
		* @return void
		* 指定したフォームのリセットと送信操作で確認を取るよう設定します。
		*/
		applySafemode : function( formElement ){
			/* WO.Event.addEvent() でイベント登録すると何故かどちらを選択しても実行されてしまう */
			formElement.onreset = WO.really;
			formElement.onsubmit = WO.really;
		},
		
		/*
		* @access public
		* @return void
		* ページ内のフォームのリセットと送信操作で確認を取るよう設定します。
		* 但し、フォームのクラス名に WO-noConfirm が指定されているものは無視します。
		*/
		applySafemodeAll : function(){
			if( WO.DOM.canDOM() == false ) return;
			
			var forms = document.getElementsByTagName("form");
			for(var i=forms.length-1; i>=0; i--){
				if( forms[i].className && WO.Arrays.containsValue( forms[i].className.split(/\s+/), "WO-noConfirm") == false ){
					WO.Form.applySafemode( forms[i] );
				}
			}
		}
	},



	/**
	* リンク先切り替え機能の提供をします。
	* 2 大機能の片割れです。
	*/
	LinkSwitcher : {
		checkboxID : "WOSWITCHBOX",
		divID : "WOSWITCH",
		
		/**
		* @access protected
		* @return void
		* チェックボックスの操作時に反応する関数です。
		*/
		handleLink : function(){
			WO.LinkSwitcher.switchLink(document.getElementById(WO.LinkSwitcher.checkboxID).checked);
		},
		
		/**
		* @access public
		* @return void
		* リンク先切り替え用のフォームをページ上に配置します。
		*/
		createController : function(){
			if( WO.DOM.canDOM() == false ) return;
			
			var div = WO.DOM.createElement("div");
			var checkbox = WO.DOM.createElement("input");
			var label = WO.DOM.createElement("label");
			
			/* checkbox の設定 */
			checkbox.setAttribute("type","checkbox");
			checkbox.setAttribute("value","on");
			checkbox.id = WO.LinkSwitcher.checkboxID;
			WO.Event.addEvent(checkbox, "change", WO.LinkSwitcher.handleLink );
			
			/* label の設定 */
			label.appendChild( checkbox );
			label.appendChild( document.createTextNode(WO.Config.LinkSwitcher.text) );
			div.appendChild(label);
			
			/* div の設定 */
			div.id = WO.LinkSwitcher.divID;
			
			/*
			* とりあえず要素を取得してみて、それに追加してみる。
			* この時、要素が見つからなければ追加操作で例外が投げられる。
			* 例外時は、選択機能を表示しない。
			*/
			try{
				var targetElement;
				if( WO.Config.LinkSwitcher.targetElementID ){
					targetElement = document.getElementById(WO.Config.LinkSwitcher.targetElementID);
				} else {
					targetElement = document.getElementsByTagName(WO.Config.LinkSwitcher.targetElementName)[WO.Config.LinkSwitcher.targetElementIndex-1];
				}
				WO.DOM.addElement( div, targetElement, WO.Config.LinkSwitcher.isBefore, WO.Config.LinkSwitcher.isOut );
			}catch(err){}
			
			if( WO.Cookie.getCookie("open") == "New" ){
				WO.LinkSwitcher.switchLink(true);
				checkbox.checked = true;
			} else {
				div.className = "disable";
			}
		},
		
		/**
		* @access public
		* @param isNewWindow boolean 新しいウィンドウで開かせるかどうか
		* @return void
		* 外部リンクを開かせるウィンドウの設定を行います
		*/
		switchLink : function(isNewWindow){
			if( WO.DOM.canDOM() == false ) return;
			
			var external = WO.Link.getExternalLinks( WO.Config.LinkSwitcher.internalURL );
			for(var i=external.length-1; i>=0; i--){
				WO.Link.setOpenTarget( external[i], isNewWindow ? "_blank" : "_self" );
			}
			document.getElementById(WO.LinkSwitcher.divID).className = isNewWindow ? "enable" : "disable";
			WO.Cookie.setCookie("open", isNewWindow ? "New" : "Same", WO.Config.LinkSwitcher.expdays, WO.Config.Cookie.domain, WO.Config.Cookie.path );
		}
	},



	/**
	* スタイルシート切り替え機能の提供をします。
	* 2 大機能の片割れで、多分需要が最も多い機能です。
	*/
	StyleSheet : {
		/* セレクトボックスに付けるID。内部的にも使用するので重要 */
		selectID : "WOSSSBOX", 
		/* WO Style Sheet Selecter の略。div 要素の ID。CSS で制御しやすいように付けている */
		divID : "WOSSS",
		
		/**
		* @access protected
		* @return object[](styleSheets[]|HTMLLinkElement[]) 優先/代替スタイルシートに関連している styleSheets オブジェクト(それが利用できなければ link 要素)の配列
		*
		* styleSheets オブジェクトから title があるものだけを返します。
		* styleSheets オブジェクトが利用できない場合は代わりに link 要素から取得します。
		* 返り値に永続スタイルシートは含みません。
		* link 要素での取得の場合に DOM がサポートされていなければ空配列を返します。
		*/
		getStyleSheets : function(){
			var i;
			var sheets = new Array();
			if( document.styleSheets ){
				var csses = document.styleSheets;
				for(i=csses.length-1; i>=0; i--){
					if( csses[i].title ){
						sheets.unshift(csses[i]);
					}
				}
			} else {
				if( WO.DOM.canDOM() == false ) return new Array();
				
				var objLinks = document.getElementsByTagName("link");
				for(i=objLinks.length-1; i>=0; i--){ // この場合は for(var i in objLinks) は正常動作しません！
					if(
					objLinks[i].getAttribute("rel") &&
					objLinks[i].getAttribute("rel").toLowerCase().indexOf("stylesheet") != -1 &&
					objLinks[i].getAttribute("title") ){
						sheets.unshift(objLinks[i]);
					}
				}
			}
			return sheets;
		},
		
		/**
		* @access public
		* @param sheet String 適用するスタイルシート名
		* @return void
		*
		* sheet と同一名のスタイルシートを有効に、それ以外を無効にします。
		* 永続スタイルシートには影響を及ぼしません。
		* DOM がサポートされていなければ何もしません。
		*/
		changeStyleSheet : function(sheet){
			if( !sheet || WO.DOM.canDOM() == false ) return;
			
			var sheets = WO.StyleSheet.getStyleSheets();
			for(var i=sheets.length-1; i>=0; i--){
				sheets[i].disabled = true;
				var title = sheets[i].title;
				if( !title ) title = sheets[i].getAttribute("title");
				if(title == sheet){
					sheets[i].disabled = false;
				}
			}
			WO.Cookie.setCookie("sheet", sheet, WO.Config.StyleSheet.expdays, WO.Config.Cookie.domain, WO.Config.Cookie.path );
		},
		
		/**
		* @access protected
		* @return void
		* 選択スタイル名によるクラス名の再設定と実際の CSS の切り替えを行う。
		* イベントで割り当てられて実行される。
		*/
		handleStyleSheet : function(){
			var selectElement = document.getElementById(WO.StyleSheet.selectID);
			var sheet = selectElement.options[selectElement.selectedIndex].text;
			var options = selectElement.options;
			for(var i=options.length-1; i>=0; i--){
				options[i].className = (options[i].text == sheet) ? "enable" : "disable";
			}
			WO.StyleSheet.changeStyleSheet(sheet);
		},
		
		
		/**
		* @access public
		* @return void
		*
		* link 要素で指定されているスタイルシートのタイトルを一覧でセレクトボックスとして出力します。
		* 出力は div 要素に select 要素を含めた形で行われます。
		* div 要素には WO.StyleSheet.divID を付けます。
		* select 要素には WO.StyleSheet.selectID を付けます。
		* このセレクトボックスは選択項目が変更されると
		* 自動的に適切な changeStyleSheet() を実行されるよう設定されます。
		* また、現在有効なスタイルの項目は選択状態にされます。
		* DOM がサポートされていなければ何もしません。
		*/
		createController : function(){
			if( WO.DOM.canDOM() == false ) return;
			
			var div = WO.DOM.createElement("div");
			var select = WO.DOM.createElement("select");
			var sheet = WO.Cookie.getCookie("sheet");
			var sheets = WO.StyleSheet.getStyleSheets();
			
			div.id = WO.StyleSheet.divID;
			select.id = WO.StyleSheet.selectID;
			
			/*
			同一の title 属性を持つスタイルシートの link が複数あると
			option が重複するためセレクトボックスに含める前にチェックします [Feedback 2004-12-19]
			*/
			var titles = new Array();
			for(var i=0, len=sheets.length; i<len; i++){
				var title = sheets[i].title;
				if( !title ) title = sheets[i].getAttribute("title");
				if( WO.Arrays.containsValue(titles, title) == false ){
					titles.push(title);
					var opt = WO.DOM.createElement("option");
					opt.appendChild( document.createTextNode(title) );
					select.appendChild(opt);
					if( title == sheet ){
						select.selectedIndex = i;
						opt.className = "enable";
					} else {
						opt.className = "disable";
					}
				}
			}
			
			/* 優先/代替スタイル一切適用無し状態が設定で有効なら追加 */
			if( WO.Config.StyleSheet.enableNoStyle && WO.Config.StyleSheet.noStyleName ){
				var nostyle = WO.DOM.createElement("option");
				nostyle.appendChild( document.createTextNode(WO.Config.StyleSheet.noStyleName) );
				select.appendChild(nostyle);
				if( sheet == WO.Config.StyleSheet.noStyleName ){
					select.selectedIndex = titles.length;
					nostyle.className = "enable";
				} else {
					nostyle.className = "disable";
				}
			}
			
			/* テキストを追加 */
			if( WO.Config.StyleSheet.text ){
				var label = WO.DOM.createElement("label");
				label.setAttribute("for", WO.StyleSheet.selectID ); // Feedback from ALIMIKA SATOMI 2004-12-19
				label.appendChild( document.createTextNode(WO.Config.StyleSheet.text) );
				div.appendChild(label);
			}
			div.appendChild(select);
			
			WO.Event.addEvent( select, "change", WO.StyleSheet.handleStyleSheet );
			
			/*
			* とりあえず（中略）例外時は、選択機能を表示しない。
			*/
			try{
				var targetElement;
				if( WO.Config.StyleSheet.targetElementID ){
					targetElement = document.getElementById(WO.Config.StyleSheet.targetElementID);
				} else {
					targetElement = document.getElementsByTagName(WO.Config.StyleSheet.targetElementName)[WO.Config.StyleSheet.targetElementIndex-1];
				}
				WO.DOM.addElement( div, targetElement, WO.Config.StyleSheet.isBefore, WO.Config.StyleSheet.isOut );
			}catch(err){}
		},
		
		/*
		* @access public
		* @return void
		*
		* 以前のスタイルシート設定を読み込んで、そのスタイルを反映させます。
		* クッキーがなんらかの理由で存在しなければ何もしません。
		*/
		init : function(){
			var sheet = WO.Cookie.getCookie("sheet");
			if( sheet != null ){
				WO.StyleSheet.changeStyleSheet(sheet);
			}
		}
	}
}

/*
*
*********** 関数のイベント登録や即座の実行 *************
# スクリプト全体を無効化する時はここをコメントアウトすると楽
*/
if( WO.Config.HTML.useFixAbbr ){
	WO.Event.addLoadEvent( WO.DOM.regenerateAbbr );
}
if( WO.Config.Frame.enable ){
	WO.Event.addLoadEvent( WO.Frame.breakFrame );
}
if( WO.Config.Form.enable ){
	WO.Event.addLoadEvent( WO.Form.applySafemodeAll );
}
if( WO.Config.Link.enable ){
	WO.Event.addLoadEvent( WO.Link.removeSelfLinks );
}
if( WO.Config.LinkSwitcher.enable ){
	WO.Event.addLoadEvent( WO.LinkSwitcher.createController );
}
if( WO.Config.Window.enable ){
	WO.Event.addLoadEvent( WO.Window.init );
}
if( WO.Config.StyleSheet.enable ){
	/*
	* if( Opera ではない or Opera だろうが構わない or XHTML ではない )
	*/
	if( !window.opera || WO.Config.StyleSheet.affectOpera || !WO.DOM.isXHTML() ){
		WO.Event.addLoadEvent( WO.StyleSheet.createController );
		/* 表示スタイルをレンダリング開始前に切り替える */
		WO.StyleSheet.init();
	}
}


/*
*	Website Options 配布先 - read a little
*		http://readalittle.net/
*
*	local variable : tabstop=4, charset=utf-8, newline=CR+LF
\e
*/
