window.onscroll = crawl_sidebar; window.onresize = crawl_sidebar; /* Following code has been modified from http://www.howtocreate.co.uk/tutorials/javascript/browserwindow */ function getScrollY() { var scrOfY = 0; if( typeof( window.pageYOffset ) == 'number' ) { //Netscape compliant scrOfY = window.pageYOffset; } else if( document.body && document.body.scrollTop ) { //DOM compliant scrOfY = document.body.scrollTop; } else if( document.documentElement && document.documentElement.scrollTop ) { //IE6 standards compliant mode scrOfY = document.documentElement.scrollTop; } return scrOfY; } function getViewportHeight() { var myHeight = 0; if( typeof( window.innerWidth ) == 'number' ) { //Non-IE myHeight = window.innerHeight; } else if( document.documentElement && document.documentElement.clientHeight ) { //IE 6+ in 'standards compliant mode' myHeight = document.documentElement.clientHeight; } else if( document.body && document.body.clientHeight ) { //IE 4 compatible myHeight = document.body.clientHeight; } return myHeight; } /* Above code has been modified from http://www.howtocreate.co.uk/tutorials/javascript/browserwindow */ /* http://www.quirksmode.org/js/findpos.html */ function findPos(obj) { var curleft = curtop = 0; if (obj.offsetParent) { do { curleft += obj.offsetLeft; curtop += obj.offsetTop; } while (obj = obj.offsetParent); } else { curleft = obj.offsetLeft; curtop = obj.offsetTop; } return [curleft,curtop]; } function crawl_sidebar() {//alert(document.body.style.zoom);return; // Get all the relevant elements sidebar = document.getElementById(sCrawledDiv); contentdiv = document.getElementById(sContainerDiv); // Get sidebar and viewport offsets sidebar_top = findPos(sidebar)[1];//sidebar.offsetTop; sidebar_bottom = sidebar_top + sidebar.offsetHeight; viewport_top = getScrollY(); viewport_bottom = viewport_top + getViewportHeight(); if ( sidebar_top > viewport_bottom ) { // below viewport, move up! if ( sidebar.offsetHeight < viewport_bottom - viewport_top ) { // align top when sidebar is shorter than viewport height; crawl = viewport_top - sidebar_top + 17; } else { // otherwise, align bottom crawl = viewport_bottom - sidebar_bottom - 17; } } else if ( sidebar_bottom < viewport_top ) { // above viewport, move down! crawl = viewport_top - sidebar_top + 17; } else { // within viewport, do nothing. return; } if ( typeof sidebar.style.marginTop == "undefined" ) { sidebar_marginTop = 0; } else { sidebar_marginTop = sidebar.style.marginTop.replace(/px/,'') - 0; } sidebar_marginTop += crawl; if ( sidebar_marginTop < 0 ) { sidebar_marginTop = 0; } else if ( sidebar_marginTop + sidebar.offsetHeight > contentdiv.offsetHeight ) { // try to avoid pushing down the footer sidebar_marginTop = contentdiv.offsetHeight - sidebar.offsetHeight; } sidebar.style.marginTop = sidebar_marginTop + "px"; }