// Copyright (c) 2004-2007 koikikukan All Rights Reserved.
// http://www.koikikukan.com/
// License is granted if and only if this entire
// copyright notice is included. By Yujiro ARAKI.
// Ver1.00 initial version.
// Ver2.00 add the state maintenance function by cookie.
// Ver3.00 improve cookie processing.
// Ver3.01 corresponds to Mac+IE.
// Ver4.00 2005.03.31 add link display by block.
// Ver5.00 2005.08.22 add Ajax library.
// Ver5.01 2005.08.27 add flag of Ajax selection for subcategory.
// Ver6.00 2006.07.10 add archives.
// Ver6.01 2006.08.22 corresponds to image.
// Ver6.02 2006.11.26 fix bug(corresponds to image).
// Ver6.03 2007.01.30 add option to apply the anchor to year and improvement of performance.
// Ver7.00 2007.04.27 add function to stateless hold.
function deleteValue(name, nameEQ) {
 var ca = document.cookie.split(';');
 var newData = new Array();
 // Repeat by cookie
 for(var i = 0, len = ca.length; i < len; i++) {
 var c = ca[i];
 while (c.charAt(0)==' ') {
 c = c.substring(1,c.length);
 }
 if (c.indexOf(nameEQ) == 0) {
 // Delete the corresponding name.
 var data = c.substring(nameEQ.length,c.length);
 var list = data.split('|');
 for(var x = 0; x < list.length; x++) {
 if (list[x] != name) {
 // corresponds to Mac+IE
 newData[newData.length] = list[x];
 }
 }
 return newData.join('|');
 }
 }
 // Return empty when cookie does not exist.
 return '';
}
function hasName(name, nameEQ) {
 var ca = document.cookie.split(';');
 for(var i = 0, len = ca.length; i < len; i++) {
 var c = ca[i];
 while (c.charAt(0)==' ') {
 c = c.substring(1,c.length);
 }
 if (c.indexOf(nameEQ) == 0) {
 var data = c.substring(nameEQ.length,c.length);
 var list = data.split('|');
 for(var x = 0, len2 = list.length; x < len2; x++) {
 if (list[x] == name) {
 return true;
 }
 }
 return false;
 }
 }
}
function createCookieByValue(name, onoff, days) {
 if (days) {
 var date = new Date();
 date.setTime(date.getTime()+(days*24*60*60*1000));
 var expires = "; expires="+date.toGMTString();
 } else {
 expires = "";
 }
 // Once delete a name from cookie.
 var newOnData = deleteValue(name, 'sidebarMenuOn=');
 var newOffData = deleteValue(name, 'sidebarMenuOff=');
 // Set up a name as new data.
 if (onoff == 'on') {
 if (newOnData != '') {
 newOnData += '|' + name;
 } else {
 newOnData = name;
 }
 } else {
 if (newOffData != '') {
 newOffData += '|' + name;
 } else {
 newOffData = name;
 }
 }
 // Save cookie.
 document.cookie = "sidebarMenuOn=" + newOnData + expires + "; path=/";
 document.cookie = "sidebarMenuOff=" + newOffData + expires + "; path=/";
}
function readCookieByValue(name) {
 // Search a menu.
 // Return empty if there is nothing to both.
 if (hasName(name, 'sidebarMenuOn=')) {
 return 'on';
 }
 if (hasName(name, 'sidebarMenuOff=')) {
 return 'off';
 }
 return null;
}
// リスト数取得
function getListCount(objLists, viewNum, idName, linkNumber, trackbackNumber, rightMarkForListNumber, subCategoryCount, leftMarkForListNumber, countTag, offsetValue) {
 var objItems;
 var href;
 var commentCounter = 0;
 // サブカテゴリーリスト
 if (subCategoryCount && (idName.indexOf('subcategories') == 0)) {
 objItems = objLists.getElementsByTagName('li');
 // 指定されたタグを使用
 } else if (countTag == 'li') {
 objItems = objLists.getElementsByTagName(countTag);
 // その他(aタグ)
 } else {
 objItems = objLists.getElementsByTagName('a');
 }
 // Recent Comments
 if (idName == 'comment') {
 for (i = 0, len = objItems.length; i < len; i++) { // Repeat a tag.
 href = objItems[i].getAttribute("href");
 if(href.indexOf('#') == -1){ // Count if '#' exists in a href attribute.
 commentCounter++;
 }
 }
 }
 // Trackback
 var counter;
 if (idName == 'trackback') {
 commentCounter = objItems.length / trackbackNumber;
 }
 // Subtract the unnecessary number of links.
 if (idName.indexOf('link') == 0) {
 var linkName;
 for (j = 0; j < linkNumber; j++) {
 linkName = 'link' + (j + 1);
 if (idName == linkName) {
 counter = objItems.length - offsetValue[j];
 }
 }
 } else {
 // Subtract the value of a counter from 'Recent Comments'
 counter = objItems.length - commentCounter;
 }
 // decoration counter
 if (leftMarkForListNumber) {
 counter = leftMarkForListNumber + counter;
 }
 if (rightMarkForListNumber) {
 counter = counter + rightMarkForListNumber;
 }
 return counter;
}
// リスト数設定
function setListNumber(buffer, listCount, menuTitle, listNumberPosition, tlspace) {
 // リスト数を前に表示
 if (listNumberPosition) {
 buffer[buffer.length] = listCount;
 if (tlspace) {
 buffer[buffer.length] = tlspace;
 }
 buffer[buffer.length] = menuTitle;
 // リスト数を後に表示
 } else {
 buffer[buffer.length] = menuTitle;
 if (tlspace) {
 buffer[buffer.length] = tlspace;
 }
 buffer[buffer.length] = listCount;
 }
}
// メニュータイトル+リスト数設定(block用)
function setMenuTitleForBlock(viewNum, buffer, listCount, menuTitle, listNumberPosition, tlspace) {
 // リスト数表示
 if (viewNum) {
 setListNumber(buffer, listCount, menuTitle, listNumberPosition, tlspace);
 // リスト数非表示
 } else {
 buffer[buffer.length] = menuTitle;
 }
}
// メニュータイトル+リスト数設定
function setMenuTitle(viewNum, buffer, listCount, menuTitle, listNumberPosition, tlspace) {
 // リスト数表示
 if (viewNum) {
 // リスト数を前に表示
 if (listNumberPosition) {
 buffer[buffer.length] = listCount;
 if (tlspace) {
 buffer[buffer.length] = tlspace;
 }
 }
 buffer[buffer.length] = menuTitle;
 // リスト数を後に表示
 if (!listNumberPosition) {
 if (tlspace) {
 buffer[buffer.length] = tlspace;
 }
 buffer[buffer.length] = listCount;
 }
 // リスト数非表示
 } else {
 buffer[buffer.length] = menuTitle;
 }
}
// 折りたたみ実行(タグ指定)
function FoldNavigationByTagName(idName, initMode, viewNum, countTag, sp, state) {
//--------------------------------------------------------
// Configuration
//--------------------------------------------------------
//--------------------------------------------------------
// メニュータイトル用設定データ
//--------------------------------------------------------
// リンク方式
// 折りたたみマークにリンク付与：'unblock'
// メニュータイトル枠全体にリンク付与 'block'
var linkType = 'block';
//-----------------------
// 折りたたみスピード
//-----------------------
// 全てのメニューのスピード
// 通常：'normal'
// 遅い：'slow'
var speed = 'normal';
// サブカテゴリーのスピード(speed が slow の場合のみ有効)
// 通常：'normal'
// 遅い：'slow'
var subcategorySpeed = 'normal';
//-----------------------
// 折りたたみマーク関連
//-----------------------
// 折りたたみマーク表示(メニュータイトル枠全体をリンクにする場合のみ有効)
// 表示する：true
// 表示しない：false
var displayMark = false;
// 折りたたみマーク
// 上：閉じている状態で表示されるマーク
// 下：開いている状態で表示されるマーク
// 画像を設定する場合は右辺を '<img src="[画像のURL]" />'; と書いてください
var openMarkForSideBarMenu = '▽';
var closeMarkForSideBarMenu = '△';
// 折りたたみマーク位置(折りたたみマークを表示する場合のみ有効)
// タイトル前に折りたたみマークを配置：true
// タイトル後に折りたたみマークを配置：false
// 左端または右端に折りたたみマークを配置：true
var preMarkForSideBarMenu = true;
// 折りたたみマーク画像(リンク方式が 'block' の場合のみ使われます)
// 画像を使用する：true
// 画像を使用しない：false
// var image = false;
//---------------
// リスト数関連
//---------------
// リスト数表示位置
// タイトル前にリスト数を表示：true
// タイトル後にリスト数を表示：false
var listNumberPosition = true;
// リスト数表示を括るマーク
var leftMarkForListNumber = '';
var rightMarkForListNumber = '';
// リンク数減算が必要なメニュー数
// リンク数を減算する必要があるメニューはここに含めてください
// 注:対象となるid属性名が「linkx(xは数字)」であること
// 減算するメニューがない場合:0
var linkNumber = 2;
// 減算する各メニューのオフセット値
// 注:対象となるid属性名が「linkx(xは数字)」であること
var offsetValue = new Array(linkNumber);
offsetValue[0] = 3;
offsetValue[1] = 2;
// トラックバック数の除数
// 注1:対象となるid属性名が「trackback」であること
// 注2:除算が不要な場合は'1'を設定すること
var trackbackNumber = 2;
// サブカテゴリーリスト数計数方法
// liタグで計数：true
// aタグで計数：false
// 注:他のタグを指定する場合はfalseを設定してください
var subCategoryCount = true;
//-------------------
// 表示位置補正関連
//-------------------
// タイトル表示位置補正フラグ(折りたたみマークを左端または右端に配置する場合)
// 補正する：true
// 補正しない：false
var modificationFlag = true;
// タイトル表示位置補正方向(折りたたみマークを左端または右端に配置する場合)
// ・タイトルを右方向に補正：true
// ・タイトルを左方向に補正：false
var centeringPosition = false;
// タイトル表示位置補正オフセット(折りたたみマークを左端または右端に配置した場合)
var offsetForCentering = 0;
// タイトルと折りたたみマークのスペース(上記以外で折りたたみマークを表示をする場合に有効)
// 折りたたみマークを左端または右端に配置する場合'0'を設定
var offsetForTitleAndMark = 0;
// タイトルとリスト数のスペース(リスト数を表示するメニューに有効)
var offsetForTitleAndLinkNumber = 1;
//--------------------------------------------------------
// サブカテゴリーリスト用設定データ
//--------------------------------------------------------
// サブカテゴリーフラグ
// サブカテゴリーの折りたたみを有効にする(別途テンプレート設定が必要)
// 有効にする：true
// 無効にする：false
var subCategory = true;
// サブカテゴリー用折りたたみマーク
// 上：閉じている状態で表示されるマーク
// 下：開いている状態で表示されるマーク
var openMarkForSubCategories = '<img src="http://www.moritec.co.jp/img/plus.gif" />';
var closeMarkForSubCategories = '<img src="http://www.moritec.co.jp/img/minus.gif" />';
// サブカテゴリー用折りたたみマーク挿入位置
// カテゴリー前に折りたたみマークを配置：true
// カテゴリー後に折りたたみマークを配置：false
var preMarkForSubCategory = true;
// サブカテゴリーのタイトルとマークのスペース
var offsetForTitleAndMarkOfSubcategory = 2;
//--------------------------------------------------------
// アーカイブリスト用設定データ
//--------------------------------------------------------
// アーカイブリストフラグ
// サブカテゴリーの折りたたみを有効にする(別途テンプレート設定が必要)
// 有効にする：true
// 無効にする：false
var archives = true;
// アーカイブリスト用折りたたみマーク
// 上：閉じている状態で表示されるマーク
// 下：開いている状態で表示されるマーク
var openMarkForArchives = '【+】';
var closeMarkForArchives = '【-】';
// アーカイブリスト用折りたたみマーク挿入位置
// カテゴリー前に折りたたみマークを配置：true
// カテゴリー後に折りたたみマークを配置：false
var preMarkForArchives = false;
// アーカイブリストのタイトルとマークのスペース
var offsetForTitleAndMarkOfArchives = 1;
// アーカイブリスト用折りたたみマーク使用
// 折りたたみマークを使用しない場合は年表示にリンクを設定
// 使用する：true
// 使用しない：false
var displayArchivesMark = false;
//--------------------------------------------------------
// 状態保持用設定データ
//--------------------------------------------------------
// 状態保持フラグ
// 有効にする：true
// 無効にする：false
var holdState = true;
//--------------------------------------------------------
 var openMark; // The mark for opening, when having closed
 var closeMark; // The mark for closing, when open
 var idTitle = Array(idName,'name').join('');
 var idList = Array(idName,'list').join('');
 var objTitle = this.document.getElementById(idTitle);
 var objLists = this.document.getElementById(idList);
 if (!objTitle || !objLists) return;
 // 折りたたみマーク
 openMark = openMarkForSideBarMenu;
 closeMark = closeMarkForSideBarMenu;
 if (subCategory) {
 if (idName.indexOf('subcategories') == 0) {
 openMark = openMarkForSubCategories;
 closeMark = closeMarkForSubCategories;
 }
 }
 if (archives) {
 if (idName.indexOf('archive') == 0) {
 openMark = openMarkForArchives;
 closeMark = closeMarkForArchives;
 }
 }
 // 状態保持解除
 if (!state) {
 holdState = false;
 }
 var dispMode = objLists.style.display;
 if (!dispMode) {
 // Hold a fold-up state to cookie.
 if (holdState) {
 var cookie_initMode = readCookieByValue(idName);
 if(cookie_initMode){
 initMode = cookie_initMode;
 }
 createCookieByValue(idName, initMode, 365);
 }
 // 開始タグ
 var buffer = new Array();
 var tmpText;
 // 折りたたみスピードによって起動関数を変更
 if(sp != 'dummy'){
 speed = sp;
 }
 if(speed == 'slow') {
 tmpText = Array('FoldNavigationSlowly(',"'",idName,"','chng','');return(false);").join('');
 } else {
 tmpText = Array('FoldNavigation(',"'",idName,"','chng','');return(false);").join('');
 }
 var startTag = Array('<a class="foldmark" href="#" onclick="',tmpText,'" onkeypress="',tmpText,'">').join('');
 // 終了タグ
 var endTag = '</a>';
 // 表示する折りたたみマーク
 var foldMark = (initMode == 'off') ? openMark : closeMark;
 // メニュータイトル
 var menuTitle = objTitle.innerHTML;
 // パディング
 var padding = '';
 for (k = 0; k < offsetForCentering; k++) {
 padding += '&nbsp;';
 }
 // タイトルとリンク数のスペース
 var tlspace = '';
 for (l = 0; l < offsetForTitleAndLinkNumber; l++) {
 tlspace += '&nbsp;';
 }
 // タイトルとマークのスペース
 var tmspace = '';
 for (l = 0; l < offsetForTitleAndMark; l++) {
 tmspace += '&nbsp;';
 }
 // サブカテゴリー用タイトルとマークのスペース
 var scspace = '';
 for (l = 0; l < offsetForTitleAndMarkOfSubcategory; l++) {
 scspace += '&nbsp;';
 }
 // アーカイブリスト用タイトルとマークのスペース
 var alspace = '';
 for (l = 0; l < offsetForTitleAndMarkOfArchives; l++) {
 alspace += '&nbsp;';
 }
 // リスト数
 var listCount;
 if (viewNum) {
 listCount = getListCount(objLists, viewNum, idName, linkNumber, trackbackNumber, rightMarkForListNumber, subCategoryCount, leftMarkForListNumber, countTag, offsetValue);
 }
 // 折りたたみ表示つきタイトル生成
 // サブカテゴリーリスト
 if (subCategory && (idName.indexOf('subcategories') == 0)) {
 if (preMarkForSubCategory) {
 buffer[buffer.length] = startTag;
 buffer[buffer.length] = foldMark;
 buffer[buffer.length] = endTag;
 if (scspace) {
 buffer[buffer.length] = scspace;
 }
 buffer[buffer.length] = menuTitle;
 } else {
 buffer[buffer.length] = menuTitle;
 if (scspace) {
 buffer[buffer.length] = scspace;
 }
 buffer[buffer.length] = startTag;
 buffer[buffer.length] = foldMark;
 buffer[buffer.length] = endTag;
 }
 // アーカイブリスト
 } else if (archives && (idName.indexOf('archive') == 0)) {
 if (displayArchivesMark) {
 if (preMarkForArchives) {
 buffer[buffer.length] = startTag;
 buffer[buffer.length] = foldMark;
 buffer[buffer.length] = endTag;
 if (alspace) {
 buffer[buffer.length] = alspace;
 }
 buffer[buffer.length] = menuTitle;
 } else {
 buffer[buffer.length] = menuTitle;
 if (alspace) {
 buffer[buffer.length] = alspace;
 }
 buffer[buffer.length] = startTag;
 buffer[buffer.length] = foldMark;
 buffer[buffer.length] = endTag;
 }
 } else {
 buffer[buffer.length] = startTag;
 buffer[buffer.length] = menuTitle;
 buffer[buffer.length] = endTag;
 }
 // メニュータイトル
 } else {
 // 生成パターン決定(buffer生成)
 if (linkType == 'unblock') {
 // マーク前
 if (preMarkForSideBarMenu) {
 // 折りたたみマーク設定
 buffer[buffer.length] = startTag;
 buffer[buffer.length] = foldMark;
 buffer[buffer.length] = endTag;
 // 表示位置補正
 if(modificationFlag && centeringPosition) {
 buffer[buffer.length] = padding;
 }
 // タイトルとマークのスペース
 if(offsetForTitleAndMark) {
 buffer[buffer.length] = tmspace;
 }
 // タイトル設定
 setMenuTitle(viewNum, buffer, listCount, menuTitle, listNumberPosition, tlspace);
 // 表示位置補正
 if(modificationFlag && !centeringPosition) {
 buffer[buffer.length] = padding;
 }
 // マーク後
 } else {
 // 表示位置補正
 if(modificationFlag && centeringPosition) {
 buffer[buffer.length] = padding;
 }
 // タイトル設定
 setMenuTitle(viewNum, buffer, listCount, menuTitle, listNumberPosition, tlspace);
 // タイトルとマークのスペース
 if(offsetForTitleAndMark) {
 buffer[buffer.length] = tmspace;
 }
 // 折りたたみマーク設定
 buffer[buffer.length] = startTag;
 buffer[buffer.length] = foldMark;
 buffer[buffer.length] = endTag;
 // 表示位置補正
 if(modificationFlag && !centeringPosition) {
 buffer[buffer.length] = padding;
 }
 }
 // ブロック表示
 } else {
 buffer[buffer.length] = startTag;
 // マーク表示
 if (displayMark) {
 // マーク前
 if (preMarkForSideBarMenu) {
 buffer[buffer.length] = foldMark;
 // タイトルとマークのスペース
 if(offsetForTitleAndMark) {
 buffer[buffer.length] = tmspace;
 }
 setMenuTitleForBlock(viewNum, buffer, listCount, menuTitle, listNumberPosition, tlspace);
 // マーク後
 } else {
 setMenuTitleForBlock(viewNum, buffer, listCount, menuTitle, listNumberPosition, tlspace);
 // タイトルとマークのスペース
 if(offsetForTitleAndMark) {
 buffer[buffer.length] = tmspace;
 }
 buffer[buffer.length] = foldMark;
 }
 // マーク非表示
 } else {
 setMenuTitleForBlock(viewNum, buffer, listCount, menuTitle, listNumberPosition, tlspace);
 }
 buffer[buffer.length] = endTag;
 }
 }
 // 生成データをオブジェクトに設定
 objTitle.innerHTML = buffer.join('');
 // スタイル設定
 objLists.style.display = (initMode == 'off') ? 'none' : 'block';
 } else if (initMode == 'chng') {
 // 折りたたみマーク置換
 var objMarks = objTitle.getElementsByTagName('a');
 for (i = 0, len = objMarks.length; i < len; i++) {
 if (objMarks[i].className == 'foldmark') {
 if(linkType == 'block' && displayMark) {
 var title = objMarks[i].innerHTML;
 // 折りたたみマークの画像判定
 var image = openMarkForSideBarMenu.search(/^</) != -1 ? true : false;
 if (subCategory) {
 if (idName.indexOf('subcategories') == 0) {
 image = openMarkForSubCategories.search(/^</) != -1 ? true : false;
 }
 }
 if (archives) {
 if (idName.indexOf('archive') == 0) {
 image = openMarkForArchives.search(/^</) != -1 ? true : false;
 }
 }
 if(image){
 if(dispMode == 'none'){
 title = title.replace(/<.*>/, closeMark);
 } else {
 title = title.replace(/<.*>/, openMark);
 }
 } else {
 if(dispMode == 'none'){
 title = title.replace(openMark, closeMark);
 } else {
 title = title.replace(closeMark, openMark);
 }
 }
 objMarks[i].innerHTML = title;
 } else if((linkType == 'unblock') || (subCategory && (idName.indexOf('subcategories') == 0)) || (archives && displayArchivesMark && (idName.indexOf('archive') == 0))) {
 objMarks[i].innerHTML = (dispMode == 'none') ? closeMark : openMark;
 }
 }
 }
 // 折りたたみスピード
 if(sp != 'dummy'){
 speed = sp;
 }
 if(speed == 'slow' || (idName.indexOf('subcategories') == 0 && subcategorySpeed == 'slow')) {
 if(dispMode == 'none') {
 element = $(idList);
 options = {
 afterFinish: function(effect) {
 Element.undoClipping(effect.element);
 Element.show(effect.element); // prototype.js 修正要
// element.style.display = 'block';
 }
 };
 Effect.BlindDown(element, options);
 } else {
 element = $(idList);
 options = {
 afterFinish: function(effect) {
 Element.hide(effect.element);
 }
 };
 Effect.BlindUp(element, options);
 }
 } else {
 // スタイル設定
 objLists.style.display = (dispMode == 'none') ? 'block' : 'none';
 }
 // Hold a fold-up state to cookie, when a change occurs.
 if (holdState) {
 if (dispMode == 'none') {
 createCookieByValue(idName, 'on', 365);
 } else {
 createCookieByValue(idName, 'off', 365);
 }
 }
 }
}
// 折りたたみ実行
function FoldNavigation(idName, initMode, viewNum) {
 FoldNavigationByTagName(idName, initMode, viewNum, 'dummy', 'dummy', true);
}
function FoldNavigationSlowly(idName, initMode, viewNum) {
 FoldNavigationByTagName(idName, initMode, viewNum, 'dummy', 'slow', true);
}
function FoldNavigationStateless(idName, initMode, viewNum) {
 FoldNavigationByTagName(idName, initMode, viewNum, 'dummy', 'dummy', false);
}




