// 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;
// 折りたたみマーク
// 上:閉じている状態で表示されるマーク
// 下:開いている状態で表示されるマーク
// 画像を設定する場合は右辺を ''; と書いてください
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 = '▼';
var closeMarkForSubCategories = '▲';
// サブカテゴリー用折りたたみマーク挿入位置
// カテゴリー前に折りたたみマークを配置:true
// カテゴリー後に折りたたみマークを配置:false
var preMarkForSubCategory = false;
// サブカテゴリーのタイトルとマークのスペース
var offsetForTitleAndMarkOfSubcategory = 0;
//--------------------------------------------------------
// アーカイブリスト用設定データ
//--------------------------------------------------------
// アーカイブリストフラグ
// サブカテゴリーの折りたたみを有効にする(別途テンプレート設定が必要)
// 有効にする: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('').join('');
// 終了タグ
var endTag = '';
// 表示する折りたたみマーク
var foldMark = (initMode == 'off') ? openMark : closeMark;
// メニュータイトル
var menuTitle = objTitle.innerHTML;
// パディング
var padding = '';
for (k = 0; k < offsetForCentering; k++) {
padding += ' ';
}
// タイトルとリンク数のスペース
var tlspace = '';
for (l = 0; l < offsetForTitleAndLinkNumber; l++) {
tlspace += ' ';
}
// タイトルとマークのスペース
var tmspace = '';
for (l = 0; l < offsetForTitleAndMark; l++) {
tmspace += ' ';
}
// サブカテゴリー用タイトルとマークのスペース
var scspace = '';
for (l = 0; l < offsetForTitleAndMarkOfSubcategory; l++) {
scspace += ' ';
}
// アーカイブリスト用タイトルとマークのスペース
var alspace = '';
for (l = 0; l < offsetForTitleAndMarkOfArchives; l++) {
alspace += ' ';
}
// リスト数
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);
}