﻿// Copyright (c) 2004 koikikukan All Rights Reserved.
// http://yujiro.dyndns.com/blog/koikikukan/
// 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.

function deleteValue(name, nameEQ) {
    var ca = document.cookie.split(';');
    var newData = new Array();

    // Repeat by cookie
    for(var i = 0; i < ca.length; 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; i < ca.length; 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; x < list.length; 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 FoldNavigation(idName,initMode,viewNum) {

//--------------------------------------------------------
// Configuration
//--------------------------------------------------------

// サイドメニュー用折りたたみマーク
var openMarkForSideBarMenu  = '[＋]';
var closeMarkForSideBarMenu = '[－]';

// 折りたたみマーク挿入位置
// タイトル前に折りたたみマークを配置：true
// タイトル後に折りたたみマークを配置：false
// 左端または右端に折りたたみマークを配置(スタイルシートの設定が必要です)：true
var preMarkForSideBarMenu = true;

// リスト数表示位置
// タイトル前にリスト数を表示：true
// タイトル後にリスト数を表示：false
var listNumberPosition = true;

// リスト数表示を括るマーク
var leftMarkForListNumber = '';
var rightMarkForListNumber = '';

// タイトル表示位置補正方向（スタイルシートで左端または右端に配置した場合）
// タイトルを右方向に移動：true
// タイトルを左方向に移動：false
var centeringPosition = true;

// タイトル表示位置補正オフセット（スタイルシートで左端または右端に配置した場合）
var offsetForCentering = 2;

// リンクメニュー数
// 他にリンク数を減算する必要があるメニューもここに含めてください
var linkNumber = 2;

// 各リンクメニューのオフセット値
// 注：id属性名は「linkx(xは数字)」であること
var offsetValue = new Array(linkNumber);
offsetValue[0] = 3;
offsetValue[1] = 2;

// トラックバック数の除数
// 注：id属性名は「trackback」であること
var trackbackNumber = 2;

// カテゴリーリスト数計算方法
// サブカテゴリーのカテゴリー数を適正に計数する
// サブカテゴリーに対応：true
// 従来のカテゴリーに対応：false
var subCategoryCount = true;

// 状態保持フラグ
// 有効にする：true
// 無効にする：false
var holdState = true;

// サブカテゴリーフラグ
// サブカテゴリーの折りたたみを有効にする(テンプレート要設定)
// 有効にする：true
// 無効にする：false
var subCategory = true;

// サブカテゴリー用折りたたみマーク
var openMarkForSubCategories  = '▽';
var closeMarkForSubCategories = '△';

//--------------------------------------------------------

    var openMark;  // The mark for opening, when having closed
    var closeMark; // The mark for closing, when open
    var preMark;   // The insertion position of a mark.
    if (subCategory) {
        if (idName.indexOf('subcategories') == 0) {
            var openMark = openMarkForSubCategories;
            var closeMark = closeMarkForSubCategories;
            preMark = false;
        } else {
            var openMark = openMarkForSideBarMenu;
            var closeMark = closeMarkForSideBarMenu;
            preMark = preMarkForSideBarMenu;
        }
    } else {
        var openMark = openMarkForSideBarMenu;
        var closeMark = closeMarkForSideBarMenu;
        preMark = preMarkForSideBarMenu;
    }
    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;
    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 tmpText = Array('FoldNavigation(',"'",idName,"','chng','');return(false);").join('');
        var insMark = new Array();
        var insText = new Array();
        insMark[insMark.length] = Array('<a class="foldmark" href="#" onclick="',tmpText,'" onkeypress="',tmpText,'">').join('');
        insMark[insMark.length] = (initMode == 'off') ? openMark : closeMark;
        insMark[insMark.length] = '</a>';
        if (preMark) insText[insText.length] = insMark.join('');

        var padding = '';
        for (k = 0; k < offsetForCentering; k++) {
            padding += '&nbsp;';
        }

        if (viewNum) {
            var objItems;
            var href;
            var commentCounter = 0;
            if (subCategoryCount) {
                if (idName == 'category') {
                    objItems = objLists.getElementsByTagName('li');
                } else {
                    objItems = objLists.getElementsByTagName('a');
                }
            } else {
                objItems = objLists.getElementsByTagName('a');
            }

            // Recent Comments
            if (idName == 'comment') {
                for (i = 0; i < objItems.length; 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;
            }



            if (listNumberPosition) {
                if(centeringPosition) {
                    insText[insText.length] = padding + Array(' <span>',counter,'</span>').join('') + ' ' + objTitle.innerHTML;
            } else {
                    insText[insText.length] = Array(' <span>',counter,'</span>').join('') + ' ' + objTitle.innerHTML + padding;
                }
            } else {
                if(centeringPosition) {
                    insText[insText.length] = padding + objTitle.innerHTML + Array('<span>',counter,'</span>').join('');
                } else {
                    insText[insText.length] = objTitle.innerHTML + Array('<span>',counter,'</span>').join('') + padding;
                }
            }
         } else {
            if (subCategory) {
                if (idName.indexOf('subcategories') == 0) {
                    insText[insText.length] = objTitle.innerHTML;
                } else {
                    if(centeringPosition) {
                        insText[insText.length] = padding + objTitle.innerHTML;
                    } else {
                        insText[insText.length] = objTitle.innerHTML + padding;
                    }
                }
            } else {
                if(centeringPosition) {
                    insText[insText.length] = padding + objTitle.innerHTML;
                } else {
                    insText[insText.length] = objTitle.innerHTML + padding;
                }
            }
        }
        if (!preMark) insText[insText.length] = insMark.join('');
        objLists.style.display = (initMode == 'off') ? 'none' : 'block';
        objTitle.innerHTML = insText.join('');
    } else if (initMode == 'chng') {
        var objMarks = objTitle.getElementsByTagName('a');
        for (i = 0; i < objMarks.length; i++) {
            if (objMarks[i].className == 'foldmark') {
                objMarks[i].firstChild.nodeValue = (dispMode == 'none') ? closeMark : openMark;
            }
        }
        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);
            }
        }
    }
}
