%PDF- %PDF-
Direktori : /home/rappan/www/blog/ |
Current File : /home/rappan/www/blog/menufolder.js |
// 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 = '▼'; var closeMarkForSubCategories = '▲'; // サブカテゴリー用折りたたみマーク挿入位置 // カテゴリー前に折りたたみマークを配置:true // カテゴリー後に折りたたみマークを配置:false var preMarkForSubCategory = false; // サブカテゴリーのタイトルとマークのスペース var offsetForTitleAndMarkOfSubcategory = 1; //-------------------------------------------------------- // アーカイブリスト用設定データ //-------------------------------------------------------- // アーカイブリストフラグ // サブカテゴリーの折りたたみを有効にする(別途テンプレート設定が必要) // 有効にする: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 += ' '; } // タイトルとリンク数のスペース 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); }