<script type="text/javascript"><!--
// cookieの書込、読出。
// サイトの中にさらに子サイトをつくったときなどのcookie識別用ヘッダー。不要なら空("")に。
cookie_head = "";
// cookieの保存。setcookie("name", "value", "3days");などと。
function setcookie(cookiename, cookievalue, timelimit) {
cookienameorder = cookie_head + cookiename + "=";
if(timelimit) {
lifetime = parseInt(timelimit.toString().match(/^[\+\-]?[0-9]*/));
if(lifetime != 0) {
cookielife = new Date();
lifeunit = timelimit.toString().match(/[A-Za-z]*$/).toString();
if(lifeunit.match(/^min/i)) { lifetime *= 60; } // minutes
else if(lifeunit.match(/^h/i)) { lifetime *= 60*60; } // hours
else if(lifeunit.match(/^d/i)) { lifetime *= 60*60*24; } // days
else if(lifeunit.match(/^w/i)) { lifetime *= 60*60*24*7; } // weeks
else if(lifeunit.match(/^m/i)) { lifetime *= 60*60*24*31; } // months
else if(lifeunit.match(/^y/i)) { lifetime *= 60*60*24*365; } // years
else { lifetime *= 60*60*24; } // default unit: days
cookielife.setTime(cookielife.getTime() + lifetime*1000);
expiredate = cookielife.toGMTString();
document.cookie = cookienameorder + cookievalue + ";expires=" + expiredate+";";
} else {
document.cookie = cookienameorder + cookievalue + ";";
}
} else {
document.cookie = cookienameorder + cookievalue + ";";
}
}
// cookieの読出。getcookie("name");で値を得る。cookieがない場合false。
function getcookie(cookiename) {
cookiedata = " "+document.cookie+";";
cookienameorder = " "+cookie_head+cookiename+"=";
startpos = cookiedata.indexOf(cookienameorder);
if(startpos >= 0) {
endpos = cookiedata.indexOf(";", startpos);
readdata = cookiedata.substring(startpos + cookienameorder.length, endpos);
return(readdata);
} else {
return false;
}
}
// 画面のスクロール値の取得。get_scroll()を呼んだ時点のスクロール値がscroll_left,scroll_top,...に入る。
scroll_left = scroll_top = scroll_height = scroll_width = 0;
function get_scroll() {
(scroll_left = document.documentElement.scrollLeft) || (scroll_left = document.body.scrollLeft);
(scroll_top = document.documentElement.scrollTop) || (scroll_top = document.body.scrollTop);
(scroll_height = document.documentElement.scrollHeight) || (scroll_height = document.body.scrollHeight);
(scroll_width = document.documentElement.scrollWidth) || (scroll_width = document.body.scrollWidth);
}
// object_idで指定されるobjectの上座標を得る。
function get_object_top(object_id) {
object_element = document.getElementById(object_id);
if(object_element && (rect = object_element.getBoundingClientRect())) {
return Math.round(rect.top); // rectの各値はなぜか必ずしも整数ではない。
} else {
return 0;
}
}
// object_idで指定されるobjectの左座標を得る。
function get_object_left(object_id) {
object_element = document.getElementById(object_id);
if(object_element && (rect = object_element.getBoundingClientRect())) {
return Math.round(rect.left); // rectの各値はなぜか必ずしも整数ではない。
} else {
return 0;
}
}
// クリックの位置をアンカーとして記憶し再現。引数はいずれも文字列。空文字""は無指定。
// object_idが指定されればそのobjectをスクロール可能な範囲でできるだけ同じ位置にいくようにする。
// さらにpage_idが指定されれば同じpage_idのときのみ動作。(ページが変わったらアンカーは効かない。)
// アンカーのセットは画面内容が変わらない場合にはobjectを指定せず<body onCick="anchor_save('','PageName')">としてもよい。
// アンカーの適用は原則としてページをすべて書き出した後、<script>anchor_apply('PageName');anchor_erase();</script>の形で呼ぶ。
//
// anchor_idはフレームを使う場合最低限各フレームごとに設定。お互い他のフレームを書換えたときにへんな干渉をさけるため。
// その他ページの種別毎などで変えてもよいが、あまり小分けにするとcookieが増える。
// 同じanchor_idで保存されるcookieは1セットのみ。でも単独ページ表示のサイトなら概ねこれで充分。
anchor_id = "anc_menu";
// アンカーの記憶。
function anchor_save(object_id, page_id) {
get_scroll();
setcookie(anchor_id+"_pid", page_id, 0);
setcookie(anchor_id+"_st", scroll_top, 0);
setcookie(anchor_id+"_sl", scroll_left, 0);
if(object_id) {
object_top = scroll_top + get_object_top(object_id);
object_left = scroll_left + get_object_left(object_id);
setcookie(anchor_id+"_oid", object_id, 0);
setcookie(anchor_id+"_ot", object_top, 0);
setcookie(anchor_id+"_ol", object_left, 0);
} else {
setcookie(anchor_id+"_oid", "", -1);
setcookie(anchor_id+"_ot", "", -1);
setcookie(anchor_id+"_ol", "", -1);
}
}
// アンカーの適用。
function anchor_apply(page_id) {
if((saved_page_id = getcookie(anchor_id+"_pid")) && page_id != saved_page_id) { return; }
get_scroll();
if((anchor_st = getcookie(anchor_id+"_st")) != "" && (anchor_sl = getcookie(anchor_id+"_sl")) != "") {
anchor_st = parseInt(anchor_st);
anchor_sl = parseInt(anchor_sl);
} else {
anchor_st = scroll_top;
anchor_sl = scroll_left;
}
if((object_id = getcookie(anchor_id+"_oid"))
&& (anchor_ot = getcookie(anchor_id+"_ot")) != ""
&& (anchor_ol = getcookie(anchor_id+"_ol")) != "") {
offset_top = (scroll_top + get_object_top(object_id)) - parseInt(anchor_ot);
offset_left = (scroll_left + get_object_left(object_id)) - parseInt(anchor_ol);
} else {
offset_top = offset_left = 0;
}
window.scrollTo(anchor_sl + offset_left, anchor_st + offset_top);
}
// アンカー消去。あえてとっておく必要がなければanchor_apply()後すぐ消去が望ましい。
function anchor_erase() {
setcookie(anchor_id+"_pid", "", -1);
setcookie(anchor_id+"_st", "", -1);
setcookie(anchor_id+"_sl", "", -1);
setcookie(anchor_id+"_oid", "", -1);
setcookie(anchor_id+"_ot", "", -1);
setcookie(anchor_id+"_ol", "", -1);
}
//--></script>